函数lda()在传递子集参数

时间:2016-05-17 08:54:49

标签: 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)
}

我运行以下操作并获取错误。它与&#34; ...&#34;有关吗? (省略号)

lda.valid(Species~.,data=iris,prior=c(1/3,1/3,1/3),train.fraction=0.5)

我正在查看trycatch内容以发现错误,但我不知道如何打印堆栈跟踪。

任何提示或建议。此时我可能不了解堆栈跟踪。

1 个答案:

答案 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