2011-10-19 30 views
6

Tôi tò mò nếu R có khả năng đặt đối tượng vào vectơ/danh sách/mảng/v.v. Tôi đang sử dụng gói randomforest để làm việc trên các tập hợp con của một đoạn dữ liệu lớn hơn và muốn lưu trữ từng phiên bản trong một danh sách. Nó sẽ là tương tự như sau:R đặt nhiều đối tượng randomForest vào một vector

answers <- c() 
for(i in 1:10){ 
x <- round((1/i), 3) 
answers <- (rbind(answers, x)) 
} 

Lý tưởng nhất là tôi muốn làm một cái gì đó như thế này:

answers <- c() 
for(i in 1:10){ 
RF <- randomForest(training, training$data1, sampsize=c(100), do.trace=TRUE, importance=TRUE, ntree=50,,forest=TRUE) 
answers <- (rbind(answers, RF)) 
} 

Đây là loại công trình nhưng đây là đầu ra cho một đối tượng RF duy nhất:

> RF 

Call: 
randomForest(x = training, y = training$data1, ntree = 50, sampsize = c(100), importance = TRUE, do.trace = TRUE,  forest = TRUE) 
       Type of random forest: regression 
        Number of trees: 10 
No. of variables tried at each split: 2 

      Mean of squared residuals: 0.05343956 
        % Var explained: 14.32 

Trong khi điều này được đặt ra cho danh sách 'câu trả lời':

> answers 
    call  type   predicted  mse  rsq  oob.times  importance importanceSD 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8 
    localImportance proximity ntree mtry forest coefs y    test inbag 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 
RF NULL   NULL  10 2 List,11 NULL Integer,150000 NULL NULL 

Có ai biết cách lưu trữ tất cả các đối tượng RF hoặc gọi chúng để thông tin được lưu trữ giống như một đối tượng RF đơn lẻ không? Cảm ơn bạn đã đề xuất.

Trả lời

9

Không phát triển vectơ hoặc liệt kê từng thành phần một. Pre-phân bổ chúng và gán đối tượng đến các bộ phận cụ thể:

answers <- vector("list",10) 
for (i in 1:10){ 
    answers[[i]] <- randomForest(training, training$data1, sampsize=c(100), 
           do.trace=TRUE, importance=TRUE, ntree=50, 
           forest=TRUE) 
} 

Là một mặt lưu ý, rbind vectơ ing không tạo ra một vector hoặc danh sách; nếu bạn kiểm tra đầu ra của bạn trong ví dụ đầu tiên của bạn, bạn sẽ thấy rằng nó là một ma trận với một cột. Điều đó giải thích hành vi kỳ lạ bạn quan sát khi cố gắng để rbind đối tượng randomForest cùng nhau.

+0

hoạt động hoàn hảo, cảm ơn bạn rất nhiều! – screechOwl

+0

Tại sao chúng ta không thể phát triển chúng một cách năng động? Đây có phải là giới hạn của R không? – wordsforthewise

3

Khởi tạo một danh sách với:

mylist <- vector("list") # technically all objects in R are vectors 

Thêm vào đó với:

new_element <- 5 
mylist <- c(mylist, new_element) 

@ lời khuyên Joran về tiền phân bổ là phù hợp khi bảng kê không lớn, nhưng không phải là hoàn toàn cần thiết khi họ đang có nhỏ bé. Bạn cũng có thể truy cập ma trận bạn xây dựng trong mã ban đầu của mình. Có vẻ hơi lạ nhưng thông tin là tất cả trong đó. Ví dụ phần tử đầu tiên của ma trận mà các danh sách có thể được phục hồi với:

answers[1, ] 
4

Sử dụng lapply:

lapply(1:10,function(i) randomForest(<your parameters>)) 

Bạn sẽ nhận được một danh sách các đối tượng rừng ngẫu nhiên; sau đó bạn có thể truy cập i-th trong số họ bằng cách sử dụng toán tử [[]].

0

Câu trả lời khác cung cấp các giải pháp để lưu trữ các đối tượng rừng ngẫu nhiên trong một list, nhưng chúng không giải thích lý do tại sao chúng hoạt động.

Như @ 42- gợi ý, đây không phải là bước phân bổ trước giải quyết vấn đề ở đây.

Vấn đề thực tế là đối tượng randomForest về cơ bản là list (hãy kiểm tra is.list(randomForest(...)). Khi bạn viết một tuyên bố như:

list_of_rf = c()          # ... or list_of_rf = NULL 
list_of_rf = rbind(list_of_rf, randomForest(...))  # ... or list_of_rf = c(list_of_rf, randomForest(...)) 

bạn về cơ bản yêu cầu ghép một đối tượng trống với danh sách.Thay vì tạo ra một danh sách độ dài 1 (mô hình rừng ngẫu nhiên), câu lệnh này dẫn đến một danh sách chứa tất cả các thành phần mô hình rừng ngẫu nhiên! Bạn có thể xác minh điều này bằng cách gõ bạn R console:

> chiều dài (list_of_rf)

[1] 19

Có một số cách để buộc R để thực hiện các hoạt động mà bạn muốn :

  1. affectation rõ ràng trong danh sách (cf @joran trả lời, mặc dù không có nhu cầu tiền phân bổ):

    list_of_rf = NULL 
    list_of_rf[[1]] = randomForest(...) 
    
  2. hãy lapply (hoặc tương đương) xây dựng danh sách (cf @mbq câu trả lời):

    list_of_rf = lapply(..., function(i) randomForest(...)) 
    
  3. đóng gói rừng ngẫu nhiên trong danh sách này sẽ được đơn giản hóa trong nối:

    list_of_rf = NULL 
    list_of_rf = c(list_of_rf, list(randomForest(...))) 
    

Cuối cùng, nếu bạn nhầm lẫn và không công khai mô hình ngẫu nhiênBạn phải mất 10 giờ mới được tính tại, bạn vẫn có thể khôi phục nó như sau:

list_of_rf = NULL 
list_of_rf = c(list_of_rf, randomForest(...)) # oups, mistake 
rf = as.vector(list_of_rf)[1:19] 
class(rf) = 'randomForest' 
Các vấn đề liên quan