2013-02-23 3 views
1

Использование пакета penalizedSVM R, я пытаюсь сделать выбор функции. Существует список из нескольких data.frames, называемых trainingdata.Выбор функции SVM с использованием SCAD

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 
        }) 

Некоторые итерации идут хорошо, но затем на одном 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 

Используя следующий вызов, я также проверки, является ли х действительно бесконечна, но вызов возвращает 0 для всех предыдущих и текущей data.frame, где произошла ошибка.

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

Есть ли другой способ проверить бесконечные значения? Что еще можно сделать, чтобы исправить эту ошибку? Есть ли способ определить индекс текущего кадра данных, обрабатываемый в течение нескольких секунд?

ответ

1

Для первого вопроса infinite or missing values in 'x' предлагает изменить ваше состояние на что-то похожее.

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

Вы можете присвоить 0, например, значениям тезисов.

train_x[idx] <- 0 

Что касается второго вопроса, относительно того, как получить имена текущего data.frame в lapply вы можете цикл по именам data.farmes, и сделать что-то вроде этого:

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 

EDIT

Вы можете использовать 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) 
     }) 
+0

Спасибо. После обновления кода я все равно получаю такое же сообщение об ошибке. Хотя я вручную проверил данные и не было никаких значений INF. – Shahzad

+0

@Shahzad, вероятно, тогда бесконечные значения связаны с некоторыми шагами вычислений в функции 'svm.fs' ... – agstudy

+0

Сообщение http://stackoverflow.com/questions/4906995/matrix-calculation-error предполагает, что существует условие в начале функции svd if (any (! is.finate (x))) stop ("бесконечные или отсутствующие значения в 'x'") – Shahzad

Смежные вопросы