当我使用'cv.ncvreg'(来自ncvreg
包)通过SCAD进行惩罚估算时,有时会发生错误并终止我的for循环:
library(spls)
library(ncvreg)
data("lymphoma")
x.m = lymphoma$x
y.v = lymphoma$y
y.v[y.v==2]=1
x.m = x.m[,sample(1:ncol(x.m),1000)]
tserr = rep(0,1000)
for(iter in 1:1000){
id<-sample(1:length(y.v),0.67*length(y.v))
trx<-x.m[id,];try<-y.v[id]
tsx<-x.m[-id,];tsy<-y.v[-id]
scad.fit = cv.ncvreg(X=trx, y=try, family="binomial", penalty="SCAD", nfolds = 3)
opt.lam = scad.fit$lambda[which.min(scad.fit$cve)]
final.fit = ncvreg(X=trx, y=try, family="binomial", penalty="SCAD", lambda=opt.lam)
p.vec = cbind(1,tsx) %*% coef(final.fit)
class.pred = (exp(p.vec) / (1+exp(p.vec))) > 0.5
tserr[iter] = mean(abs(class.pred - tsy))
}
## Error in dimnames(beta) <- list(varnames, lamNames(lambda)) :
## length of 'dimnames' [2] not equal to array extent
## In addition: There were 25 warnings (use warnings() to see them)
该软件包与其他数据集(如白血病,乳腺癌......)的效果非常好。
然而,lymphoma
出了问题。 :(
cv.ncvreg()
和lymphoma
有什么问题?
答案 0 :(得分:0)
我无法复制这一点,但我会回答一些调试技巧,这些技巧比评论更容易阅读:
sessionInfo()
(或至少您的操作系统和您正在使用的软件包版本)的结果很有帮助cat(iter,"\n")
添加到循环代码中,则可以看到代码失败的迭代次数。set.seed(101)
添加到代码顶部(在您使用的第一个命令调用随机数生成器之前),它将生成(更多)可重现的结果set.seed(1000+iter)
添加到循环代码中,那么当您在(例如)第745次迭代中发现代码失败时,您可以使用set.seed(1745)
直接进行该迭代,以便你可以更容易地看到发生了什么options(error=recover)
让R在发生错误时将您转储到调试环境中try()
中,并在失败时执行适当的操作,例如final.fit <- try(<your code here>); if (inherits(final.fit,"try-error")) next