gpt4 book ai didi

r - 将模型公式传递给另一个函数时找不到对象错误

转载 作者:行者123 更新时间:2023-12-04 02:54:01 25 4
gpt4 key购买 nike

我对 R 有一个奇怪的问题,我似乎无法解决。

我尝试编写一个函数,对 R 中的逐步程序选择的模型执行 K 折交叉验证。(我知道逐步程序的问题,这纯粹是为了比较目的):)

现在的问题是,如果我定义函数参数 (linmod,k,direction) 并运行函数的内容,它可以完美地工作。但是,如果我将它作为函数运行,我会收到一条错误消息,指出无法找到 datas.train 对象。

我已经尝试使用 debug() 单步执行该函数,并且该对象显然存在,但是 R 表示在我实际运行该函数时并不存在。如果我只是使用 lm() 拟合模型它工作正常,所以我相信这是循环中的 step 函数的问题,而在函数内部。 (尝试注释掉 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)

有什么想法吗?

最佳答案

创建公式时,lm.cars , in 被分配了自己的环境。除非您明确更改,否则此环境将保留在公式中。因此,当您使用 formula 提取公式时功能,包括模型的原始环​​境。

我不知道我在这里使用的术语是否正确,但我认为您需要明确更改函数中公式的环境:

cv.step <- function(linmod,k=10,direction="both"){
response <- linmod$y
dmatrix <- linmod$x
n <- length(response)
datas <- linmod$model
.env <- environment() ## identify the environment of cv.step

## extract the formula in the environment of cv.step
form <- as.formula(linmod$call, env = .env)

## The rest of your function follows

关于r - 将模型公式传递给另一个函数时找不到对象错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8218196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com