r - qqplot2中的LOESS置信区间过窄
问题描述
ggplot2
在使用 LOESS 平滑时,我无法理解如何计算置信区间。从其他几个线程来看,我的理解是ggplot2
使用基于回归标准误差计算的 t 间隔,即使用实际数据点与黄土线之间的距离。但我认为根据ggplot2
产生的置信区间我一定是错误的。这是示例代码(实际上qplot
在这种情况下,但我认为结果应该是相同的):
qplot(Year, Purposivism, data=fig1.dat, geom=c('point', 'smooth'), level=0.99, span=0.5, method='loess', ylab="Term Frequency per Million Words") +
theme_bw() +
theme(text=element_text(family="Century", size=12)) +
expand_limits(y = 0) +
scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
theme(axis.text.x = element_text(angle = 45, hjust=1))
这是结果图:
在图的左侧(例如,1920-1940),这些点紧紧地围绕着 LOESS 线排列,并且大部分位于置信区间内。但从 1960 年到 1980 年左右,它们无处不在,但置信区间的宽度似乎大致相同。我想我一定是误解了 CI 的工作原理,因为这似乎不直观。
在此先感谢您的帮助!很高兴提供任何其他可能有用的信息。
解决方案
您可能会感到困惑的是置信区间和预测区间之间的差异。置信区间,其中使用的geom_smooth
是估计平均值的预测置信度。这是衡量您的观察平均值在点估计时偏离多远的量度。有predict.lm
一个添加选项interval = "prediction"
,它将为您提供预测间隔。预测区间包含来自 的误差项的不确定性y ~ x %*% beta + epsilon
,而置信区间仅包含来自 的固定效应不确定性y ~ x %*% beta
。我没有研究loess
曲线的预测区间,以及其他非参数和半参数平滑器,但它似乎没有在?predict.loess
我们可以说明如何geom_smooth
通过手动计算来估计置信区间。让我们从使用最无聊的可重现示例开始。mtcars
从stats
包中(包含在 base 中R
)。
data(mtcars)
fit <- loess(mpg ~ hp, data = mtcars)
preds <- predict(fit, se = TRUE)
names(preds)
#[1] "fit" "se.fit" "residual.scale" "df"
为了计算置信区间,我们使用您正确指定的标准公式。
T <- qt(p = 0.975, df = preds$df)
lwr <- preds$fit - T * preds$se.fit
upr <- preds$fit + T * preds$se.fit
为了创建正确的置信区间图,我将所有必要的信息合并为一个data.frame
,同时对输入进行排序,以确保正确的行顺序。
ord <- order(mtcars$hp)
plotData <- data.frame(lwr = lwr[ord],
upr = upr[ord],
fit = preds$fit[ord],
hp = mtcars$hp[ord],
mpg = mtcars$mpg[ord])
最后但同样重要的是,我们只需要创建情节,并将其与由ggplot2
p1 <- ggplot(plotData, aes(x = hp, ymax = upr, ymin = lwr)) +
#Data points
geom_point(aes(y = mpg)) +
#Line from prediction
geom_line(aes(y = fit)) +
#Points from prediction
geom_point(aes(y = fit)) +
#Confidence interval
geom_ribbon(alpha = 0.3, col = "thistle1") +
labs(title = "manual")
p2 <- ggplot(mtcars, aes(x = hp, y = mpg)) +
geom_point() +
geom_smooth() +
labs(title = "ggplot2")
#Merge plots
library(gridExtra)
grid.arrange(p1, p2, ncol = 1)
除了由 完成的一些平滑ggplot
,以及拟合值的添加点,这很容易看出是相同的。
我希望这可以清除点置信区间的计算方式。
推荐阅读
- pdf - 如何创建带有倾斜文本的倾斜 SVG 图像
- bash - BigQuery“合并:找不到命令”命令不起作用
- java - Spring Cloud Contracts - 没有为主题设置消费者 [...]
- c# - 是否可以通过 C# 连接到不同的 oracle 数据库版本?
- php - 从字符串的开头删除一些特殊字符
- python - AttributeError:模块“cupy”没有属性“cupyx”
- ios - 当您将应用程序从后台带到前台时,无法触发 didReceive 通知委托
- c# - 如何将具有多个日期的字符串解析为列表
? - loops - 在循环中获取从一行到另一行的范围
- python - 如何使用循环从 JSON 中提取多个数据以创建 CSV