【问题标题】:R: extract regression results using two or more for loopsR:使用两个或多个 for 循环提取回归结果
【发布时间】:2015-08-27 22:45:47
【问题描述】:

基于this post,我创建了以下矩阵和for 循环来遍历我的df 中的所有回归组合:

all_lm <-data.frame(matrix(nrow=180, ncol=9))
names(all_lm)=c("col1", "col2", "Estimate", " Std. Error", " z value", " pValue", "2.5%", "97.5%", "r^2")

为了保存结果,这个:

for (i in c("A","B","C"))
for (j in c(1:10))
for (k in c("D","E"))
for (l in c("F", "G", "H")){
  form <- formula(paste0(i,"_PC_AB_",k, " ~ ", l))
  result<-lm(form, data = schools, subset=Decile==j)
  all_lm[i,1]<-i
  all_lm[i,2]<-j
  all_lm[i,3]<-round(coef(summary(result))[2,1],3)
  all_lm[i,4]<-round(coef(summary(result))[2,2],3)
  all_lm[i,5]<-round(coef(summary(result))[2,3],3)
  all_lm[i,6]<-round(coef(summary(result))[2,4],3)
  all_lm[i,7]<-round(confint(result)[2,1],2)
  all_lm[i,8]<-round(confint(result)[2,2],2)
  all_lm[i,9]<-round(summary(result)$r.squared, 3)
}

当我使用它导出Cairo 中的图时,此循环配置有效,但我意识到all_lm[i,n] 是一种不正确的方法。我对 R 的了解还不够,无法解决这个问题。我尝试了各种组合,例如all_lm[i,j,k,n]。我也试过 { 在每个 for 之后,但这没有用。如何循环遍历 180 个回归并将结果存储在我的矩阵中?

【问题讨论】:

  • 为什么四个控制结构只有一组大括号?
  • 正如我在帖子中所说,当用于包Cairo 时,这个完全相同的for 循环配置有效。正如我在上面所说的,我在所有四个控制结构(最后四个)之后尝试了 { 大括号,但这也不起作用。如上所述,问题再次出现在 `all_lm[i,1]' 中。
  • 括号适用于子集行和列。总是[row, column]。您的i 变量取值“A”,然后是“B”,然后是“C”,然后是“D”。因此,当您运行all_lm[i, 1] &lt;- i 时,这相当于all_lm["A", 1] &lt;- "A",除非您有一个名为"A" 的行,否则它将不起作用。看起来你没有任何行名,所以这不起作用。
  • 此外,这条 i-dependent 行 all_lm[i, 1] &lt;- i 正在运行 很多 次而不是必要的。每次 ijkl 递增时,您都会运行它。它应该在您的 i 循环内,但在其他循环之外。与仅依赖于j 的行相同。您随后的round(coef(summary(...))) 行将具有取决于kl 的值,因为您的公式会根据kl 而变化,但是您存储它们的位置仅取决于i,所以您'最终会用较新的值覆盖这些值。
  • @LeroyTyrone 大括号与此错误没有任何关系,我只是说一致使用它们,以及适当的缩进将使您的代码更具可读性...

标签: r for-loop


【解决方案1】:

在大多数情况下,如果您被吸引到使用 for 循环(更不用说嵌套 for 循环),那么您可能走错了方向。

解决问题的一般方法是使用expand.grid 函数创建所有输入组合,然后使用mapply 对每个输入组合重复回归并返回结果列表,然后使用@987654324 @ 将结果列表组合成一个数据框。

您的代码应如下所示:

i <- c('A','B','C')
j <- 1:10
k <- c('D','E')
l <- c('F','G','H')

params <- expand.grid(i, j, k, l, stringsAsFactors = FALSE)

您现在拥有所有输入组合的数据框。

> head(params)
  Var1 Var2 Var3 Var4
1    A    1    D    F
2    B    1    D    F
3    C    1    D    F
4    A    2    D    F
5    B    2    D    F
6    C    2    D    F
> tail(params)
    Var1 Var2 Var3 Var4
175    A    9    E    H
176    B    9    E    H
177    C    9    E    H
178    A   10    E    H
179    B   10    E    H
180    C   10    E    H

现在设置一个函数,mapply 将用于 params 数据帧的每一行。

# 
one_lm <- function(i, j, k, l) {  

  form <- formula(paste0(i,"_PC_AB_",k, " ~ ", l))
  result <- lm(form, data = schools, subset=Decile==j)

    list(
      col1 = i,
      col2 = j,
      estimate = round(coef(summary(result))[2,1],3),
      std_err  = round(coef(summary(result))[2,2],3),
      z_value  = round(coef(summary(result))[2,3],3),
      p_value  = round(coef(summary(result))[2,4],3),
      pct_2.5  = round(confint(result)[2,1],2),
      pct_97.5 = round(confint(result)[2,2],2),
      r_square = round(summary(result)$r.squared, 3)

    )
}

现在使用mapply 一次处理每个组合,并返回每行的估计值、std_err 等列表。

result_list <- mapply(one_lm, params[,1], params[,2], params[,3], params[,4], SIMPLIFY = FALSE)

然后,您可以一起使用 do.callrbind 函数将所有这些列表组合成一个数据框。

results <- do.call(rbind, result_list)

【讨论】:

    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2018-06-05
    相关资源
    最近更新 更多