For 循环中的线性回归

Linear Regression in For Loop

我收到以下代码的 运行 错误。我还没有弄清楚我做错了什么 - 如果很明显,我很抱歉,我是 R 的新手。我的想法是 "generate" 100 次回归并输出估计斜率 100 次。

set.seed(21) 
x <- seq(1,40,1) 
for (i in 1:100 ) {
  y[i] = 2*x+1+5*rnorm(length(x))
  reg[i] <- lm(y[i]~x)
  slp[i] <-  coef(reg[i])[2]
  }

您需要先创建 matrix/vector yregslp,才能写入位置 i,例如:y[i] <-。你可以一起做点什么:

set.seed(21) 
x <- seq(1,40,1) 
slp <- numeric(100)
for (i in 1:100 ) {
  y <- 2*x+1+5*rnorm(length(x))
  reg <- lm(y~x)
  slp[i] <-  coef(reg)[2]
}

   > slp
  [1] 2.036344 1.953487 1.949170 1.961897 2.098186 2.027659 2.002638 2.107278
  [9] 2.036880 1.980800 1.893701 1.925230 1.927503 2.073176 2.101303 1.943719
      ...
 [97] 1.966039 2.041239 2.063801 2.066801

您使用索引的方式有几个问题。您可能需要再次花一些时间阅读有关 R 初学者的简短教程,而不是 "rush" 循环和回归...

最后,您想要一个包含 100 个斜率值的向量。您需要在 运行 循环之前定义此(空)向量 'slp',然后用循环中的值填充每个 ith 元素。

另一方面, 1) 在每次迭代中,您不会填充 y 的第 i 个元素,而是创建一个全新的向量 y,其值与 x 中的值一样多... 2) 你不需要保留每一个回归,所以你不需要 "index" 你的对象 reg。

这里是:

set.seed(21) 
x <- seq(1,40,1) 
slp=rep(NA,100)
for (i in 1:100) {
    y = 2*x+1+5*rnorm(length(x))
    reg <- lm(y~x)
    slp[i]<-coef(reg)[2]
}
print(slp)

除了其他答案之外,还有更好(更高效、更简单)的可能性。 lm 接受矩阵作为 y 的输入:

set.seed(21)
y <- matrix(rep(2*x + 1, 100) + 5 *rnorm(length(x) * 100), ncol = 100)
reg1 <- lm(y ~ x)
slp1 <- coef(reg1)[2,]
all.equal(slp, slp1)
#[1] TRUE

如果您有 lm 以外的函数并且需要一个循环,您应该使用 replicate 而不是 for 循环:

set.seed(21) 
slp2 <- replicate(100, {
  y = 2*x+1+5*rnorm(length(x))
  reg <- lm(y~x)
  unname(coef(reg)[2])
})
all.equal(slp, slp2)
#[1] TRUE