R'de kukla kodlama yerine efekt kodlaması ile regresyon nasıl yapılır?


15

Şu anda bağımsız değişkenler olarak sadece kategorik / faktör değişkenlerine sahip olduğum bir regresyon modeli üzerinde çalışıyorum. Bağımlı değişkenim logit dönüşümü oranıdır.

R, "faktör" türünden hemen sonra aptalları nasıl kodlayacağını otomatik olarak bildiğinden, R'de normal bir regresyon çalıştırmak oldukça kolaydır. Bununla birlikte, bu tip kodlama, her bir değişkenten bir kategorinin taban çizgisi olarak kullanıldığını, dolayısıyla yorumlanmasını zorlaştırdığını ima eder.

Profesörüm bana bunun yerine sadece efekt kodlaması kullanmamı söyledi (-1 veya 1), çünkü bu, kesme için büyük ortalamanın kullanımını ima eder.

Bununla nasıl başa çıkacağını bilen var mı?

Şimdiye kadar denedim:

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
Bakın kontrastlar Bence onun contr.sum büyük ortalama karşı test etmek - R yardım dosyalarını kontrol
user20650

Yanıtlar:


13

Prensip olarak, kesişmenin Büyük Ortamı tahmin edeceği iki tür kontrast kodlaması vardır. Bunlar toplam kontrastlar ve tekrarlanan kontrastlardır (kayma farklılıkları).

Aşağıda bir veri kümesi örneği verilmiştir:

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

Koşulların anlamı:

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

Büyük Ortalama:

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

contrastsParametresiyle kontrast kodlama türünü belirleyebilirsiniz lm.

Toplam zıtlıklar

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

Coefficients:
(Intercept)           b1           b2  
     0.9782       1.0543      -0.0657 

Kesişme Büyük Ortalama'dır. İlk eğim, birinci faktör seviyesi ile Büyük Ortalama arasındaki farktır. İkinci eğim, ikinci faktör seviyesi ile Büyük Ortalama arasındaki farktır.

Tekrarlanan kontrastlar

Tekrarlanan kontrast oluşturma işlevi MASSpaketin bir parçasıdır .

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

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

Kesişme Büyük Ortalama'dır. Eğimler ardışık faktör seviyeleri (2'ye karşı 1, 3'e 2) arasındaki farkları ortaya koymaktadır.


Hmm, sadece ne önerdiğini denedim, ama kodlardan herhangi birinin istediğimi yaptığını bilmiyorum. Mesele şu ki, bir IV'te {1998, ..., 2007} yıl, başka bir IV'te {Jan, ..., Dec} ay var. Şimdi olduğu gibi lm işlevi otomatik olarak Nisan yanı sıra 1998 yanı sıra kesişmek izin. Bunun yerine sadece kesişim genel bir ortalama olmasını istiyorum ... Gerçekten düşünürken mantıklı olup olmadığını bilmiyorum ...
Kasper Christensen

@KasperChristensen Örneklerdeki gibi karşıtlıkları belirtirseniz, kesme Büyük Ortalama olacaktır. Lütfen denediklerinizin tekrarlanabilir bir örneğini sağlayın.
Sven Hohenstein

@SvenHohenstein neden zıtlıklarda C kategorik değeri için b3 katsayısı yok? -0.9885891 olmalıdır.
Vivaldi

@Vivaldi b3 değeri kesme noktası ve b1, b2 ile belirlenir. Başka bir kontrast için serbestlik derecesi yoktur.
Sven Hohenstein

@SvenHohenstein b3 diğer değişkenlerin doğrusal bir kombinasyonu olarak doğrudan ifade edilebildiğinden, bu daha çok bir eşdoğrusallık sorunu değil mi: (3 * genel ortalama - b1 - b2)?
Vivaldi

6

Nitpicking: Profesörünüz size değişkenlerinizi kodlamanızı(-1, 1) söylediyse, size efekt boyutlarını değil, efekt kodlamasını kullanmanızı söyledi . Her durumda, @ user20650 doğrudur. Her zaman olduğu gibi, UCLA istatistikleri yardım web sitesinde, R ile nasıl yapılacağını açıklayan yararlı bir sayfa vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.