Ошибка при запуске 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. Есть идеи, люди?

Ответы:


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. Это генерирует ошибку.

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


Спасибо за вдумчивый и быстрый ответ. Большинство вещей, которые вы говорите, кажутся правильными, но я не уверен, что причина в том, что они линейно разделимы. Если вы увеличите 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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.