Biến biến trong công thức lm vẫn gây ra lỗi tương phản


9

Tôi đang cố chạy lm () chỉ trên một tập hợp con dữ liệu của mình và gặp sự cố.

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)

Ở trên không hoạt động vì bộ dữ liệu hiện chỉ có nam giới và do đó chúng tôi không thể đưa x3, biến giới tính vào mô hình. NHƯNG...

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

Đây là một vấn đề với ký hiệu "dấu trừ" trong công thức? Làm ơn cho lời khuyên. Lưu ý: Tất nhiên tôi có thể làm theo cách khác; ví dụ, tôi có thể loại trừ các biến trước khi đưa chúng vào lm (). Nhưng tôi đang dạy một lớp về những thứ này và tôi không muốn gây nhầm lẫn cho các sinh viên, vì đã nói với họ rằng họ có thể loại trừ biến bằng cách sử dụng một dấu trừ trong công thức.


3
Thật thú vị khi cả hai model.matrix(y ~ . - x3, data = dt[x3 == "men"])model.matrix(y ~ x1 + x2, data = dt[x3 == "men"])công việc ( lmgọi model.matrixnội bộ). Sự khác biệt duy nhất giữa cả hai ma trận mô hình là một "contrasts"thuộc tính (vẫn chứa x3) và được chọn sau này trong lmthói quen, có khả năng gây ra lỗi mà bạn nhìn thấy. Vì vậy, cảm giác của tôi là vấn đề liên quan đến cách model.matrixtạo và lưu trữ ma trận thiết kế khi loại bỏ các điều khoản.
Maurits Evers

Tôi đã cố gắng "mở rộng" .để có được một công thức đơn giản hóa terms(y ~ . -x3, data=dt, simplify=TRUE)nhưng kỳ lạ là nó vẫn giữ nguyên x3thuộc tính biến đi lênlm
MrFlick

1
@MrFlick - có vẻ như neg.out=tùy chọn chưa thực hiện trong R có thể liên quan. Từ các tệp trợ giúp S cho terms, nơi neg.out=được triển khai: cờ kiểm soát việc xử lý các thuật ngữ nhập bằng dấu "-". Nếu TRUE, các điều khoản sẽ được kiểm tra để hủy bỏ và nếu không thì bỏ qua. Nếu SAI, các thuật ngữ phủ định sẽ được giữ lại (với thứ tự âm).
thelHRail

1
@MauritsEvers: lmgọi model.matrixmột phiên bản sửa đổi của dữ liệu. Ngay từ đầu, hãy lmsoạn thảo và đánh giá biểu thức sau : mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE ). Điều này gây ra x3để trở thành một yếu tố cấp độ duy nhất. model.matrix()sau đó được gọi mf, không phải dữ liệu gốc, dẫn đến lỗi chúng tôi quan sát thấy.
Artem Sokolov

Câu trả lời:


2

Lỗi bạn gặp phải là do x3 nằm trong mô hình chỉ có một giá trị = "men"(xem nhận xét bên dưới từ @Artem Sokolov)

Một cách để giải quyết nó là tập hợp con trước thời hạn:

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)

Hoặc bạn có thể làm cả hai trong cùng một bước:

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

Nhìn chung, đây là một giải pháp tốt đẹp. Một điều cần sửa là -x3trong một công thức không gây ra lmsuy nghĩ rằng bạn đang cố gắng trừ cột. Ý định "không sử dụng x3 trong mô hình" được truyền đạt chính xác, nhưng vấn đề là ở chỗlm các cuộc gọi model.frame( ..., drop.unused.levels=TRUE )gây ra x3trở thành một yếu tố cấp độ đơn lẻ, dẫn đến các vấn đề hạ lưu model.matrix().
Artem Sokolov

Cảm ơn vì đã làm rõ Artem Sokolov, tôi đã đưa ra lời giải thích không chính xác đó ra khỏi câu trả lời của mình.
Dylan_Gomes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.