2012-11-09 50 views
5

Tôi đang cố gắng chạy 96 lần hồi quy và lưu kết quả dưới dạng 96 đối tượng khác nhau. Để làm phức tạp mọi thứ, tôi muốn chỉ số trên một trong các biến số trong mô hình cũng thay đổi 96 lần. Tôi đã gần như giải quyết vấn đề nhưng tôi đã không may trúng một bức tường. Mã cho đến nay là,Lặp qua các biến số trong hồi quy bằng cách sử dụng R

for(i in 1:96){ 

    assign(paste("z.out", i,sep=""), lm(rMonExp_EGM~ TE_i + Month2+Month3+Month4+Month5+Month6+Month7+Month8+Month9+ 
    Month10+Month11+Month12+Yrs_minus_2004 + 
    as.factor(LGA),data=Pokies)) 

} 

này hoạt động ở phía bên tạo đối tượng (ví dụ tôi có z.out1 - z.out96) nhưng tôi dường như không thể có được subscript trên covariate thay đổi là tốt.

Tôi có 96 biến được gọi là TE_1, TE_2 ... TE_96 trong tập dữ liệu. Như vậy, chỉ số trên TE_, "i" cần thay đổi để tương ứng với từng đối tượng tôi tạo. Đó là, z.out1 nên giữ kết quả từ mô hình này:

z.out1 <- lm(rMonExp_EGM~ TE_1 + Month2+Month3+Month4+Month5+Month6+Month7+Month8+Month9+ 
    Month10+Month11+Month12+Yrs_minus_2004 + as.factor(LGA),data=Pokies) 

Và z.out96 nên là:

z.out96 <- lm(rMonExp_EGM~ TE_96+ Month2+Month3+Month4+Month5+Month6+Month7+Month8+Month9+ 
    Month10+Month11+Month12+Yrs_minus_2004 + as.factor(LGA),data=Pokies) 

Hy vọng rằng điều này làm cho ý nghĩa. Tôi rất biết ơn mọi lời khuyên/lời khuyên.

+0

Nhưng ngoài prog vấn đề ramming, bạn có lẽ nên suy nghĩ lại hoặc yêu cầu CrossValidate về lm trên một chuỗi thời gian như các yếu tố riêng lẻ. Kết quả là dứt khoát gây hiểu nhầm hoặc đơn giản là sai. –

Trả lời

7

tôi sẽ đưa các kết quả trong một danh sách và tránh những for loopassign báo cáo

Bạn có thể sử dụng một sự kết hợp của reformulateupdate để tạo ra công thức của bạn

orig_formula <- MonExp_EGM~ Month2+Month3+Month4+Month5+Month6+Month7+Month8+Month9+ 
Month10+Month11+Month12+Yrs_minus_2004 + as.factor(LGA) 


te_variables <- paste0('TE_', 1:96) 
# Or if you don't have a current version of R 
# te_variables <- paste('TE', 1:96, sep = '_') 

new_formula <- lapply(te_variables, function(x,orig = orig_formula) { 
    new <- reformulate(c(x,'.')) 
    update(orig, new)}) 
## it works!  
new_formula[[1]] 
## MonExp_EGM ~ TE_1 + Month2 + Month3 + Month4 + Month5 + Month6 + 
## Month7 + Month8 + Month9 + Month10 + Month11 + Month12 + 
## Yrs_minus_2004 + as.factor(LGA) 
new_formula[[2]] 
## MonExp_EGM ~ TE_2 + Month2 + Month3 + Month4 + Month5 + Month6 + 
## Month7 + Month8 + Month9 + Month10 + Month11 + Month12 + 
## Yrs_minus_2004 + as.factor(LGA) 


models <- lapply(new_formula, lm, data = pokies) 

Có bây giờ sẽ là 96 yếu tố trong danh sách models

Bạn có thể đặt tên cho chúng để phản ánh các tên được hoạch định ban đầu của bạn

names(models) <- paste0('z.out', 1:96) 
# or if you don't have a current version of R 
# names(models) <-paste('z.out', 1:96 ,sep = '') 

và sau đó truy cập vào một mô hình duy nhất bằng cách

models$z.out5 

vv

hoặc tạo bản tóm tắt của tất cả các mô hình

summaries <- lapply(models, summary) 

vv ....

# just the coefficients 
coefficients <- lapply(models, coef) 

# the table with coefficient estimates and standard.errors 

coef_tables <- apply(summaries, '[[', 'coefficients') 
+0

cảm ơn! Điều này làm các trick. Giả sử tôi muốn trích xuất các hệ số từ các mô hình, sau đó có nên thận trọng khi sử dụng vòng lặp for không? Ví dụ - bumpkis <- ma trận (nrow = 96, ncol = 1) cho (i trong 1:96) { bumpkis [i,] <- c (mô hình $ z.out (i) $ hệ số [2]) } Điều này không có tác dụng vì tôi không thể đưa tôi làm việc. Tôi nghĩ rằng tôi đang thiếu một cái gì đó cơ bản về vòng lặp. – kpeyton

+0

No. Xem ví dụ của tôi trong giải pháp đã chỉnh sửa. Đối với loại hoạt động này, các vòng lặp sẽ hoạt động, nhưng một giải pháp R thành ngữ là sử dụng 'lapply'. Việc bạn sử dụng 'i' trong' mô hình $ z.out (i) 'sẽ không chính xác. Hãy thử 'mô hình [[dán ('z.out', i, sep = '')]]'. Bạn sẽ không thể sử dụng '$' – mnel

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