Localizando os valores ajustados e previstos para um modelo estatístico

12

Digamos que tenho os seguintes dados e estou executando um modelo de regressão:

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

Por um lado, corro um modelo linear para prever a renda:

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

Segundo, eu executo um modelo de logit para prever a variável ganha:

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

Para os dois modelos, pergunto-me como posso gerar uma tabela ou quadro de dados com a categoria de resposta do preditor, o valor ajustado e o valor previsto do modelo.

Portanto, para o modelo linear, algo como:

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 talvez deva ser para cada ponto de dados. Portanto, para o ponto de dados x_i, os valores ajustados e previstos são:

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. Do ponto de vista estatístico, esse empreendimento é útil? Por que ou por que não?

  2. Como isso pode ser feito no R? (olhou para os nomes (md1) e encontrou o que posso extrair do modelo, mas não passei disso)

Obrigado!

ATMathew
fonte
11
Re # 2: stat.ethz.ch/R-manual/R-patched/library/stats/html/… . Re # 1: útil para quê? O que você deseja realizar no final?
whuber
Útil para saber se o modelo é "preditivo" para cada ponto de dados individual. Eu quero olhar para qualquer linha / ID e poder comparar o valor verdadeiro / ajustado e o valor previsto, a fim de ver o quão "correto" é.
ATMathew
Se você deseja escanear a tabela para ver como a resposta real varia em relação à covariável, suponho que possa ser útil. Eu não entendo sua terminologia, no entanto. o valor ajustado e o valor previsto devem ser os mesmos. O que deve diferir é o valor observado e o valor ajustado.
Michael R. Chernick
2
Poderia tentar algo como: x = cbind (df, md1 $ fitted.values) COLNAMES (x) = c (COLNAMES (DF), "previu")
RioRaider
2
As diferenças entre os valores observados e montados estão disponíveis através do residualscomando no R. Use cbindpara juntá-los ao quadro de dados original.
whuber

Respostas:

20

Você deve ter um pouco de cuidado com os objetos de modelo em R. Por exemplo, embora os valores ajustados e as previsões dos dados de treinamento devam ser os mesmos no glm()caso do modelo, eles não são os mesmos quando você usa as funções corretas do extrator:

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

Isso ocorre porque o padrão para predict.glm()é retornar previsões na escala do preditor linear. Para obter os valores ajustados, queremos aplicar a inversa da função de link a esses valores. fitted()faz isso por nós, e podemos obter os valores corretos usando predict()também:

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

Da mesma forma com residuals()(ou resid()); os valores armazenados md2$residualssão os resíduos de trabalho que dificilmente serão o que você deseja. O resid()método permite especificar o tipo de resíduo que você deseja e possui um padrão útil.

Para o glm()modelo, algo como isso será suficiente:

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

Algo semelhante pode ser feito para o lm()modelo:

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
fonte