¿Por qué la columna de intercepción en model.matrix reemplaza el primer factor?

9

Estoy tratando de convertir mi columna de factor a variables ficticias:

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

No hay una columna para el primer valor de mi factor ( ".lte100"), que es lo que la primera fila se debe clasificar como ¿Cómo recupero estos datos? ¿Y qué significa la columna Interceptar que parece ser todo 1?

digitgopher
fuente
3
Cuando tiene variables ficticias "K", su modelo resultante tendrá a.) El término de intercepción (que es una columna de unos) y b.) Columnas adicionales "K-1". La razón es porque, de lo contrario, las columnas de la matriz resultante no serían linealmente independientes (y, como resultado, no podría hacer OLS ).
Steve S
2
¿Por qué 'no tiene sentido'? Es el mismo modelo con la misma bondad de ajuste, solo parametrizado de una manera diferente.
Wolfgang
2
@digitgopher: cuando ejecuta una regresión y termina con un modelo como este: , técnicamente está terminando con un modelo como esto: , donde este nuevo término siempre es igual a "1" (de ahí la columna de unos) Si eliminara esta columna de unos al ejecutar una regresión regular, terminaría con un modelo sesgado ya que, en efecto, estaría forzando a cada modelo a través del origen. y =β0*x0+β1*x1x0y^=β0+β1x1y^=β0 0X0 0+β1X1X0 0
Steve S
2
@SteveS: De hecho, R es tan amigable que si intentas eliminar la intercepción - 1cuando tienes un solo predictor categórico representado como un factor (como en esta pregunta), asumirá que realmente no quieres decir eso y cambiarás a usar sum- codificación a cero; que por supuesto es solo una parametrización diferente. Demasiado amable, si me preguntas.
Scortchi - Restablece a Monica
2
@SteveS: Gracias. Debería haberlo verificado: cambia a la codificación de medios celulares. No hace lo que podría esperar, que se ajusta al modelo forzado a través del origen contra el que advierte con razón (sin embargo, lo hará cuando la columna sea de tipo numérico).
Scortchi - Restablece a Monica

Respuestas:

10

Considera lo siguiente:

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)

Los dos primeros comandos son idénticos. Los dos últimos comandos especifican no producir la intercepción y mantienen las dos variables ficticias producidas.

RUser4512
fuente
1
Gracias, esto explica el código que quería. Pero no explica por qué ni me ayuda a entender.
digitgopher
2
@digitgopher: consulte ats.ucla.edu/stat/r/library/contrast_coding.htm para obtener una explicación de la codificación de nivel de referencia y otros esquemas de codificación.
Scortchi - Restablece a Monica