函数lda()在传递子集参数时引发错误

  • 本文关键字:参数 错误 子集 lda 函数 r
  • 更新时间 :
  • 英文 :


这个错误看起来很常见,但我似乎无法理解。

我得到了以下代码(在一门课程中,但它(代码)没有评分),作为进行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 

最新更新