2013-09-05 34 views
10

Tôi gặp sự cố lạ. Tôi đã chạy thành công mã này trên máy tính xách tay của mình, nhưng khi tôi thử chạy nó trên một máy khác trước tiên, tôi nhận được cảnh báo này Phân phối không được chỉ định, giả định bernoulli ... mà tôi mong đợi nhưng sau đó tôi gặp lỗi này: Error in object$var.levels[[i]] : subscript out of boundschỉ số ngoài ranh giới trong hàm gbm

library(gbm) 
gbm.tmp <- gbm(subxy$presence ~ btyme + stsmi + styma + bathy, 
       data=subxy, 
       var.monotone=rep(0, length= 4), n.trees=2000, interaction.depth=3, 
       n.minobsinnode=10, shrinkage=0.01, bag.fraction=0.5, train.fraction=1, 
       verbose=F, cv.folds=10) 

Ai cũng có thể trợ giúp? Các cấu trúc dữ liệu giống hệt nhau, cùng một mã, cùng R. Tôi thậm chí không sử dụng một chỉ số ở đây.

EDIT: traceback()

6: predict.gbm(model, newdata = my.data, n.trees = best.iter.cv) 
5: predict(model, newdata = my.data, n.trees = best.iter.cv) 
4: predict(model, newdata = my.data, n.trees = best.iter.cv) 
3: gbmCrossValPredictions(cv.models, cv.folds, cv.group, best.iter.cv, 
     distribution, data[i.train, ], y) 
2: gbmCrossVal(cv.folds, nTrain, n.cores, class.stratify.cv, data, 
     x, y, offset, distribution, w, var.monotone, n.trees, interaction.depth, 
     n.minobsinnode, shrinkage, bag.fraction, var.names, response.name, 
     group) 
1: gbm(subxy$presence ~ btyme + stsmi + styma + bathy, data = subxy,var.monotone = rep(0, length = 4), n.trees = 2000, interaction.depth = 3, n.minobsinnode = 10, shrinkage = 0.01, bag.fraction = 0.5, train.fraction = 1, verbose = F, cv.folds = 10) 

Nó có thể có cái gì để làm vì tôi di chuyển R workspace lưu vào máy khác?

EDIT 2: ok vì vậy tôi đã cập nhật gói gbm trên máy nơi mã đang hoạt động và bây giờ tôi gặp lỗi tương tự. Vì vậy, vào thời điểm này tôi nghĩ rằng gói gbm cũ hơn có lẽ không có kiểm tra này tại chỗ hoặc phiên bản mới hơn có một số vấn đề. Tôi không hiểu gbm đủ để nói.

+1

(1) Nó có thể không phải là nguồn gốc của vấn đề của bạn, nhưng công thức của bạn không nên sử dụng '$'; chỉ làm 'hiện diện ~ ...'. (2) Một điều cần kiểm tra là cả hai máy đều có R được thiết lập theo cùng một cách; ví dụ kiểm tra 'stringsAsFactors'. – joran

+0

Khung dữ liệu 'subxy' này ở đâu? Nếu đó là dữ liệu của riêng bạn, sau đó vui lòng bạn có thể cung cấp một số dữ liệu mẫu tái tạo sự cố. Một 'traceback()' của nơi xảy ra lỗi cũng sẽ hữu ích. –

+0

Phân phối mặc định cho 'gbm' là" bernoulli ", vì vậy nếu bạn có kết quả lớn hơn hai cấp, bạn sẽ không gặp phải lỗi? –

Trả lời

11

chỉ là linh cảm vì tôi không thể thấy dữ liệu của bạn, nhưng tôi tin rằng lỗi xảy ra khi bạn có các mức biến tồn tại trong tập kiểm tra không tồn tại trong tập huấn luyện.

điều này có thể dễ dàng xảy ra khi bạn có biến số yếu tố với số lượng cấp cao hoặc một cấp có số lượng phiên bản thấp.

