Помилка під час запуску glmnet у мультиноміальному [закритому]


9

Проблема, згадана в цьому питанні, виправлена ​​у версії 1.7.3 glmnet пакета R.

У мене виникають проблеми з керуванням glmnet з сім'єю = багаточлен, і мені було цікаво, чи трапляється щось подібне або, можливо, можна сказати мені, що я роблю не так.

Коли я вкладаю свої власні манекенні дані, під час запуску повідомляється про помилку "Помилка при застосуванні (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

Є тонкий клоп.

У цьому наборі штучних даних три групові засоби знаходяться на лінії, і при використанні відносно невеликого стандартного відхилення три групи стають лінійно відокремленими у вашому 10-мірному просторі. Як наслідок, всі параметри, що відносяться до другої групи, оцінюються в 0 для всіхλ. Перевірити

coef(glm)

Всередині cv.glmnetє заклик predictвизначитися з кожнимλкількість ненульових коефіцієнтів. Спробуйте

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 у входах, помилка
усувається

1
NRH: Одна думка не пов'язана - я підозрюю, що професор Хасті може не оцінити те, що ви розмістили його електронний лист у простому тексті, як це, можливо, запрошує спам (хоча, звичайно, це неможливо сказати точно). Я не хочу звучати суворо, оскільки ваша відповідь була дуже корисною ..
BenJWoodcroft

2
@BenJWoodcroft, не лінійна відокремлюваність як така викликає помилку, а геометричну організацію трьох груп по лінії. Лінійна відокремлюваність робить цю організацію більш очевидною у вибіркових даних, і якщо достатньо збільшити стандартне відхилення, glmnet не "відкриє" організацію. Як показує ваш другий приклад, вам фактично не потрібна лінійна роздільність. Ви маєте рацію щодо електронної адреси, дякую.
НРХ

3
Я також отримую цю помилку з glmnet 1.9.8 та з R 3.1.1 з кодом вище, а також з кодом, наданим на віньєтці із зразковими даними.
користувач2030668

1
Я бачу цю помилку з реальними даними, використовуючи R 3.2.1 для Windows та glmnet 2.0-2. Дані тренінгу мають 449 спостережень 229 прогнозів. Змінна відповіді має 9 рівнів. Будь-які пропозиції щодо того, як діяти, будуть вітатися.
Кент Джонсон

-1

Спочатку конвертуйте матрицю, наприклад

x без відповіді на числовий. Після цього значущий коефіцієнт (и), що сприяє моделі, знаходять пошукові імена або назви рядків, як у структурі даних змінні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.