Grundlegendes zur Erstellung von Dummy-Variablen (manuell oder automatisiert) in GLM


13

Wenn in der glm-Formel eine Faktorvariable (z. B. Geschlecht mit den Ebenen M und F) verwendet wird, werden Dummy-Variablen erstellt, die zusammen mit den zugehörigen Koeffizienten (z. B. genderM) in der glm-Modellzusammenfassung aufgeführt sind.

Wenn Sie sich nicht auf R verlassen, um den Faktor auf diese Weise aufzuteilen, wird der Faktor in einer Reihe numerischer 0/1-Variablen codiert (z. B. genderM (1 für M, 0 für F), genderF (1 für F, 0 für) M) und diese Variablen werden dann als numerische Variablen in der glm-Formel verwendet. Wäre das Koeffizientenergebnis anders?

Grundsätzlich lautet die Frage: Verwendet R eine andere Koeffizientenberechnung, wenn mit Faktorvariablen als mit numerischen Variablen gearbeitet wird?

Folgefrage (möglicherweise oben beantwortet): Gibt es neben der Effizienz, mit der R Dummy-Variablen erstellen kann, ein Problem damit, Faktoren als eine Reihe numerischer 0,1-Variablen neu zu codieren und stattdessen diese im Modell zu verwenden?


2
Die Koeffizienten sind die gleichen. Die Standardcodierung von R für Faktoren entspricht genau Ihrer Beschreibung (dies wird als "Dummy" -Codierung bezeichnet). Wenn Sie dies manuell tun, müssen Sie die "Dummy-Variablenfalle" kennen - Sie können nicht alle erstellten Variablen einschließen, sondern nur N - 1 (alternativ den Achsenabschnitt ausschließen); Andernfalls ist Ihr Modell überidentifiziert. Es gibt auch andere Methoden zum Codieren von Faktorvariablen. N.N.- -1
Affine

@Affine meine Vermutung ist, dass, wenn ich sowohl genderM als auch genderF einspeiste, einer von ihnen NA für Koeffizienten zurückgeben würde (mit der Meldung, dass eine Variable aufgrund von Singularitäten ausgeschlossen wurde). Dies ist sinnvoll, da sie in diesem Fall perfekt linear zusammenhängen. Aber Sie sagen, dass ich nicht alle N einschließen kann; Bedeutet das, dass, obwohl genderF auf NA gesetzt ist, dies zu Unterschieden / Problemen für den genderM-Koeffizienten führen würde? Oder ist es einfacher, ein überidentifiziertes Modell zu verwenden, wenn GLM / LM Variablen aufgrund von Singularitäten ausschließt? (Ich stimme Ihrem Punkt zu - nur die praktischen Konsequenzen abfragen)
Bryan

Antworten:


22

Kategoriale Variablen ( in R " Faktoren " genannt) müssen in mehreren Regressionsmodellen durch numerische Codes dargestellt werden. Es gibt sehr viele Möglichkeiten, numerische Codes angemessen zu erstellen (siehe diese großartige Liste auf der Hilfeseite der UCLA für Statistiken). Standardmäßig verwendet R die Codierung auf Referenzebene (die R "contr.treatment" nennt) und ist so ziemlich die Standardstatistik für die gesamte Statistik. Dies kann für alle Kontraste für Ihre gesamte R-Sitzung mithilfe von Optionen oder für bestimmte Analysen / Variablen mithilfe von Kontrasten oder C (beachten Sie das Großbuchstaben) geändert werden . Wenn Sie weitere Informationen zur Codierung auf Referenzniveau benötigen, erkläre ich dies hier: Regression, die beispielsweise auf Wochentagen basiert.

