【问题标题】:Does geom_smooth() of ggplot2 show pointwise confidence bands, or simultaneous confidence bands?ggplot2 的 geom_smooth() 是否显示逐点置信带或同时置信带?
【发布时间】:2016-12-30 20:00:39
【问题描述】:

我不确定这个问题是否更适合这里或交叉验证。我希望我做出了正确的选择。

考虑这个例子:

library(dplyr)
setosa <- iris %>% filter(Species == "setosa") %>% select(Sepal.Length, Sepal.Width, Species)
library(ggplot2)
ggplot(data = setosa, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point() +
geom_smooth(method ="lm", formula = y ~ poly(x,2))

默认情况下,ggplot“显示平滑附近的置信区间”(参见here),由回归曲线周围的灰色区域给出。我一直认为这些是simultaneous confidence bands for the regression curve,而不是逐点置信带。 ggplot2 文档参考predict 函数,了解有关如何计算标准误差的详细信息。但是,阅读predict.lm 的文档时,并没有明确说明同时计算置信带。那么,这里的正确解释是什么?

【问题讨论】:

  • 我认为这在stats site 上更好,因为它似乎与 ggplot 关系不大,更多的是询问如何为线性回归计算置信区间:投票支持迁移跨度>
  • @WeihuangWong,感谢您的帮助,但您发布的链接讨论了置信区间和预测区间之间的差异。我不关心预测间隔。我只想知道predict.lm() 在用于计算置信度 带时,是计算同时 置信带还是逐点 置信带。
  • @user20650,你可能是对的。我特别问的是什么类型的置信区间ggplot 正在计算(逐点或同时)。这也是我最后选择在这里发帖的原因。无论如何,CV 可能更适合这个问题。我将对标题进行一些编辑以避免任何混淆,请稍等片刻。如果我没有收到任何答案,我会迁移(当然,假设版主到那时还没有迁移问题)。
  • 嗨 Delta:因为 ggplot 只使用代码 predict(.., interval = "confidence")(您可以手动建模并绘制检查),所以问题似乎减少到这个间隔代表什么。

标签: r ggplot2 regression confidence-interval


【解决方案1】:

检查predict.lm() 计算内容的一种方法是检查代码(predict 将标准错误乘以qt((1 - level)/2, df),因此似乎不会针对同时推理进行调整)。另一种方法是构建同时置信区间并将它们与predict 的区间进行比较。

拟合模型并构建同时置信区间:

setosa <- subset(iris, Species == "setosa")
setosa <- setosa[order(setosa$Sepal.Length), ]
fit <- lm(Sepal.Width ~ poly(Sepal.Length, 2), setosa)

K <- cbind(1, poly(setosa$Sepal.Length, 2))
cht <- multcomp::glht(fit, linfct = K)
cci <- confint(cht)

重塑和绘图:

cc <- as.data.frame(cci$confint)
cc$Sepal.Length <- setosa$Sepal.Length
cc <- reshape2::melt(cc[, 2:4], id.var = "Sepal.Length")

library(ggplot2)
ggplot(data = setosa, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point() +
  geom_smooth(method ="lm", formula = y ~ poly(x,2)) +
  geom_line(data = cc, 
            aes(x = Sepal.Length, y = value, group = variable),
            colour = "red")

似乎predict(.., interval = "confidence") 不会同时产生置信区间:

【讨论】:

  • 谢谢!不过,您能否在代码中添加一点解释? ggplot 部分是相当不言自明的,但是一些关于之前行的 cmets 可能会使答案更普遍有用。例如,为什么需要重新排序setosa?包multcomp中的函数glht是做什么的?
  • 重新排序 setosa 只是为了让线条在绘图上正确呈现(否则它们会来回曲折)。至于multcomp::glht,不幸的是我没有信心给你一个准确或有用的解释(除了这是一种同时获得置信区间的方法),所以你最好发布一个后续问题(在这里或在简历上)。
  • 谢谢!我也想知道你为什么不导入包multcomp...发现它掩盖了dplyrselect
猜你喜欢
  • 2013-10-09
  • 1970-01-01
  • 2023-04-06
  • 2016-05-11
  • 1970-01-01
  • 2016-01-10
  • 2011-09-18
  • 2017-12-31
相关资源
最近更新 更多