Нахождение подогнанных и прогнозируемых значений для статистической модели

12

Допустим, у меня есть следующие данные и я использую модель регрессии:

df=data.frame(income=c(5,3,47,8,6,5),
              won=c(0,0,1,1,1,0),
              age=c(18,18,23,50,19,39),
              home=c(0,0,1,0,0,1))

С одной стороны, я использую линейную модель для прогнозирования доходов:

md1 = lm(income ~ age + home + home, data=df)

Во-вторых, я запускаю модель logit для прогнозирования выигрышной переменной:

md2 = glm(factor(won) ~ age + home, data=df, family=binomial(link="logit"))

Для обеих моделей мне интересно, как я могу сгенерировать таблицу или фрейм данных с категорией ответа предиктора, подогнанным значением и прогнозируемым значением модели.

Так что для линейной модели что-то вроде:

age  fitted_income  predicted_income
18    3              5 
23    3              3
50    4              2
19    5              5
39    6              4

home   fitted_income    predicted_income
0       5               6       
1       3               9

Или, возможно, это должно быть для каждой точки данных. Таким образом, для точки данных x_i подогнанные и прогнозируемые значения:

id   age  fitted_income  predicted_income
1     18    3              5 
2     23    3              3
3     50    4              2
4     19    5              5
5     39    6              4
  1. С точки зрения статистики, полезно ли такое начинание? Почему или почему нет?

  2. Как это можно сделать в R? (посмотрел на имена (md1) и нашел то, что я могу извлечь из модели, но не прошел дальше)

Спасибо!

ATMathew
источник
1
Re # 2: stat.ethz.ch/R-manual/R-patched/library/stats/html/… . Re # 1: полезно для чего? Что вы хотите достичь в конце?
whuber
Полезно для определения, является ли модель «прогнозирующей» для каждой отдельной точки данных. Я хочу посмотреть на любую строку / идентификатор и быть в состоянии сравнить истинное / подогнанное значение и прогнозируемое значение, чтобы увидеть, насколько оно «правильное».
ATMathew
Если вы хотите отсканировать таблицу, чтобы увидеть, как фактический ответ изменяется по отношению к ковариате, я полагаю, что это может быть полезно. Я не понимаю вашу терминологию. установленное значение и прогнозируемое значение должны быть одинаковыми. Что должно отличаться - это наблюдаемое значение и установленное значение.
Майкл Р. Черник
2
Можно попробовать что-то вроде: x = cbind (df, md1 $ fit.values) colnames (x) = c (colnames (df), «прогнозируемый»)
RioRaider
2
Различия между наблюдаемыми и установленными значениями доступны через residualsкоманду в R. Используйте, cbindчтобы присоединить их к исходному фрейму данных.
whuber

Ответы:

20

Вы должны быть немного осторожнее с объектами модели в R. Например, хотя подогнанные значения и прогнозы обучающих данных должны быть одинаковыми в glm()модельном случае, они не совпадают, когда вы используете правильные функции экстрактора:

R> fitted(md2)
        1         2         3         4         5         6 
0.4208590 0.4208590 0.4193888 0.7274819 0.4308001 0.5806112 
R> predict(md2)
         1          2          3          4          5          6 
-0.3192480 -0.3192480 -0.3252830  0.9818840 -0.2785876  0.3252830

Это связано с тем, что по умолчанию для predict.glm()возвращаются прогнозы в масштабе линейного предиктора. Чтобы получить подогнанные значения, мы хотим применить обратную функцию связи к этим значениям. fitted()делает это для нас, и мы можем получить правильные значения, используя predict()также:

R> predict(md2, type = "response")
        1         2         3         4         5         6 
0.4208590 0.4208590 0.4193888 0.7274819 0.4308001 0.5806112

Аналогично с residuals()(или resid()); значения , хранящиеся в md2$residualsявляются рабочими невязки вряд ли то , что вы хотите. Этот resid()метод позволяет указать желаемый тип остатка и имеет полезное значение по умолчанию.

Для glm()модели будет примерно так:

R> data.frame(Age = df$age, Won = df$won, Fitted = fitted(md2))
  Age Won    Fitted
1  18   0 0.4208590
2  18   0 0.4208590
3  23   1 0.4193888
4  50   1 0.7274819
5  19   1 0.4308001
6  39   0 0.5806112

Нечто подобное можно сделать для lm()модели:

R> data.frame(Age = df$age, Income = df$income, Fitted = fitted(md1))
  Age Income    Fitted
1  18      5  7.893273
2  18      3  7.893273
3  23     47 28.320749
4  50      8 -1.389725
5  19      6  7.603179
6  39      5 23.679251
Гэвин Симпсон
источник