Znajdowanie dopasowanych i przewidywanych wartości dla modelu statystycznego

12

Powiedzmy, że mam następujące dane i korzystam z modelu regresji:

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))

Z jednej strony prowadzę model liniowy, aby przewidzieć dochód:

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

Po drugie, uruchamiam model logit, aby przewidzieć wygraną zmienną:

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

W przypadku obu modeli zastanawiam się, jak mogę wygenerować tabelę lub ramkę danych z kategorią odpowiedzi predyktora, dopasowaną wartością i przewidywaną wartością modelu.

W przypadku modelu liniowego coś takiego:

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

A może powinno być dla każdego punktu danych. Zatem dla punktu danych x_i dopasowane i przewidywane wartości to:

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. Czy ze statystycznego punktu widzenia takie przedsięwzięcie jest przydatne? Dlaczego lub dlaczego nie?

  2. Jak można to zrobić w R? (spojrzał na nazwy (md1) i znalazł to, co mogę wyciągnąć z modelu, ale nie przeszedłem dalej)

Dzięki!

ATMathew
źródło
1
Re # 2: stat.ethz.ch/R-manual/R-pched/library/stats/html/… . Re # 1: przydatne do czego? Co chcesz w końcu osiągnąć?
whuber
Przydatne do stwierdzenia, czy model jest „predykcyjny” dla każdego pojedynczego punktu danych. Chcę spojrzeć na dowolny wiersz / id i móc porównać wartość true / dopasowaną i wartość przewidywaną, aby zobaczyć, jak „poprawna” jest.
ATMathew
Jeśli chcesz zeskanować tabelę, aby zobaczyć, jak rzeczywista odpowiedź różni się w zależności od zmiennej towarzyszącej, przypuszczam, że może być przydatna. Nie rozumiem jednak twojej terminologii. dopasowana wartość i przewidywana wartość powinny być takie same. To, co powinno się różnić, to obserwowana wartość i dopasowana wartość.
Michael R. Chernick,
2
Można spróbować czegoś takiego: x = cbind (df, md1 $ fit.values) colnames (x) = c (colnames (df), "przewidywana")
RioRaider
2
Różnice między wartościami obserwowanymi i dopasowanymi są dostępne za pomocą residualspolecenia w R. Użyj, cbindaby połączyć je z oryginalną ramką danych.
whuber

Odpowiedzi:

20

Trzeba być ostrożnym z obiektami modelu w R. Na przykład, podczas gdy dopasowane wartości i prognozy danych treningowych powinny być takie same w glm()przypadku modelu, nie są one takie same, gdy używasz prawidłowych funkcji ekstraktora:

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

Wynika to z tego, że domyślną wartością predict.glm()jest zwracanie prognoz na skalę predyktora liniowego. Aby uzyskać dopasowane wartości, chcemy zastosować odwrotność funkcji link do tych wartości. fitted()robi to za nas i możemy uzyskać prawidłowe wartości, używając predict()również:

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

Podobnie z residuals()(lub resid()); Wartości zapisane w md2$residualsto pracy reszty to jest mało prawdopodobne, aby to, co chcesz. resid()Metoda pozwala określić typ resztkowa chcesz i posiada użyteczną domyślną.

W przypadku glm()modelu wystarczy coś takiego:

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

Coś podobnego można zrobić dla lm()modelu:

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
Gavin Simpson
źródło