首页 > 解决方案 > 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 的工作原理,因为这似乎不直观。

在此先感谢您的帮助!很高兴提供任何其他可能有用的信息。

标签: rggplot2continuous-integrationloess

解决方案


您可能会感到困惑的是置信区间和预测区间之间的差异。置信区间,其中使用的geom_smooth是估计平均值的预测置信度。这是衡量您的观察平均值在点估计时偏离多远的量度。有predict.lm一个添加选项interval = "prediction",它将为您提供预测间隔。预测区间包含来自 的误差项的不确定性y ~ x %*% beta + epsilon,而置信区间仅包含来自 的固定效应不确定性y ~ x %*% beta。我没有研究loess曲线的预测区间,以及其他非参数和半参数平滑器,但它似乎没有在?predict.loess

我们可以说明如何geom_smooth通过手动计算来估计置信区间。让我们从使用最无聊的可重现示例开始。mtcarsstats包中(包含在 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,以及拟合值的添加点,这很容易看出是相同的。

我希望这可以清除点置信区间的计算方式。


推荐阅读