Finden der angepassten und vorhergesagten Werte für ein statistisches Modell

12

Angenommen, ich habe die folgenden Daten und führe ein Regressionsmodell aus:

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

Einerseits führe ich ein lineares Modell aus, um das Einkommen vorherzusagen:

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

Zweitens führe ich ein Logit-Modell aus, um die gewonnene Variable vorherzusagen:

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

Für beide Modelle frage ich mich, wie ich eine Tabelle oder einen Datenrahmen mit der Antwortkategorie des Prädiktors, dem angepassten Wert und dem vorhergesagten Wert des Modells generieren kann.

Also für das lineare Modell so etwas wie:

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

Oder vielleicht sollte es für jeden Datenpunkt sein. Für den x_i-Datenpunkt sind die angepassten und vorhergesagten Werte also:

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. Ist ein solches Unternehmen aus statistischer Sicht sinnvoll? Warum oder warum nicht?

  2. Wie kann das in R gemacht werden? (schaute auf Namen (md1) und fand heraus, was ich aus dem Modell ziehen kann, bin aber nicht darüber hinausgegangen)

Vielen Dank!

ATMathew
quelle
1
Zu # 2: stat.ethz.ch/R-manual/R-patched/library/stats/html/… . Zu # 1: nützlich für was? Was möchten Sie am Ende erreichen?
whuber
Nützlich, um festzustellen, ob das Modell für jeden einzelnen Datenpunkt "prädiktiv" ist. Ich möchte mir jede Zeile / ID ansehen und in der Lage sein, den wahren / angepassten Wert und den vorhergesagten Wert zu vergleichen, um zu sehen, wie "korrekt" er ist.
ATMathew
Wenn Sie die Tabelle scannen möchten, um zu sehen, wie sich die tatsächliche Antwort in Bezug auf die Kovariate ändert, könnte dies nützlich sein. Ich verstehe Ihre Terminologie jedoch nicht. Der angepasste Wert und der vorhergesagte Wert sollten gleich sein. Was sich unterscheiden sollte, ist der beobachtete Wert und der angepasste Wert.
Michael R. Chernick
2
Könnte etwas versuchen wie: x = cbind (df, md1 $ fit.values) Spaltennamen (x) = c (Spaltennamen (df), "vorhergesagt")
RioRaider
2
Die Unterschiede zwischen beobachteten und angepassten Werten sind über den residualsBefehl in verfügbar R. Verwenden Sie cbinddiese Option, um sie mit dem ursprünglichen Datenrahmen zu verbinden.
whuber

Antworten:

20

Sie müssen mit Modellobjekten in R etwas vorsichtig sein. Beispielsweise sollten die angepassten Werte und Vorhersagen der Trainingsdaten im glm()Modellfall gleich sein, sie sind jedoch nicht dieselben, wenn Sie die richtigen Extraktionsfunktionen verwenden:

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

Dies liegt daran, dass standardmäßig predict.glm()Vorhersagen auf der Skala des linearen Prädiktors zurückgegeben werden. Um die angepassten Werte zu erhalten, möchten wir die Umkehrung der Verknüpfungsfunktion auf diese Werte anwenden. fitted()tut das für uns und wir können die richtigen Werte auch erhalten mit predict():

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

Ebenso mit residuals()(oder resid()); Es ist unwahrscheinlich, dass die darin gespeicherten Werte md2$residualsdie Arbeitsreste sind, die Sie möchten. Mit dieser resid()Methode können Sie den gewünschten Residuentyp angeben und haben eine nützliche Standardeinstellung.

Für das glm()Modell reicht so etwas aus:

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

Ähnliches kann für das lm()Modell getan werden :

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
Stellen Sie Monica wieder her - G. Simpson
quelle