我有一個奇怪的R問題,我似乎無法解決問題。我試過編寫一個函數,爲R中的逐步過程選擇的模型執行K-fold交叉驗證(我意識到逐步過程的問題,純粹是爲了比較目的):)將模型公式傳遞給另一個函數時找不到對象
現在的問題是,如果我定義函數參數(linmod,k,方向)並運行函數的內容,它的工作原理是完美無瑕的。但是,如果我將它作爲函數運行,則會出現錯誤,指出無法找到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()'爲'統計::: add1.lm'。 – jthetzel
@jthetzel,的確。我解決類似問題的一種方法是在循環內部調用另一個函數,即全局分配它。 – dcl