Calcola la varianza spiegata da ciascun predittore nella regressione multipla usando R


13

Ho eseguito una regressione multipla in cui il modello nel suo insieme è significativo e spiega circa il 13% della varianza. Tuttavia, devo trovare la quantità di varianza spiegata da ciascun predittore significativo. Come posso fare questo usando R?

Ecco alcuni dati e codice di esempio:

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 )

Ecco l'output con i miei dati effettivi:

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

A questa domanda è stata data una risposta qui , ma la risposta accettata riguarda solo i predittori non correlati e, sebbene vi sia una risposta aggiuntiva che affronta i predittori correlati, fornisce solo un suggerimento generale, non una soluzione specifica. Vorrei sapere cosa fare se i miei predittori sono correlati.


2
Hai guardato la risposta di Jeromy Anglim qui ?
Stat

Sì, quella era la risposta aggiuntiva a cui mi riferivo. Speravo in qualcosa di più specifico e graduale. Ho scaricato ppcor ma non ero sicuro di cosa fare con l'output di spcor. Inoltre, mi chiedo se c'è un modo per farlo nel core R? Sembra un compito abbastanza comune che non richiederebbe un pacchetto speciale.
baixiwei,

La risposta più breve alla tua domanda sui predittori correlati è che la loro importanza separata non può essere quantificata, perlomeno ulteriori ipotesi e approssimazioni. Consideralo in questo modo: se questo è semplice, perché non è prontamente e facilmente disponibile, perché molti ricercatori pensano di volerlo?
Nick Cox,

Suggerirei di esaminare il relaimpopacchetto e il relativo documento di accompagnamento: jstatsoft.org/index.php/jss/article/view/v017i01/v17i01.pdf Uso frequentemente il metodo "LMG".
Phil

Risposte:


15

La percentuale spiegata dipende dall'ordine inserito.

Se specifichi un ordine particolare, puoi calcolarlo in modo banale in R (ad es. Tramite le funzioni updatee anova, vedi sotto), ma un diverso ordine di immissione produrrebbe risposte potenzialmente molto diverse.

[Una possibilità potrebbe essere la media di tutti gli ordini o qualcosa del genere, ma diventerebbe ingombrante e potrebbe non rispondere a una domanda particolarmente utile.]

-

Come sottolinea Stat, con un singolo modello, se cerchi una variabile alla volta, puoi semplicemente usare 'anova' per produrre le somme incrementali della tabella dei quadrati. Ciò sarebbe seguito dal tuo codice:

 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        

-

Quindi abbiamo spiegato la varianza incrementale; come possiamo ottenere la proporzione?

Abbastanza banalmente, ridimensionali di 1 divisi per la loro somma. (Sostituire 1 con 100 per la variazione della percentuale spiegata.)

Qui l'ho visualizzato come una colonna aggiunta alla tabella 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 decidi di volere diversi ordini di entrata particolari, puoi fare qualcosa di ancora più generale come questo (che ti consente anche di inserire o rimuovere gruppi di variabili alla volta, se lo desideri):

 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

(Tale approccio potrebbe anche essere automatizzato, ad esempio tramite loop e l'uso di get. È possibile aggiungere e rimuovere variabili in più ordini, se necessario)

... e poi ridimensionare in percentuale come prima.

(NB. Il fatto che spiego come fare queste cose non dovrebbe essere necessariamente considerato come un sostegno a tutto ciò che spiego.)


2
R2anova(fit)m0m5

Questa risposta rivista è davvero utile. Penso che ci sto arrivando. Una domanda: se calcolo la proporzione di varianza spiegata per iv5 (l'ultima variabile) nel modo che hai descritto, è matematicamente uguale alla differenza nei valori di R ^ 2 restituiti dal riepilogo applicata al modello che si adatta al e senza iv5? In effetti sto ottenendo gli stessi valori e volevo solo verificare se questi sono concettualmente la stessa cosa.
baixiwei,

E un'altra domanda: c'è qualche motivo per cui non ho potuto fare quello che ho appena descritto nel commento precedente una volta per ciascuna delle due diverse iv? Sarebbe equivalente al secondo metodo proposto che prevede diversi ordini di immissione di variabili?
baixiwei,

R2summary.lm

2

Ho dimostrato che la percentuale di variazione spiegata da un determinato predittore in una regressione lineare multipla è il prodotto del coefficiente di pendenza e la correlazione del predittore con i valori adattati della variabile dipendente (supponendo che tutte le variabili siano state standardizzate per avere media zero e varianza uno, che è senza perdita di generalità). Lo trovi qui:

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


3
user128460 benvenuto, ma questo è un sito di domande e risposte, non un sito di domande e collegamenti per rispondere.
Robert Long,

Non è il punteggio di Pratt?
Brett,

2

È possibile utilizzare la libreria hier.part per avere misure di bontà di adattamento per le regressioni di una singola variabile dipendente a tutte le combinazioni di N variabili indipendenti

library(hier.part)
env <- D[,2:5]
all.regs(D$dv, env, fam = "gaussian", gof = "Rsqu",
     print.vars = TRUE)
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.