Bagaimana melakukan regresi dengan efek pengkodean alih-alih pengkodean dummy dalam R?

14

Saat ini saya sedang mengerjakan model regresi di mana saya hanya memiliki variabel kategori / faktor sebagai variabel independen. Variabel dependen saya adalah rasio transformasi logit.

Cukup mudah hanya untuk menjalankan regresi normal dalam R, karena R secara otomatis tahu cara mengkodekan boneka begitu mereka adalah tipe "faktor". Namun jenis pengkodean ini juga menyiratkan bahwa satu kategori dari setiap variabel digunakan sebagai garis dasar, sehingga sulit untuk diinterpretasikan.

Profesor saya telah mengatakan kepada saya untuk hanya menggunakan pengkodean efek sebagai gantinya (-1 atau 1), karena ini menyiratkan penggunaan grand mean untuk intersep.

Adakah yang tahu cara menanganinya?

Sampai sekarang saya sudah mencoba:

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 
Kasper Christensen
sumber
1
Lihatlah kontras saya pikir contr.sum untuk menguji terhadap mean besar - periksa file bantuan R
user20650

Jawaban:

13

Pada prinsipnya, ada dua jenis pengkodean kontras, yang dengannya intersep akan memperkirakan Grand Mean. Ini adalah jumlah kontras dan kontras berulang (perbedaan geser).

Berikut ini contoh kumpulan data:

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

Ketentuan berarti:

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

Grand Mean:

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

Anda dapat menentukan jenis pengkodean kontras dengan contrastsparameter dalam lm.

Jumlah kontras

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

Coefficients:
(Intercept)           b1           b2  
     0.9782       1.0543      -0.0657 

Mencegat adalah Grand Mean. Kemiringan pertama adalah perbedaan antara tingkat faktor pertama dan Grand Mean. Kemiringan kedua adalah perbedaan antara tingkat faktor kedua dan Grand Mean.

Kontras berulang

Fungsi untuk membuat kontras berulang adalah bagian dari MASSpaket.

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

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

Mencegat adalah Grand Mean. Kemiringan menentukan perbedaan antara tingkat faktor berturut-turut (2 vs 1, 3 vs 2).

Sven Hohenstein
sumber
Hmm, baru saja mencoba apa yang Anda sarankan, tetapi saya tidak yakin ada kode yang melakukan apa yang saya inginkan. Masalahnya adalah saya memiliki tahun {1998, ..., 2007} dalam satu IV dan bulan {Jan, ..., Dec} di IV lain. Seperti sekarang fungsi lm secara otomatis membiarkan April menjadi intersep dan juga 1998. Sebaliknya saya hanya ingin intersep menjadi rata-rata keseluruhan ... Saya tidak benar-benar tahu apakah masuk akal ketika memikirkannya ...
Kasper Christensen
@KasperChristensen Jika Anda menentukan kontras seperti pada contoh, intersep akan menjadi Grand Mean. Berikan contoh yang dapat direproduksi dari apa yang telah Anda coba.
Sven Hohenstein
@ SvenHohenstein mengapa tidak ada koefisien b3 untuk nilai kategori C dalam jumlah kontras? Seharusnya -0,9885891.
Vivaldi
@Vivaldi Nilai b3 ditentukan oleh intersep dan b1, b2. Tidak ada derajat kebebasan yang tersisa untuk kontras lainnya.
Sven Hohenstein
@ SvenHohenstein Bukankah ini lebih merupakan masalah collinearity karena b3 dapat secara langsung dinyatakan sebagai kombinasi linear dari variabel lain: (3 * grand mean - b1 - b2)?
Vivaldi
6

Nitpicking: jika profesor Anda memberi tahu Anda untuk memberi kode variabel (-1, 1), ia memberi tahu Anda untuk menggunakan pengkodean efek , bukan ukuran efek . Bagaimanapun, @ user20650 benar. Seperti biasa, situs web bantuan statistik UCLA memiliki halaman berguna yang menjelaskan cara melakukan ini dengan R.

gung - Pasang kembali Monica
sumber