Como fazer regressão com codificação de efeito em vez de codificação fictícia em R?

14

Atualmente, estou trabalhando em um modelo de regressão em que tenho apenas variáveis ​​categóricas / fatoriais como variáveis ​​independentes. Minha variável dependente é uma proporção transformada em logit.

É bastante fácil apenas executar uma regressão normal em R, pois R sabe automaticamente como codificar manequins assim que eles são do tipo "fator". No entanto, esse tipo de codificação também implica que uma categoria de cada variável seja usada como linha de base, dificultando a interpretação.

Meu professor me disse para usar apenas a codificação de efeitos (-1 ou 1), pois isso implica o uso da média geral para a interceptação.

Alguém sabe como lidar com isso?

Até agora eu tentei:

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
fonte
1
? Olhada contrastes Eu acho que é contr.sum para teste contra a média geral - verificar os arquivos de ajuda R
user20650

Respostas:

13

Em princípio, existem dois tipos de codificação de contraste, com os quais a interceptação estimará a Grande Média. Estes são contrastes de soma e contrastes repetidos (diferenças deslizantes).

Aqui está um exemplo de conjunto de dados:

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

As condições »significam:

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

A Grande Média:

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

Você pode especificar o tipo de contraste de codificação com o contrastsparâmetro lm.

Soma contrastes

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

Coefficients:
(Intercept)           b1           b2  
     0.9782       1.0543      -0.0657 

A interceptação é a grande média. A primeira inclinação é a diferença entre o primeiro nível de fator e a Grande Média. A segunda inclinação é a diferença entre o segundo nível de fator e a Grande Média.

Contrastes repetidos

A função para criar contrastes repetidos faz parte do MASSpacote.

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

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

A interceptação é a grande média. As inclinações indicam as diferenças entre os níveis de fatores consecutivos (2 vs. 1, 3 vs. 2).

Sven Hohenstein
fonte
Hmm, tentei o que você sugeriu, mas não sei se algum dos códigos faz o que eu quero. O fato é que eu tenho anos {1998, ..., 2007} em um IV e meses {Jan, ..., Dec} em outro IV. Como agora, a função lm permite que abril se torne automaticamente a interceptação, bem como 1998. Em vez disso, eu só quero que a interceptação seja uma média geral ... Eu realmente não sei se faz sentido pensar nisso ...
Kasper Christensen
@ KasperChristensen Se você especificar os contrastes como nos exemplos, a interceptação será a Grande Média. Forneça um exemplo reproduzível do que você tentou.
Sven Hohenstein
@SvenHohenstein, por que não há coeficiente b3 para o valor categórico de C nos contrastes de soma? Deve ser -0,9885891.
Vivaldi
@Vivaldi O valor de b3 é determinado pela interceptação e b1, b2. Não há grau de liberdade para outro contraste.
Sven Hohenstein
@SvenHohenstein Isso não é mais um problema de colinearidade, já que b3 pode ser expresso diretamente como uma combinação linear de outras variáveis: (3 * média geral - b1 - b2)?
Vivaldi
6

Nitpicking: se seu professor lhe disse para codificar suas variáveis (-1, 1), ele lhe disse para usar codificação de efeitos , não tamanhos de efeito . De qualquer forma, @ user20650 está certo. Como sempre, o site de ajuda de estatísticas da UCLA tem uma página útil que explica como fazer isso com R.

Repor a Monica
fonte