จะทำการถดถอยด้วยเอฟเฟ็กต์โค้ดแทนที่จะใช้การจำลองแบบ dummy ใน R ได้อย่างไร


15

ขณะนี้ฉันกำลังทำงานกับตัวแบบการถดถอยที่ฉันมีตัวแปรเด็ดขาด / ตัวประกอบเป็นตัวแปรอิสระเท่านั้น ตัวแปรตามของฉันคืออัตราส่วนการแปลง logit

มันค่อนข้างง่ายเพียงเรียกใช้การถดถอยปกติใน R เนื่องจาก R รู้วิธีการกำหนดรหัสโดยอัตโนมัติทันทีที่พวกมันอยู่ในประเภท "factor" อย่างไรก็ตามการเข้ารหัสประเภทนี้ก็หมายความว่าหนึ่งประเภทจากแต่ละตัวแปรนั้นถูกใช้เป็นพื้นฐานทำให้ยากต่อการตีความ

อาจารย์ของฉันบอกให้ฉันใช้เอฟเฟ็กต์โค้ดแทน (-1 หรือ 1) เพราะนี่หมายถึงการใช้ความหมายที่ยิ่งใหญ่สำหรับการสกัดกั้น

ไม่มีใครรู้วิธีจัดการกับสิ่งนั้น?

จนถึงตอนนี้ฉันได้ลอง:

gm <- mean(tapply(ds$ln.crea, ds$month,  mean))
model <- lm(ln.crea ~ month + month*month + year + year*year, data = ds, contrasts = list(gm = contr.sum))

Call:
lm(formula = ln.crea ~ month + month * month + year + year * 
    year, data = ds, contrasts = list(gm = contr.sum))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.89483 -0.19239 -0.03651  0.14955  0.89671 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.244493   0.204502 -15.865   <2e-16 ***
monthFeb    -0.124035   0.144604  -0.858   0.3928    
monthMar    -0.365223   0.144604  -2.526   0.0129 *  
monthApr    -0.240314   0.144604  -1.662   0.0993 .  
monthMay    -0.109138   0.144604  -0.755   0.4520    
monthJun    -0.350185   0.144604  -2.422   0.0170 *  
monthJul     0.050518   0.144604   0.349   0.7275    
monthAug    -0.206436   0.144604  -1.428   0.1562    
monthSep    -0.134197   0.142327  -0.943   0.3478    
monthOct    -0.178182   0.142327  -1.252   0.2132    
monthNov    -0.119126   0.142327  -0.837   0.4044    
monthDec    -0.147681   0.142327  -1.038   0.3017    
year1999     0.482988   0.200196   2.413   0.0174 *  
year2000    -0.018540   0.200196  -0.093   0.9264    
year2001    -0.166511   0.200196  -0.832   0.4073    
year2002    -0.056698   0.200196  -0.283   0.7775    
year2003    -0.173219   0.200196  -0.865   0.3887    
year2004     0.013831   0.200196   0.069   0.9450    
year2005     0.007362   0.200196   0.037   0.9707    
year2006    -0.281472   0.200196  -1.406   0.1625    
year2007    -0.266659   0.200196  -1.332   0.1855    
year2008    -0.248883   0.200196  -1.243   0.2164    
year2009    -0.153083   0.200196  -0.765   0.4461    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

Residual standard error: 0.3391 on 113 degrees of freedom
Multiple R-squared: 0.3626, Adjusted R-squared: 0.2385 
F-statistic: 2.922 on 22 and 113 DF,  p-value: 0.0001131 

1
ดูหรือไม่ฉันคิดว่า contr.sum แตกต่างกันเพื่อทดสอบกับค่าเฉลี่ย - ตรวจสอบไฟล์ช่วยเหลือ R
user20650

2
สิ่งนี้อาจมีประโยชน์: unc.edu/courses/2006spring/ecol/145/001/docs/lectures/…
mark999

คำตอบ:


13

โดยหลักการแล้วมีการเข้ารหัสความคมชัดสองประเภทซึ่งการสกัดกั้นจะประเมินค่าเฉลี่ยขนาดใหญ่ เหล่านี้คือความแตกต่างโดยรวมและความแตกต่างซ้ำ (ความแตกต่างเลื่อน)

นี่คือชุดข้อมูลตัวอย่าง:

