从多个回归中提取系数值并存储在新矩阵中

时间:2018-09-25 19:05:46

标签: r loops for-loop statistics

我进行了一系列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==""命令,所以我不知道问题出在哪里。也许有人可以启发我?

1 个答案:

答案 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可以消除lapplydo.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