Calcular a variação explicada por cada preditor em regressão múltipla usando R

13

Fiz uma regressão múltipla na qual o modelo como um todo é significativo e explica cerca de 13% da variação. No entanto, preciso encontrar a quantidade de variação explicada por cada preditor significativo. Como posso fazer isso usando R?

Aqui estão alguns dados e código de exemplo:

D = data.frame(
    dv = c( 0.75, 1.00, 1.00, 0.75, 0.50, 0.75, 1.00, 1.00, 0.75, 0.50 ),
    iv1 = c( 0.75, 1.00, 1.00, 0.75, 0.75, 1.00, 0.50, 0.50, 0.75, 0.25 ),
    iv2 = c( 0.882, 0.867, 0.900, 0.333, 0.875, 0.500, 0.882, 0.875, 0.778, 0.867 ),
    iv3 = c( 1.000, 0.067, 1.000, 0.933, 0.875, 0.500, 0.588, 0.875, 1.000, 0.467 ),
    iv4 = c( 0.889, 1.000, 0.905, 0.938, 0.833, 0.882, 0.444, 0.588, 0.895, 0.812 ),
    iv5 = c( 18, 16, 21, 16, 18, 17, 18, 17, 19, 16 ) )
fit = lm( dv ~ iv1 + iv2 + iv3 + iv4 + iv5, data=D )
summary( fit )

Aqui está a saída com meus dados reais:

Call: lm(formula = posttestScore ~ pretestScore + probCategorySame + 
    probDataRelated + practiceAccuracy + practiceNumTrials, data = D)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.6881 -0.1185  0.0516  0.1359  0.3690 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)
 (Intercept)        0.77364    0.10603    7.30  8.5e-13 ***
 iv1                0.29267    0.03091    9.47  < 2e-16 ***
 iv2                0.06354    0.02456    2.59   0.0099 **
 iv3                0.00553    0.02637    0.21   0.8340
 iv4               -0.02642    0.06505   -0.41   0.6847
 iv5               -0.00941    0.00501   -1.88   0.0607 .  
--- Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Residual standard error: 0.18 on 665 degrees of freedom
 Multiple R-squared:  0.13,      Adjusted R-squared:  0.123
 F-statistic: 19.8 on 5 and 665 DF,  p-value: <2e-16

Esta pergunta foi respondida aqui , mas a resposta aceita apenas aborda preditores não correlacionados e, embora haja uma resposta adicional que aborda preditores correlacionados, ela fornece apenas uma dica geral, não uma solução específica. Gostaria de saber o que fazer se meus preditores estiverem correlacionados.

baixiwei
fonte
2
Você olhou a resposta de Jeromy Anglim aqui ?
Stat
Sim, essa foi a resposta adicional a que eu estava me referindo. Eu esperava algo mais específico e passo a passo. Fiz o download do ppcor, mas não tinha certeza do que fazer com a saída spcor. Além disso, eu estou querendo saber se existe uma maneira de fazer isso no núcleo R? Parece uma tarefa bastante comum que não exigiria um pacote especial.
Baixiwei
A resposta mais curta à sua pergunta sobre preditores correlacionados é que sua importância separada não pode ser quantificada, sem no mínimo suposições e aproximações adicionais. Considere da seguinte maneira: se isso é direto, por que não está fácil e prontamente disponível, porque muitos pesquisadores pensam que o desejam?
Nick Cox
Eu sugeriria examinar o relaimpopacote e seu documento: jstatsoft.org/index.php/jss/article/view/v017i01/v17i01.pdf Eu uso o método "LMG" com frequência.
Phil

Respostas:

15

A porcentagem explicada depende do pedido digitado.

Se você especificar uma ordem específica, poderá calcular isso trivialmente em R (por exemplo, através das funções updatee anova, veja abaixo), mas uma ordem de entrada diferente produziria respostas potencialmente muito diferentes.

[Uma possibilidade pode ser a média de todos os pedidos ou algo assim, mas seria complicado e pode não estar respondendo a uma pergunta particularmente útil.]

-

Como aponta Stat, com um único modelo, se você estiver atrás de uma variável por vez, poderá usar 'anova' para produzir as somas incrementais da tabela de quadrados. Isso seguiria no seu código:

 anova(fit)
Analysis of Variance Table

Response: dv
          Df   Sum Sq  Mean Sq F value Pr(>F)
iv1        1 0.033989 0.033989  0.7762 0.4281
iv2        1 0.022435 0.022435  0.5123 0.5137
iv3        1 0.003048 0.003048  0.0696 0.8050
iv4        1 0.115143 0.115143  2.6294 0.1802
iv5        1 0.000220 0.000220  0.0050 0.9469
Residuals  4 0.175166 0.043791        