set.seed(42)
x <- data.frame(a = c(rnorm(100,2), rnorm(100,1),rnorm(100,0)),
                b = rep(c("A", "B", "C"), each = 100))

เงื่อนไข 'หมายถึง:

tapply(x$a, x$b, mean)
         A           B           C 
2.03251482  0.91251629 -0.01036817 

ความหมายที่ยิ่งใหญ่:

mean(tapply(x$a, x$b, mean))
[1] 0.978221

คุณสามารถระบุชนิดของความคมชัดเข้ารหัสกับพารามิเตอร์ในcontrastslm

ผลรวมที่ตรงกันข้าม

lm(a ~ b, x, contrasts = list(b = contr.sum))

Coefficients:
(Intercept)           b1           b2  
     0.9782       1.0543      -0.0657 

การสกัดกั้นคือค่าเฉลี่ยยิ่งใหญ่ ความชันแรกคือความแตกต่างระหว่างระดับปัจจัยแรกกับค่าเฉลี่ยแกรนด์ ความชันที่สองคือความแตกต่างระหว่างระดับตัวประกอบที่สองกับค่าเฉลี่ยแกรนด์

ความแตกต่างซ้ำแล้วซ้ำอีก

ฟังก์ชั่นสำหรับสร้างความแตกต่างซ้ำซ้อนเป็นส่วนหนึ่งของMASSแพ็คเกจ

lm(a ~ b, x, contrasts = list(b = MASS::contr.sdif))

Coefficients:
(Intercept)         b2-1         b3-2  
     0.9782      -1.1200      -0.9229 

การสกัดกั้นคือค่าเฉลี่ยยิ่งใหญ่ ความลาดชันแสดงถึงความแตกต่างระหว่างระดับปัจจัยต่อเนื่อง (2 กับ 1, 3 กับ 2)


อืมเพิ่งลองสิ่งที่คุณแนะนำ แต่ฉันไม่แน่ใจว่ารหัสใดเป็นไปตามที่ฉันต้องการ สิ่งที่ฉันมีปี {1998, ... , 2007} ในหนึ่ง IV และเดือน {Jan, ... , Dec} ใน IV อื่น เนื่องจากตอนนี้ฟังก์ชั่น lm ทำให้ April กลายเป็นจุดตัดเช่นเดียวกับ 1998 โดยอัตโนมัติฉันแค่ต้องการให้จุดตัดเป็นค่าเฉลี่ยโดยรวม ... ฉันไม่รู้จริงๆว่ามันสมเหตุสมผลหรือไม่เมื่อคิด ...
Kasper Christensen

@KasperChristensen หากคุณระบุความแตกต่างเช่นในตัวอย่างการสกัดกั้นจะเป็นค่าเฉลี่ยแกรนด์ โปรดให้ตัวอย่างที่ทำซ้ำได้ของสิ่งที่คุณพยายาม
Sven Hohenstein

@SvenHohenstein ทำไมถึงไม่มีค่าสัมประสิทธิ์ b3 สำหรับค่า C เด็ดขาดในทางตรงกันข้ามรวม? ควรเป็น -0.9885891
Vivaldi

@Vivaldi ค่าของ b3 ถูกกำหนดโดยการสกัดกั้นและ b1, b2 ไม่มีระดับความอิสระเหลืออยู่สำหรับความแตกต่างอื่น
Sven Hohenstein

@SvenHohenstein ปัญหาความไม่ลงรอยกันมากกว่านี้หรือไม่เนื่องจาก b3 สามารถแสดงโดยตรงเป็นการรวมกันเชิงเส้นของตัวแปรอื่น ๆ : (3 * ค่าเฉลี่ยแกรนด์ - b1 - b2)?
Vivaldi

6

Nitpicking: ถ้าอาจารย์ของคุณบอกให้คุณเขียนโค้ดตัวแปรด้วย(-1, 1)เขาบอกให้คุณใช้การเขียนโค้ดเอฟเฟกต์ไม่ใช่ขนาดของเอฟเฟกต์ ไม่ว่าจะด้วยวิธีใดก็ตาม @ user20650 นั้นถูกต้อง ตามปกติเว็บไซต์ความช่วยเหลือด้านสถิติของ UCLA มีหน้าเว็บที่มีประโยชน์ซึ่งอธิบายเกี่ยวกับวิธีการทำเช่นนี้กับ R

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.