2012-02-11 24 views
31

Tôi đã cố gắng tự động hóa một đoạn mã của mình để chương trình trở nên ít tẻ nhạt. Về cơ bản, tôi đã cố gắng thực hiện lựa chọn biến theo từng bước bằng cách sử dụng fastbw() trong gói rms. Tôi muốn vượt qua danh sách các biến bởi fastbw() chọn vào một công thức như y ~ x1+x2+x3, "x1" "x2" "x3" là danh sách các biến bởi fastbw()chuyển một vectơ biến thành công thức lm()

Ở đây chọn là mã tôi đã cố gắng và đã không làm việc

olsOAW0.r060 <- ols(roll_pct~byoy+trans_YoY+change18m, 
        subset= helper=="POPNOAW0_r060", 
        na.action = na.exclude, 
        data = modelready) 

OAW0 <- fastbw(olsOAW0.r060, rule="p", type="residual", sls= 0.05) 

vec <- as.vector(OAW0$names.kept, mode="any") 

b <- paste(vec, sep ="+") ##I even tried b <- paste(OAW0$names.kept, sep="+") 

bestp.OAW0.r060 <- lm(roll_pct ~ b , 
         data = modelready, 
         subset = helper =="POPNOAW0_r060",  
         na.action = na.exclude) 

Tôi mới đến R và vẫn còn havent kéo theo đường cong học tập dốc, vì vậy xin lỗi vì những sai lầm lập trình rõ ràng. Bất kỳ trợ giúp nào được đánh giá cao

Trả lời

44

Bạn sắp hoàn tất. Bạn chỉ cần paste các toàn bộ công thức với nhau, một cái gì đó như thế này:

paste("roll_pct ~ ",b,sep = "") 

ép buộc nó vào một công thức thực tế sử dụng as.formula và sau đó vượt qua rằng để lm. Về mặt kỹ thuật, tôi nghĩ rằng lm có thể ép buộc một chuỗi ký tự, nhưng tự ép buộc nó thường an toàn hơn. (Một số chức năng mong đợi công thức sẽ không thực hiện cưỡng chế cho bạn, những người khác sẽ làm.)

+0

JJoran, thankyou, tôi vẫn gặp lỗi. Hãy xem hpi <- paste ("byoy", "change18m", "change24m", "change18m0", "change24m0", "lag3byoy", "lag3change18m" , "lag3change24m", "lag6byoy", "lag6change18m", "lag6change24m", "trans_YoY", sep = "+") hpi.form <- as.formula (dán ("roll_pct ~", "hpi", sep = "")) lmNGC0.r060 <- lm (hpi.form, tập hợp con = helper == "POPNOANGC0_r060", na.action = na.exclude, data = modelready) > Lỗi trong model.frame.default (công thức = như .công thức (dán ("roll_pct ~", "hpi",: độ dài biến khác nhau (được tìm thấy cho 'hpi') – Anand

+0

@ user1199861 Bạn đặt 'hpi' trong dấu ngoặc kép ở dòng thứ hai. Nhập' hpi.form' vào bảng điều khiển và bạn sẽ thấy lý do tại sao điều này là sai – joran

+0

Joran, cảm ơn một lần nữa, tôi nghĩ rằng lm() không phải là nén đối tượng "hpi" vào công thức như chuỗi ký tự. Khi tôi đã thử gõ các biến vào công thức lm(), nó đã làm việc – Anand

13

Bạn thực sự cần sử dụng sự sụp đổ thay vì seb khi xác định b.

b <- paste(OAW0$names.kept, collapse="+") 

Sau đó, bạn có thể đặt nó trong câu trả lời Joran

paste("roll_pct ~ ",b,sep = "") 

hoặc chỉ sử dụng:

paste("roll_pct ~ ",paste(OAW0$names.kept, collapse="+"),sep = "") 
3

Tôi chạy vào vấn đề tương tự ngày hôm nay, nếu bạn muốn làm cho nó thậm chí còn chung chung hơn nơi bạn thậm chí không cần phải có tên lớp cố định, bạn có thể sử dụng

frmla <- as.formula(paste(colnames(modelready)[1], paste(colnames(modelready)[2:ncol(modelready)], sep = "", 
           collapse = " + "), sep = " ~ ")) 

này giả định rằng bạn có biến lớp học hoặc các biến phụ thuộc trong cột đầu tiên nhưng chỉ mục có thể dễ dàng chuyển sang cột cuối cùng như sau:

frmla <- as.formula(paste(colnames(modelready)[ncol(modelready)], paste(colnames(modelready)[1:(ncol(modelready)-1)], sep = "", 
           collapse = " + "), sep = " ~ ")) 

Sau đó tiếp tục với lm sử dụng:

bestp.OAW0.r060 <- lm(frmla , data = modelready, ...) 
0

Nếu bạn đang tìm kiếm thứ gì đó ít chi tiết hơn:

fm <- as.formula(paste(colnames(df)[i], ".", sep=" ~ ")) 
             # i is the index of the outcome column 

Ở đây có chức năng:

getFormula<-function(target, df) { 

    i <- grep(target,colnames(df)) 
    as.formula(paste(colnames(df)[i], 
        ".", 
        sep = " ~ ")) 
} 
fm <- getFormula("myOutcomeColumnName", myDataFrame) 
rp <- rpart(fm, data = myDataFrame) # Use the formula to build a model 
Các vấn đề liên quan