Recherche des valeurs ajustées et prédites pour un modèle statistique

12

Disons que j'ai les données suivantes et que j'utilise un modèle de régression:

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

D'une part, je lance un modèle linéaire pour prédire le revenu:

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

Deuxièmement, je lance un modèle logit pour prédire la variable won:

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

Pour les deux modèles, je me demande comment générer un tableau ou un bloc de données avec la catégorie de réponse du prédicteur, la valeur ajustée et la valeur prédite du modèle.

Donc, pour le modèle linéaire, quelque chose comme:

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

Ou peut-être que cela devrait être pour chaque point de données. Ainsi, pour le point de données x_i, les valeurs ajustées et prédites sont:

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. D'un point de vue statistique, une telle entreprise est-elle utile? Pourquoi ou pourquoi pas?

  2. Comment cela peut-il être fait dans R? (regarda les noms (md1) et trouva ce que je pouvais tirer du modèle, mais je ne suis pas allé au-delà)

Merci!

ATMathew
la source
1
Re # 2: stat.ethz.ch/R-manual/R-patched/library/stats/html/… . Re # 1: utile pour quoi? Que voulez-vous accomplir à la fin?
whuber
Utile pour savoir si le modèle est "prédictif" pour chaque point de données individuel. Je veux regarder n'importe quelle ligne / id, et pouvoir comparer la valeur vraie / ajustée et la valeur prédite afin de voir à quel point elle est "correcte".
ATMathew
Si vous voulez parcourir le tableau pour voir comment la réponse réelle varie par rapport à la covariable, je suppose que cela pourrait être utile. Je ne comprends cependant pas votre terminologie. la valeur ajustée et la valeur prédite doivent être identiques. Ce qui devrait différer, c'est la valeur observée et la valeur ajustée.
Michael R. Chernick
2
Pourrait essayer quelque chose comme: x = cbind (df, md1 $ fit.values) colnames (x) = c (colnames (df), "prédit")
RioRaider
2
Les différences entre les valeurs observées et ajustées sont disponibles via la residualscommande dans R. Utilisez-les cbindpour les joindre à la trame de données d'origine.
whuber

Réponses:

20

Vous devez être un peu prudent avec les objets du modèle dans R. Par exemple, alors que les valeurs ajustées et les prédictions des données d'apprentissage doivent être les mêmes dans le glm()cas du modèle, elles ne sont pas les mêmes lorsque vous utilisez les fonctions d'extraction correctes:

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

En effet, la valeur par défaut de predict.glm()est de renvoyer des prédictions à l'échelle du prédicteur linéaire. Pour obtenir les valeurs ajustées, nous voulons appliquer l'inverse de la fonction de lien à ces valeurs. fitted()fait cela pour nous, et nous pouvons également obtenir les valeurs correctes en utilisant predict():

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

De même avec residuals()(ou resid()); les valeurs stockées dans md2$residualssont les résidus de travail ne sont probablement pas ce que vous voulez. La resid()méthode vous permet de spécifier le type de résidu que vous souhaitez et possède une valeur par défaut utile.

Pour le glm()modèle, quelque chose comme ça suffira:

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

Quelque chose de similaire peut être fait pour le lm()modèle:

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
la source