我进行了一系列86回归(编号83-168),并将其存储为“ reg_83”,“ reg_84”等。我现在正在尝试提取每个变量的系数值,并将它们输入到新的数据框中进行分析,以查看系数值如何随时间变化。我有一个新的矩阵(“ gencoef”),具有12列和86行。我有一栏专门介绍每个自变量。我正在尝试运行一个循环,该循环会将每个回归的系数值存储在变量列的相应单元格中。我使用了以下代码,但无济于事。我对循环不是特别熟练,因此它可能是一个相对简单的解决方案:
for(i in c(83:168)){
for(j in c(1:86)){
eval(parse(text=paste(
"gencoef[",j,",2] <- summary(reg_",i,")$coefficients[1,1]"),sep==""))
}
}
无论出于何种原因,它当前都在“ reg_”和数字之间创建一个空格,因此似乎认为我正在运行“ reg_ 83”,这当然是行不通的。但是,我在循环中有一个sep==""
命令,所以我不知道问题出在哪里。也许有人可以启发我?
答案 0 :(得分:1)
执行此操作的方法可能很多,但这是我很快想到的一种方法。它使用如上所述的broom
包。
首先让我们列出模型:
# make a response variable and a matrix of predictors
set.seed(111)
response <- rnorm(10)
predictors <- matrix(rnorm(100), nrow = 10)
# model response using each predictor to give a list of 10 model outputs
mods <- apply(predictors, 2, function(x) lm(response ~ x))
现在用扫帚整理输出,并将结果数据帧绑定在一起。
library(broom)
l <- lapply(mods, tidy)
do.call(rbind, l)
或者使用purrr
可以消除lapply
和do.call
。
library(purrr)
map_df(mods, tidy)
给出相同的结果。
# A tibble: 20 x 5
# term estimate std.error statistic p.value
# * <chr> <dbl> <dbl> <dbl> <dbl>
# 1 (Intercept) 0.0643 0.564 0.114 0.912
# 2 x 0.0851 0.454 0.187 0.856
# 3 (Intercept) 0.0256 0.511 0.0501 0.961
# 4 x -0.0763 0.567 -0.135 0.896
# 5 (Intercept) 0.113 0.514 0.220 0.832
# 6 x -0.310 0.458 -0.677 0.518
# 7 (Intercept) -0.448 0.562 -0.797 0.448
# etc
哦,您可以给每个模型一个.id
:
map_dfr(mods, tidy, .id = "model")
# A tibble: 20 x 6
# model term estimate std.error statistic p.value
# <chr> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 1 (Intercept) -0.672 0.263 -2.56 0.0338
# 2 1 x -0.0655 0.284 -0.230 0.824
# 3 2 (Intercept) -0.688 0.260 -2.65 0.0293
# 4 2 x 0.133 0.225 0.589 0.572
# etc