For循环中的线性回归

时间:2015-03-18 08:48:03

标签: r for-loop

运行下面的代码时出错。我还没弄清楚我做错了什么 - 抱歉,如果很明显,我是R的新手。想法是“生成”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]
  }

3 个答案:

答案 0 :(得分:3)

您需要先创建矩阵/向量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

答案 1 :(得分:3)

使用索引的方式存在一些问题。你可能需要花一些时间在一个关于初学者R的简短教程上,而不是“急于”循环和回归......

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

另一方面, 1)在每次迭代中,你没有填充y的 i 元素,但创建一个全新的向量y,其值与x中的值一样多...... 2)您不需要保留每个回归,因此您不需要“索引”您的对象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)

答案 2 :(得分:3)

除了其他答案之外,还有更好的(更有效和更容易)的可能性。 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