ทำความเข้าใจกับการสร้างตัวแปรจำลอง (แบบแมนนวลหรือแบบอัตโนมัติ) ใน GLM


13

หากมีการใช้ตัวแปรปัจจัย (เช่นเพศที่มีระดับ M และ F) ในสูตร glm จะมีการสร้างตัวแปรจำลองและสามารถพบได้ในสรุปแบบจำลอง glm พร้อมกับค่าสัมประสิทธิ์ที่เกี่ยวข้อง (เช่น genderM)

หากแทนที่จะอาศัย R เพื่อแยกปัจจัยด้วยวิธีนี้ปัจจัยจะถูกเข้ารหัสในชุดของตัวแปรตัวเลข 0/1 (เช่น genderM (1 สำหรับ M, 0 สำหรับ F), genderF (1 สำหรับ F, 0 สำหรับ M) และใช้ตัวแปรเหล่านี้เป็นตัวแปรตัวเลขในสูตร glm ผลลัพธ์สัมประสิทธิ์จะแตกต่างกันหรือไม่?

โดยทั่วไปคำถามคือ: R ใช้การคำนวณสัมประสิทธิ์ที่แตกต่างกันเมื่อทำงานกับตัวแปรปัจจัยเทียบกับตัวแปรตัวเลขหรือไม่

คำถามติดตามผล (อาจตอบโดยข้างต้น): นอกจากประสิทธิภาพของการปล่อยให้ R สร้างตัวแปรจำลองแล้วยังมีปัญหากับปัจจัยการเข้ารหัสซ้ำเป็นชุดของตัวแปรตัวเลข 0,1 และใช้ในรูปแบบแทนหรือไม่?


2
สัมประสิทธิ์จะเหมือนกันการเข้ารหัสเริ่มต้นของปัจจัยต่าง ๆ ตรงตามที่คุณอธิบายไว้ (ซึ่งเรียกว่าการเข้ารหัส "ดัมมี่") หากทำสิ่งนี้ด้วยตนเองคุณจะต้องตระหนักถึง "กับดักตัวแปร dummy" - คุณไม่สามารถรวมตัวแปรที่สร้างขึ้นทั้งหมดได้ แต่สามารถรวม (ไม่รวมแยกดัก); มิฉะนั้นโมเดลของคุณจะถูกเขียนทับ นอกจากนี้ยังมีวิธีอื่นในการเข้ารหัสตัวแปรปัจจัยเช่นกัน N - 1ยังไม่มีข้อความยังไม่มีข้อความ-1
เลียนแบบ

@ ให้ฉันเดาว่าถ้าฉันป้อนทั้งใน M เพศและ M หรือ F หนึ่งในนั้นก็จะส่งกลับค่าสัมประสิทธิ์ NA โดยมีข้อความว่าตัวแปรถูกยกเว้นเนื่องจากมีภาวะเอกฐาน) สิ่งนี้สมเหตุสมผลเนื่องจากมีความสัมพันธ์เชิงเส้นในกรณีนี้ แต่คุณบอกว่าฉันไม่สามารถรวม N ทั้งหมดได้ หมายความว่าถึงแม้ว่า genderF ถูกตั้งค่าเป็น NA มันจะส่งผลให้เกิดความแตกต่าง / ปัญหาสำหรับสัมประสิทธิ์ sexM หรือไม่? หรือมากกว่านั้นถ้า GLM / LM ไม่รวมตัวแปรเนื่องจากภาวะเอกฐานกำลังใช้ปัญหาแบบจำลองแบบ overidentified หรือไม่? (ฉันเห็นด้วยกับประเด็นของคุณ - เพียงสอบถามการแยกแยะทางปฏิบัติ)
ไบรอัน

คำตอบ:


22

