Как я могу наложить модифицированные лессовые линии на qplot ggplot2?

Задний план

Прямо сейчас я создаю линейную модель с несколькими предикторами и строю диагностические графики для оценки допущений регрессии. (Это для класса статистики множественного регрессионного анализа, который мне нравится в данный момент :-)

В моем учебнике (Коэн, Коэн, Уэст и Айкен, 2003) рекомендуется строить график зависимости каждого предиктора от остатков, чтобы убедиться, что:

  1. Остатки систематически не коррелируют с предиктором
  2. Остатки гомоскедастичны по отношению к каждому предиктору в модели.

По пункту (2) в моем учебнике сказано следующее:

Некоторые статистические пакеты позволяют аналитику строить линии соответствия с наименьшим значением среднего значения остатков (0-линия), 1 стандартное отклонение выше среднего и 1 стандартное отклонение ниже среднего значения остатков... В данном случае {их пример}, две линии {среднее + 1sd и среднее - 1sd} остаются примерно параллельными линии минимума {0}, что согласуется с интерпретацией, согласно которой дисперсия остатков не изменяется как функция X. (стр. 131)

Как изменить лессовые линии?

Я знаю, как создать диаграмму рассеяния с «0-строкой»:

    # First, I'll make a simple linear model and get its diagnostic stats
    library(ggplot2)
    data(cars)
    mod <- fortify(lm(speed ~ dist, data = cars))
    attach(mod)
    str(mod)

    # Now I want to make sure the residuals are homoscedastic
    qplot (x = dist, y = .resid, data = mod) + 
    geom_smooth(se = FALSE) # "se = FALSE" Removes the standard error bands

Но кто-нибудь знает, как я могу использовать ggplot2 и qplot для создания графиков, на которых будут накладываться линии 0, «среднее + 1sd» и «среднее - 1sd»? Это странный/сложный вопрос?


person briandk    schedule 28.03.2010    source источник
comment
Как бы то ни было, я не привязан к ggplot2. Я только что обнаружил, что это действительно интуитивно понятный и мощный пакет для отображения данных, особенно с учетом того, что я новичок в R :-)   -  person briandk    schedule 28.03.2010
comment
Я не уверен, чего ты хочешь. Разве это не просто 68% доверительный интервал? Меня всегда учили строить абсолютные остатки и лёсс. Это более простая проверка на переменную дисперсию.   -  person hadley    schedule 28.03.2010
comment
Хэдли. Моя книга дает пример гомоскедастичности и два примера гетероскедастичности: picasaweb. google.com/brian.danielak/ На второй и третьей фотографиях линия 0 для лесса вообще не сильно качается, но линии +1sd и -1sd выявляют закономерность в остатках. Конечно, узоры видны без лесса, но что, если бы они были менее заметны на графике? Я не могу сказать, находится ли моя проблема на уровне кодирования или на уровне концептуальной статистики. Учитывая данные на этих картинках, как бы вы подумали об оценке гомоскедастичности?   -  person briandk    schedule 28.03.2010
comment
Поправьте меня, если я ошибаюсь, Хэдли, но я считаю, что стандартные ошибки для лёсса вычисляются с учетом гомоскедазисности (через остаточную шкалу). Briandk, это не отвечает на ваш вопрос, но я бы использовал что-то вроде: qplot (x = dist, y = abs(.resid), data = mod) + geom_smooth(), и если линия не плоская, используйте hccm .   -  person Ian Fellows    schedule 28.03.2010
comment
... Жаль, что я не знал о fortify() 2 часа назад.   -  person Matt Parker    schedule 29.03.2010
comment
@Matt - Хорошая новость в том, что теперь ты знаешь об этом!   -  person briandk    schedule 30.03.2010


Ответы (3)


извинения

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

Мы получаем 68% доверительный интервал бесплатно

geom_smooth() по умолчанию используется loess сглаживание, и оно накладывает линии +1sd и -1sd как часть сделки. Именно это имел в виду Хэдли, когда сказал: «Разве это не просто 68% доверительный интервал?» Я просто совершенно забыл, что такое интервал 68% , и продолжал искать то, что я уже знал, как это сделать. Не помогло и то, что я фактически отключил доверительные интервалы отключил в своем коде, указав geom_smooth(se = FALSE).

Как должен был выглядеть мой пример кода

# First, I'll make a simple linear model and get its diagnostic stats.
library(ggplot2)
data(cars)
mod <- fortify(lm(speed ~ dist, data = cars))
attach(mod)
str(mod)

# Now I want to make sure the residuals are homoscedastic.
# By default, geom_smooth is loess and includes the 68% standard error bands.
qplot (x = dist, y = .resid, data = mod) + 
geom_abline(slope = 0, intercept = 0) +
geom_smooth() 

Что я узнал

Хэдли реализовал действительно красивый и простой способ получить то, что я всегда хотел. Но поскольку я сосредоточился на лёссовых линиях, я упустил из виду тот факт, что доверительный интервал 68% был ограничен именно теми линиями, которые мне были нужны. Извините за беспокойство, все.

person briandk    schedule 30.03.2010
comment
ладно, я думал там что-то странное в вопросе :-). Спасибо за то, что хоть как-то прояснили - person dalloliogm; 30.03.2010

Не могли бы вы рассчитать значения стандартного отклонения +/- по данным и добавить на график их подобранную кривую?

person djq    schedule 28.03.2010
comment
Отличное предложение, хотя я не думаю, что оно сработает. Коэн и др. (2003) добавляют следующее: Две другие линии {среднее + 1sd и среднее - 1sd} создаются с использованием процедуры наименьшего значения для оценки значений на 1 стандартное отклонение выше и на 1 стандартное отклонение ниже наименьшей линии. Поскольку вычисления sd (кажется) являются фактически точечными вычислениями в алгоритме lowess, я не уверен, что ваше предложение точно даст то, что мы хотим. Если вы имеете в виду вычисление sd набора данных, а затем добавьте/вычтите это из самых низких оценок, это создаст точные копии кривой :-( - person briandk; 28.03.2010
comment
А, понятно... Спасибо за объяснение. Еще один хороший источник советов по ggplot2 — [email protected], поэтому, если вы не решите свой вопрос здесь, это вариант (также существует тег ggplot2) - person djq; 28.03.2010

Посмотрите на мой вопрос "изменить lm или лессовая функция.."

Я не уверен, что очень хорошо понял ваш вопрос, но, может быть:

+ stat_smooth(method=yourfunction)

будет работать, если вы определите свою функцию как описано здесь.

person dalloliogm    schedule 29.03.2010
comment
@dalliologm - Спасибо за предложение! Оказывается (см. ниже), мне даже не нужно задавать пользовательский yourfunction, потому что доверительные интервалы по умолчанию для geom_smooth() ограничены именно теми линиями, которые я все время пытался построить. - person briandk; 30.03.2010