Predict.lm() в R - как получить непостоянные полосы прогноза вокруг установленных значений - программирование
Подтвердить что ты не робот

Predict.lm() в R - как получить непостоянные полосы прогноза вокруг установленных значений

Итак, в настоящее время я пытаюсь сделать доверительный интервал для линейной модели. Я узнал, что для этого должен использовать pred.liz(), но у меня есть несколько проблем, которые действительно понимают функцию, и мне не нравятся функции, не зная, что происходит. Я нашел несколько советов по этому вопросу, но только с соответствующим R-кодом, никаких реальных объяснений. Это сама функция:

## S3 method for class 'lm'
predict(object, newdata, se.fit = FALSE, scale = NULL, df = Inf,
        interval = c("none", "confidence", "prediction"),
        level = 0.95, type = c("response", "terms"),
        terms = NULL, na.action = na.pass,
        pred.var = res.var/weights, weights = 1, ...)

Теперь, что мне трудно понять:

    1) newdata  
    An optional data frame in which to look for variables 
    with which to predict. If omitted, the fitted values are used.
  • Кажется, что для этого используются новые данные, но я не могу понять, почему. Для расчета доверительного интервала мне, очевидно, нужны данные, для которых этот интервал (например, # наблюдений, среднее значение x и т.д.), Поэтому не может быть того, что подразумевается под ним. Но тогда: что это значит?

    2) interval
    Type of interval calculation.

  • ладно.. но что такое "нет"?

    3a) type
    Type of prediction (response or model term).

    3b) terms
    If type="terms", which terms (default is all terms)

  • 3a: Могу ли я этим получить доверительный интервал для одной конкретной переменной в моей модели? И если да, то для чего тогда 3b? Если я могу указать термин в 3a, это не имеет смысла делать это снова в 3b.. поэтому, я думаю, я снова ошибаюсь, но я не могу понять, почему.

Я думаю, некоторые из вас могут подумать: почему бы просто не попробовать это? И я бы (даже если бы это могло бы не решить все здесь), но я прямо сейчас не знаю, как это сделать. Поскольку я не сейчас, для чего нужны newdata, я не знаю, как его использовать, и если я попытаюсь, я не получу правильный доверительный интервал. Как-то очень важно, как вы выбираете эти данные, но я просто не понимаю!

EDIT: Я хочу добавить, что мое намерение - понять, как работает sched.lm. Под этим я подразумеваю, что не понимаю, работает ли это так, как я думаю. То есть он вычисляет y-hat (предсказанные значения), а затем использует добавление/вычитание для каждой границы upr/lwr интервала для вычисления нескольких точек данных (тогда выглядит как доверительная линия)? Тогда я бы предпочел, почему необходимо иметь такую ​​же длину в newdata, что и в линейной модели.

4b9b3361

Ответ 1

Составьте некоторые данные:

d <- data.frame(x=c(1,4,5,7),
                y=c(0.8,4.2,4.7,8))

Установите модель:

lm1 <- lm(y~x,data=d)

Интервалы доверия и прогнозирования с исходными значениями x:

p_conf1 <- predict(lm1,interval="confidence")
p_pred1 <- predict(lm1,interval="prediction")

Conf. и пред. интервалы с новыми значениями x (экстраполяция и более мелкие/равномерные интервалы, чем исходные данные):

nd <- data.frame(x=seq(0,8,length=51))
p_conf2 <- predict(lm1,interval="confidence",newdata=nd)
p_pred2 <- predict(lm1,interval="prediction",newdata=nd)

Сплоть все вместе:

par(las=1,bty="l") ## cosmetics
plot(y~x,data=d,ylim=c(-5,12),xlim=c(0,8)) ## data
abline(lm1) ## fit
matlines(d$x,p_conf1[,c("lwr","upr")],col=2,lty=1,type="b",pch="+")
matlines(d$x,p_pred1[,c("lwr","upr")],col=2,lty=2,type="b",pch=1)
matlines(nd$x,p_conf2[,c("lwr","upr")],col=4,lty=1,type="b",pch="+")
matlines(nd$x,p_pred2[,c("lwr","upr")],col=4,lty=2,type="b",pch=1)

введите описание изображения здесь

Использование новых данных позволяет экстраполяцию за пределы исходных данных; Кроме того, если исходные данные имеют рассеянное или неравномерное расстояние, интервалы прогнозирования (которые не являются прямыми линиями) могут быть недостаточно аппроксимированы линейной интерполяцией между исходными значениями х...

Я не совсем уверен, что вы подразумеваете под "доверительным интервалом для одной конкретной переменной в моей модели"; если вам нужны доверительные интервалы для параметра, то вы должны использовать confint. Если вы хотите предсказания изменений, основанные только на некоторых изменениях параметров (игнорируя неопределенность из-за других параметров), вы действительно хотите использовать type="terms".

interval="none" (по умолчанию) просто говорит R не беспокоить вычисление любых интервалов уверенности или прогноза и возвращать только предсказанные значения.