【问题标题】:Produce nice linear regression plot (fitted line, confidence / prediction bands, etc)生成漂亮的线性回归图(拟合线、置信度/预测带等)
【发布时间】:2016-11-07 13:25:01
【问题描述】:

我有这个未来 10 年回归的样本。

date<-as.Date(c("2015-12-31", "2014-12-31", "2013-12-31", "2012-12-31"))
value<-c(16348, 14136, 12733, 10737)
#fit linear regression
model<-lm(value~date)
#build predict dataframe
dfuture<-data.frame(date=seq(as.Date("2016-12-31"), by="1 year", length.out = 10))
#predict the futurne
predict(model, dfuture, interval = "prediction")

如何为此添加置信区间?

【问题讨论】:

  • 与上述没有重复。 OP 要求的是置信区间而不是置信区间。
  • @Zheyuan Li 我也不认为它是重复的。首先,术语的使用很奇怪。如果有人正在寻找它并使用正确的术语,他可能不会找到它。其次,我们这里有线性回归的特殊情况,其他答案中没有提到。令人惊讶的是(对我来说也是如此),如果你寻找[r] confidence band linear regressions,你不会得到一个好的结果。所以我认为这个问题很好。但我也确信在 SO 上有很多解决方案。但是,如果您找不到他们,他们如何提供帮助?

标签: r plot regression linear-regression lm


【解决方案1】:

以下代码将为您生成漂亮的回归图。我的代码中的 cmets 应该清楚地解释一切。该代码将使用valuemodel,就像您的问题一样。

## all date you are interested in, 4 years with observations, 10 years for prediction
all_date <- seq(as.Date("2012-12-31"), by="1 year", length.out = 14)

## compute confidence bands (for all data)
pred.c <- predict(model, data.frame(date=all_date), interval="confidence")

## compute prediction bands (for new data only)
pred.p <- predict(model, data.frame(date=all_date[5:14]), interval="prediction")

## set up regression plot (plot nothing here; only set up range, axis)
ylim <- range(range(pred.c[,-1]), range(pred.p[,-1]))
plot(1:nrow(pred.c), numeric(nrow(pred.c)), col = "white", ylim = ylim,
     xaxt = "n", xlab = "Date", ylab = "prediction",
     main = "Regression Plot")
axis(1, at = 1:nrow(pred.c), labels = all_date)

## shade 95%-level confidence region
polygon(c(1:nrow(pred.c),nrow(pred.c):1), c(pred.c[, 2], rev(pred.c[, 3])),
        col = "grey", border = NA)

## plot fitted values / lines
lines(1:nrow(pred.c), pred.c[, 1], lwd = 2, col = 4)

## add 95%-level confidence bands
lines(1:nrow(pred.c), pred.c[, 2], col = 2, lty = 2, lwd = 2)
lines(1:nrow(pred.c), pred.c[, 3], col = 2, lty = 2, lwd = 2)

## add 95%-level prediction bands
lines(4 + 1:nrow(pred.p), pred.p[, 2], col = 3, lty = 3, lwd = 2)
lines(4 + 1:nrow(pred.p), pred.p[, 3], col = 3, lty = 3, lwd = 2)

## add original observations on the plot
points(1:4, rev(value), pch = 20)

## finally, we add legend
legend(x = "topleft", legend = c("Obs", "Fitted", "95%-CI", "95%-PI"),
       pch = c(20, NA, NA, NA), lty = c(NA, 1, 2, 3), col = c(1, 4, 2, 3),
       text.col = c(1, 4, 2, 3), bty = "n")

JPEG由代码生成:

jpeg("regression.jpeg", height = 500, width = 600, quality = 100)
## the above code
dev.off()
## check your working directory for this JPEG
## use code getwd() to see this director if you don't know

从剧情中可以看出,

  • 随着您尝试远离观察到的数据进行预测,置信带会变宽;
  • 预测区间比置信区间宽。

如果您想了解更多关于 predict.lm() 如何在内部计算置信区间/预测区间的信息,请阅读 How does predict.lm() compute confidence interval and prediction interval? 以及我的答案。

感谢Alex对visreg包的简单使用演示;但我还是更喜欢使用 R 基础。

【讨论】:

  • 我认为这些不是置信区间。
  • 我认为您使用这些术语的方式与我不同。对于预测,我将其称为预测带,就像维基百科一样 en.wikipedia.org/wiki/…。我将使用术语置信区间来表示回归参数的区间,如下所述:en.wikipedia.org/wiki/Confidence_interval
  • @ZheyuanLi 这两个图可以作为一个连续体显示吗?我的意思是,从你的底部情节开始,然后继续你的顶部情节?
【解决方案2】:

您可以简单地使用visreg::visreg

library(visreg)
visreg(model)

如果您对这些值感兴趣:

> head(visreg(model)$fit)
        date   value visregFit visregLwr visregUpr
1 2012-12-31 13434.5  10753.10  9909.073  11597.13
2 2013-01-10 13434.5  10807.81  9974.593  11641.02
3 2013-01-21 13434.5  10862.52 10040.033  11685.00
4 2013-02-01 13434.5  10917.22 10105.389  11729.06
5 2013-02-12 13434.5  10971.93 10170.658  11773.21
6 2013-02-23 13434.5  11026.64 10235.837  11817.44

【讨论】:

  • 对不起,为什么 Y 轴的值与之前的图不同?
  • @Oposum 我认为这是因为另一个情节使用了未来的数据。但如果你这样做,你不应该使用自信带,而是使用预测带。置信带与您用于估计回归线的数据相关。而预测波段应该用于新数据。
  • 我现在明白了,我的意思是预测带。置信带和预测带可以连续显示吗?
猜你喜欢
  • 2020-03-02
  • 2022-01-13
  • 1970-01-01
  • 2021-12-13
  • 2020-10-22
  • 2019-01-22
  • 2019-08-29
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多