我正在关注 Many Models R for Data Science 书中的示例,用于生成单个多元线性回归模型。如下面可重现的示例所示,我的数据框由三列组成:id, val1, val2, val3,
.我可以使用 map
拟合线性模型Hadley 的书中详述的功能。但是,我一直在努力从每个模型中提取系数并将这些值逐列添加回 my.list
内的数据框中。 .当前存储模型系数的方式使得调用我的代码的其他部分变得困难/麻烦。
到目前为止我想出的最好的方法是制作一个长度为 my.list
的列表。并通过迭代 my.list
中的每个数据帧来提取系数:Name1, Name2, Name3
.这意味着现在我的全局环境中有另一个列表和 coef.list
不再包含因子 Name1, Name2, Name3
来自 my.list
;这些现在已被替换为 [[1]], [[2]], [[3]]
.
任何人都可以在使用多个模型时提出一种提取模型系数的“更干净”的方法吗?我的首选输出只是为每个系数创建一列:intercept, val1, val2
.这些列将出现在现有数据框中 Name1, Name2, Name3
内my.list
这样我就可以使用 mutate
直接在数据框上:
# reproducible example
set.seed(1363)
d1 <- data.frame(id=c("Name1", "Name2", "Name3"),
val1=c(rnorm(n=15, mean=5)),
val2=c(rnorm(n=15, mean=3)),
val3=c(rnorm(n=15, mean=8)))
# linear model function
lm.fun <- function(df){
lm(val3 ~ val1+val2, data = df)
}
# map lm function
d1 <- d1 %>%
group_by(id) %>%
nest() %>%
mutate(model = map(data, lm.fun)) %>%
unnest(data, .drop = FALSE)
#split data frame by 'id' and convert into list
my.list <- split(d1, d1$id)
# make list of coefficients
coef.list <- list(length(my.list))
for (i in seq_along(my.list)) {
coef.list[[i]] <- my.list[[i]][["model"]][[1]][["coefficients"]]
}
>head(coef.list, n=1)
[[1]]
(Intercept) val1 val2
9.03278337 -0.07096932 0.02119088
期望输出
my.list$Name1
id val1 val2 val3 intc coef1 coef2
Name1 1 2 3 9.03 -.070 .021
Name1 3 1 5 9.03 -.070 .021
Name1 2 6 8 9.03 -.070 .021
最佳答案
使用 sapply
,给定数据 d1
(包含 model
列):
coeff <- sapply(d1$model, function(x) return(coefficients(x)))
library(dplyr)
bind_cols(d1, data.frame(t(coeff))) %>%
rename_at(6:8, ~ c("intc", "coef1", "coef2")) %>%
distinct(id, .keep_all = TRUE)
关于r - [R]-从嵌套列表(列表列)中提取模型系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51181888/