Entendendo a criação de variáveis ​​fictícias (manual ou automatizada) no GLM

13

Se uma variável fator (por exemplo, gênero com níveis M e F) for usada na fórmula glm, as variáveis ​​fictícias serão criadas e poderão ser encontradas no resumo do modelo glm juntamente com seus coeficientes associados (por exemplo, gêneroM)

Se, em vez de confiar em R para dividir o fator dessa maneira, o fator é codificado em uma série de variáveis ​​numéricas 0/1 (por exemplo, gêneroM (1 para M, 0 para F), gêneroF (1 para F, 0 para M) e essas variáveis ​​são usadas como variáveis ​​numéricas na fórmula glm, o resultado do coeficiente seria diferente?

Basicamente, a pergunta é: R usa um cálculo de coeficiente diferente ao trabalhar com variáveis ​​fatoriais versus variáveis ​​numéricas?

Pergunta de acompanhamento (possivelmente respondida acima): além da eficiência de deixar R criar variáveis ​​fictícias, existe algum problema com a recodificação de fatores como uma série de variáveis ​​numéricas 0,1 e usando as do modelo?

Bryan
fonte
2
Os coeficientes serão os mesmos, a codificação padrão de R para os fatores é exatamente como você descreveu (isso é chamado de codificação "fictícia"). Se você fizer isso manualmente, precisará conhecer a "armadilha de variável dummy" - não é possível incluir todas as variáveis ​​criadas, mas apenas (como alternativa, excluir a interceptação); caso contrário, seu modelo será superidentificado. Também existem outros métodos de codificação de variáveis ​​fatoriais. NN1
Afine
@Afinal, meu palpite é que, se eu alimentasse genderM e genderF, um deles retornaria NA por coeficientes (com a mensagem de que uma variável foi excluída por causa de singularidades). Isso faz sentido porque eles se relacionam perfeitamente linearmente neste caso. Mas você diz que não posso incluir todos os N; isso significa que, embora genderF esteja definido como NA, isso resultaria em diferenças / problemas para o coeficiente genderM? Ou, mais simplesmente, se o GLM / LM excluir variáveis ​​por causa de singularidades, o uso de um modelo superidentificado é um problema? (Eu concordo com o seu ponto - apenas consultando as ramificações práticas)
Bryan

Respostas:

22

Variáveis ​​categóricas (chamadas " fatores " em R) precisam ser representadas por códigos numéricos em vários modelos de regressão. Existem muitas maneiras possíveis de construir códigos numéricos de maneira apropriada (consulte esta ótima lista no site de ajuda de estatísticas da UCLA). Por padrão, o R usa codificação no nível de referência (que R chama de "tratamento de controle") e que é praticamente o padrão em toda a estatística. Isso pode ser alterado para todos os contrastes de toda a sua sessão R usando as opções? Ou para análises / variáveis ​​específicas usando os contrastes ? Ou C (observe a capital). Se você precisar de mais informações sobre codificação no nível de referência, explico aqui: Regressão baseada, por exemplo, nos dias da semana.

Algumas pessoas acham a codificação no nível de referência confusa e você não precisa usá-la. Se desejar, você pode ter duas variáveis ​​para masculino e feminino; isso é chamado nível significa codificação. No entanto, se você fizer isso, será necessário suprimir a interceptação ou a matriz do modelo será singular e a regressão não poderá ser ajustada como as notas do @Affine acima e como explico aqui: A codificação qualitativa de variáveis ​​leva a singularidades . Para suprimir a interceptação, você modifica sua fórmula adicionando -1ou +0assim: y~... -1ou y~... +0.

O uso da codificação de nível significa em vez da codificação em nível de referência alterará os coeficientes estimados e o significado dos testes de hipótese impressos com a sua saída. Quando você possui um fator de dois níveis (por exemplo, masculino versus feminino) e usa a codificação em nível de referência, verá a interceptação chamada (constant)e apenas uma variável listada na saída (talvez sexM). A interceptação é a média do grupo de referência (talvez mulheres) e sexMé a diferença entre a média dos homens e a média das mulheres. O valor p associado à interceptação é um teste uma amostra para determinar se o nível de referência tem uma média de e o valor p associado at0sexMinforma se os sexos diferem em sua resposta. Mas se você usar a codificação de nível médio, terá duas variáveis ​​listadas e cada valor p corresponderá a um teste uma amostra para determinar se a média desse nível é . Ou seja, nenhum dos valores-p será um teste para saber se os sexos diferem. t0

set.seed(1)
y    = c(    rnorm(30), rnorm(30, mean=1)         )
sex  = rep(c("Female",  "Male"          ), each=30)
fem  = ifelse(sex=="Female", 1, 0)
male = ifelse(sex=="Male", 1, 0)

ref.level.coding.model   = lm(y~sex)
level.means.coding.model = lm(y~fem+male+0)

summary(ref.level.coding.model)
# ...
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  0.08246    0.15740   0.524    0.602    
# sexMale      1.05032    0.22260   4.718 1.54e-05 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ...
summary(level.means.coding.model)
# ...
# Coefficients:
#      Estimate Std. Error t value Pr(>|t|)    
# fem   0.08246    0.15740   0.524    0.602    
# male  1.13277    0.15740   7.197 1.37e-09 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ...
Repor a Monica
fonte
1
Obrigado pela adição do código: isso demonstra claramente que a interceptação na célula de referência que codifica = sexFemale na célula significa codificação (eu também fiquei confuso com "o que aconteceu" à variável N-1 ...) Talvez precise de outra pergunta, mas isso é fácil de entender com uma variável, e quanto a 2 ou mais? por exemplo, idade: "velho" "jovem". Na codificação de células ref, os coeficientes seriam exibidos para sexMale, ageYoung (por exemplo) e a interceptação são responsáveis ​​por AMBOS sexFemale e ageOld?
Bryan
1
Se você possui um fator com 3 níveis, a interceptação é a média do nível de referência e os outros 2 serão representados na saída. Seus coeficientes serão a diferença entre eles e o nível de referência e seu ps será o significado dessas diferenças. Se você tiver 2 fatores, ambos terão níveis de referência, e a interceptação será a média das pessoas que estão nos dois grupos de referência (por exemplo, young F) e os outros níveis serão diferentes do nível dado de fator 1 w / o nível de referência do outro fator e o grupo dos dois níveis de referência. Por exemplo, oldé old F- `jovem F , & M` é young M- young F.
gung - Restabelece Monica
1
Eu brinquei um pouco com isso e experimentei uma R^2diferença substancial entre as duas abordagens. Eu sei que é apenas um R^2, mas existe uma explicação para isso?
hans0l0
@ hans0l0, não faço ideia. Não deve haver diferença.
gung - Restabelece Monica
1
@ confuso, você pode encontrar isso na documentação ,? glm .
gung - Restabelece Monica
2

Os coeficientes estimados seriam os mesmos sujeitos à condição em que você cria suas variáveis ​​fictícias (isto é, as numéricas) consistentes com R. Por exemplo: vamos criar um dado falso e ajustar um fator de Poisson glm. Observe que a glfunção cria uma variável de fator.

> counts <- c(18,17,15,20,10,20,25,13,12)
> outcome <- gl(3,1,9)
> outcome
[1] 1 2 3 1 2 3 1 2 3
Levels: 1 2 3
> class(outcome)
[1] "factor"
> glm.1<- glm(counts ~ outcome, family = poisson())
> summary(glm.1)

Call:
glm(formula = counts ~ outcome, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   3.0445     0.1260  24.165   <2e-16 ***
outcome2     -0.4543     0.2022  -2.247   0.0246 *  
outcome3     -0.2930     0.1927  -1.520   0.1285    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

Como resultado tem três níveis, crio duas variáveis ​​fictícias (dummy.1 = 0 se resultado = 2 e dummy.2 = 1 se resultado = 3) e recoloque usando esses valores numéricos:

> dummy.1=rep(0,9)
> dummy.2=rep(0,9)
> dummy.1[outcome==2]=1
> dummy.2[outcome==3]=1
> glm.2<- glm(counts ~ dummy.1+dummy.2, family = poisson())
> summary(glm.2)

Call:
glm(formula = counts ~ dummy.1 + dummy.2, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   3.0445     0.1260  24.165   <2e-16 ***
dummy.1      -0.4543     0.2022  -2.247   0.0246 *  
dummy.2      -0.2930     0.1927  -1.520   0.1285    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

Como você pode ver, os coeficientes estimados são os mesmos. Mas você precisa ter cuidado ao criar suas variáveis ​​fictícias se quiser obter o mesmo resultado. Por exemplo, se eu criar duas variáveis ​​fictícias como (dummy.1 = 0 se resultado = 1 e dummy.2 = 1 se resultado = 2), os resultados estimados serão diferentes da seguinte maneira:

> dummy.1=rep(0,9)
> dummy.2=rep(0,9)
> dummy.1[outcome==1]=1
> dummy.2[outcome==2]=1
> glm.3<- glm(counts ~ dummy.1+dummy.2, family = poisson())
> summary(glm.3)

Call:
glm(formula = counts ~ dummy.1 + dummy.2, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   2.7515     0.1459   18.86   <2e-16 ***
dummy.1       0.2930     0.1927    1.52    0.128    
dummy.2      -0.1613     0.2151   -0.75    0.453    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

Isso ocorre porque quando você adiciona outcomevariável no glm.1, R, por padrão, cria duas variáveis ​​fictícias, a saber, outcome2e outcome3define-as de forma semelhante a dummy.1e dummy.2no glm.2, isto é, o primeiro nível de resultado é quando todas as outras variáveis ​​fictícias ( outcome2e outcome3) são definidas como zero.

Estado
fonte
Obrigado pela prova de código dos coeficientes estimados sendo os mesmos. Além disso, o aviso sobre a criação de minha própria é útil: eu queria criar minha própria, porque uma variável de modelo seria vinculada diretamente a uma coluna de banco de dados por nome (o que poderia ser útil a jusante), mas parece que eu preciso entender os problemas de como Eu vou fazer isso.
Bryan