这个错误看起来很常见,但我似乎无法理解这一点。
我已经获得了以下代码(在课程上但未评分的代码)作为执行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)
}
我运行以下操作并获取错误。它与&#34; ...&#34;有关吗? (省略号)
lda.valid(Species~.,data=iris,prior=c(1/3,1/3,1/3),train.fraction=0.5)
我正在查看trycatch
内容以发现错误,但我不知道如何打印堆栈跟踪。
任何提示或建议。此时我可能不了解堆栈跟踪。
答案 0 :(得分:1)
如果您致电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