我想对group_by
之后的所有组进行线性回归,将模型系数保存在列表列中,然后使用“ unnest”来“扩展列表列”。
这里我以mtcars
数据集为例。
注意:我想使用do' here, because
broom :: tidy`不适用于所有型号。
mtcars %>% group_by(cyl) %>%
do(model=lm(mpg~wt+hp, data=.)) %>%
mutate(coefs = list(summary(model)$coefficients)) %>%
unnest()
我想要这样的东西。
cyl term Estimate Std. Error t value Pr(>|t|)
4 (Intercept) 36.9083305 2.19079864 16.846975 1.620660e-16
4 wt -2.2646936 0.57588924 -3.932516 4.803752e-04
4 hp -0.0191217 0.01500073 -1.274718 2.125285e-01
6.......
6......
........
我收到如下错误:
Error: All nested columns must have the same number of elements.
任何人都可以帮助解决此问题吗?尝试了很多次后,我无法理解它。
答案 0 :(得分:2)
一种选择是提取'coefs'列(.$coefs
),将list
列的名称设置为'cyl'列,用{{ 1}},将其转换为list
,根据行名创建新列,并使用map
从{{1}的data.frame
创建'cyl'列}
.id
如果我们想使用names
,则将list
的内容更改为
library(tidyverse)
mtcars %>%
group_by(cyl) %>%
do(model=lm(mpg~ wt + hp, data=.)) %>%
mutate(coefs = list(summary(model)$coefficients)) %>%
select(-model) %>%
{set_names(.$coefs, .$cyl)} %>%
map_df(~ .x %>%
as.data.frame %>%
rownames_to_column('term'), .id = 'cyl')
# cyl term Estimate Std. Error t value Pr(>|t|)
#1 4 (Intercept) 45.83607319 4.78693568 9.575243 1.172558e-05
#2 4 wt -5.11506233 1.60247105 -3.191984 1.276524e-02
#3 4 hp -0.09052672 0.04359827 -2.076383 7.151610e-02
#4 6 (Intercept) 32.56630096 5.57482132 5.841676 4.281411e-03
#5 6 wt -3.24294031 1.37365306 -2.360815 7.759393e-02
#6 6 hp -0.02219994 0.02017664 -1.100279 3.329754e-01
#7 8 (Intercept) 26.66393686 3.66217797 7.280896 1.580743e-05
#8 8 wt -2.17626765 0.72094143 -3.018647 1.168393e-02
#9 8 hp -0.01367295 0.01073989 -1.273099 2.292303e-01
另外,另一个选择是在tidy
之后map_df
,然后在 ... %>%
map_df(~ .x %>%
broom::tidy(.), .id = 'cyl')
对象上应用nest
,然后在group_by
broom::tidy