Por que a coluna de interceptação no model.matrix substitui o primeiro fator?

9

Estou tentando converter minha coluna de fator em variáveis ​​fictícias:

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

Não há coluna para o primeiro valor do meu fator ( ".lte100"), que é o que a primeira linha deve ser categorizada como. Como obtenho esses dados de volta? E o que significa a coluna Interceptar, que parece ser todos os 1s?

digitgopher
fonte
3
Quando você possui variáveis ​​fictícias "K", seu modelo resultante terá a.) O termo de interceptação (que é uma coluna de uma) eb). Colunas adicionais "K-1". O motivo é que, caso contrário, as colunas da matriz resultante não seriam linearmente independentes (e, como resultado, você não seria capaz de executar o OLS ).
21740 Steve
2
Por que 'não tem sentido'? É o mesmo modelo com a mesma qualidade de ajuste, apenas parametrizado de uma maneira diferente.
Wolfgang
2
@digitgopher: Quando você executa uma regressão e termina com um modelo como este: , você está tecnicamente terminando com um modelo como this: , em que este novo termo é sempre igual a "1" (daí a coluna de uns). Se você eliminasse essa coluna de pessoas ao executar uma regressão regular, acabaria com um modelo tendencioso , pois, na verdade, estaria forçando todos os modelos pela origem. Y =β0*x0+β1*x1x0y^=β0+β1x1y^=β0x0+β1x1x0
Steve S
2
@SteveS: Na verdade, o R é tão amigável que, se você tentar remover a interceptação - 1quando tiver um único preditor categórico representado como um fator (como nesta pergunta), ele assumirá que você realmente não quer dizer isso e passa a usar o sum- codificação para zero; o que é obviamente apenas uma parametrização diferente. Muito amigável, se você me perguntar.
Scortchi - Restabelece Monica
2
@ Steve: Obrigado. Eu deveria ter verificado: ele muda para a codificação celular. Ele não faz o que você poderia esperar, o que é adequado ao modelo forçado através da origem com o qual você adverte com razão (ele fará isso quando as colunas são do tipo numérico).
Scortchi - Restabelece Monica

Respostas:

10

Considere o seguinte:

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)

Os dois primeiros comandos são idênticos. Os dois últimos comandos especificam não produzir a interceptação e mantém as duas variáveis ​​fictícias produzidas.

RUser4512
fonte
11
Obrigado - isso explica o código que eu queria. Mas isso não explica o porquê ou me ajuda a entender.
digitgopher
2
@ digitgopher: Veja ats.ucla.edu/stat/r/library/contrast_coding.htm para obter uma explicação sobre a codificação em nível de referência e outros esquemas de codificação.
Scortchi - Reinstate Monica