美文网首页数据-R语言-图表-决策-Linux-Python
小洁详解《R数据科学》--第19章 处理多个模型

小洁详解《R数据科学》--第19章 处理多个模型

作者: 小洁忘了怎么分身 | 来源:发表于2018-11-22 14:12 被阅读98次

1.准备工作

重点:使用list列保存任意数据结构

library(modelr)
library(tidyverse)
#> ── Attaching packages ───────────────────────────────── tidyverse 1.2.1 ──
#> ✔ ggplot2 3.0.0     ✔ purrr   0.2.5
#> ✔ tibble  1.4.2     ✔ dplyr   0.7.6
#> ✔ tidyr   0.8.1     ✔ stringr 1.3.1
#> ✔ readr   1.1.1     ✔ forcats 0.3.0
#> ── Conflicts ──────────────────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::filter() masks stats::filter()
#> ✖ dplyr::lag()    masks stats::lag()

2.list列

用tribble()新建--只是帮助理解

tribble(
~x, ~y,
1:3, "1, 2",
3:5, "3, 4, 5"
)
#> # A tibble: 2 x 2
#>   x         y      
#>   <list>    <chr>  
#> 1 <int [3]> 1, 2   
#> 2 <int [3]> 3, 4, 5

3.创建list列

普遍方法:

(1) tidyr::nest()

将分组数据框转换为嵌套数据框,嵌套数据框中会包含【数据框列表】列。

(2) mutate()以及能够返回列表的向量化函数。

(3) summarize()以及能够返回多个结果的摘要函数。

另外,我们还可以使用
tibble::enframe()函数根据命名列表来创建列表列。

(1)nest

帮助文档中的例子

as_tibble(iris) %>% nest(-Species)
#> # A tibble: 3 x 2
#>   Species    data             
#>   <fct>      <list>           
#> 1 setosa     <tibble [50 × 4]>
#> 2 versicolor <tibble [50 × 4]>
#> 3 virginica  <tibble [50 × 4]>

(2)使用向量化函数

嵌套--拆分字符串mutate和str_split联用

df <- tribble(
~x1,
"a,b,c",
"d,e,f,g"
)
df %>%
mutate(x2 = stringr::str_split(x1, ","))
#> # A tibble: 2 x 2
#>   x1      x2       
#>   <chr>   <list>   
#> 1 a,b,c   <chr [3]>
#> 2 d,e,f,g <chr [4]>

嵌套还原

df %>%
mutate(x2 = stringr::str_split(x1, ",")) %>%
unnest()
#> # A tibble: 7 x 2
#>   x1      x2   
#>   <chr>   <chr>
#> 1 a,b,c   a    
#> 2 a,b,c   b    
#> 3 a,b,c   c    
#> 4 d,e,f,g d    
#> 5 d,e,f,g e    
#> 6 d,e,f,g f    
#> 7 d,e,f,g g

(3)使用多值摘要函数

#先认识一下quantile函数

quantile(mtcars$mpg)
#>     0%    25%    50%    75%   100% 
#> 10.400 15.425 19.200 22.800 33.900
length(quantile(mtcars$mpg))
#> [1] 5

mtcars %>%
group_by(cyl) %>%
summarize(q = list(quantile(mpg)))
#> # A tibble: 3 x 2
#>     cyl q        
#>   <dbl> <list>   
#> 1     4 <dbl [5]>
#> 2     6 <dbl [5]>
#> 3     8 <dbl [5]>

(4)tibble::enframe() 命名列表

x <- list(
a = 1:5,
b = 3:4,
c = 5:6
)
df <- enframe(x)
df
#> # A tibble: 3 x 2
#>   name  value    
#>   <chr> <list>   
#> 1 a     <int [5]>
#> 2 b     <int [2]>
#> 3 c     <int [2]>

#对名称和值进行迭代
df %>%
mutate(
smry = map2_chr(
name,
value,
~ stringr::str_c(.x, ": ", .y[1])
)
)
#> # A tibble: 3 x 3
#>   name  value     smry 
#>   <chr> <list>    <chr>
#> 1 a     <int [5]> a: 1 
#> 2 b     <int [2]> b: 3 
#> 3 c     <int [2]> c: 5

4.list转换为向量

获取list列的类型和长度信息

df <- tribble(
~x,
letters[1:5],
1:3,
runif(5)
)
df %>% mutate(
type = map_chr(x, typeof),
length = map_int(x, length)
)
#> # A tibble: 3 x 3
#>   x         type      length
#>   <list>    <chr>      <int>
#> 1 <chr [5]> character      5
#> 2 <int [3]> integer        3
#> 3 <dbl [5]> double         5

