【问题标题】:extracting linear model coefficients into a vector within a loop将线性模型系数提取到循环内的向量中
【发布时间】:2014-10-23 15:09:10
【问题描述】:

我正在尝试使用 R 中的循环创建 200 个线性模型系数的样本。最终,我想要一个包含这些系数的向量。

for (i in 1:200) {        
  smpl_5 <- population[sample(1:1000, 5), ]
  model_5 <- summary(lm(y~x, data=smpl_5))         
}

我可以很容易地提取系数,但是我无法将它们输出到循环内的向量中。有什么建议吗?

【问题讨论】:

  • 提取系数见帮助文件?coef。假设您要从每个模型存储多个系数,您需要将它们存储在 list(推荐)或多个向量(每个系数一个)中。您还需要在进入循环之前将对象初始化为正确的长度(例如coefList &lt;- list(NULL); length(coefList) &lt;- 200)。
  • @nrussell - 由于所有模型都具有相同的结构(即,x 的截距和系数是估计的),系数矩阵将具有相同的维度,因此数组也是合适的。
  • @jbaums 同意,我只是抛出了我想到的前几个建议,这些建议几乎不需要修改 OP 的代码。

标签: r loops lm


【解决方案1】:

如果您愿意,可以使用replicate。在您的情况下,由于所有模型的系数数量相同,因此它将返回一个数组,如下例所示:

d <- data.frame(x=runif(1000))
d$y <- d$x * 0.123 + rnorm(1000, 0, 0.01)
coefs <- replicate(3, {
  xy <- d[sample(nrow(d), 100), ]
  coef(summary(lm(y~x, data=xy)))
})

coefs

# , , 1
# 
#                Estimate  Std. Error    t value     Pr(>|t|)
# (Intercept) 0.001361961 0.002091297  0.6512516 5.164083e-01
# x           0.121142447 0.003624717 33.4212114 2.235307e-55
# 
# , , 2
# 
#                Estimate  Std. Error  t value     Pr(>|t|)
# (Intercept) 0.003213314 0.001967050  1.63357 1.055579e-01
# x           0.118026828 0.003332906 35.41259 1.182027e-57
# 
# , , 3
# 
#                Estimate  Std. Error   t value     Pr(>|t|)
# (Intercept) 0.003366678 0.001990226  1.691606 9.389883e-02
# x           0.119408470 0.003370190 35.430783 1.128070e-57

使用普通数组索引访问特定元素,例如:

coefs[, , 1] # return the coefs for the first model

#                Estimate  Std. Error    t value     Pr(>|t|)
# (Intercept) 0.001361961 0.002091297  0.6512516 5.164083e-01
# x           0.121142447 0.003624717 33.4212114 2.235307e-55

因此,对于您的问题,您可以使用:

replicate(200, { 
  smpl_5 <- population[sample(1:1000, 5), ]
  coef(summary(lm(y~x, data=smpl_5))) 
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多