ตัวแปรหมวดหมู่ (เรียกว่า " ปัจจัย " ใน R) จำเป็นต้องแสดงด้วยรหัสตัวเลขในตัวแบบการถดถอยหลายแบบ มีวิธีที่เป็นไปได้มากมายในการสร้างรหัสตัวเลขที่เหมาะสม (ดูรายการที่ยอดเยี่ยมนี้ได้ที่เว็บไซต์ช่วยเหลือของ UCLA) โดยค่าเริ่มต้น R ใช้การเข้ารหัสระดับอ้างอิง (ซึ่ง R เรียกว่า "contr.treatment") และรหัสสถิติเริ่มต้นค่อนข้างกว้าง สิ่งนี้สามารถเปลี่ยนแปลงได้สำหรับความแตกต่างทั้งหมดสำหรับเซสชัน R ทั้งหมดของคุณโดยใช้ตัวเลือก?หรือสำหรับการวิเคราะห์ / ตัวแปรที่เฉพาะเจาะจงโดยใช้? ความเปรียบต่างหรือ? C (บันทึกเมืองหลวง) หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับการเข้ารหัสระดับอ้างอิงฉันอธิบายได้ที่นี่: การถดถอยตามตัวอย่างในวันของสัปดาห์.

บางคนพบว่ารหัสอ้างอิงระดับสับสนและคุณไม่จำเป็นต้องใช้มัน หากคุณต้องการคุณสามารถมีตัวแปรสองตัวสำหรับผู้ชายและผู้หญิง สิ่งนี้เรียกว่าระดับหมายถึงการเข้ารหัส แต่ถ้าคุณทำเช่นนั้นคุณจะต้องปราบปรามการตัดหรือรุ่นเมทริกซ์จะเป็นเอกพจน์และการถดถอยที่ไม่สามารถจะพอดีเป็นบันทึก @Affine ข้างต้นและที่ผมอธิบายที่นี่: ตัวแปรการเข้ารหัสคุณภาพนำไปสู่เอก เพื่อให้การปราบปรามสกัดกั้นคุณปรับเปลี่ยนสูตรของคุณโดยการเพิ่ม-1หรือ+0ชอบโดย: หรือ y~... -1y~... +0

การใช้ระดับหมายถึงการเข้ารหัสแทนการเข้ารหัสระดับอ้างอิงจะเปลี่ยนค่าสัมประสิทธิ์โดยประมาณและความหมายของการทดสอบสมมติฐานที่พิมพ์ด้วยเอาต์พุตของคุณ เมื่อคุณมีปัจจัยสองระดับ (เช่นผู้ชายกับผู้หญิง) และคุณใช้การเข้ารหัสระดับอ้างอิงคุณจะเห็นการสกัดกั้นที่เรียกว่า(constant)และมีเพียงหนึ่งตัวแปรที่ระบุไว้ในผลลัพธ์ (อาจsexM) จุดตัดคือค่าเฉลี่ยของกลุ่มอ้างอิง (อาจเป็นเพศหญิง) และsexMเป็นความแตกต่างระหว่างค่าเฉลี่ยของเพศชายกับค่าเฉลี่ยของเพศหญิง p-value ที่เกี่ยวข้องกับการสกัดกั้นเป็นหนึ่งตัวอย่างทดสอบว่าระดับการอ้างอิงมีค่าเฉลี่ยของและค่า p ที่เกี่ยวข้องกับเสื้อ0t 0sexMบอกให้คุณทราบว่าเพศแตกต่างกันไปตามคำตอบของคุณหรือไม่ แต่ถ้าคุณใช้วิธีการเข้ารหัสระดับแทนคุณจะมีสองตัวแปรจดทะเบียนและแต่ละ p-value จะสอดคล้องกับหนึ่งตัวอย่าง -test ว่าค่าเฉลี่ยของระดับที่0นั่นคือไม่มีค่า p ใด ๆ ที่จะทดสอบว่าเพศแตกต่างกันหรือไม่ เสื้อ0

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
ขอบคุณสำหรับการเพิ่มรหัส: นี่แสดงให้เห็นอย่างชัดเจนว่าการสกัดกั้นในการอ้างอิงเซลล์การเข้ารหัส = sexFemale ในเซลล์หมายถึงการเข้ารหัส (ฉันยังสับสนด้วย "เกิดอะไรขึ้น" กับตัวแปร N-1 ... ) อาจต้องการคำถามอื่น แต่ สิ่งนี้ง่ายต่อการเข้าใจกับตัวแปรตัวเดียวประมาณ 2 ตัวขึ้นไป? เช่นอายุ: "เก่า" "หนุ่ม" ในการเข้ารหัสเซลล์อ้างอิงสัมประสิทธิ์จะแสดงสำหรับ sexMale, ageYoung (ตัวอย่าง) และบัญชีสกัดกั้นสำหรับทั้งสองเพศหญิงสาวและ ageOld หรือไม่
ไบรอัน

