Вероятно, вы запутались в разнице между доверием и интервалом прогнозирования.Доверительные интервалы, которые используются в 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)
Теперь для вывода: ![Image of loess smoother produced by the described code](https://i.stack.imgur.com/DQnnz.png)
За исключением некоторого сглаживаниясделанный ggplot
, и добавленные точки для подобранных значений это легко увидеть, чтобы быть идентичными.
Надеюсь, это прояснит, как рассчитывается доверительный интервал очков.