匹配R的置信区间来自predict.lm()

时间:2018-06-08 22:24:34

标签: r linear-regression

我无法匹配R的线性模型置信度和点估计的预测间隔:

set.seed(3)
x <- rnorm(392, 20, 5)
y <- 2*x + 3 + rnorm(392, sd=3)

lm.fit <- lm(y~x)

(est <- as.vector(matrix(c(1,20),nrow=1,ncol=2) %*% lm.fit$coefficients))
(ci <- est + c(-1,1) * qt(.975, df=lm.fit$df.residual)*sqrt(var(lm.fit$residuals)/(lm.fit$df.residual)))
(pred <- predict(lm.fit,data.frame(x=(c(20))), interval="confidence", se.fit = TRUE))

sqrt(var(lm.fit$residuals)/(lm.fit$df.residual)) 
pred$se.fit

如果您运行上面的代码,您会看到点估计值相同,但我得到的标准误差略有不同,因此置信区间略有偏差。 R如何匹配标准错误?

我在predict.lm()(下面)的文档中看到R在predict.lm函数中使用pred.var,但pred.var使用res.var,并没有说res.var在哪里来自。 res.var也与残差的方差不匹配:

var(lm.fit$residuals)

http://127.0.0.1:25345/library/stats/html/predict.lm.html

谢谢!

1 个答案:

答案 0 :(得分:2)

您将预测间隔标准误差(对于新观察)与置信区间标准误差(对于平均响应)混淆。

具体而言,对于预测,SE在标准误差的表达式中具有额外的1。我在下面显示完整的计算。

请参阅以下代码:

set.seed(3)
x <- rnorm(392, 20, 5)
y <- 2*x + 3 + rnorm(392, sd=3)

lm.fit <- lm(y~x)

如果这是一个新观察,你需要在比例因子中加1(见第一个术语

pred <- predict(lm.fit,data.frame(x=(c(20))), interval="prediction", se.fit = TRUE)
MSE <- sum(lm.fit$residuals^2)/(length(x)-2)
Scaling_factor = (1 + 1/length(x) + ((20 - mean(x))^2) / sum( (x- mean(x))^2     ))
est - qt(.975, length(x)-2)*sqrt(MSE*Scaling_factor)
est + qt(.975, length(x)-2)*sqrt(MSE*Scaling_factor)

如果您预测平均响应(这通常是线性回归),您就不需要该术语。

pred <- predict(lm.fit,data.frame(x=(c(20))), interval="confidence", se.fit = TRUE)
MSE <- sum(lm.fit$residuals^2)/(length(x)-2)
Scaling_factor = (1/length(x) + ((20 - mean(x))^2) / sum( (x- mean(x))^2     ))
est - qt(.975, length(x)-2)*sqrt(MSE*Scaling_factor)
est + qt(.975, length(x)-2)*sqrt(MSE*Scaling_factor)

注意它们现在完美匹配。对于数学分析,请看一下这篇伟大的文章:

Linear Regression for the mean response and for an individual response

具体而言,对于平均回应:

enter image description here

然而,对于个人观察:

enter image description here

额外&#34; 1&#34;是什么让你与众不同。基本思路是,当您预测单个响应时,会有额外的随机性,因为您对MSE的估计会计算平均响应值周围的可变性,而不是个别响应值

直观地说,这很有道理。作为您的观察数量 - &gt;无穷大1使标准误差保持为0(因为任何一个人总是有一些变化)。

希望有所帮助!