R에 이상한 문제가있어서 잘 풀리지 못합니다.모델 수식을 다른 함수로 전달할 때 개체를 찾을 수 없음 오류
R에서 단계별 절차로 선택한 모델에 대해 K 배 교차 유효성 검사를 수행하는 함수를 작성하려고했습니다. (단계별 절차의 문제점을 알고 있는데, 이는 비교 목적으로 만 사용되었습니다 :)
이제는 함수 매개 변수 (linmod, k, direction)를 정의하고 함수의 내용을 실행하면 문제가 발생하지 않습니다. 하지만 함수로 실행하면 datas.train 개체를 찾을 수 없다는 오류가 발생합니다.
나는 debug() 함수를 통해 스테핑을 시도했지만 객체가 분명하게 존재하지만 R은 실제로 함수를 실행할 때 그렇지 않다는 것을 알립니다. 필자가 lm()을 사용하여 모델에 적합하다면 잘 동작하므로 함수 내부에서 루프의 step 함수에 문제가 있다고 생각합니다. (단계 명령을 주석 처리하고 일반 선형 모델의 예측으로 예측을 설정하십시오.)
#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)
어떤 생각이 들었습니까?
'step (lm.1, direction = direction, trace = 0)'이 이미 알고있는 것처럼 'datas.train'을 찾을 수없는 범위 지정 문제가있는 것 같습니다. 나는 그 문제의 원인을 직접 볼 수 없다. 'datas.train'을 전역 변수로 할당하는 것은 해결 방법이지만, 특히 만족스러운 방법은 아닙니다 ('datas.train << datas [-xval.idx [[j]]]). 아마도 이것은 StackOverflow로 마이그레이션해야합니까? – jthetzel
특히'step()'에서'add1 (fit, scope $ add, scale = scale, trace = trace, k = k, ...)'를 호출하면 에러가 발생하고,'add1()'은' stats ::: add1.lm'. – jthetzel
@jthetel, 참으로. 한 가지 방법은 비슷한 문제를 해결했지만 루프 내에서 다른 함수 호출을 위해 전역 적으로 할당하는 것이 었습니다. – dcl