2016-05-17 12 views
1

このエラーはよく見えますが、私はこれを頭に入れているようには見えません。関数lda()は、サブセット引数を渡すときにエラーをスローします

私はLDAを行うためのショートカットとして次のコードを与えられました(コース上では(コード)は格付けされていません)。どうやらそれはいくつかのコンピュータで動作しますが、私のものではありません。私はR and R studioと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) 
} 

です。それは私がエラーをキャッチするためにtrycatchものを見ていたが、私はスタックトレースを印刷することができますどのように表示されていない

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

「...」(省略符号)に関連しています。

ヒントやご提案です。私はおそらくこの時点でスタックトレースを理解していないでしょう。

+0

のStackOverflowへようこそ。明確な質問を投稿してくれてありがとう! – Andrie

+0

気づいていただきありがとうございます! – jason

答えて

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 
+0

こんにちはAndrie パーフェクト。それがソートされました。すべて今働いている。 – jason

関連する問題