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.