我正在分析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])
}