使用'cv.ncvreg'

时间:2017-06-11 18:12:27

标签: r

当我使用'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有什么问题?

1 个答案:

答案 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