vì bạn đang sử dụng nếp gấp CV, có thể cài đặt lưu giữ trên một trong các vòng lặp có mức nước ngoài cho dữ liệu đào tạo.

tôi muốn đề nghị một trong hai:

A) sử dụng model.matrix() để một nóng encode biến yếu tố của bạn

B) giữ thiết hạt khác nhau cho đến khi bạn có được một sự chia rẽ CV mà không làm có lỗi này xảy ra.

CHỈNH SỬA: vâng, với lần truy nguyên đó, lần giữ CV thứ 3 của bạn có cấp độ yếu tố trong tập kiểm tra không tồn tại trong đào tạo. do đó, chức năng dự đoán sẽ thấy giá trị nước ngoài và không biết phải làm gì.

EDIT 2: Dưới đây là một ví dụ nhanh để hiển thị những gì tôi có nghĩa là bởi "mức yếu tố không có trong bộ test"

#Example data with low occurrences of a factor level: 

set.seed(222) 
data = data.frame(cbind(y = sample(0:1, 10, replace = TRUE), x1 = rnorm(10), x2 = as.factor(sample(0:10, 10, replace = TRUE)))) 
data$x2 = as.factor(data$x2) 
data 

     y   x1 x2 
[1,] 1 -0.2468959 2 
[2,] 0 -1.2155609 6 
[3,] 0 1.5614051 1 
[4,] 0 0.4273102 5 
[5,] 1 -1.2010235 5 
[6,] 1 1.0524585 8 
[7,] 0 -1.3050636 6 
[8,] 0 -0.6926076 4 
[9,] 1 0.6026489 3 
[10,] 0 -0.1977531 7 

#CV fold. This splits a model to be trained on 80% of the data, then tests against the remaining 20%. This is a simpler version of what happens when you call gbm's CV fold. 

CV_train_rows = sample(1:10, 8, replace = FALSE) ; CV_test_rows = setdiff(1:10, CV_train_rows) 
CV_train = data[CV_train_rows,] ; CV_test = data[CV_test_rows,] 

#build a model on the training... 

CV_model = lm(y ~ ., data = CV_train) 
summary(CV_model) 
#note here: as the model has been built, it was only fed factor levels (3, 4, 5, 6, 7, 8) for variable x2 

CV_test$x2 
#in the test set, there are only levels 1 and 2. 

#attempt to predict on the test set 
predict(CV_model, CV_test) 

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
factor x2 has new levels 1, 2 
+1

cảm ơn câu trả lời, nó hơi hơn đầu tôi, tôi không chắc liệu tôi có hiểu hết hay không. Tại sao cùng một chức năng hoạt động trên máy tính khác? Tôi chưa bao giờ gặp lỗi này. Đó là một chút lạ. Tôi không muốn sửa đổi tham số CV. –

+0

vui lòng xem edit2 trong câu trả lời nếu điều đó có ý nghĩa. Cảm ơn bạn –

+4

vì vậy tôi có thể xác nhận rằng bằng cách hủy kích hoạt CV gbm gấp. Có lẽ đó là một lỗi với gói? Nó đã làm việc trong gói trước đó. Bất kỳ số CV nào cao hơn 1 đều cho lỗi này. Vì vậy, bất cứ lúc nào nó được sử dụng. –

0

tôi gặp phải cùng một vấn đề và cuối cùng giải quyết nó bằng cách thay đổi một trong những chức năng ẩn được gọi là predict.gbm trong gói gbm. Hàm này dự đoán thử nghiệm được thiết lập bởi đối tượng gbm được đào tạo trên tập huấn luyện từ phân chia bằng xác thực chéo.

Vấn đề là bộ thử nghiệm được thông qua chỉ nên có các cột tương ứng với các tính năng, vì vậy bạn nên sửa đổi hàm.

+0

"Vấn đề là bộ thử nghiệm được thông qua chỉ nên có các cột tương ứng với các tính năng, vì vậy bạn nên sửa đổi chức năng." Cảm ơn! Điều này đã khiến tôi mất một thời gian dài sáng nay. –

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