2010-08-28 21 views
18

Tôi muốn ép các biến cụ thể vào hồi quy glm mà không chỉ định đầy đủ từng biến. Tập dữ liệu thực của tôi có ~ 200 biến. Tôi đã không thể tìm thấy mẫu này trong tìm kiếm trực tuyến của tôi cho đến nay.Chỉ định công thức trong R với độ chói mà không khai báo rõ ràng của từng biến số

Ví dụ (chỉ với 3 biến):

n=200 
set.seed(39) 
samp = data.frame(W1 = runif(n, min = 0, max = 1), W2=runif(n, min = 0, max = 5)) 
samp = transform(samp, # add A 
A = rbinom(n, 1, 1/(1+exp(-(W1^2-4*W1+1))))) 
samp = transform(samp, # add Y 
Y = rbinom(n, 1,1/(1+exp(-(A-sin(W1^2)+sin(W2^2)*A+10*log(W1)*A+15*log(W2)-1+rnorm(1,mean=0,sd=.25)))))) 

Nếu tôi muốn bao gồm tất cả các điều khoản chính, điều này có một phím tắt đơn giản:

glm(Y~., family=binomial, data=samp) 

Nhưng nói rằng tôi muốn bao gồm tất cả các chính các điều khoản (W1, W2 và A) cộng với W2^2:

glm(Y~A+W1+W2+I(W2^2), family=binomial, data=samp) 

Có lối tắt cho điều này không?

[chỉnh sửa trước khi xuất bản:] Tính năng này hoạt động! glm(formula = Y ~ . + I(W2^2), family = binomial, data = samp)

Được rồi, vậy còn cái này thì sao!

Tôi muốn bỏ qua một thuật ngữ chính biến và chỉ bao gồm hai nhiệm kỳ chính (A, W2) và W2^2 và W2^2: A:

glm(Y~A+W2+A*I(W2^2), family=binomial, data=samp) 

Rõ ràng chỉ với một vài biến không có phím tắt là thực sự cần thiết, nhưng tôi làm việc với dữ liệu chiều cao. Tập dữ liệu hiện tại có "chỉ" 200 biến, nhưng một số khác có hàng nghìn và hàng nghìn.

+1

Ồ wow, tôi rất xin lỗi, tôi cũng đã tìm ra câu hỏi thứ hai của mình! glm (Y ~.-W1 + A * I (W2^2), gia đình = nhị thức, dữ liệu = samp) Hy vọng điều này sẽ giúp người khác, vì vậy không tệ khi có nó ở đây. –

Trả lời

19

Việc bạn sử dụng . một cách sáng tạo để tạo công thức chứa tất cả hoặc gần như tất cả các biến là một cách tiếp cận tốt và sạch sẽ. Một tùy chọn khác đó là hữu ích đôi khi là để xây dựng công thức programatically như là một chuỗi, và sau đó chuyển nó sang công thức sử dụng as.formula:

vars <- paste("Var",1:10,sep="") 
fla <- paste("y ~", paste(vars, collapse="+")) 
as.formula(fla) 

Tất nhiên, bạn có thể làm cách fla đối tượng phức tạp hơn.

13

Aniko đã trả lời câu hỏi của bạn. Để mở rộng một chút:

Bạn cũng có thể loại trừ các biến sử dụng -:

glm(Y~.-W1+A*I(W2^2), family=binomial, data=samp) 

Đối với nhóm lớn các biến, tôi thường tạo ra một khung cho nhóm các biến, cho phép bạn làm điều gì đó như:

vars <- data.frame(
    names = names(samp), 
    main = c(T,F,T,F), 
    quadratic =c(F,T,T,F), 
    main2=c(T,T,F,F), 
    stringsAsFactors=F 
) 


regform <- paste(
    "Y ~", 
    paste(
     paste(vars[vars$main,1],collapse="+"), 
     paste(vars[1,1],paste("*I(",vars[vars$quadratic,1],"^2)"),collapse="+"), 
     sep="+" 
    ) 
) 
> regform 
[1] "Y ~ W1+A+W1 *I(W2 ^2)+W1 *I(A ^2)" 

> glm(as.formula(regform),data=samp,family=binomial) 

Sử dụng tất cả các loại điều kiện (trên tên, trên cấu trúc, bất kỳ thứ gì) để điền vào khung dữ liệu, cho phép tôi nhanh chóng chọn các nhóm biến trong tập hợp dữ liệu lớn.

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