วิธีบังคับให้ R ใช้ระดับปัจจัยที่ระบุเป็นข้อมูลอ้างอิงในการถดถอย


112

ฉันจะบอกให้ R ใช้ระดับหนึ่งเป็นข้อมูลอ้างอิงได้อย่างไรหากฉันใช้ตัวแปรอธิบายไบนารีในการถดถอย

มันใช้เพียงระดับหนึ่งโดยค่าเริ่มต้น

lm(x ~ y + as.factor(b)) 

ด้วยb {0, 1, 2, 3, 4}. สมมติว่าฉันต้องการใช้ 3 แทนศูนย์ที่ใช้โดย R


9
คุณควรทำขั้นตอนการประมวลผลข้อมูลนอกสูตร / ฟิตติ้งของโมเดล เมื่อมีการสร้างปัจจัยจากคุณสามารถระบุการสั่งซื้อของระดับการใช้b factor(b, levels = c(3,1,2,4,5))ดำเนินการนี้ในขั้นตอนการประมวลผลข้อมูลนอกการlm()โทร คำตอบของฉันด้านล่างใช้relevel()ฟังก์ชันเพื่อให้คุณสามารถสร้างปัจจัยจากนั้นเลื่อนระดับการอ้างอิงไปรอบ ๆ เพื่อให้เหมาะสมตามที่คุณต้องการ
Gavin Simpson

1
ฉันตอบคำถามของคุณใหม่ คุณกำลังเปลี่ยนระดับการอ้างอิงจริง ๆ แล้วโดยไม่ได้ละเว้น
Joris Meys

ขอบคุณสำหรับการตอบคำถามของฉันอีกครั้ง แท้จริงแล้วการปลดปล่อย () คือสิ่งที่ฉันกำลังมองหา ขอบคุณสำหรับคำตอบโดยละเอียดและตัวอย่างแม้ว่า ฉันไม่แน่ใจว่าแท็กการถดถอยเชิงเส้นทำให้เข้าใจผิดเล็กน้อยหรือไม่เพราะสิ่งนี้ใช้ได้กับการถดถอยทุกชนิดโดยใช้คำอธิบายแบบจำลอง ...
Matt Bannert

คำตอบ:


152

ดูrelevel()ฟังก์ชัน นี่คือตัวอย่าง:

set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))
head(DF)
str(DF)

m1 <- lm(y ~ x + b, data = DF)
summary(m1)

ตอนนี้ปรับเปลี่ยนปัจจัยbในDFโดยใช้relevel()ฟังก์ชั่น:

DF <- within(DF, b <- relevel(b, ref = 3))
m2 <- lm(y ~ x + b, data = DF)
summary(m2)

แบบจำลองมีการประมาณระดับการอ้างอิงที่แตกต่างกัน

> coef(m1)
(Intercept)           x          b2          b3          b4          b5 
  3.2903239   1.4358520   0.6296896   0.3698343   1.0357633   0.4666219 
> coef(m2)
(Intercept)           x          b1          b2          b4          b5 
 3.66015826  1.43585196 -0.36983433  0.25985529  0.66592898  0.09678759

9
ในการกำหนดตัวแปรดั้งเดิมอย่าใช้withinแต่df$bR = relevel(df$b, ref=3).
BurninLeo

1
คุณสามารถใช้ Relevel () ในสูตรของคุณได้โดยจะไม่ส่งผลต่อชุดข้อมูลเดิม ...
Mehdi Zare

36

คนอื่น ๆ ได้กล่าวถึงrelevelคำสั่งซึ่งเป็นทางออกที่ดีที่สุดหากคุณต้องการเปลี่ยนระดับพื้นฐานสำหรับการวิเคราะห์ข้อมูลทั้งหมดของคุณ (หรือยินดีที่จะอยู่กับการเปลี่ยนแปลงข้อมูล)

หากคุณไม่ต้องการเปลี่ยนแปลงข้อมูล (เป็นการเปลี่ยนแปลงเพียงครั้งเดียว แต่ในอนาคตคุณต้องการลักษณะการทำงานเริ่มต้นอีกครั้ง) คุณสามารถใช้Cฟังก์ชัน (หมายเหตุตัวพิมพ์ใหญ่) ร่วมกันเพื่อตั้งค่าคอนทราสต์และcontr.treatmentsฟังก์ชันด้วย อาร์กิวเมนต์พื้นฐานสำหรับการเลือกระดับที่คุณต้องการให้เป็นพื้นฐาน

ตัวอย่างเช่น:

lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )

33

