A multicolinearidade está implícita nas variáveis ​​categóricas?

10

Notei que, ao mexer em um modelo de regressão multivariada, houve um efeito multicolinearidade pequeno, mas perceptível, medido por fatores de inflação de variação, dentro das categorias de uma variável categórica (depois de excluir a categoria de referência, é claro).

Por exemplo, digamos que temos um conjunto de dados com a variável contínua y e uma variável categórica nominal x que tem k possíveis valores mutuamente exclusivos. Codificamos esses valores possíveis como 0/1 variáveis ​​fictícias . Em seguida, executamos um modelo de regressão . As pontuações do VIF para as variáveis ​​dummy são diferentes de zero. De fato, à medida que o número de categorias aumenta, os VIFs aumentam. Centralizar as variáveis ​​fictícias não parece alterar os VIFs.x 1 , x 2 , , x k y = b 0 + b 1 x 1 + b 2 x 2 + + b k - 1 x k - 1 k - 1kx1 1,x2,,xky=b0 0+b1 1x1 1+b2x2++bk-1 1xk-1 1k-1 1

A explicação intuitiva parece ser que a condição mutuamente exclusiva das categorias dentro da variável categórica causa essa ligeira multicolinearidade. Esta é uma descoberta trivial ou é um problema a considerar ao criar modelos de regressão com variáveis ​​categóricas?

RobertF
fonte

Respostas:

8

Não posso reproduzir exatamente esse fenômeno, mas posso demonstrar que o VIF não aumenta necessariamente à medida que o número de categorias aumenta .

A intuição é simples: variáveis ​​categóricas podem ser ortogonais através de desenhos experimentais adequados. Portanto, não deve, em geral, nenhuma relação entre o número de categorias e multicolinearidade.

Rn

trial <- function(n, k1=2, k2=2) {
  df <- expand.grid(1:k1, 1:k2)
  df <- do.call(rbind, lapply(1:n, function(i) df))
  df$y <- rnorm(k1*k2*n)
  fit <- lm(y ~ Var1+Var2, data=df)
  vif(fit)
}

1 1

sapply(1:5, trial) # Two binary categories, 1-5 replicates per combination
sapply(1:5, function(i) trial(i, 10, 3)) # 30 categories, 1-5 replicates

Isso sugere que a multicolinearidade pode estar aumentando devido a um crescente desequilíbrio no design . Para testar isso, insira a linha

  df <- subset(df, subset=(y < 0))

antes da fitlinha entrar trial. Isso remove metade dos dados aleatoriamente. Re-executando

sapply(1:5, function(i) trial(i, 10, 3))

1 1sapply(1:5, function(i) trial(i, 10, 10))

whuber
fonte
2

xEuxEu=1 1x1 1=1 1-xEuEu1 1

Michael R. Chernick
fonte
Não entendo o que as distribuições multinomiais têm a ver com essa situação. Você poderia explicar?
whuber