-

Então, aí temos a variação incremental explicada; como obtemos a proporção?

Bastante trivialmente, dimensione-os por 1 dividido pela sua soma. (Substitua 1 por 100 para ver a variação percentual explicada.)

Aqui eu o exibi como uma coluna adicionada à tabela anova:

 af <- anova(fit)
 afss <- af$"Sum Sq"
 print(cbind(af,PctExp=afss/sum(afss)*100))
          Df       Sum Sq      Mean Sq    F value    Pr(>F)      PctExp
iv1        1 0.0339887640 0.0339887640 0.77615140 0.4280748  9.71107544
iv2        1 0.0224346357 0.0224346357 0.51230677 0.5137026  6.40989591
iv3        1 0.0030477233 0.0030477233 0.06959637 0.8049589  0.87077807
iv4        1 0.1151432643 0.1151432643 2.62935731 0.1802223 32.89807550
iv5        1 0.0002199726 0.0002199726 0.00502319 0.9468997  0.06284931
Residuals  4 0.1751656402 0.0437914100         NA        NA 50.04732577

-

Se você decidir que deseja várias ordens de entrada específicas, poderá fazer algo ainda mais geral como este (que também permite inserir ou remover grupos de variáveis ​​por vez, se desejar):

 m5 = fit
 m4 = update(m5, ~ . - iv5)
 m3 = update(m4, ~ . - iv4)
 m2 = update(m3, ~ . - iv3)
 m1 = update(m2, ~ . - iv2)
 m0 = update(m1, ~ . - iv1)

 anova(m0,m1,m2,m3,m4,m5)
Analysis of Variance Table

Model 1: dv ~ 1
Model 2: dv ~ iv1
Model 3: dv ~ iv1 + iv2
Model 4: dv ~ iv1 + iv2 + iv3
Model 5: dv ~ iv1 + iv2 + iv3 + iv4
Model 6: dv ~ iv1 + iv2 + iv3 + iv4 + iv5
  Res.Df     RSS Df Sum of Sq      F Pr(>F)
1      9 0.35000                           
2      8 0.31601  1  0.033989 0.7762 0.4281
3      7 0.29358  1  0.022435 0.5123 0.5137
4      6 0.29053  1  0.003048 0.0696 0.8050
5      5 0.17539  1  0.115143 2.6294 0.1802
6      4 0.17517  1  0.000220 0.0050 0.9469

(Essa abordagem também pode ser automatizada, por exemplo, através de loops e do uso de get. Você pode adicionar e remover variáveis ​​em várias ordens, se necessário)

... e depois dimensione para porcentagens como antes.

(NB. O fato de eu explicar como fazer essas coisas não deve necessariamente ser tomado como defesa de tudo o que explico.)

Glen_b -Reinstate Monica
fonte
2
R2anova(fit)m0m5
Esta resposta revisada é realmente útil. Eu acho que estou chegando lá. Uma pergunta: se eu calcular a proporção de variação explicada para iv5 (a última variável) da maneira que você descreveu, isso é matematicamente o mesmo que a diferença nos valores de R ^ 2 retornados pelo resumo aplicado ao modelo, se encaixa com e sem iv5? Na verdade, estou obtendo os mesmos valores e só queria verificar se estes são conceitualmente a mesma coisa.
Baixiwei
E mais uma pergunta: existe alguma razão para eu não poder fazer o que acabei de descrever no comentário anterior uma vez para cada uma das duas ivs diferentes? Isso seria equivalente ao seu segundo método proposto, envolvendo diferentes ordens de entrada de variáveis?
Baixiwei
R2summary.lm
2

Eu provei que a porcentagem de variação explicada por um determinado preditor em uma regressão linear múltipla é o produto do coeficiente de inclinação e a correlação do preditor com os valores ajustados da variável dependente (assumindo que todas as variáveis ​​foram padronizadas para ter zero médio e variância um; sem perda de generalidade). Encontre aqui:

https://www.researchgate.net/publication/306347340_A_Natural_Decomposition_of_R2_in_Multiple_Linear_Regression

user128460
fonte
3
user128460 é bem-vindo, mas este é um site de Perguntas e Respostas, não um site de Perguntas e Link-a-Resposta.
Robert Long
Não é esse o placar de Pratt?
Brett
2

Você pode usar a biblioteca hier.part para ter medidas de qualidade de ajuste para regressões de uma única variável dependente para todas as combinações de N variáveis ​​independentes

library(hier.part)
env <- D[,2:5]
all.regs(D$dv, env, fam = "gaussian", gof = "Rsqu",
     print.vars = TRUE)
MFR
fonte