1

Rパッケージを使用penalizedSVMして、特徴選択を行おうとしています。trainingdataと呼ばれるいくつかのdata.framesのリストがあります。

trainingdata <-lapply(trainingdata, function(data)
                   {
                     levels(data$label) <- c(-1, 1)
                     train_x<-data[, -1]
                     train_x<-data.matrix(train_x)
                     trainy<-data[, 1]
                     print(which(!is.finite(train_x)))
                     scad.fix<-svm.fs(train_x, y=trainy, fs.method="scad",
                                      cross.outer=0, grid.search="discrete",
                                      lambda1.set=lambda1.scad, parms.coding="none",
                                      show="none", maxIter=1000, inner.val.method="cv",
                                      cross.inner=5, seed=seed, verbose=FALSE)

                     data <- data[c(1, scad.fix$model$xind)]
                     data
                   })

いくつかの反復はうまくいきますが、1つのdata.frameで次のエラーメッセージが表示されます。

[1] "feature selection method is scad"
Error in svd(m, nv = 0, nu = 0) : infinite or missing values in 'x'
Calls: lapply ... scadsvc -> .calc.mult.inv_Q_mat2 -> rank.condition -> svd

次の呼び出しを使用して、xが本当に無限大であるかどうかも確認していますが、エラーが発生した先行および現在のすべてのdata.frameに対して呼び出しは0を返します。

print(which(!is.finite(train_x)))

無限の値をチェックする他の方法はありますか?このエラーを修正するために他に何ができるでしょうか?lapply内で処理されている現在のdata.frameのインデックスを判別する方法はありますか?

4

1 に答える 1

1

最初の質問についてはinfinite or missing values in 'x' 、条件をのようなものに変更することをお勧めします。

   idx <- is.na(train_x) | is.infinite(train_x)

たとえば、これらの値に0を割り当てることができます。

   train_x[idx] <- 0

2番目の質問では、現在のdata.frameの名前を取得する方法について、data.farmes lapplyの名前をループして、次のようにすることができます。

 lapply(names(trainingdata), function(data){ data <- trainingdata[data]....}

例えば:

 ll <- list(f=1,c=2)
> lapply(names(list(f=1,c=2)), function(x) data <- ll[x])
[[1]]
[[1]]$f
[1] 1


[[2]]
[[2]]$c
[1] 2

編集

tryCatchこの行の前にscad.fix<-svm.fsを使用できます

   tryCatch(
    scad.fix<-svm.fs(....)
      , error = function(e) e)
           })

たとえば、ここでこのリストでテストすると、リストにNAが含まれていても、コードはリストの最後まで実行され続けます。

lapply(list(1,NA,2), function(x){
  tryCatch(
  if (any(!is.finite(x)))
     stop("infinite or missing values in 'x'")
  , error = function(e) e)
       })
于 2013-02-23T17:01:33.170 に答える