Jak zrobić regresję z kodowaniem efektu zamiast kodowania fikcyjnego w R?


15

Obecnie pracuję nad modelem regresji, w którym jako zmienne niezależne mam tylko zmienne kategorialne / czynnikowe. Moja zmienna zależna to stosunek przekształcony logit.

Całkiem łatwo jest uruchomić normalną regresję w R, ponieważ R automatycznie wie, jak zakodować manekiny, gdy tylko będą miały typ „czynnik”. Jednak ten rodzaj kodowania oznacza również, że jedna kategoria z każdej zmiennej jest używana jako punkt odniesienia, co utrudnia interpretację.

Mój profesor powiedział mi, żebym zamiast tego użył kodowania efektów (-1 lub 1), ponieważ oznacza to użycie wielkiej średniej do przechwytywania.

Czy ktoś wie, jak sobie z tym poradzić?

Do tej pory próbowałem:

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
Spójrz na? Kontrasty Myślę, że jest to contr.sum do przetestowania w stosunku do wielkiej średniej - sprawdź pliki pomocy R
user20650

Odpowiedzi:


13

Zasadniczo istnieją dwa rodzaje kodowania kontrastowego, za pomocą których przecięcie oszacuje Wielką średnią. Są to kontrasty sumy i powtórzenia kontrastów (różnice ślizgowe).

Oto przykładowy zestaw danych:

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

Warunki ”oznaczają:

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

Wielki środek:

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

Możesz określić rodzaj kodowania kontrastu za pomocą contrastsparametru w lm.

Suma kontrastów

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

Coefficients:
(Intercept)           b1           b2  
     0.9782       1.0543      -0.0657 

Punktem przecięcia jest Grand Mean. Pierwsze nachylenie jest różnicą między pierwszym poziomem czynnika a Wielką średnią. Drugie nachylenie jest różnicą między poziomem drugiego czynnika a Wielką średnią.

Powtarzające się kontrasty

Funkcja tworzenia powtarzających się kontrastów jest częścią MASSpakietu.

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

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

Punktem przecięcia jest Grand Mean. Nachylenia unieważniają różnice między kolejnymi poziomami czynników (2 vs. 1, 3 vs. 2).


Hmm, właśnie wypróbowałem to, co zasugerowałeś, ale nie jestem pewien, czy któryś z kodów robi to, co chcę. Chodzi o to, że mam lata {1998, ..., 2007} w jednym IV, a miesiące {styczeń, ..., grudzień} w innym IV. Ponieważ jest to teraz funkcja lm automatycznie pozwala April stać się przechwytywaniem, podobnie jak 1998 r. Zamiast tego chcę, aby przechwytywanie było ogólnym środkiem ... Naprawdę nie wiem, czy to ma sens, gdy o tym myślę ...
Kasper Christensen

@KasperChristensen Jeśli określisz kontrasty jak w przykładach, przecięcie będzie Wielkim Średnim. Podaj powtarzalny przykład tego, co próbowałeś.
Sven Hohenstein

@ SvenHohenstein, dlaczego nie ma współczynnika b3 dla jakościowej wartości C w kontrastach sumarycznych? Powinien wynosić -0,9885891.
Vivaldi,

@Vivaldi Wartość b3 jest określona przez punkt przecięcia i b1, b2. Kolejny kontrast nie pozostawia stopnia swobody.
Sven Hohenstein,

@ SvenHohenstein Czy to nie jest bardziej problem kolinearności, ponieważ b3 można bezpośrednio wyrazić jako liniową kombinację innych zmiennych: (3 * średnia średnia - b1 - b2)?
Vivaldi,

6

Nitpicking: jeśli twój profesor kazał ci kodować zmienne (-1, 1), powiedział ci, abyś używał kodowania efektów , a nie rozmiarów efektów . W każdym razie @ user20650 ma rację. Jak zwykle strona pomocy statystyk UCLA ma przydatną stronę, na której wyjaśniono, jak to zrobić za pomocą R.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.