Как использовать glmnet на небольшом образце? - PullRequest
0 голосов
/ 30 декабря 2018

Я анализирую многомерный набор данных Z с n = 12 выборками и параметрами p = 61 (данные являются числовыми и не имеют NA).Для этого я использую пакет glmnet для вычисления оценок Лассо по данным регрессии (Z[, j], Z [, -j]) для j между 1 и p.Поэтому я выбираю один столбец для своих наблюдений, другие столбцы - мой дизайн (для тех, кто немного разбирается в многомерной статистике: я хочу использовать Neighborhood Selection).

Кажется, что это легко сделать с использованием cv.glmnet, что имеет место для больших образцов.Но в этом случае, с n = 12 выборками, glmnet, кажется, запутался:

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

Ошибка в predmat [которую, seq (nlami)] <- preds: замена имеет нулевую длину</p>

Это ошибка, которую я получаю, но это не всегда происходит.Чтобы изучить ошибку, я использовал следующее: for -loop

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])
 }
...