การลดตัวแปรในสูตร lm ยังทำให้เกิดข้อผิดพลาดของความต่าง


9

ฉันกำลังพยายามเรียกใช้ lm () ในชุดย่อยของข้อมูลของฉันและพบปัญหา

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

lm( y ~ ., dt) # Use all x: Works
lm( y ~ ., dt[x3 == 'men']) # Use all x, limit to men: doesn't work (as expected)

ด้านบนใช้งานไม่ได้เนื่องจากชุดข้อมูลมีเฉพาะผู้ชายดังนั้นเราจึงไม่สามารถรวม x3 ตัวแปรเพศไว้ในแบบจำลองได้ แต่...

lm( y ~ . -x3, dt[x3 == 'men']) # Exclude x3, limit to men: STILL doesn't work
lm( y ~ x1 + x2, dt[x3 == 'men']) # Exclude x3, with different notation: works great

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


3
มันน่าสนใจที่ทั้งสองmodel.matrix(y ~ . - x3, data = dt[x3 == "men"])และmodel.matrix(y ~ x1 + x2, data = dt[x3 == "men"])ทำงาน ( lmโทรmodel.matrixภายใน) ความแตกต่างเพียงอย่างเดียวระหว่างเมทริกซ์โมเดลทั้งคู่คือแอ"contrasts"ททริบิวต์ (ซึ่งยังมีอยู่x3) และจะถูกเลือกในภายหลังlmตามปกติอาจทำให้เกิดข้อผิดพลาดที่คุณเห็น ดังนั้นความรู้สึกของฉันคือปัญหาเกี่ยวข้องกับการmodel.matrixสร้างและจัดเก็บเมทริกซ์การออกแบบเมื่อนำคำศัพท์ออก
Maurits Evers

ฉันพยายาม "ขยาย" .เพื่อให้ได้สูตรที่ง่ายขึ้นด้วยterms(y ~ . -x3, data=dt, simplify=TRUE)แต่แปลกที่มันยังคงx3อยู่ในแอตทริบิวต์ของตัวแปรซึ่งเดินทางไปlm
MrFlick

1
@MrFlick - ดูเหมือนว่าตัวเลือก unimplemented-in-R neg.out=อาจเกี่ยวข้องกัน จากไฟล์วิธีใช้ S สำหรับtermsที่neg.out=มีการใช้งาน: แฟล็กควบคุมการจัดการคำที่ป้อนด้วยเครื่องหมาย "-" หากเป็น TRUE จะมีการตรวจสอบข้อกำหนดเพื่อการยกเลิกและไม่สนใจ หากเป็น FALSE คำศัพท์เชิงลบจะถูกเก็บไว้ (พร้อมลำดับที่เป็นลบ)
thelatemail

1
@MauritsEvers: lmเรียกmodel.matrixใช้ข้อมูลที่ถูกแก้ไข ที่จุดเริ่มต้นมากประกอบด้วยและประเมินผลการแสดงออกต่อไปนี้:lm mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE )สิ่งนี้ทำให้x3กลายเป็นปัจจัยระดับเดียว model.matrix()จากนั้นจะถูกเรียกใช้mfไม่ใช่ข้อมูลดั้งเดิมทำให้เกิดข้อผิดพลาดที่เราสังเกต
Artem Sokolov

คำตอบ:


2

ข้อผิดพลาดที่คุณได้รับคือเนื่องจาก x3 อยู่ในรูปแบบที่มีค่าเดียว = "men"(ดูความคิดเห็นด้านล่างจาก @Artem Sokolov)

วิธีหนึ่งในการแก้ไขคือการเซตย่อยล่วงหน้า:

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

dmen<-dt[x3 == 'men'] # create a new subsetted dataset with just men

lm( y ~ ., dmen[,-"x3"]) # now drop the x3 column from the dataset (just for the model)

หรือคุณสามารถทำทั้งสองอย่างในขั้นตอนเดียวกัน:

lm( y ~ ., dt[x3 == 'men',-"x3"])

โดยรวมแล้วนี่เป็นทางออกที่ดี สิ่งหนึ่งที่ต้องแก้ไขคือ-x3ในสูตรไม่ทำให้lmคิดว่าคุณกำลังพยายามลบคอลัมน์ "การไม่ได้ใช้ x3 ในรูปแบบ" ความตั้งใจที่มีการสื่อสารอย่างถูกต้อง แต่ปัญหาคือlmสายmodel.frame( ..., drop.unused.levels=TRUE )ที่ก่อให้เกิดการกลายเป็นปัจจัยระดับเดียวนำไปสู่ปัญหาในปลายน้ำx3 model.matrix()
Artem Sokolov

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