relevel()คำสั่งเป็นวิธีการจดชวเลขสำหรับคำถามของคุณ สิ่งที่ทำคือเรียงลำดับปัจจัยใหม่เพื่อให้ระดับอ้างอิงเป็นอันดับแรก ดังนั้นการจัดลำดับระดับปัจจัยของคุณใหม่จะมีผลเช่นเดียวกัน แต่ช่วยให้คุณควบคุมได้มากขึ้น บางทีคุณอาจต้องการมีเลเวล 3,4,0,1,2 ในกรณีนั้น...

bFactor <- factor(b, levels = c(3,4,0,1,2))

ฉันชอบวิธีนี้เพราะมันง่ายกว่าสำหรับฉันที่จะเห็นในโค้ดของฉันไม่เพียง แต่สิ่งที่อ้างอิงเท่านั้น แต่ยังรวมถึงตำแหน่งของค่าอื่น ๆ ด้วย (แทนที่จะต้องดูผลลัพธ์สำหรับสิ่งนั้น)

หมายเหตุ: อย่าทำให้เป็นปัจจัยสั่งซื้อ ปัจจัยที่มีลำดับที่ระบุและปัจจัยที่สั่งซื้อไม่ใช่สิ่งเดียวกัน lm()อาจเริ่มคิดว่าคุณต้องการความแตกต่างของพหุนามถ้าคุณทำเช่นนั้น


2
ความแตกต่างของโพลิโนเมียลไม่ใช่การถดถอยพหุนาม
hadley

มีวิธีตั้งค่าระดับการอ้างอิงในเวลาเดียวกันกับที่คุณกำหนดปัจจัยหรือไม่แทนที่จะเรียกร้องให้ลดระดับในภายหลัง
David Bruce Borenstein

31

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันมีปัญหาที่คล้ายกันและพบว่า:

lm(x ~ y + relevel(b, ref = "3")) 

ไม่ตรงตามที่คุณถาม


3
นี่เป็นความช่วยเหลือที่ยิ่งใหญ่! โซลูชันเดียวที่มีวิธีดำเนินการภายในคำสั่ง lm () ซึ่งเป็นสิ่งที่ฉันต้องการ ขอบคุณ!
cparmstrong

3
นี่เป็นวิธีที่ยืดหยุ่นมากในการทำงานกับปัจจัยต่างๆ ฉันชอบความจริงที่ว่าฉันสามารถรวมเข้าด้วยกันได้as.factor()หากจำเป็นตัวอย่างเช่นโดยใช้...+relevel(as.factor(mycol), ref = "myref")+...
ปีเตอร์

12

นอกจากนี้คุณยังสามารถแท็กคอลัมน์ด้วยตนเองด้วยcontrastsแอตทริบิวต์ซึ่งดูเหมือนว่าจะได้รับการเคารพโดยฟังก์ชันการถดถอย:

contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
   base=which(levels(df$factorcol) == 'RefLevel'))

1

สำหรับผู้ที่มองหารุ่น dplyr / tidyverse การสร้างโซลูชัน Gavin Simpson:

# Create DF
set.seed(123)
x <- rnorm(100)
DF <- data.frame(x = x,
                 y = 4 + (1.5*x) + rnorm(100, sd = 2),
                 b = gl(5, 20))

# Change reference level
DF = DF %>% mutate(b = relevel(b, 3))

m2 <- lm(y ~ x + b, data = DF)
summary(m2)

ฉันสับสนว่าทำไมคุณใส่ "ถ้าตัวแปรเป็นปัจจัย" ในที่ที่คุณทำ ... สิ่งนี้จำเป็นไม่ว่าคุณจะใช้relevel()หรือforcats::fct_relevel()
Gregor Thomas

คุณถูกต้องขอบคุณ! ฉันได้เพิ่ม "คุณสามารถใช้" เพราะ afaik, fct_relevel ใช้ได้เฉพาะกับปัจจัยเท่านั้น
Gorka

2
relevelใช้ได้กับปัจจัยเท่านั้น fct_relevelใช้ได้กับปัจจัยเท่านั้น ไม่มีความแตกต่างระหว่างฟังก์ชั่นใด ๆ ยกเว้นชื่อ AFAIK การพูดว่า "ถ้าตัวแปรเป็นปัจจัยคุณก็ใช้ได้เช่นกันfct_relevel" หมายความว่าถ้าตัวแปรนั้นไม่ใช่ปัจจัยที่คุณสามารถใช้ได้relevelแต่นั่นไม่เป็นความจริง
Gregor Thomas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.