2012-03-06 22 views
6

Trong ví dụ sau, giả sử bạn có một mô hình trong đó supp là một biến yếu tố.Công thức R và kết quả là các tên hệ số

lm(len ~ dose + supp, data = ToothGrowth) 

nhưng tôi muốn sử dụng cấp cơ sở khác cho yếu tố. Tôi có thể chỉ định này trực tiếp trong công thức:

lm(len ~ dose + relevel(supp, "VC"), data = ToothGrowth) 

và đầu ra sẽ là:

Call: 
lm(formula = len ~ dose + relevel(supp, "VC"), data = ToothGrowth) 

Coefficients: 
     (Intercept)     dose relevel(supp, "VC")OJ 
      5.573     9.764     3.700 

Nó rất thuận tiện để làm biến đổi trực tiếp trong công thức, và không làm cho các tập dữ liệu trung gian hoặc thay đổi hiện tại. Một ví dụ là khi bạn sử dụng scale để chuẩn hóa các biến trong đó điều cần thiết là tính toán số lần bỏ lỡ trong các biến khác được bao gồm trong mô hình cuối cùng. Thông thường, tuy nhiên các tên hệ số kết quả trong đầu ra trở nên khá xấu xí.

Câu hỏi của tôi là: có thể chỉ định tên biến được tạo thành từ biểu thức khi làm việc với công thức không? Một cái gì đó như

lm(len ~ dose + (OJ = relevel(supp, "VC")), data = Toothgrowth) 

(không hoạt động).

EDIT: Mặc dù giải pháp được đề xuất bởi G. Grothendieck rất hay nhưng nó thực sự tạo ra kết quả sai. Ví dụ sau đây cho thấy điều này:

# Create some data: 
df <- data.frame(x1 = runif(10), x2=runif(10)) 
df <- transform(df, y = x1 + x2 + rnorm(10)) 

# Introduce some missings. 
df$x1[2:3] <- NA 

# The wrong result: 
lm(formula = y ~ z1 + z2, 
    data = transform(df, z1 = scale(x1), z2=scale(x2))) 

# extract a model frame. 
df2 <- model.frame(y ~ x1 + x2, df) 

# The right result: 
lm(formula = y ~ scale(x1) + scale(x2), 
    data = df2) 

# or: 
lm(formula = y ~ z1 + z2, 
    data = transform(model.frame(y ~ x1 + x2, df), 
      z1 = scale(x1), z2 = scale(x2))) 

Vấn đề là khi demeaning x2, nó sử dụng các quan sát không có trong mô hình cuối cùng vì x1 có thiếu sót. Vì vậy, với tôi câu hỏi vẫn còn, cho dù có cách nào để giao diện công thức xử lý trường hợp này mà không có bước trung gian khó chịu khi sử dụng công thức thừa và trích xuất khung mô hình, sau đó có thể "chuyển đổi".

Tôi hy vọng câu hỏi là rõ ràng.

Trả lời

7

Sửa đổi nó trong đối số data= hơn trong đối số formula=:

lm(len ~ dose + OJ, data = transform(ToothGrowth, OJ = relevel(supp, "VC"))) 
+0

Nice, thanks a lot! – Stefan

+1

Nếu bạn thích nó và giải quyết vấn đề của bạn, bạn nên bấm để chấp nhận nó ... –

+0

Xin chào, GG, trong khi câu trả lời của bạn rất hay và hoạt động trong nhiều trường hợp, nó vẫn có thể cho kết quả không mong muốn. Tôi đã làm một ví dụ trong một chỉnh sửa cho câu hỏi. – Stefan

Các vấn đề liên quan