Tôi gặp vấn đề lạ với R mà tôi không thể làm việc.Lỗi đối tượng không tìm thấy khi chuyển công thức mô hình sang chức năng khác
Tôi đã cố gắng viết một hàm thực hiện xác thực chéo K cho một mô hình được chọn theo thủ tục stepwise trong R. (Tôi biết các vấn đề với thủ tục từng bước, nó hoàn toàn cho mục đích so sánh) :)
Bây giờ vấn đề là, nếu tôi xác định các tham số hàm (linmod, k, direction) và chạy nội dung của hàm, nó hoạt động hoàn hảo. NHƯNG, nếu tôi chạy nó như là một hàm, tôi nhận được một lỗi nói rằng đối tượng datas.train không thể được tìm thấy.
Tôi đã thử bước qua chức năng với debug() và đối tượng rõ ràng tồn tại, nhưng R nói nó không khi tôi thực sự chạy hàm. Nếu tôi chỉ phù hợp với một mô hình bằng cách sử dụng lm() nó hoạt động tốt, vì vậy tôi tin rằng đó là một vấn đề với chức năng bước trong vòng lặp, trong khi bên trong một chức năng. (hãy thử nhận xét ra lệnh bước và đặt các dự đoán cho những người từ mô hình tuyến tính thông thường.)
#CREATE A LINEAR MODEL TO TEST FUNCTION
lm.cars <- lm(mpg~.,data=mtcars,x=TRUE,y=TRUE)
#THE FUNCTION
cv.step <- function(linmod,k=10,direction="both"){
response <- linmod$y
dmatrix <- linmod$x
n <- length(response)
datas <- linmod$model
form <- formula(linmod$call)
# generate indices for cross validation
rar <- n/k
xval.idx <- list()
s <- sample(1:n, n) # permutation of 1:n
for (i in 1:k) {
xval.idx[[i]] <- s[(ceiling(rar*(i-1))+1):(ceiling(rar*i))]
}
#error calculation
errors <- R2 <- 0
for (j in 1:k){
datas.test <- datas[xval.idx[[j]],]
datas.train <- datas[-xval.idx[[j]],]
test.idx <- xval.idx[[j]]
#THE MODELS+
lm.1 <- lm(form,data= datas.train)
lm.step <- step(lm.1,direction=direction,trace=0)
step.pred <- predict(lm.step,newdata= datas.test)
step.error <- sum((step.pred-response[test.idx])^2)
errors[j] <- step.error/length(response[test.idx])
SS.tot <- sum((response[test.idx] - mean(response[test.idx]))^2)
R2[j] <- 1 - step.error/SS.tot
}
CVerror <- sum(errors)/k
CV.R2 <- sum(R2)/k
res <- list()
res$CV.error <- CVerror
res$CV.R2 <- CV.R2
return(res)
}
#TESTING OUT THE FUNCTION
cv.step(lm.cars)
Bất kỳ suy nghĩ nào?
Dường như có vấn đề về phạm vi, trong đó 'bước (lm.1, hướng = hướng, dấu vết = 0)' không thể tìm thấy 'datas.train', như bạn đã biết. Tôi không thể thấy nguyên nhân của vấn đề. Việc gán 'datas.train' làm biến toàn cầu là một work-around, nhưng không phải là một biến đặc biệt thỏa mãn (' datas.train << - datas [-xval.idx [[j]],] '). Có lẽ điều này nên được di chuyển đến StackOverflow? – jthetzel
Cụ thể, lệnh gọi 'add1 (phù hợp, phạm vi $ add, scale = scale, trace = trace, k = k, ...)' trong 'step()' ném lỗi, trong đó 'add1()' là ' số liệu thống kê ::: add1.lm'. – jthetzel
@jthetzel, Thật vậy. Một cách tôi giải quyết một vấn đề tương tự nhưng đối với một cuộc gọi hàm bên trong một vòng lặp là gán nó trên toàn cầu. – dcl