Jakościowe kodowanie zmiennych w regresji prowadzi do „osobliwości”

17

Mam niezależną zmienną o nazwie „jakość”; ta zmienna ma 3 tryby odpowiedzi (zła jakość; średnia jakość; wysoka jakość). Chcę wprowadzić tę zmienną niezależną do mojej wielokrotnej regresji liniowej. Kiedy mam binarną zmienną niezależną (zmienną fikcyjną, mogę kodować 0/ 1), łatwo jest wprowadzić ją do modelu wielokrotnej regresji liniowej.

Ale przy 3 sposobach odpowiedzi próbowałem zakodować tę zmienną w następujący sposób:

Bad quality      Medium quality      High quality

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

Ale jest problem, gdy próbuję wykonać moją wielokrotną regresję liniową: modalność Medium qualitydaje mi NA:

Coefficients: (1 not defined because of singularities) 

Jak mogę zakodować tę zmienną „jakość” za pomocą 3 modalności? Czy muszę utworzyć zmienną jako czynnik ( factorin R), ale czy mogę wprowadzić ten czynnik do wielokrotnej regresji liniowej?

varin sacha
źródło
2
Być może nie rozumiem pytania, ale nie można zawrzeć wszystkich poziomów zmiennej kategorialnej w regresji liniowej z powodu doskonałej kolinearności. Jedna z twoich kategorii zostanie usunięta, aby zapewnić grupę podstawową, z którą porównywane są pozostałe grupy.
RickyB
1
W kontekście statystycznym istnieje wyjątkowe wyjaśnienie tego, co stanowi tutaj osobliwą macierz: co-korelacja-czyni-macierz-pojedynczą?
gung - Przywróć Monikę

Odpowiedzi:

23

Problem, który masz (tj. „Osobliwości”), może być traktowany jako przykład wielokoliniowości . Wielokoliniowość jest często definiowana jako:

Jedna lub więcej zmiennych predykcyjnych to liniowa kombinacja innych zmiennych predykcyjnych.

Jest to w rzeczywistości dość ścisła definicja; jest to idealna wielokoliniowość i możesz łatwo mieć problem z wielokoliniowością, przy czym żadna ze zmiennych nie jest idealną liniową kombinacją innych. Ponadto rzadko występuje doskonała wielokoliniowość. Natknąłeś się jednak na przypadek, w którym może to nastąpić. Zobaczmy, jak możemy doskonale przewidzieć medium qualityz naszej wiedzy o pozostałych dwóch kategoriach (będziemy to robić z modelu regresji, gdzie medium qualityjest , a i to X 1 i X 2Ybad qualityhigh qualityX1X2
Zauważ, że nie określono terminu błędu ε , ponieważ możemy to doskonale przewidzieć. W tym celu ustawiamy β 0 = 1 , β 1 = - 1 i β 2 = - 1 . Teraz, gdy masz, to X 1 = 1 , co anuluje β 0 ( 1

Y=β0+β1X1+β2X2
εβ0=1β1=1β2=1bad qualityX1=1β0 ), a X 2 = 0 , tak że okres jest eliminowana, a ( - 1 x 0 ). Zatem pozostaje nam przewidywana wartość 0 dla Y (), która jest dokładnie poprawna. Pozostawiam tobie wypracowanie innych możliwości (w twoim przypadku zawsze działa). 1+1×1X2=01×00Ymedium quality

0RfactorR zrobi to wszystko za Ciebie - będzie to zrobione poprawnie i jest to o wiele wygodniejsze - niemniej warto zrozumieć, że to właśnie dzieje się „za kulisami”.

gung - Przywróć Monikę
źródło
Dziękujemy za wszystkie komentarze! Używam R, więc jeśli dobrze rozumiem, przy współczynniku R zrobi wszystko, nie muszę nic robić! Doskonały ! Czołgi jeszcze raz!
varin sacha
Jeśli ustawisz punkt przecięcia na zero w lmformule ( + 0), czy to zadziała?
Firebug
1
@ Firebug, jeśli używasz kodowania oznaczającego poziom (tzn. Masz osobną zmienną dla każdego poziomu), możesz ustawić punkt przecięcia na zero i powinien on działać poprawnie. Chociaż znaczenie zmiennych współczynników i testów hipotez będzie się różnić.
gung - Przywróć Monikę
10

@ gung jasno wyjaśnił teorię. Oto praktyczny przykład do zilustrowania:

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

Teraz, jeśli sami kodujemy zmienne fikcyjne i próbujemy dopasować model, używając wszystkich z nich:

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)

Otrzymujemy oczekiwany błąd: singular fit encountered

dardisco
źródło
1
Przyjemność. Mam nadzieję, że teraz wszystko jest jasne. factorna ogół zajmie się tobą kodowaniem zmiennym, ale dobrze jest wiedzieć, co się dzieje „pod maską”.
dardisco