r - qqplot2 中的 LOESS 置信区间过窄

标签 r ggplot2 continuous-integration loess

在使用 LOESS 平滑时,我无法理解如何在 ggplot2 中计算置信区间。从其他几个线程中,我的理解是 ggplot2 使用基于回归标准误差计算的 t 间隔,即使用实际数据点与 LOESS 线之间的距离。但我认为,根据 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))

这是结果图:

Graph

在图表的左侧(例如,1920-1940 年),点紧紧围绕 LOESS 线排列,并且大部分位于置信区间内。但从 1960 年到 1980 年左右,它们无处不在,但置信区间的宽度似乎大致相同。我想我一定是误解了 CI 的工作原理,因为这看起来不直观。

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

最佳答案

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

我们可以说明 geom_smooth 如何通过手动计算来估计置信区间。让我们从使用最无聊的可重现示例开始。 stats 包中的 mtcars(包含在基础 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)

现在输出: Image of loess smoother produced by the described code

除了由 ggplot 完成的一些平滑处理,以及为拟合值添加的点外,这很容易看出是相同的。

我希望这清楚了如何计算点置信区间。

关于r - qqplot2 中的 LOESS 置信区间过窄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58041940/

相关文章:

javascript - 如何在 Shiny 的某些单元格中创建带有空格的类似矩阵的复选框组?

删除任意网格线但保留 ggplot2 中各自的刻度线

r - R-将多图保存到文件

javascript - JavaScript 测试与 MSBuild/Visual Studio 的持续集成

按 list() 变量名而不是 R 中的索引重命名

r - 对 R 中的时间序列执行傅里叶分析

r - 根据R中的条件计算列之间的比率

r - ggplot 辅助 y 轴使用 sec_axis 显示 z 分数

mysql - travis mysql数据库创建用户报错

jenkins - 从另一个多分支管道触发多分支管道作业