Comprensione della creazione di variabili fittizie (manuali o automatizzate) in GLM


13

Se nella formula glm viene utilizzata una variabile fattore (ad es. Genere con livelli M e F), vengono create variabili dummy, che possono essere trovate nel riepilogo del modello glm insieme ai coefficienti associati (ad es. GenderM)

Se, invece di fare affidamento su R per suddividere il fattore in questo modo, il fattore viene codificato in una serie di variabili numeriche 0/1 (ad es. GenderM (1 per M, 0 per F), genderF (1 per F, 0 per M) e queste variabili vengono quindi utilizzate come variabili numeriche nella formula glm, il risultato del coefficiente sarebbe diverso?

Fondamentalmente la domanda è: R usa un diverso calcolo del coefficiente quando si lavora con variabili fattoriali rispetto a variabili numeriche?

Domanda di follow-up (eventualmente fornita da una risposta sopra): oltre all'efficienza di lasciare che R crei variabili fittizie, c'è qualche problema con la ricodifica dei fattori come una serie di variabili numeriche 0,1 e usando invece quelle nel modello?


2
I coefficienti saranno gli stessi, la codifica di default di R per i fattori è esattamente come descritta (questo è chiamato codifica "fittizia"). Se lo fai manualmente, dovrai conoscere la "trappola variabile fittizia" - non puoi includere tutte le variabili create, ma puoi includere solo N - 1 (in alternativa, escludere l'intercettazione); in caso contrario, il modello viene identificato in modo eccessivo. Esistono anche altri metodi per codificare le variabili dei fattori. NN-1
Affine

@Affine la mia ipotesi è che se avessi alimentato sia genderM sia genderF, uno di loro avrebbe restituito NA per coefficienti (con il messaggio che una variabile era esclusa a causa delle singolarità). Questo ha senso perché in questo caso sono perfettamente correlati linearmente. Ma tu dici che non posso includere tutte le N; ciò significa che, anche se genderF è impostato su NA, comporterebbe differenze / problemi per il coefficiente genderM? O, più semplicemente, se GLM / LM esclude le variabili a causa delle singolarità, l'utilizzo di un modello sovra identificato è un problema? (Sono d'accordo con il tuo punto - sto solo interrogando le ramificazioni pratiche)
Bryan

Risposte:


22

Le variabili categoriche (chiamate " fattori " in R) devono essere rappresentate da codici numerici in più modelli di regressione. Esistono molti modi possibili per costruire i codici numerici in modo appropriato (vedi questo fantastico elenco nel sito di aiuto delle statistiche dell'UCLA). Per impostazione predefinita, R utilizza la codifica a livello di riferimento (che R chiama "trattamento di contrasto") e che è praticamente la statistica predefinita. Questo può essere modificato per tutti i contrasti per l'intera sessione R usando le opzioni? Oppure per specifiche analisi / variabili usando i contrasti o ? C (nota la maiuscola). Se hai bisogno di maggiori informazioni sulla codifica a livello di riferimento, te lo spiego qui: Regressione basata ad esempio sui giorni della settimana.

Alcune persone trovano confusa la codifica a livello di riferimento e non è necessario utilizzarla. Se vuoi, puoi avere due variabili per maschio e femmina; questo si chiama livello significa codifica. Tuttavia, se lo fai, dovrai sopprimere l'intercettazione o la matrice del modello sarà singolare e la regressione non sarà adatta come sopra @Affine note e come spiego qui: la codifica qualitativa delle variabili porta a singolarità . Per sopprimere l'intercettazione, modifichi la formula aggiungendo -1o in questo +0modo: y~... -1o y~... +0.

(constant)sexMsexMt0sexMt0

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
# ...

1
Grazie per l'aggiunta del codice: questo dimostra chiaramente che l'intercettazione nella codifica della cella di riferimento = sexFemale nella cella significa codifica (sono stato anche confuso da "cosa è successo" alla variabile N-1 ...) Forse ha bisogno di un'altra domanda, ma questo è facile da capire con una variabile, che ne dici di 2 o più? es. età: "vecchio" "giovane". Nella codifica delle celle di riferimento, i coefficienti mostrerebbero per sexMale, ageYoung (per esempio) e il conto di intercettazione per ENTRAMBI sexFemale ed ageOld?
Bryan,

1
Se hai un fattore con 3 livelli, l'intercettazione è la media del livello di riferimento e gli altri 2 saranno rappresentati nell'output. I loro coefficienti saranno entrambi la differenza tra loro e il livello di riferimento e il loro ps sarà il significato di quelle differenze. Se hai 2 fattori, entrambi avranno livelli di riferimento e l'intercettazione sarà la media di quelle persone che fanno parte di entrambi i gruppi di riferimento (ad es. young F) E gli altri livelli saranno diversi dal livello dato di fattore 1 w / il livello di riferimento dell'altro fattore e entrambi i gruppi di livelli di riferimento. Ad esempio oldè old F- `giovane F , & M` è young M- young F.
gung - Ripristina Monica

1
Ho giocato un po 'con questo e ho riscontrato R^2differenze sostanziali tra i due approcci. So che è solo un R^2, ma c'è una spiegazione per questo?
hans0l0

@ hans0l0, non ne ho idea. Non ci dovrebbero essere differenze.
gung - Ripristina Monica

1
@confuso, puoi trovarlo nella documentazione ? glm .
gung - Ripristina Monica

2

I coefficienti stimati sarebbero gli stessi soggetti alla condizione in cui si creano le variabili fittizie (cioè quelle numeriche) coerenti con R. Ad esempio: creiamo un dato falso e adattiamo un glm di Poisson usando il fattore. Si noti che la glfunzione crea una variabile fattore.

> 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

Poiché il risultato ha tre livelli, creo due variabili fittizie (fittizio.1 = 0 se outcome = 2 e fittizio.2 = 1 se outcome = 3) e refit usando questi valori numerici:

> 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

Come puoi vedere i coefficienti stimati sono gli stessi. Ma devi fare attenzione quando crei le variabili fittizie se vuoi ottenere lo stesso risultato. Ad esempio, se creo due variabili fittizie come (fittizio.1 = 0 se risultato = 1 e fittizio.2 = 1 se risultato = 2), i risultati stimati sono diversi come segue:

> 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

Questo perché quando si aggiunge una outcomevariabile in glm.1, R per impostazione predefinita crea due variabili fittizie outcome2e cioè e le outcome3definisce in modo simile a dummy.1e dummy.2in glm.2, ovvero il primo livello di risultato è quando tutte le altre variabili fittizie ( outcome2e outcome3) sono impostate per essere zero.


Grazie per la dimostrazione del codice dei coefficienti stimati essendo gli stessi. Anche l'avvertimento sulla creazione del mio è utile: volevo crearne uno mio perché una variabile del modello sarebbe stata ricollegata direttamente a una colonna del database per nome (che potrebbe essere utile a valle), ma sembra che debba capire i problemi con come Vado a fare questo.
Bryan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.