1
หากคุณมีปัจจัย w / 3 ระดับการสกัดกั้นคือค่าเฉลี่ยของระดับการอ้างอิงและอีก 2 รายการจะถูกแสดงในเอาต์พุต ค่าสัมประสิทธิ์ของพวกเขาทั้งสองจะแตกต่างกัน b / t พวกเขาและระดับการอ้างอิงและ ps ของพวกเขาจะมีความสำคัญของ difs เหล่านั้น หากคุณมี 2 ปัจจัยทั้งสองจะมีระดับการอ้างอิงและการสกัดกั้นจะเป็นค่าเฉลี่ยของคนเหล่านั้นที่อยู่ในทั้งสองกลุ่มอ้างอิง (เช่น, young F) และระดับอื่น ๆ จะแตกต่างกัน b / t ในระดับที่กำหนดของ 1w / ระดับการอ้างอิงของปัจจัยอื่น & กลุ่มการอ้างอิงทั้งสอง เช่นoldเป็นold F- `หนุ่ม F , & M` เป็น-young M young F
gung - Reinstate Monica

1
ฉันเล่นกับสิ่งนี้และประสบการณ์ที่R^2แตกต่างกันมากระหว่างทั้งสองวิธี ฉันรู้ว่ามันเป็นเพียงR^2แต่มีคำอธิบายสำหรับสิ่งนั้นหรือไม่?
hans0l0

@ hans0l0 ฉันไม่มีความคิด ไม่ควรมีความแตกต่าง
gung - Reinstate Monica

1
@confused แล้วคุณจะพบว่าในเอกสาร? GLM
gung - Reinstate Monica

2

ค่าสัมประสิทธิ์โดยประมาณจะอยู่ภายใต้เงื่อนไขเดียวกับที่คุณสร้างตัวแปรจำลอง (เช่นตัวเลข) ที่สอดคล้องกับ R ตัวอย่างเช่น: ให้ 'สร้างข้อมูลปลอมและพอดีกับค่าปัวซงโดยใช้ปัจจัย โปรดทราบว่าglฟังก์ชั่นสร้างตัวแปรปัจจัย

> 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

เนื่องจากผลลัพธ์มีสามระดับฉันจึงสร้างตัวแปรจำลองสองตัว (dummy.1 = 0 ถ้า result = 2 และ dummy.2 = 1 ถ้า result = 3) และปรับใหม่โดยใช้ค่าตัวเลขเหล่านี้:

> 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

คุณสามารถเห็นค่าสัมประสิทธิ์โดยประมาณเหมือนกัน แต่คุณต้องระวังเมื่อสร้างตัวแปรจำลองของคุณหากคุณต้องการผลลัพธ์ที่เหมือนกัน ตัวอย่างเช่นถ้าฉันสร้างตัวแปรดัมมี่สองตัวเป็น (dummy.1 = 0 ถ้า result = 1 และ dummy.2 = 1 ถ้า result = 2) ผลลัพธ์ที่ประมาณการจะแตกต่างกันดังต่อไปนี้:

> 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

นี่คือเนื่องจากเมื่อคุณเพิ่มoutcomeตัวแปรใน glm.1, R โดยค่าเริ่มต้นจะสร้างตัวแปรจำลองสองตัวคือoutcome2และoutcome3กำหนดให้คล้ายกับdummy.1และdummy.2ใน glm.2 นั่นคือระดับแรกของผลลัพธ์คือเมื่อตัวแปร dummy อื่น ๆ ( outcome2และoutcome3) ถูกตั้งค่าให้เป็น ศูนย์.


ขอบคุณสำหรับการพิสูจน์โค้ดของค่าสัมประสิทธิ์โดยประมาณที่เหมือนกัน คำเตือนเกี่ยวกับการสร้างของตัวเองก็มีประโยชน์เช่นกัน: ฉันต้องการสร้างของตัวเองเพราะตัวแปรรุ่นจะผูกกลับโดยตรงกับคอลัมน์ฐานข้อมูลโดยใช้ชื่อ (ซึ่งอาจเป็นประโยชน์ต่อเนื่อง) แต่ดูเหมือนว่าฉันต้องเข้าใจปัญหาด้วย ฉันจะทำสิ่งนี้
ไบรอัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.