Pourquoi la colonne d'interception dans model.matrix remplace-t-elle le premier facteur?

9

J'essaie de convertir ma colonne de facteurs en variables factices:

str(cards$pointsBin)
# Factor w/ 5 levels ".lte100",".lte150",..: 3 2 3 1 4 4 2 2 4 4 ...

labels <- model.matrix(~ pointsBin, data=cards)

head(labels)

#     (Intercept) pointsBin.lte150 pointsBin.lte200 pointsBin.lte250 pointsBin.lte300
# 741           1                0                0                0                0
# 407           1                1                0                0                0
# 676           1                0                0                1                0
# 697           1                1                0                0                0
# 422           1                0                1                0                0
# 300           1                0                1                0                0

Il n'y a pas de colonne pour la première valeur de mon facteur ( ".lte100"), qui correspond à la première ligne à classer. Comment récupérer ces données? Et que signifie la colonne Interception qui semble être tous les 1?

digitgopher
la source
3
Lorsque vous avez des variables fictives "K", votre modèle résultant aura a.) Le terme d'interception (qui est une colonne d'unités) et b.) Des colonnes supplémentaires "K-1". La raison en est que sinon les colonnes de la matrice résultante ne seraient pas linéairement indépendantes (et, par conséquent, vous ne pourriez pas faire OLS ).
Steve S
2
Pourquoi «pas significatif»? C'est le même modèle avec la même qualité d'ajustement, juste paramétré d'une manière différente.
Wolfgang
2
@digitgopher: Lorsque vous exécutez une régression et que vous vous retrouvez avec un modèle comme celui-ci: , vous vous retrouvez techniquement avec un modèle comme ceci: , où ce nouveau terme est toujours égal à "1" (d'où la colonne de ceux). Si vous deviez éliminer cette colonne de l'un lors de l'exécution d'une régression régulière, vous vous retrouveriez avec un modèle biaisé puisque vous forceriez, en fait, chaque modèle à travers l'origine. y =β0*x0+β1*x1x0y^=β0+β1x1y^=β0x0+β1x1x0
Steve S
2
@SteveS: En fait, R est si convivial que si vous essayez de supprimer l'interception - 1lorsque vous avez un seul prédicteur catégorique représenté comme un facteur (comme dans cette question), cela supposera que vous ne voulez pas vraiment dire cela et que vous passerez à l'utilisation de sum- codage à zéro; ce qui est bien sûr juste un paramétrage différent. Trop sympathique, si vous me demandez.
Scortchi - Réintégrer Monica
2
@SteveS: Merci. J'aurais dû vérifier: il passe au codage cellulaire. Il ne fait pas ce à quoi vous vous attendez, ce qui correspond au modèle de passage forcé à l'origine contre lequel vous mettez en garde à juste titre (il le fera cependant lorsque les colonnes sont de type numérique).
Scortchi - Réintégrer Monica

Réponses:

10

Considérer ce qui suit:

require(mlbench)

data(HouseVotes84, package = "mlbench")
head(HouseVotes84)

labels <- model.matrix(~ V1, data=HouseVotes84)
head(labels)

labels1 <- model.matrix(~ V1+1, data=HouseVotes84)
head(labels1)

labels0 <- model.matrix(~ V1+0, data=HouseVotes84)
head(labels0)

labels_1 <- model.matrix(~ V1-1, data=HouseVotes84)
head(labels_1)

Les deux premières commandes sont identiques. Les deux dernières commandes spécifient de ne pas produire l'interception et conserve les deux variables fictives produites.

RUser4512
la source
1
Merci - cela explique le code que je voulais. Mais cela n'explique pas pourquoi ni ne m'aide à comprendre.
digitgopher
2
@digitgopher: Voir ats.ucla.edu/stat/r/library/contrast_coding.htm pour une explication du codage de niveau de référence et d'autres schémas de codage.
Scortchi - Réintégrer Monica