使用LOESS平滑处理时,我在理解如何在ggplot2
中计算置信区间时遇到了一些麻烦。从其他一些线程来看,我的理解是ggplot2
使用基于回归标准误差(即,使用实际数据点与LOESS线之间的距离)计算的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的工作方式,因为这似乎不直观。
预先感谢您的帮助!很高兴提供其他可能有用的信息。
答案 0 :(得分:0)
您可能会感到困惑的是置信度和预测间隔之间的差异。 geom_smooth
中使用的置信区间是对估计均值的预测置信度。这是对您的观测值的平均值与点估计值相差多少的度量。在predict.lm
中,有一个添加interval = "prediction"
的选项,它将为您提供预测间隔。预测区间包含来自y ~ x %*% beta + epsilon
的误差项中的不确定性,而置信区间仅包含来自y ~ x %*% beta
的固定效应不确定性。我没有研究loess
曲线以及其他非参数和半参数平滑器的预测间隔,但是似乎没有在?predict.loess
我们可以说明geom_smooth
如何通过手动计算来估计置信区间。让我们从最无聊的可复制示例开始。 mtcars
包中的stats
(包含在基本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
进行的某些平滑处理以及拟合值的加法点外,很容易看出它们是相同的。
我希望这可以弄清楚点的置信区间是如何计算的。