ฉันจะบอกให้ R ใช้ระดับหนึ่งเป็นข้อมูลอ้างอิงได้อย่างไรหากฉันใช้ตัวแปรอธิบายไบนารีในการถดถอย
มันใช้เพียงระดับหนึ่งโดยค่าเริ่มต้น
lm(x ~ y + as.factor(b))
ด้วยb {0, 1, 2, 3, 4}
. สมมติว่าฉันต้องการใช้ 3 แทนศูนย์ที่ใช้โดย R
ฉันจะบอกให้ R ใช้ระดับหนึ่งเป็นข้อมูลอ้างอิงได้อย่างไรหากฉันใช้ตัวแปรอธิบายไบนารีในการถดถอย
มันใช้เพียงระดับหนึ่งโดยค่าเริ่มต้น
lm(x ~ y + as.factor(b))
ด้วยb {0, 1, 2, 3, 4}
. สมมติว่าฉันต้องการใช้ 3 แทนศูนย์ที่ใช้โดย R
คำตอบ:
ดู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
within
แต่df$bR = relevel(df$b, ref=3)
.
คนอื่น ๆ ได้กล่าวถึงrelevel
คำสั่งซึ่งเป็นทางออกที่ดีที่สุดหากคุณต้องการเปลี่ยนระดับพื้นฐานสำหรับการวิเคราะห์ข้อมูลทั้งหมดของคุณ (หรือยินดีที่จะอยู่กับการเปลี่ยนแปลงข้อมูล)
หากคุณไม่ต้องการเปลี่ยนแปลงข้อมูล (เป็นการเปลี่ยนแปลงเพียงครั้งเดียว แต่ในอนาคตคุณต้องการลักษณะการทำงานเริ่มต้นอีกครั้ง) คุณสามารถใช้C
ฟังก์ชัน (หมายเหตุตัวพิมพ์ใหญ่) ร่วมกันเพื่อตั้งค่าคอนทราสต์และcontr.treatments
ฟังก์ชันด้วย อาร์กิวเมนต์พื้นฐานสำหรับการเลือกระดับที่คุณต้องการให้เป็นพื้นฐาน
ตัวอย่างเช่น:
lm( Sepal.Width ~ C(Species,contr.treatment(3, base=2)), data=iris )
relevel()
คำสั่งเป็นวิธีการจดชวเลขสำหรับคำถามของคุณ สิ่งที่ทำคือเรียงลำดับปัจจัยใหม่เพื่อให้ระดับอ้างอิงเป็นอันดับแรก ดังนั้นการจัดลำดับระดับปัจจัยของคุณใหม่จะมีผลเช่นเดียวกัน แต่ช่วยให้คุณควบคุมได้มากขึ้น บางทีคุณอาจต้องการมีเลเวล 3,4,0,1,2 ในกรณีนั้น...
bFactor <- factor(b, levels = c(3,4,0,1,2))
ฉันชอบวิธีนี้เพราะมันง่ายกว่าสำหรับฉันที่จะเห็นในโค้ดของฉันไม่เพียง แต่สิ่งที่อ้างอิงเท่านั้น แต่ยังรวมถึงตำแหน่งของค่าอื่น ๆ ด้วย (แทนที่จะต้องดูผลลัพธ์สำหรับสิ่งนั้น)
หมายเหตุ: อย่าทำให้เป็นปัจจัยสั่งซื้อ ปัจจัยที่มีลำดับที่ระบุและปัจจัยที่สั่งซื้อไม่ใช่สิ่งเดียวกัน lm()
อาจเริ่มคิดว่าคุณต้องการความแตกต่างของพหุนามถ้าคุณทำเช่นนั้น
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันมีปัญหาที่คล้ายกันและพบว่า:
lm(x ~ y + relevel(b, ref = "3"))
ไม่ตรงตามที่คุณถาม
as.factor()
หากจำเป็นตัวอย่างเช่นโดยใช้...+relevel(as.factor(mycol), ref = "myref")+...
นอกจากนี้คุณยังสามารถแท็กคอลัมน์ด้วยตนเองด้วยcontrasts
แอตทริบิวต์ซึ่งดูเหมือนว่าจะได้รับการเคารพโดยฟังก์ชันการถดถอย:
contrasts(df$factorcol) <- contr.treatment(levels(df$factorcol),
base=which(levels(df$factorcol) == 'RefLevel'))
สำหรับผู้ที่มองหารุ่น 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()
relevel
ใช้ได้กับปัจจัยเท่านั้น fct_relevel
ใช้ได้กับปัจจัยเท่านั้น ไม่มีความแตกต่างระหว่างฟังก์ชั่นใด ๆ ยกเว้นชื่อ AFAIK การพูดว่า "ถ้าตัวแปรเป็นปัจจัยคุณก็ใช้ได้เช่นกันfct_relevel
" หมายความว่าถ้าตัวแปรนั้นไม่ใช่ปัจจัยที่คุณสามารถใช้ได้relevel
แต่นั่นไม่เป็นความจริง
b
factor(b, levels = c(3,1,2,4,5))
ดำเนินการนี้ในขั้นตอนการประมวลผลข้อมูลนอกการlm()
โทร คำตอบของฉันด้านล่างใช้relevel()
ฟังก์ชันเพื่อให้คุณสามารถสร้างปัจจัยจากนั้นเลื่อนระดับการอ้างอิงไปรอบ ๆ เพื่อให้เหมาะสมตามที่คุณต้องการ