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 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
您使用索引的方式有几个问题。您可能需要再次花一些时间阅读有关 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
我收到以下代码的 运行 错误。我还没有弄清楚我做错了什么 - 如果很明显,我很抱歉,我是 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 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
您使用索引的方式有几个问题。您可能需要再次花一些时间阅读有关 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