Mam dziwny problem z R, którego nie mogę wymyślić.Nie znaleziono błędu obiektu podczas przekazywania formuły modelu do innej funkcji
Próbowałem napisać funkcję, która wykonuje K-krotność sprawdzania poprawności dla modelu wybranego przez procedurę krokową w R. (Jestem świadomy problemów z procedurami krokowymi, to jest wyłącznie w celach porównawczych) :)
Problem polega na tym, że jeśli zdefiniuję parametry funkcji (linmod, k, kierunek) i uruchomię zawartość funkcji, działa ona bezbłędnie. ALE, jeśli uruchomię go jako funkcję, pojawia się błąd informujący, że nie można odnaleźć obiektu datas.train.
Próbowałem już przejść przez funkcję z debug(), a obiekt wyraźnie istnieje, ale R mówi, że tak nie jest, gdy faktycznie uruchomię tę funkcję. Jeśli po prostu pasuję do modelu za pomocą lm(), to działa dobrze, więc uważam, że jest to problem z funkcją kroku w pętli, podczas gdy wewnątrz funkcji. (spróbuj skomentować polecenie kroku i ustawić predykcje na te ze zwykłego modelu liniowego.)
#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)
Jakieś przemyślenia?
Wydaje się, że istnieje problem z zakresu, w którym 'step (lm.1, direction = direction, trace = 0)' nie może znaleźć 'datas.train', jak już wiesz. Nie widzę przyczyny problemu. Przypisanie 'datas.train' jako zmiennej globalnej jest rozwiązaniem, ale nie jest szczególnie satysfakcjonujące (' datas.train << - datas [-xval.idx [[j]],] '). Być może należy to przenieść do StackOverflow? – jthetzel
W szczególności wywołanie 'add1 (dopasowanie, zasięg $ add, skala = skala, trace = trace, k = k, ...)' w 'step()' powoduje zgłoszenie błędu, gdzie 'add1()' jest ' statystyki ::: add1.lm'. – jthetzel
@jthetzel, Rzeczywiście. Jednym ze sposobów rozwiązania podobnego problemu, ale dla innego wywołania funkcji w pętli było przypisanie go globalnie. – dcl