在R中使用Predict.lm() - 如何获得围绕拟合值的非常数预测区间

15

我目前正在尝试绘制线性模型的置信区间。我发现应该使用predict.lm()来实现,但我对该函数的理解还存在一些问题,并且我不喜欢在不了解内部机制的情况下使用函数。我找到了一些关于此主题的指南,但仅附有相应的R代码,没有真正的解释。 这是函数本身:

## S3 method for class 'lm'
predict(object, newdata, se.fit = FALSE, scale = NULL, df = Inf,
        interval = c("none", "confidence", "prediction"),
        level = 0.95, type = c("response", "terms"),
        terms = NULL, na.action = na.pass,
        pred.var = res.var/weights, weights = 1, ...)

现在,我遇到的困难是:

    1) newdata  
    An optional data frame in which to look for variables 
    with which to predict. If omitted, the fitted values are used.
  • 大家似乎都用newdata,但我不太明白为什么。对于计算置信区间,我显然需要用到这个区间所属的数据(例如观测值数量、x的均值等),因此它不能是所指的内容。但是:它是什么意思呢?

    2) interval
    区间计算类型。

  • 好的...但"none"是什么意思?

    3a) type
    预测类型(响应或模型术语)。

    3b) terms
    如果type="terms",则使用哪些术语(默认为所有术语)

  • 3a: 我能否通过这种方式获取模型中一个特定变量的置信区间?如果可以,那么3b是用来做什么的?如果我可以在3a中指定术语,那么在3b中再次进行指定就没有意义了...所以我猜又错了,但我不知道错在哪里。

我想你们中的一些人可能会认为:为什么不试一下呢?虽然这可能不能解决所有问题,但我会尝试的,但现在我不知道该怎么做。由于我不知道newdata是什么,所以我不知道该如何使用它,如果我尝试,我就无法得到正确的置信区间。不知怎么地,选择数据的方式非常重要,但我就是不明白!

编辑:我想补充一下,我的意图是理解predict.lm的工作原理。我的意思是,我不明白它是否按照我想的那样工作。也就是说,它先计算y-hat(预测值),然后对于每个上限/下限边界分别添加/减去,以计算多个数据点(看起来像置信线)。那么我就会明白为什么需要在新数据中具有与线性模型相同的长度。


我想这就是让我困惑的地方:“predict.lm生成预测值,通过在新数据框架中评估回归函数获得”(在一般解释中),以及“如果省略newdata,则基于用于拟合的数据进行预测。”对于newdata。为什么我要尝试获取与我的实际回归无关的置信区间?这就是我理解这句话的方式,所以这就是让我困惑的原因。 然后它解释了在这种情况下如何处理缺失值,但我已经在第一部分遇到了困难! - lisa
2
你可能对针对新观测值的_预测_区间感兴趣。 - joran
那么它完全让我困惑,为什么newdata必须具有与拟合模型相同数量的观测值?! - lisa
1
newdata 不需要与拟合模型具有相同数量的观测值... - Ben Bolker
我认为我们需要一个可重现的示例来查看出了什么问题。请参见下面的答案... - Ben Bolker
显示剩余3条评论
1个回答

22

制造一些数据:

d <- data.frame(x=c(1,4,5,7),
                y=c(0.8,4.2,4.7,8))

训练模型:

lm1 <- lm(y~x,data=d)

使用原始x值的置信区间和预测区间:

p_conf1 <- predict(lm1,interval="confidence")
p_pred1 <- predict(lm1,interval="prediction")

使用新的 x 值(比原始数据更细/均匀)进行置信区间和预测区间:

nd <- data.frame(x=seq(0,8,length=51))
p_conf2 <- predict(lm1,interval="confidence",newdata=nd)
p_pred2 <- predict(lm1,interval="prediction",newdata=nd)

将所有内容绘制在一起:

par(las=1,bty="l") ## cosmetics
plot(y~x,data=d,ylim=c(-5,12),xlim=c(0,8)) ## data
abline(lm1) ## fit
matlines(d$x,p_conf1[,c("lwr","upr")],col=2,lty=1,type="b",pch="+")
matlines(d$x,p_pred1[,c("lwr","upr")],col=2,lty=2,type="b",pch=1)
matlines(nd$x,p_conf2[,c("lwr","upr")],col=4,lty=1,type="b",pch="+")
matlines(nd$x,p_pred2[,c("lwr","upr")],col=4,lty=2,type="b",pch=1)

enter image description here

使用新数据可以对原始数据进行外推;而且,如果原始数据稀疏或不均匀分布,则预测区间(它们不是直线)可能不能很好地通过在原始x值之间进行线性插值来近似...

我不太确定你所说的“我的模型中某个特定变量的置信区间”的意思是什么;如果你想要置信区间的参数,那么应该使用confint。如果你想要基于一些参数变化的预测(忽略由其他参数引起的不确定性),那么确实需要使用type="terms"

interval="none"(默认设置)只是告诉R不要计算任何置信度或预测区间,并返回预测值。


有没有人可以简单解释一下预测和置信区间的区别?我的理解是:置信区间可以让你知道在95%的情况下,所使用的总体均值可能会落在哪里。而预测区间则不是关于均值,而是关于未出现在数据中的y值的未来值。这个理解正确吗? - lisa
2
我可以建议您谷歌搜索“预测区间”“置信区间”……?答案都在那里……如果您在那里找不到所需的内容,那么您应该在http://stats.stackexchange.com上提问,因为我们已经超出了编程领域……另外:https://dev59.com/DGDVa4cB1Zd3GeqPgcJ0 - Ben Bolker

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