提取嵌套表格的一部分

df <- tribble(
~x,
list(a = 1, b = 2),
list(a = 2, c = 4)
)
df %>% mutate(
a = map_dbl(x, "a"),
b = map_dbl(x, "b", .null = NA_real_)
)
#> # A tibble: 2 x 3
#>   x              a     b
#>   <list>     <dbl> <dbl>
#> 1 <list [2]>     1     2
#> 2 <list [2]>     2    NA

嵌套还原:如果有两个列表列,就需要它们同一行的元素数量相等。

df1 <- tribble(
~x, ~y, ~z,
1, c("a", "b"), 1:2, 
2, "c", 3
)
#第一行都有两个元素,第二行都有一个元素
df1
#> # A tibble: 2 x 3
#>       x y         z        
#>   <dbl> <list>    <list>   
#> 1     1 <chr [2]> <int [2]>
#> 2     2 <chr [1]> <dbl [1]>
df1 %>% unnest(y, z)
#> # A tibble: 3 x 3
#>       x y         z
#>   <dbl> <chr> <dbl>
#> 1     1 a         1
#> 2     1 b         2
#> 3     2 c         3

5.使用broom生成整洁数据

broom::glance(model) 摘要统计量,模型度量方式
broom::tidy(model) 系数的估计值或变异指标
broom::augment(model, data) 添加一些额外信息如残差。

sim1_mod <- lm(y ~ x, data = sim1)
coef(sim1_mod)
#> (Intercept)           x 
#>    4.220822    2.051533
broom::glance(sim1_mod) 
#> # A tibble: 1 x 11
#>   r.squared adj.r.squared sigma statistic  p.value    df logLik   AIC   BIC
#> *     <dbl>         <dbl> <dbl>     <dbl>    <dbl> <int>  <dbl> <dbl> <dbl>
#> 1     0.885         0.880  2.20      215. 1.17e-14     2  -65.2  136.  141.
#> # ... with 2 more variables: deviance <dbl>, df.residual <int>
broom::tidy(sim1_mod)
#> # A tibble: 2 x 5
#>   term        estimate std.error statistic  p.value
#>   <chr>          <dbl>     <dbl>     <dbl>    <dbl>
#> 1 (Intercept)     4.22     0.869      4.86 4.09e- 5
#> 2 x               2.05     0.140     14.7  1.17e-14
broom::augment(sim1_mod, sim1)
#> # A tibble: 30 x 9
#>        x     y .fitted .se.fit   .resid   .hat .sigma   .cooksd .std.resid
#>  * <int> <dbl>   <dbl>   <dbl>    <dbl>  <dbl>  <dbl>     <dbl>      <dbl>
#>  1     1  4.20    6.27   0.748 -2.07    0.115    2.20   6.51e-2   -1.00   
#>  2     1  7.51    6.27   0.748  1.24    0.115    2.23   2.32e-2    0.598  
#>  3     1  2.13    6.27   0.748 -4.15    0.115    2.08   2.61e-1   -2.00   
#>  4     2  8.99    8.32   0.634  0.665   0.0828   2.24   4.49e-3    0.315  
#>  5     2 10.2     8.32   0.634  1.92    0.0828   2.21   3.74e-2    0.910  
#>  6     2 11.3     8.32   0.634  2.97    0.0828   2.16   8.97e-2    1.41   
#>  7     3  7.36   10.4    0.533 -3.02    0.0586   2.16   6.21e-2   -1.41   
#>  8     3 10.5    10.4    0.533  0.130   0.0586   2.24   1.15e-4    0.0608 
#>  9     3 10.5    10.4    0.533  0.136   0.0586   2.24   1.26e-4    0.0637 
#> 10     4 12.4    12.4    0.454  0.00763 0.0424   2.24   2.78e-7    0.00354
#> # ... with 20 more rows
微信公众号生信星球同步更新我的文章

友情链接:
生信技能树公益视频合辑:学习顺序是linux,r,软件安装,geo,小技巧,ngs组学!
B站链接:https://m.bilibili.com/space/338686099
YouTube链接:https://m.youtube.com/channel/UC67sImqK7V8tSWHMG8azIVA/playlists
生信工程师入门最佳指南:https://mp.weixin.qq.com/s/vaX4ttaLIa19MefD86WfUA
学徒培养:https://mp.weixin.qq.com/s/3jw3_PgZXYd7FomxEMxFmw
资料大全:https://mp.weixin.qq.com/s/QcES9u1vYh-l6LMXPgJIlA

相关文章

网友评论

    本文标题:小洁详解《R数据科学》--第19章 处理多个模型

    本文链接:https://www.haomeiwen.com/subject/nmdlqqtx.html