A codificação qualitativa de variáveis ​​na regressão leva a "singularidades"

17

Eu tenho uma variável independente chamada "qualidade"; essa variável possui 3 modalidades de resposta (má qualidade; média qualidade; alta qualidade). Quero introduzir essa variável independente em minha regressão linear múltipla. Quando eu tenho uma variável independente binária (variável dummy, eu posso codificar 0/ 1), é fácil introduzi-la em um modelo de regressão linear múltipla.

Mas com 3 modalidades de resposta, tentei codificar essa variável assim:

Bad quality      Medium quality      High quality

     0                1                  0
     1                0                  0
     0                0                  1
     0                1                  0

Mas há um problema quando tento fazer minha regressão linear múltipla: a modalidade Medium qualityme dá NA:

Coefficients: (1 not defined because of singularities) 

Como posso codificar essa variável "qualidade" com 3 modalidades? Preciso criar uma variável como um fator ( factorin R), mas posso introduzi-lo em uma regressão linear múltipla?

varin sacha
fonte
2
Talvez eu esteja entendendo mal a pergunta, mas você não pode incluir todos os níveis de uma variável categórica em uma regressão linear por causa da colinearidade perfeita. Uma de suas categorias será descartada para fornecer um grupo base com o qual os outros grupos são comparados.
RickyB
1
Existe uma excelente explicação em um contexto estatístico do que constitui uma matriz singular aqui: o que correlação faz uma matriz singular?
gung - Restabelece Monica

Respostas:

23

O problema que você está tendo (por exemplo, "singularidades") pode ser pensado como um exemplo de multicolinearidade . A multicolinearidade é geralmente definida como:

Uma ou mais variáveis ​​preditoras são uma combinação linear de outras variáveis ​​preditoras.

Esta é, de fato, uma definição bastante estrita; é multicolinearidade perfeita e você pode facilmente ter um problema com multicolinearidade sem que nenhuma de suas variáveis ​​seja perfeita combinação linear de outras. Além disso, a multicolinearidade perfeita raramente ocorre. No entanto, você encontrou um caso em que isso pode ocorrer. Vamos ver como podemos perfeitamente prever medium qualitya partir de nosso conhecimento das outras duas categorias (vamos fazer isso com um modelo de regressão, onde medium qualityé , e & são X 1 e X 2 , respectivamente): Y = β 0 + β 1Ybad qualityhigh qualityX1X2
Observe que não há termo de erro, ε , especificado, porque podemos prever isso perfeitamente. Para fazer isso, definimos β 0 = 1 , β 1 = - 1 e β 2 = - 1 . Agora, quando você tem, então X 1 = 1 , que cancela β 0 ( 1

Y=β0+β1X1+β2X2
εβ0=1β1=1β2=1bad qualityX1=1β0 ) e X 2 = 0 para que o termo também seja cancelado ( - 1 × 0 ). Assim, ficamos com um valor previsto de 0 para Y (), que é exatamente correto. Vou deixar que você trabalhe com outras possibilidades (sempre funciona, no seu caso). 1+1×1X2=01×00Ymedium quality

0RfactorR fará tudo isso por você - será feito corretamente e é muito mais conveniente - no entanto, vale a pena entender que é isso que está acontecendo "nos bastidores".

- Reinstate Monica
fonte
Obrigado por todos os seus comentários! Estou usando R, por isso, se entendi bem, com um fator R fará tudo, não preciso fazer nada! Perfeito! Tanques mais uma vez!
varin sacha
Se você definir a interceptação como zero na lmfórmula ( + 0), isso funcionaria?
Firebug
1
@ Firebug, se você estiver usando nível significa codificação (ou seja, você tem uma variável separada para cada nível), então você pode definir a interceptação como zero e deve funcionar bem. Embora o significado dos coeficientes variáveis ​​e dos testes de hipóteses sejam diferentes.
gung - Restabelece Monica
10

@gung explicou a teoria claramente. Aqui está um exemplo prático para ilustrar:

set.seed(1)
pred1 <- factor(c("bad", "med", "high"), levels=c("bad", "med", "high"))
df1 <- data.frame(y=20*abs(runif(6)),
                  x=rnorm(6),
                  q=sample(pred1, 6, replace=TRUE)
                  )
l1 <- lm(y ~ x, data=df1)
### add variable q    
l2 <- lm(y ~ x + q, data=df1)
### look at dummy variables generated in creating model
model.matrix(l2)

0bad

  (Intercept)          x qmed qhigh
1           1  1.5952808    1     0
2           1  0.3295078    0     1
3           1 -0.8204684    0     1
4           1  0.4874291    0     0
5           1  0.7383247    1     0
6           1  0.5757814    0     0

Agora, se codificarmos as variáveis ​​dummy e tentarmos ajustar um modelo usando todas elas:

df1 <- within(df1, {
       qbad <- ifelse(q=="bad", 1, 0)
       qmed <- ifelse(q=="med", 1, 0)
       qhigh <- ifelse(q=="high", 1, 0)
       })    
lm(y ~ x + qbad + qmed + qhigh, data=df1, singular.ok=FALSE)

Temos o erro esperado: singular fit encountered

dardisco
fonte
1
Prazer. Espero que esteja tudo claro agora. factorEm geral, você cuida da codificação de variáveis ​​fictícias para você, mas é bom estar ciente do que está acontecendo "sob o capô".
dardisco 23/09