Làm thế nào để buộc R sử dụng một mức nhân tố xác định làm tham chiếu trong một hồi quy?


112

Làm thế nào tôi có thể yêu cầu R sử dụng một mức nhất định làm tham chiếu nếu tôi sử dụng các biến giải thích nhị phân trong một hồi quy?

Nó chỉ sử dụng một số cấp độ theo mặc định.

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

với b {0, 1, 2, 3, 4}. Giả sử tôi muốn sử dụng số 3 thay vì số 0 được sử dụng bởi R.


9
Bạn nên thực hiện bước xử lý dữ liệu bên ngoài công thức / khớp mô hình. Khi tạo hệ số từ bbạn có thể chỉ định thứ tự của các cấp bằng cách sử dụng factor(b, levels = c(3,1,2,4,5)). Thực hiện việc này trong bước xử lý dữ liệu bên ngoài lm()cuộc gọi. Câu trả lời của tôi bên dưới sử dụng relevel()hàm để bạn có thể tạo một hệ số và sau đó thay đổi mức tham chiếu xung quanh cho phù hợp khi bạn cần.
Gavin Simpson

1
Tôi đã đổi tên câu hỏi của bạn. Bạn thực sự sau khi thay đổi mức tham chiếu, không bỏ sót một mức nào.
Joris Meys

thx để ghi lại câu hỏi của tôi. Thật vậy, minimvel () là thứ tôi đang tìm kiếm. Thx cho câu trả lời chi tiết và ví dụ. Tôi không chắc chắn nếu thẻ tuyến tính hồi quy là một chút sai lệch bởi vì đây áp dụng cho tất cả các loại hồi quy sử dụng explanatories giả ...
Matt Bannert

Câu trả lời:


152

Xem relevel()chức năng. Đây là một ví dụ:

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ây giờ thay đổi yếu tố btrong DFbằng cách sử dụng các relevel()chức năng:

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

Các mô hình đã ước tính các mức tham chiếu khác nhau.

> 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
Để xóa trước biến ban đầu, chỉ cần không sử dụng within, nhưng df$bR = relevel(df$b, ref=3).
BurninLeo

1
Bạn có thể sử dụng relevel () bên trong công thức của bạn, sẽ không ảnh hưởng đến dữ liệu gốc ...
Mehdi Zare

36

Những người khác đã đề cập đến relevellệnh là giải pháp tốt nhất nếu bạn muốn thay đổi mức cơ sở cho tất cả các phân tích trên dữ liệu của mình (hoặc sẵn sàng sống chung với việc thay đổi dữ liệu).

Nếu bạn không muốn thay đổi dữ liệu (đây là thay đổi một lần, nhưng trong tương lai bạn muốn hoạt động mặc định trở lại), thì bạn có thể sử dụng kết hợp hàm C(ghi chú viết hoa) để đặt độ tương phản và contr.treatmentshàm với đối số cơ sở để chọn mức bạn muốn làm đường cơ sở.

Ví dụ:

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

33

Các relevel()lệnh là một phương pháp viết tắt cho câu hỏi của bạn. Những gì nó làm là sắp xếp lại hệ số sao cho cấp độ tham chiếu là đầu tiên. Do đó, sắp xếp lại thứ tự các cấp độ yếu tố của bạn cũng sẽ có tác dụng tương tự nhưng cho phép bạn kiểm soát nhiều hơn. Có lẽ bạn muốn có các cấp 3,4,0,1,2. Trong trường hợp đó...

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

Tôi thích phương pháp này hơn vì tôi dễ dàng xem mã của mình hơn không chỉ tham chiếu mà còn cả vị trí của các giá trị khác (thay vì phải xem kết quả cho điều đó).

LƯU Ý: KHÔNG biến nó thành một yếu tố có thứ tự. Một yếu tố có thứ tự xác định và một yếu tố có thứ tự không giống nhau. lm()có thể bắt đầu nghĩ rằng bạn muốn tương phản đa thức nếu bạn làm điều đó.


2
Đa thức tương phản, không phải là một hồi quy đa thức.
hadley

Có cách nào để đặt mức tham chiếu cùng lúc mà bạn xác định yếu tố, thay vì trong lần gọi tiếp theo để hạ cấp không?
David Bruce Borenstein

31

Tôi biết đây là một câu hỏi cũ, nhưng tôi đã gặp vấn đề tương tự và nhận thấy rằng:

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

làm chính xác những gì bạn yêu cầu.


3
Đây là một trợ giúp lớn! Giải pháp duy nhất bao gồm một cách để thực hiện điều đó trong lệnh lm (), đó là chính xác những gì tôi cần. Cảm ơn!
cparmstrong

3
Đây là một cách làm việc rất linh hoạt với các yếu tố. Tôi thích thực tế là tôi có thể kết hợp nó với as.factor(), nếu cần thiết, ví dụ bằng cách sử dụng...+relevel(as.factor(mycol), ref = "myref")+...
Peter

12

Bạn cũng có thể gắn thẻ cột theo cách thủ công với một contraststhuộc tính, thuộc tính này dường như được các hàm hồi quy tôn trọng:

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

1

Đối với những người đang tìm kiếm một phiên bản dplyr / updo. Xây dựng trên giải pháp 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)

Tôi đang bối rối tại sao bạn đặt "Nếu biến là một yếu tố", nơi bạn đã làm ... này là cần thiết dù bạn sử dụng relevel()hoặcforcats::fct_relevel()
Gregor Thomas

Bạn là chính xác, cảm ơn! Tôi đã thêm "bạn cũng có thể sử dụng", bởi vì, afaik, fct_relevel chỉ hoạt động với các yếu tố.
Gorka

2
relevelchỉ hoạt động với các yếu tố. fct_relevelchỉ hoạt động với các yếu tố. Không có bất kỳ sự khác biệt nào giữa các chức năng ngoại trừ tên, AFAIK. Nói "Nếu biến là một thừa số, bạn cũng có thể sử dụng fct_relevel" ngụ ý rằng nếu biến không phải là một thừa số, bạn có thể sử dụng relevel, nhưng điều đó không đúng.
Gregor Thomas
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.