运行下面的代码时出错。我还没弄清楚我做错了什么 - 抱歉,如果很明显,我是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]
}
答案 0 :(得分:3)
您需要先创建矩阵/向量y
,reg
,slp
,才能写入位置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