为lm对象绘制95%置信区间

11
我该如何在R中计算和绘制回归的置信区间?目前我有两个长度相等的数值向量(x,y),以及一个回归对象(lm.out)。我已经绘制了y关于x的散点图,并将回归直线添加到了这个图中。我正在寻找一种方法来将lm.out的95%预测置信带添加到图中。我尝试使用predict函数,但是我甚至不知道从哪里开始:/。这是我目前的代码:
x=c(1,2,3,4,5,6,7,8,9,0)
y=c(13,28,43,35,96,84,101,110,108,13)

lm.out <- lm(y ~ x)

plot(x,y)

regression.data = summary(lm.out) #save regression summary as variable
names(regression.data) #get names so we can index this data
a= regression.data$coefficients["(Intercept)","Estimate"] #grab values
b= regression.data$coefficients["x","Estimate"]
abline(a,b) #add the regression line

谢谢!

编辑: 我已经查看了提出的重复内容,但是还不能完全理解。


2
https://dev59.com/TGYq5IYBdhLWcg3w8VG8?rq=1 - Guilherme Marthe
2
可能是绘制置信区间的重复问题。 - Guilherme Marthe
我看了一下那个,它并没有完全帮助到我。我认为那位发帖者不是在寻找和我一样的东西。 - Max Lester
2个回答

18
你需要使用 predict 函数来对新的数据向量进行预测,这里是 newx
x=c(1,2,3,4,5,6,7,8,9,0)

y=c(13,28,43,35,96,84,101,110,108,13)

lm.out <- lm(y ~ x)
newx = seq(min(x),max(x),by = 0.05)
conf_interval <- predict(lm.out, newdata=data.frame(x=newx), interval="confidence",
                         level = 0.95)
plot(x, y, xlab="x", ylab="y", main="Regression")
abline(lm.out, col="lightblue")
lines(newx, conf_interval[,2], col="blue", lty=2)
lines(newx, conf_interval[,3], col="blue", lty=2)

编辑

正如Ben在评论中提到的那样,可以使用以下方法使用matlines完成此操作:

plot(x, y, xlab="x", ylab="y", main="Regression")
abline(lm.out, col="lightblue")
matlines(newx, conf_interval[,2:3], col = "blue", lty=2)

你可以通过 matlines(newx, conf_interval[,2:3], ...) 稍微简化一下。 - Ben Bolker
@Ben Bolker,你会怎么做,我从未使用过matlines - Alejandro Andrade
@BenBolker TIL matpointsmatlines可以作为matplot的简化版本/用于points/lines的类似物,谢谢 :) - MichaelChirico
使用matlines时,我得到了以下错误信息:matplot(x = x, y = y, type = type, lty = lty, lwd = lwd, pch = pch, : 'x' 和 'y' 必须具有相同的行数。 - Another.Chemist
使用Lines是可以的,但在图形中没有绘制任何内容。 - Another.Chemist

12

我将添加一个小技巧,如果在尝试@Alejandro Andrade给出的方法时,这个技巧可以帮助你避免很多的挫败感:如果你的数据在数据框中,那么当你使用lm()构建模型时,使用data=参数而不是$符号。例如,使用

lm.out <- lm(y ~ x, data = mydata)

而不是

lm.out <- lm(mydata$y ~ mydata$x)

如果您选择后者,那么这个声明

predict(lm.out, newdata=data.frame(x=newx), interval="confidence", level = 0.95)

看起来要么忽略了使用newdata=传递的新值,要么存在一个静默错误。无论哪种情况,输出结果都是原始数据的预测结果,而不是新数据。

此外,请确保在新数据框中,您的x变量与原始数据中的变量名称相同。这更容易发现,因为会出现错误,但事先知道可能会节省您一轮调试时间。

注意:尝试将此作为评论添加,但没有足够的声望点数。


1
遇到了相同的问题,使用predict!时出现了这个问题。 - uPhone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接