R中的Predict.lm() - 如何在拟合值周围得到非常量预测带

时间:2012-09-22 13:14:40

标签: r regression

所以我目前正在尝试绘制线性模型的置信区间。我发现我应该使用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
    Type of interval calculation.

  • 好吧..但是什么是“无”?

    3a) type
    Type of prediction (response or model term).

    3b) terms
    If type="terms", which terms (default is all terms)

  • 3a:我能否获得模型中某个特定变量的置信区间?如果是这样,那么3b是什么?如果我可以在3a中指定术语,那么再次在3b中执行它是没有意义的。所以我想我又错了,但我无法弄清楚为什么。

我想你们中的一些人可能会想:为什么不试试呢?我会(即使它可能不会解决这里的一切),但我现在不知道如何。因为我现在不知道新数据是什么,我不知道如何使用它,如果我尝试,我没有得到正确的置信区间。不知何故,你选择那些数据非常重要,但我只是不明白!

编辑:我想补充一点,我的目的是了解predict.lm的工作原理。我的意思是我不明白它是否像我认为的那样工作。也就是说它计算y-hat(预测值),然后对每个区间的upr / lwr-bound使用加/减来计算几个数据点(然后看起来像一个置信线)?然后,我要指出为什么必须在新数据中使用与线性模型相同的长度。

1 个答案:

答案 0 :(得分:21)

制作一些数据:

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")

CONF。和pred。具有新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不要计算任何置信度或预测间隔,只返回预测值。