Individuazione dei valori adattati e previsti per un modello statistico


12

Diciamo che ho i seguenti dati e sto eseguendo un modello di regressione:

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

Da un lato, eseguo un modello lineare per prevedere sul reddito:

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

In secondo luogo, eseguo un modello logit per prevedere la variabile vinta:

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

Per entrambi i modelli, mi chiedo come sia possibile generare una tabella o un frame di dati con la categoria di risposta del predittore, il valore adattato e il valore previsto del modello.

Quindi, per il modello lineare, qualcosa del tipo:

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

O forse dovrebbe essere per ogni punto dati. Quindi per il punto dati x_i, i valori previsti e previsti sono:

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. Da un punto di vista statistico, un'impresa del genere è utile? Perché o perché no?

  2. Come si può fare in R? (ho guardato i nomi (md1) e ho trovato quello che posso estrarre dal modello, ma non sono passato oltre)

Grazie!


1
Ri # 2: stat.ethz.ch/R-manual/R-patched/library/stats/html/… . Ri # 1: utile per cosa? Cosa vuoi realizzare alla fine?
whuber

Utile per dire se il modello è "predittivo" per ogni singolo punto dati. Voglio esaminare qualsiasi riga / ID ed essere in grado di confrontare il valore reale / adattato e il valore previsto al fine di vedere quanto sia "corretto".
ATMathew

Se vuoi scansionare la tabella per vedere come varia la risposta effettiva rispetto alla covariata, suppongo che potrebbe essere utile. Non capisco la tua terminologia però. il valore montato e il valore previsto dovrebbero essere gli stessi. Ciò che dovrebbe differire è il valore osservato e il valore montato.
Michael R. Chernick,

2
Potrebbe provare qualcosa del tipo: x = cbind (df, md1 $ fitting.values) colnames (x) = c (colnames (df), "predicted")
RioRaider

2
Le differenze tra i valori osservati e quelli adattati sono disponibili tramite il residualscomando in R. Utilizzare cbindper unirli al frame di dati originale.
whuber

Risposte:


20

Bisogna stare un po 'attenti con gli oggetti modello in R. Ad esempio, mentre i valori adattati e le previsioni dei dati di addestramento dovrebbero essere gli stessi nel glm()caso del modello, non sono gli stessi quando si usano le funzioni di estrazione corrette:

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

Questo perché il valore predefinito per predict.glm()è di restituire previsioni sulla scala del predittore lineare. Per ottenere i valori adattati vogliamo applicare l'inverso della funzione di collegamento a tali valori. fitted()fa questo per noi e possiamo ottenere anche i valori corretti usando predict():

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

Allo stesso modo con residuals()(o resid()); i valori memorizzati md2$residualssono i residui di lavoro che difficilmente sono quelli che desideri. Il resid()metodo consente di specificare il tipo di residuo desiderato e ha un valore predefinito utile.

Per il glm()modello, sarà sufficiente qualcosa del genere:

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

Qualcosa di simile può essere fatto per il lm()modello:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.