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

lis*_*isa 14 regression r

所以我目前正在尝试绘制线性模型的置信区间.我发现我应该使用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, ...)
Run Code Online (Sandbox Code Playgroud)

现在,我难以理解:

    1) newdata  
    An optional data frame in which to look for variables 
    with which to predict. If omitted, the fitted values are used.
Run Code Online (Sandbox Code Playgroud)
  • 每个人似乎都使用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使用加/减来计算几个数据点(然后看起来像一个置信线)?然后,我要指出为什么必须在新数据中使用与线性模型中相同的长度.

Ben*_*ker 21

补充一些数据:

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

适合模型:

lm1 <- lm(y~x,data=d)
Run Code Online (Sandbox Code Playgroud)

具有原始x值的置信度和预测间隔:

p_conf1 <- predict(lm1,interval="confidence")
p_pred1 <- predict(lm1,interval="prediction")
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

将所有内容绘制在一起:

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

使用新数据允许在原始数据之外进行推断; 此外,如果原始数据稀疏或不均匀地间隔,则预测间隔(不是直线)可能无法通过原始x值之间的线性插值很好地近似...

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

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

  • 我可以建议你google'"预测间隔""置信区间"'......?答案就在那里......如果你没有得到你需要的东西,那么你应该在http://stats.stackexchange.com上询问,因为我们已经超越了编程领域...还:http:http ://stackoverflow.com/questions/9406139/r-programming-predict-prediction-vs-confidence (2认同)