Le codage des variables qualitatives en régression conduit à des «singularités»

17

J'ai une variable indépendante appelée "qualité"; cette variable a 3 modalités de réponse (mauvaise qualité; qualité moyenne; haute qualité). Je veux introduire cette variable indépendante dans ma régression linéaire multiple. Lorsque j'ai une variable indépendante binaire (variable fictive, je peux coder 0/ 1), il est facile de l'introduire dans un modèle de régression linéaire multiple.

Mais avec 3 modalités de réponse, j'ai essayé de coder cette variable comme ceci:

Bad quality      Medium quality      High quality

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

Mais il y a un problème quand j'essaie de faire ma régression linéaire multiple: la modalité Medium qualityme donne NA:

Coefficients: (1 not defined because of singularities) 

Comment coder cette variable "qualité" avec 3 modalités? Dois-je créer une variable comme facteur ( factorin R) mais puis-je introduire ce facteur dans une régression linéaire multiple?

varin sacha
la source
2
Je comprends peut-être mal la question, mais vous ne pouvez pas inclure tous les niveaux d'une variable catégorielle dans une régression linéaire en raison de la colinéarité parfaite. L'une de vos catégories sera supprimée pour fournir un groupe de base auquel les autres groupes seront comparés.
RickyB
1
Il y a une explication exceptionnelle dans un contexte statistique de ce qui constitue une matrice singulière ici: quelle-corrélation-rend-une-matrice-singulière?
gung - Rétablir Monica

Réponses:

23

Le problème que vous rencontrez (c'est-à-dire les "singularités") peut être considéré comme un exemple de multicolinéarité . La multicollinéarité est souvent définie comme:

Une ou plusieurs variables prédictives sont une combinaison linéaire d'autres variables prédictives.

Il s'agit, en fait, d'une définition assez stricte; c'est une multicolinéarité parfaite , et vous pouvez facilement avoir un problème de multicolinéarité sans qu'aucune de vos variables ne soit une combinaison linéaire parfaite des autres. De plus, une multicolinéarité parfaite se produit rarement. Cependant, vous êtes tombé sur un cas où cela peut se produire. Voyons comment nous pouvons parfaitement prédire à medium qualitypartir de notre connaissance des deux autres catégories (nous le ferons avec un modèle de régression où medium qualityest , et & sont X 1 & X 2 , respectivement): Y = β 0 + β 1Ybad qualityhigh qualityX1X2
Notez qu'il n'y a pas de terme d'erreur, ε , spécifié, car nous pouvons le prédire parfaitement. Pour ce faire, nous fixons β 0 = 1 , β 1 = - 1 et β 2 = - 1 . Maintenant, quand vous avez, alors X 1 = 1 , ce qui annule β 0 ( 1

Y=β0+β1X1+β2X2
εβ0=1β1=1β2=1bad qualityX1=1β0 ), et X 2 = 0 pour que le terme soit également annulé ( - 1 × 0 ). Ainsi, nous nous retrouvons avec une valeur prédite de 0 pour Y (), ce qui est exactement correct. Je vous laisse le soin de trouver les autres possibilités (ça marche toujours, dans votre cas). 1+-1×1X2=0-1×00Ouimedium quality

0RfactorR fera tout cela pour vous - ce sera fait correctement, et c'est beaucoup plus pratique - néanmoins, il vaut la peine de comprendre que c'est ce qui se passe «dans les coulisses».

gung - Réintégrer Monica
la source
Merci pour tous vos commentaires ! J'utilise R donc si j'ai bien compris, avec un facteur R fera tout, je n'ai rien à faire! Parfait! Des chars une fois de plus!
varin sacha
Si vous définissez l'interception à zéro dans la lmformule ( + 0) cela fonctionnerait-il?
Firebug
1
@Firebug, si vous utilisez le codage de niveau (c'est-à-dire que vous avez une variable distincte pour chaque niveau), vous pouvez définir l'interception sur zéro et cela devrait fonctionner correctement. Bien que la signification des coefficients variables et les tests d'hypothèse diffèrent.
gung - Rétablir Monica
10

@gung a clairement expliqué la théorie. Voici un exemple pratique pour illustrer:

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

Maintenant, si nous codons nous-mêmes les variables fictives et essayons d'adapter un modèle en les utilisant toutes:

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)

Nous obtenons l'erreur attendue: singular fit encountered

dardisco
la source
1
Plaisir. J'espère que tout est clair maintenant. factors'occupe généralement du codage des variables factices pour vous, mais bon de savoir ce qui se passe «sous le capot».
dardisco