问题在于:Y
分别对X = 4, 8, 12, 16, 20
进行五次观察。真正的回归函数是E(y) = 20 + 4X
,而ei
是独立的N(O, 25)
。
生成五个正态随机数,平均值为0,方差为25.将这些随机数视为Y
的五个X = 4,8, 12, 16, 20
观察值的误差项,并计算Y1
, Y2
,Y3
,Y4
和Y5
。在为五个案例拟合直线时,获得最小二乘估计bo
和b1
。同时在Yh
时计算Xh = 10
,并在E(Yh)
时获得Xh = 10
的95%置信区间。我做了第1部分,但我需要帮助重复它200次。
重复第(1)部分200次,每次都产生新的随机数。
制作200个估算值b1
的频率分布。计算200个估计值b1
的平均值和标准差。结果是否与理论预期一致?
当E(Yh)
包含Xh = 10
时,E(Yh)
的200个置信区间有多大比例?这个结果是否符合理论预期?
到目前为止,这是我的代码,我对如何重复第1部分200次感到难过:
X <- matrix(c(4, 8, 12, 16, 20), nrow = 5, ncol = 1)
e <- matrix(c(rnorm(5,0,sqrt(5))), nrow = 5, ncol = 1)
Y <- 20 + 4 * X + e
mydata <- data.frame(cbind(Y=Y, X=X, e=e))
names(mydata) <- c("Y","X","e")
reg<-lm(Y ~ X, data = mydata)
predict(reg, newdata = data.frame(X=10), interval="confidence")
答案 0 :(得分:1)
您的代码中存在错误。您希望出现独立的N(O, 25)
错误,但您已将sqrt(5)
作为标准错误传递给rnorm()
。它应该是5
。
我们首先将您的代码包装成一个函数。此函数不接受任何输入,但只运行一次实验,并在中返回回归系数b0
,b1
和预测fit
,lwr
,upr
命名为 vector。
sim <- function () {
x <- c(4, 8, 12, 16, 20)
y <- 20 + 4 * x + rnorm(5,0,5)
fit <- lm(y ~ x)
pred <- predict(fit, data.frame(x = 10), interval = "confidence")
pred <- setNames(c(pred), dimnames(pred)[[2]])
## return simulation result
c(coef(fit), pred)
}
例如,让我们试试
set.seed(2016)
sim()
#(Intercept) x fit lwr upr
# 24.222348 3.442742 58.649773 47.522309 69.777236
现在我们使用replicate
重复此类实验200次。
set.seed(0)
z <- t(replicate(200, sim()))
head(z)
# (Intercept) x fit lwr upr
#[1,] 24.100535 3.987755 63.97808 57.61262 70.34354
#[2,] 6.417639 5.101501 57.43265 52.44263 62.42267
#[3,] 20.652355 3.797991 58.63227 52.74861 64.51593
#[4,] 20.349829 3.816426 58.51409 52.59115 64.43702
#[5,] 19.891873 4.095140 60.84327 57.49911 64.18742
#[6,] 24.586749 3.589483 60.48158 53.64574 67.31743
将有200行,用于200次模拟的结果。
第二列包含200 {200}模拟下b1
的估算,我们计算它们的均值和标准误差:
mean(z[,2])
# [1] 3.976249
sd(z[,2])
# [1] 0.4263377
我们知道真正的值是4
,很明显我们的估计与真实值一致。
最后,让我们用X = 10
的95%置信区间进行预测。真值为20 + 4 * 10 = 60
,因此涵盖此真实值的置信区间的比例为
mean(z[, "lwr"] < 60 & z[, "upr"] > 60)
## 0.95
完全 0.95。