如何在小样本上使用glmnet?

时间:2018-12-30 15:56:08

标签: r cross-validation glmnet

我正在分析n = 12个样本和p = 61个参数的高维数据集Z(数据是数字,没有NA)。为此,我使用glmnet程序包在1和p之间的Z[, j]的回归数据([, -j],Z j)上计算套索估计量。 因此,我选择一列作为观察对象,另一列是我的设计(对于那些在高维统计方面有一点经验的人:我想使用邻域选择)。

使用cv.glmnet似乎很容易完成,较大的样本就是这种情况。但是在这种情况下,对于n = 12个样本,glmnet似乎搞砸了:

as.matrix( coef( cv.glmnet(Z[, -j], Z[, j], intercept=FALSE))[-1])
  

predmat [seq(nlami)]中的错误<-preds:替换的长度为零

这是我得到的错误,但这并不总是会发生。为了研究错误,我习惯于遵循for循环

for (j in 1:p){
  print(j)
  as.matrix( coef( cv.glmnet(Z[, -j], Z[, j], intercept=FALSE))[-1])
}

我想到的第一件事是,它适用于大多数j。但是有时候,无缘无故,例如j=7就没有。 我重复循环,发现无效的j不同。似乎错误取决于随机性。

set.seed(70)
for (j in 1:p){
  print(j)
  as.matrix( coef( cv.glmnet(Z[, -j], Z[, j], intercept=FALSE))[-1])
}

这证实了我的猜测。 因此,我认为这与调整参数校准有关。 cv.glmnet使用k倍交叉验证。所以我的下一个猜测是,如果k > 12,则在对数据集进行分区时可能会出现空集。但是设置nfolds = 3并不能解决问题。

你们知道如何解决此问题吗?

这是问题的最小示例:

library(glmnet)

set.seed(79)
data <- rnorm( n=62*12, mean=0, sd=1)
Z <- matrix( data, nrow=12, ncol=62)
set.seed(2)
for (j in 1:61)
{
     print(j)
     as.matrix( coef( cv.glmnet(Z[, -j], Z[, j], intercept=FALSE))[-1])
 }

在这种情况下,我们看到该过程在j=13处失败。 但是,使用另一个种子,我们不会出错:

 set.seed(1239340) 
 for (j in 1:61)
 {
     print(j)
     as.matrix( coef( cv.glmnet(Z[, -j], Z[, j], intercept=FALSE))[-1])
 }

0 个答案:

没有答案