使用penalizedSVM
R包,我正在尝试进行功能选择。有一个名为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
})
有些迭代顺利,但随后在一个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的索引?
答案 0 :(得分:1)
对于第一个问题,infinite or missing values in 'x'
建议您将条件更改为类似的内容。
idx <- is.na(train_x) | is.infinite(train_x)
您可以将0分配给这些值。
train_x[idx] <- 0
关于第二个问题,关于如何在lapply
中获取当前data.frame的名称,你可以遍历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
修改强>
您可以在此行scad.fix&lt; -svm.fs
之前使用tryCatch
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)
})