La codifica variabile qualitativa nella regressione porta a "singolarità"


17

Ho una variabile indipendente chiamata "qualità"; questa variabile ha 3 modalità di risposta (cattiva qualità; media qualità; alta qualità). Voglio introdurre questa variabile indipendente nella mia regressione lineare multipla. Quando ho una variabile binaria indipendente (variabile fittizia, posso codificare 0/ 1) è facile introdurla in un modello di regressione lineare multipla.

Ma con 3 modalità di risposta, ho provato a codificare questa variabile in questo modo:

Bad quality      Medium quality      High quality

     0                1                  0
     1                0                  0
     0                0                  1
     0                1                  0

Ma c'è un problema quando provo a fare la mia regressione lineare multipla: la modalità Medium qualitymi dà NA:

Coefficients: (1 not defined because of singularities) 

Come posso codificare questa variabile "qualità" con 3 modalità? Devo creare una variabile come fattore ( factorin R) ma poi posso introdurre questo fattore in una regressione lineare multipla?


2
Forse sto fraintendendo la domanda, ma non puoi includere tutti i livelli di una variabile categoriale in una regressione lineare a causa della perfetta collinearità. Una delle tue categorie verrà eliminata per fornire un gruppo base rispetto al quale vengono confrontati gli altri gruppi.
RickyB,

1
C'è una spiegazione eccezionale in un contesto statistico di ciò che costituisce una matrice singolare qui: cosa-correlazione-rende-una-matrice-singolare?
gung - Ripristina Monica

Risposte:


23

Il problema che stai riscontrando (cioè "singolarità") può essere considerato come un'istanza di multicollinearità . La multicollinearità è spesso definita come:

Una o più variabili predittive sono una combinazione lineare di altre variabili predittive.

Questa è, in effetti, una definizione piuttosto rigorosa; è una multicollinearità perfetta e puoi facilmente avere un problema con la multicollinearità senza che nessuna delle tue variabili sia una perfetta combinazione lineare di altre. Inoltre, raramente si verifica una perfetta multicollinearità. Tuttavia, ti sei imbattuto in un caso in cui può accadere. Vediamo come possiamo prevedere perfettamentemedium quality dalla nostra conoscenza delle altre due categorie (lo faremo con un modello di regressione dove medium qualityè , e e sono X 1 e X 2 , rispettivamente): Y = β 0 + β 1Ybad qualityhigh qualityX1X2
Notare che non esiste un termine di errore, ε , perché possiamo prevederlo perfettamente. Per fare ciò, impostiamo β 0 = 1 , β 1 = - 1 e β 2 = - 1 . Ora, quando hai, allora X 1 = 1 , che annulla β 0 () emodo che anche quel termine venga cancellato (

Y=β0+β1X1+β2X2
εβ0=1β1=-1β2=-1bad qualityX1=1β01+-1×1X2=0-1×0). Pertanto, ci viene lasciato un valore previsto di per ( ), che è esattamente corretto. Lascerò a te elaborare le altre possibilità (funziona sempre, nel tuo caso). 0Ymedium quality

Quindi cosa dovresti fare? Quando si rappresenta una variabile categoriale, generalmente si usa la codifica delle celle di riferimento (spesso chiamata "codifica fittizia"). Per fare ciò, scegliamo un livello della nostra variabile categoriale come livello di riferimento; quel livello non ottiene il proprio codice fittizio, ma viene semplicemente indicato avendo tutti gli nei codici fittizi per tutti gli altri livelli. Gli altri livelli della variabile categoriale sono rappresentati da codici fittizi proprio come hai già fatto. (Per ulteriori informazioni su questo, puoi vedere la mia risposta qui: Regressione basata ad esempio sui giorni della settimana .) Se stai usando , puoi usare un e0RfactorR farà tutto questo per te - sarà fatto correttamente, ed è molto più conveniente - tuttavia, vale la pena capire che questo è ciò che sta accadendo "dietro le quinte".


Grazie per tutti i tuoi commenti! Sto usando R, quindi se ho capito bene, con un fattore R farà tutto, non ho bisogno di fare nulla! Perfetto ! I carri armati ancora una volta!
varin sacha,

Se imposti l'intercetta su zero nella lmformula ( + 0) funzionerebbe?
Firebug

1
@Firebug, se stai usando level significa codifica (cioè, hai una variabile separata per ogni livello), allora puoi impostare l'intercetta su zero e dovrebbe funzionare bene. Sebbene il significato dei coefficienti variabili e i test di ipotesi differiranno.
gung - Ripristina Monica

10

@gung ha spiegato chiaramente la teoria. Ecco un esempio pratico per illustrare:

set.seed(1)
pred1 <- factor(c("bad", "med", "high"), levels=c("bad", "med", "high"))
df1 <- data.frame(y=20*abs(runif(6)),
                  x=rnorm(6),
                  q=sample(pred1, 6, replace=TRUE)
                  )
l1 <- lm(y ~ x, data=df1)
### add variable q    
l2 <- lm(y ~ x + q, data=df1)
### look at dummy variables generated in creating model
model.matrix(l2)

0bad

  (Intercept)          x qmed qhigh
1           1  1.5952808    1     0
2           1  0.3295078    0     1
3           1 -0.8204684    0     1
4           1  0.4874291    0     0
5           1  0.7383247    1     0
6           1  0.5757814    0     0

Ora se codifichiamo noi stessi le variabili fittizie e proviamo ad adattare un modello usando tutte:

df1 <- within(df1, {
       qbad <- ifelse(q=="bad", 1, 0)
       qmed <- ifelse(q=="med", 1, 0)
       qhigh <- ifelse(q=="high", 1, 0)
       })    
lm(y ~ x + qbad + qmed + qhigh, data=df1, singular.ok=FALSE)

Viene visualizzato l'errore previsto: singular fit encountered


1
Piacere. Spero sia tutto chiaro ora. factorgeneralmente si occuperà della codifica variabile fittizia per te, ma è bene essere consapevoli di ciò che sta accadendo "sotto il cofano".
dardisco,
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.