如何解决使用一系列map函数提取每个模型的系数
我正在创建以下模型:
models <- mtcars %>%
split(.$cyl) %>%
map(function(df) lm(mpg ~ wt,data = df))
结果应该如下所示:
4 6 8
-5.647025 -2.780106 -2.192438
我正在努力解决这个问题。任何帮助表示赞赏。
解决方法
看起来像
coefs <- (mtcars
%>% split(.$cyl)
%>% map(lm,formula = mpg~wt)
%>% map_dbl(~coef(.)[["wt"]])
)
应该做你想做的吗?如果您想获得更多信息,以 map_dfr(broom::tidy)
而不是 map_dbl
结尾会有所帮助(您也可以使用 .id=
参数,尽管当列表没有有命名参数)。
这与@henryn 的答案非常相似,尽管 map
语法(使用命名的 formula
参数意味着数据被隐式替换为 next 参数,因此您不必使用匿名函数 function(df) lm(mpg ~ wt,data = df)
或(R >= 4.1.0)\(df) lm(mpg ~ wt,data = df)
:我认为通常的做法是,~ lm(mpg ~ wt,data = .)
可能 被公式中的波浪号搞砸了,但我不确定......
您可以使用 map_dbl
和 coef
函数来挑选“wt”系数:
coefs <- mtcars %>%
split(.$cyl) %>%
map(function(df) lm(mpg ~ wt,data = df)) %>%
map_dbl(~coef(.)[["wt"]])
,
这行得通吗:
mtcars %>% split(.$cyl) %>% map(function(x) {
c = lm(mpg ~ wt,data = x)
c$coefficients[2]
}) %>% unlist
4.wt 6.wt 8.wt
-5.647025 -2.780106 -2.192438
,
1) 这可以在直接 dplyr 中完成:
mtcars %>%
group_by(cyl) %>%
summarize(wt = coef(lm(mpg ~ wt))[[2]],.groups = "drop")
给予:
# A tibble: 3 x 2
cyl wt
<dbl> <dbl>
1 4 -5.65
2 6 -2.78
3 8 -2.19
2) 这种变体也有效:
mtcars %>%
group_by(cyl) %>%
summarize(wt = cov(mpg,wt) / var(wt),.groups = "drop")
3) 还要考虑这一点——省略 [2] 以获得两个系数。
library(nlme)
coef(lmList(mpg ~ wt | cyl,mtcars))[2]
给予:
wt
4 -5.647025
6 -2.780106
8 -2.192438
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。