第一步是将系数合并到一个数据框中,每个模型和项的组合一行。然后,您将能够将其展开到一个表中,每个模型一行,每个术语一列。
My 扫帚包有一个有用的功能,tidy
将线性拟合转换为系数数据框:
fit <- lm(mpg ~ wt + disp + qsec, mtcars)
library(broom)
tidy(fit)
# term estimate std.error statistic p.value
# 1 (Intercept) 19.777558 5.9383 3.3305 0.00244
# 2 wt -5.034410 1.2241 -4.1127 0.00031
# 3 disp -0.000128 0.0106 -0.0121 0.99042
# 4 qsec 0.926649 0.3421 2.7087 0.01139
(请注意,与coef
,这返回一个数据框而不是矩阵,并将术语合并为列而不是行名)。您可以将此函数应用于每个模型,然后重新组合,例如使用 plyr 的 ldply。我们使用 20 个与您的“模型”相同的模型生成一个示例:
models <- replicate(20, lm(mpg ~ wt + disp + qsec, mtcars), simplify = FALSE)
names(models) <- paste0("MODEL", 1:20)
那么我们的“整理并重新组合”代码将是:
all_coefs <- plyr::ldply(models, tidy, .id = "model")
head(all_coefs)
# model term estimate std.error statistic p.value
# 1 MODEL1 (Intercept) 19.777558 5.9383 3.3305 0.00244
# 2 MODEL1 wt -5.034410 1.2241 -4.1127 0.00031
# 3 MODEL1 disp -0.000128 0.0106 -0.0121 0.99042
# 4 MODEL1 qsec 0.926649 0.3421 2.7087 0.01139
# 5 MODEL2 (Intercept) 19.777558 5.9383 3.3305 0.00244
# 6 MODEL2 wt -5.034410 1.2241 -4.1127 0.00031
然后,您需要删除 std.error、statistic 和 p.value 列并展开estimate
期限结束。这可以通过 dplyr 和 tidyr 包来完成:
library(dplyr)
library(tidyr)
results <- all_coefs %>% select(-(std.error:p.value)) %>%
spread(term, estimate)
这会产生:
model (Intercept) disp qsec wt
1 MODEL1 19.8 -0.000128 0.927 -5.03
2 MODEL2 19.8 -0.000128 0.927 -5.03
3 MODEL3 19.8 -0.000128 0.927 -5.03
4 MODEL4 19.8 -0.000128 0.927 -5.03
5 MODEL5 19.8 -0.000128 0.927 -5.03
这是您想要的输出。 (这个输出很无聊,因为所有模型都是相同的,但可能你的模型是不同的)。如果某些模型具有其他模型没有的系数,则缺失值将用 NA 填充。