Come fare la regressione con la codifica degli effetti invece della codifica fittizia in R?


14

Attualmente sto lavorando a un modello di regressione in cui ho solo variabili categoriali / fattoriali come variabili indipendenti. La mia variabile dipendente è un rapporto trasformato logit.

È abbastanza semplice eseguire una normale regressione in R, poiché R sa automaticamente come codificare i manichini non appena sono del tipo "fattore". Tuttavia, questo tipo di codifica implica anche che una categoria di ciascuna variabile venga utilizzata come base, rendendo difficile l'interpretazione.

Il mio professore mi ha detto di usare solo la codifica degli effetti (-1 o 1), poiché ciò implica l'uso del grande significato per l'intercettazione.

Qualcuno sa come gestirlo?

Fino ad ora ho provato:

gm <- mean(tapply(ds$ln.crea, ds$month,  mean))
model <- lm(ln.crea ~ month + month*month + year + year*year, data = ds, contrasts = list(gm = contr.sum))

Call:
lm(formula = ln.crea ~ month + month * month + year + year * 
    year, data = ds, contrasts = list(gm = contr.sum))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.89483 -0.19239 -0.03651  0.14955  0.89671 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.244493   0.204502 -15.865   <2e-16 ***
monthFeb    -0.124035   0.144604  -0.858   0.3928    
monthMar    -0.365223   0.144604  -2.526   0.0129 *  
monthApr    -0.240314   0.144604  -1.662   0.0993 .  
monthMay    -0.109138   0.144604  -0.755   0.4520    
monthJun    -0.350185   0.144604  -2.422   0.0170 *  
monthJul     0.050518   0.144604   0.349   0.7275    
monthAug    -0.206436   0.144604  -1.428   0.1562    
monthSep    -0.134197   0.142327  -0.943   0.3478    
monthOct    -0.178182   0.142327  -1.252   0.2132    
monthNov    -0.119126   0.142327  -0.837   0.4044    
monthDec    -0.147681   0.142327  -1.038   0.3017    
year1999     0.482988   0.200196   2.413   0.0174 *  
year2000    -0.018540   0.200196  -0.093   0.9264    
year2001    -0.166511   0.200196  -0.832   0.4073    
year2002    -0.056698   0.200196  -0.283   0.7775    
year2003    -0.173219   0.200196  -0.865   0.3887    
year2004     0.013831   0.200196   0.069   0.9450    
year2005     0.007362   0.200196   0.037   0.9707    
year2006    -0.281472   0.200196  -1.406   0.1625    
year2007    -0.266659   0.200196  -1.332   0.1855    
year2008    -0.248883   0.200196  -1.243   0.2164    
year2009    -0.153083   0.200196  -0.765   0.4461    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Residual standard error: 0.3391 on 113 degrees of freedom
Multiple R-squared: 0.3626, Adjusted R-squared: 0.2385 
F-statistic: 2.922 on 22 and 113 DF,  p-value: 0.0001131 

1
Guarda? Contrasti Penso che sia la sua somma di test da testare contro la media media - controlla i file di aiuto R
user20650

Risposte:


13

In linea di principio, esistono due tipi di codifica del contrasto, con cui l'intercetta stimerà il Grand Mean. Questi sono contrasti di somma e contrasti ripetuti (differenze di scorrimento).

Ecco un set di dati di esempio:

set.seed(42)
x <- data.frame(a = c(rnorm(100,2), rnorm(100,1),rnorm(100,0)),
                b = rep(c("A", "B", "C"), each = 100))

Le condizioni "significano:

tapply(x$a, x$b, mean)
         A           B           C 
2.03251482  0.91251629 -0.01036817 

The Grand Mean:

mean(tapply(x$a, x$b, mean))
[1] 0.978221

È possibile specificare il tipo di codifica del contrasto con il contrastsparametro in lm.

Somma di contrasti

lm(a ~ b, x, contrasts = list(b = contr.sum))

Coefficients:
(Intercept)           b1           b2  
     0.9782       1.0543      -0.0657 

L'intercettazione è il Grand Mean. La prima pendenza è la differenza tra il livello del primo fattore e il Grand Mean. La seconda pendenza è la differenza tra il livello del secondo fattore e il Grand Mean.

Contrasti ripetuti

La funzione per la creazione di contrasti ripetuti fa parte del MASSpacchetto.

lm(a ~ b, x, contrasts = list(b = MASS::contr.sdif))

Coefficients:
(Intercept)         b2-1         b3-2  
     0.9782      -1.1200      -0.9229 

L'intercettazione è il Grand Mean. Le pendenze identificano le differenze tra livelli di fattori consecutivi (2 contro 1, 3 contro 2).


Hmm, ho appena provato quello che mi hai suggerito, ma non sono sicuro che nessuno dei codici faccia quello che voglio. Il fatto è che ho anni {1998, ..., 2007} in un IV e mesi {Jan, ..., Dec} in un altro IV. Come è ora la funzione lm fa sì che April diventi l'intercettazione così come il 1998. Invece voglio solo che l'intercettazione sia un mezzo generale ... Non so davvero se abbia senso quando ci pensi ...
Kasper Christensen,

@KasperChristensen Se specifichi i contrasti come negli esempi, l'intercettazione sarà il Grand Mean. Fornisci un esempio riproducibile di ciò che hai provato.
Sven Hohenstein,

@SvenHohenstein perché non esiste un coefficiente b3 per il valore categoriale C nei contrasti di somma? Dovrebbe essere -0.9885891.
Vivaldi,

@Vivaldi Il valore di b3 è determinato dall'intercetta e b1, b2. Non è rimasto alcun grado di libertà per un altro contrasto.
Sven Hohenstein,

@SvenHohenstein Non è più questo un problema di collinearità poiché b3 può essere espresso direttamente come una combinazione lineare di altre variabili: (3 * grand mean - b1 - b2)?
Vivaldi,

6

Nitpicking: se il tuo professore ti ha detto di codificare le tue variabili (-1, 1), ti ha detto di usare la codifica degli effetti , non le dimensioni degli effetti . Ad ogni modo, @ user20650 ha ragione. Come al solito, il sito Web di aiuto per le statistiche dell'UCLA ha una pagina utile che spiega come farlo con R.

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.