Ошибка при запуске glmnet в многочлене [закрыто]

9

Проблема, упомянутая в этом вопросе, исправлена ​​в версии 1.7.3 пакета R glmnet.

У меня возникли некоторые проблемы при запуске glmnet с family = multinomial, и мне было интересно, что я столкнулся с чем-то похожим или, возможно, смог сказать мне, что я делаю неправильно.

Когда я вставляю свои собственные фиктивные данные, при запуске появляется сообщение об ошибке «Ошибка в применении (nz, 1, медиана): dim (X) должна иметь положительную длину») cv.glmnet, что, помимо сообщения «это не сработало» не был очень информативным для меня.

y=rep(1:3,20) #=> 60 element vector
set.seed(1011)
x=matrix(y+rnorm(20*3*10,sd=0.4),nrow=60) # 60*10 element matrix
glm = glmnet(x,y,family="multinomial")   #=> returns without error
crossval = cv.glmnet(x,y,family="multinomial")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="class")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="mae")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
cvglm = cv.glmnet(x,y,family="multinomial",lambda=2)   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length

Вот визуальное описание проблемы, которую я пытался заставить glmnet решить, если это поможет:

my_colours = c('red','green','blue')
plot(x[,1],x[,2],col=my_colours[y])

Я могу запустить пример кода из документации пакета, что заставляет меня подозревать, что я что-то неправильно понимаю или что есть ошибка в glmnet.

library(glmnet)
set.seed(10101)
n=1000;p=30
x=matrix(rnorm(n*p),n,p) #=> 1000*30 element matrix
beta3=matrix(rnorm(30),10,3)
beta3=rbind(beta3,matrix(0,p-10,3))
f3=x%*% beta3
p3=exp(f3)
p3=p3/apply(p3,1,sum)
g3=rmult(p3) #=> 1000 element vector
set.seed(10101)
cvfit=cv.glmnet(x,g3,family="multinomial")

Это использует R версии 2.13.1 (2011-07-08) и glmnet 1.7.1, хотя я могу создать ту же проблему на R 2.14.1. Есть идеи, люди?

BenJWoodcroft
источник

Ответы:

11

Есть небольшая ошибка.

λ

coef(glm)

cv.glmnetpredictλ

predict(glm, type = "nonzero")

Структура, от чтения cv.glmnetкода, должна быть списком списков, но вторая запись в списке - NULL, а не список! Это вызывает ошибку. Это происходит в этом блоке кода изcv.glmnet

if (inherits(glmnet.object, "multnet")) {
    nz = predict(glmnet.object, type = "nonzero")
    nz = sapply(nz, function(x) sapply(x, length))
    nz = ceiling(apply(nz, 1, median))
}

Результат, возвращаемый двумя вложенными sapplyвызовами, не является матрицей, как ожидалось в последнем вызове apply. Это генерирует ошибку.

На практике это может быть очень маловероятным, но код, конечно, должен быть устойчивым к экстремальным случаям. Вы должны сообщить о проблеме сопровождающему, Тревору Хасти (его адрес электронной почты указан по ссылке).

NRH
источник
Спасибо за вдумчивый и быстрый ответ. Большинство вещей, которые вы говорите, кажутся правильными, но я не уверен, что причина в том, что они линейно разделимы. Если вы увеличите sd rnorm на входах, ошибка исчезнет:
BenJWoodcroft
1
NRH: Одна мысль не связана - я подозреваю, что профессор Хасти, возможно, не оценит то, что вы помещаете его электронное письмо в виде простого текста, поскольку это, возможно, вызывает спам (хотя, конечно, невозможно сказать наверняка). Я не хочу звучать резко, поскольку ваш ответ был очень полезным ..
BenJWoodcroft
2
@ BenJWoodcroft, это не линейная отделимость как таковая, которая вызывает ошибку, а геометрическая организация трех групп вдоль линии. Линейная отделимость делает эту организацию более очевидной в выборочных данных, и если вы достаточно увеличите стандартное отклонение, glmnet не «обнаружит» организацию. Как показывает ваш второй пример, вам на самом деле не нужна линейная отделимость. Вы правы насчет адреса электронной почты, спасибо.
NRH
3
Я также получаю эту ошибку с glmnet 1.9.8 и с R 3.1.1 с кодом выше, а также с кодом, приведенным на виньетке с примерами данных.
user2030668
1
Я вижу эту ошибку с реальными данными, использующими R 3.2.1 в Windows и glmnet 2.0-2. Данные обучения имеют 449 наблюдений 229 предикторов. Переменная ответа имеет 9 уровней. Любые предложения о том, как поступить, будут приветствоваться.
Кент Джонсон
-1

Сначала преобразуйте вашу матрицу, например

х без ответа в числовой. После этого значимые коэффициенты, которые вносят вклад в модель, находят по столбцам или именам строк поиска, как в структуре данных, переменные.

Мухаммед Наим
источник