这个错误看起来很常见,但我似乎无法理解。
我得到了以下代码(在一门课程中,但它(代码)没有评分),作为进行LDA的快捷方式。显然,它在某些电脑上有效,但在我的电脑上无效。我已经升级了R和R工作室以及MASS库。有什么想法吗?
我得到的错误是:
Error in eval(expr, envir, enclos) : object 'training' not found
代码是
lda.valid <- function(formula,data,...,train.fraction=0.75){
grouping <- model.response(model.frame(formula,data))
tbl <- table(grouping,lda(formula,data,...,CV=TRUE)$class)
CV <- sum(diag(tbl))/sum(tbl)
n <- nrow(data)
training <- sample(1:n,n*train.fraction)
lda.training <- lda(formula,data,...,subset=training)
lda.pred <- predict(lda.training,data[-training,])
tbl <- table(grouping[-training],lda.pred$class)
VAL <- sum(diag(tbl))/sum(tbl)
c(CV=CV,VAL=VAL)
}
我运行以下程序并得到错误。它与"…"(省略号)有关吗
lda.valid(Species~.,data=iris,prior=c(1/3,1/3,1/3),train.fraction=0.5)
我一直在查看trycatch
的内容以捕捉错误,但不知道如何打印stacktrace。
任何提示或建议。在这一点上,我可能不理解堆叠赛跑。
调用lda.training <- lda(...)
时出错。这似乎与lda()
函数的内部有关,我不清楚为什么会发生这种情况。
然而,这段代码的意图似乎是只使用数据的训练子集来执行lda。
这很容易通过预先对数据进行子集设置来直接指定。所以我建议用替换违规行
lda.training <- lda(formula, data[training, ], ...)
因此,完整的功能是:
library(MASS)
lda.valid <- function(formula, data, ..., train.fraction = 0.75){
grouping <- model.response(model.frame(formula, data))
tbl <- table(grouping, lda(formula, data, ..., CV = TRUE)$class)
CV <- sum(diag(tbl))/sum(tbl)
n <- nrow(data)
training <- sample(1:n, n*train.fraction)
lda.training <- lda(formula, data[training, ], ...) # <<<--- Changed
lda.pred <- predict(lda.training, data[-training, ])
tbl <- table(grouping[-training], lda.pred$class)
VAL <- sum(diag(tbl))/sum(tbl)
c(CV = CV, VAL = VAL)
}
lda.valid(Species~., data = iris, prior = c(1/3, 1/3, 1/3), train.fraction = 0.5)
这导致:
> lda.valid(Species~., data = iris, prior = c(1/3, 1/3, 1/3), train.fraction = 0.5)
CV VAL
0.98 0.96