Einige Leute finden die Codierung auf Referenzniveau verwirrend, und Sie müssen sie nicht verwenden. Wenn Sie möchten, können Sie zwei Variablen für männlich und weiblich haben. Dies nennt man Level bedeutet Codierung. Wenn Sie dies tun, müssen Sie jedoch den Achsenabschnitt unterdrücken, da sonst die Modellmatrix singulär ist und die Regression nicht wie oben beschrieben und wie ich hier erläutere, angepasst werden kann: Qualitative Variablencodierung führt zu Singularitäten . Um den Achsenabschnitt zu unterdrücken, ändern Sie Ihre Formel, indem Sie Folgendes hinzufügen -1oder +0mögen: y~... -1oder 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
Vielen Dank für die Hinzufügung des Codes: Dies zeigt deutlich, dass der Achsenabschnitt in der Referenzzellencodierung = sexFemale in der Zelle Codierung bedeutet (ich war zusätzlich verwirrt über "was passiert ist" mit der N-1-Variablen ...). Vielleicht braucht es eine andere Frage, aber Dies ist mit einer Variablen leicht zu verstehen. Was ist mit 2 oder mehr? zB Alter: "alt" "jung". Würden bei der Ref-Zellcodierung Koeffizienten für sexMale, ageYoung (zum Beispiel) und das Intercept-Konto für BEIDE sexFemale und ageOld angezeigt?
Bryan

1
Wenn Sie einen Faktor mit 3 Pegeln haben, ist der Achsenabschnitt der Mittelwert des Referenzpegels, und die anderen 2 werden in der Ausgabe dargestellt. Ihre Koeffizienten sind sowohl die Differenz zwischen ihnen als auch das Referenzniveau und ihre ps sind die Bedeutung dieser Unterschiede. Wenn Sie 2 Faktoren haben, haben beide Ref-Levels, und der Achsenabschnitt ist der Mittelwert der Personen, die in beiden Ref-Gruppen sind (z. B. young F), und die anderen Levels unterscheiden sich vom angegebenen Level von Faktor 1 w / das Referenzniveau des anderen Faktors und die Gruppe der beiden Referenzniveaus. ZB oldist old F- `junges F , & M` ist young M- young F.
Gung - Reinstate Monica

1
Ich habe ein bisschen damit gespielt und einen wesentlichen R^2Unterschied zwischen beiden Ansätzen festgestellt. Ich weiß, es ist nur eine R^2, aber gibt es eine Erklärung dafür?
hans0l0

@ hans0l0, ich habe keine Ahnung. Es sollte keinen Unterschied geben.
Gung - Reinstate Monica

1
@confused finden Sie das in der Dokumentation , ? glm .
gung - Monica wieder einsetzen

2

Die geschätzten Koeffizienten sind unter der Bedingung gleich, dass Sie Ihre Dummy-Variablen (dh die numerischen) gemäß R erstellen. Beispiel: Erstellen Sie gefälschte Daten und passen Sie einen Poisson-glm-Faktor an. Beachten Sie, dass die glFunktion eine Faktorvariable erstellt.

> 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

Da das Ergebnis drei Ebenen hat, erstelle ich zwei Dummy-Variablen (Dummy.1 = 0, wenn Ergebnis = 2 und Dummy.2 = 1, wenn Ergebnis = 3) und passe mit diesen numerischen Werten um:

> 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

Wie Sie sehen können, sind die geschätzten Koeffizienten gleich. Sie müssen jedoch beim Erstellen Ihrer Dummy-Variablen vorsichtig sein, wenn Sie das gleiche Ergebnis erzielen möchten. Wenn ich zum Beispiel zwei Dummy-Variablen wie folgt erstelle (Dummy.1 = 0, wenn Ergebnis = 1 und Dummy.2 = 1, wenn Ergebnis = 2), unterscheiden sich die geschätzten Ergebnisse wie folgt:

> 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

Dies liegt daran outcome, dass R beim Hinzufügen einer Variablen in glm.1 standardmäßig zwei Dummy-Variablen erstellt, outcome2und zwar und outcome3diese ähnlich wie in dummy.1und dummy.2in glm.2 definiert, dh die erste Ergebnisebene ist, wenn alle anderen Dummy-Variablen ( outcome2und outcome3) festgelegt sind Null.


Vielen Dank für den Code-Beweis, dass die geschätzten Koeffizienten gleich sind. Auch die Warnung zum Erstellen meiner eigenen ist nützlich: Ich wollte meine eigene erstellen, da dann eine Modellvariable direkt nach Namen mit einer Datenbankspalte verknüpft wird (was nachgelagert nützlich sein könnte), aber es sieht so aus, als müsste ich die Probleme damit verstehen, wie Ich mache das.
Bryan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.