Errore durante l'esecuzione di glmnet in multinomial [chiuso]


9

Il problema menzionato in questa domanda è stato risolto nella versione 1.7.3 del pacchetto R glmnet.

Sto riscontrando alcuni problemi con glmnet con family = multinomial, e mi chiedevo di aver riscontrato qualcosa di simile o di essere in grado di dirmi cosa sto facendo di sbagliato.

Quando inserisco i miei dati fittizi, l'errore "Errore nell'applicazione (nz, 1, mediana): dim (X) deve avere una lunghezza positiva" viene segnalato durante l'esecuzione cv.glmnet, che a parte dire "non ha funzionato" non era estremamente informativo per me.

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

Ecco una descrizione visiva del problema che stavo cercando di risolvere glmnet, se questo aiuta:

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

Sono in grado di eseguire il codice di esempio dai documenti del pacchetto, il che mi fa sospettare che o stia fraintendendo qualcosa o che ci sia un bug in 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")

Questo sta usando R versione 2.13.1 (2011-07-08) e glmnet 1.7.1, anche se posso generare lo stesso problema su R 2.14.1. Qualche idea gente?

Risposte:


11

C'è un bug sottile.

Quello che sta succedendo è il seguente: Nel tuo set di dati artificiali, i mezzi dei tre gruppi sono su una linea e, con la deviazione standard relativamente piccola utilizzata, i tre gruppi diventano linearmente separabili nel tuo spazio 10-dimensionale. Di conseguenza, tutti i parametri relativi al secondo gruppo sono stimati a 0 per tuttiλ . Dai un'occhiata

coef(glm)

Internamente cv.glmnetc'è una chiamata a predictdeterminare per ogni il numero di coefficienti diversi da zero. Provareλ

predict(glm, type = "nonzero")

La struttura, dalla lettura del cv.glmnetcodice, dovrebbe essere un elenco di elenchi, ma la seconda voce nell'elenco è NULL e non un elenco! Questo provoca l'errore. Succede in questo blocco di codice dacv.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))
}

Il risultato restituito dalle due sapplychiamate nidificate non è una matrice come previsto nell'ultima chiamata di apply. Questo genera l'errore.

Potrebbe essere molto improbabile che si verifichi un errore nella pratica, ma il codice dovrebbe ovviamente essere robusto in casi estremi. Dovresti segnalare il problema al manutentore, Trevor Hastie (la sua e-mail è elencata al link).


Grazie per la risposta premurosa e veloce. La maggior parte delle cose che dici sembrano corrette, ma non sono sicuro che la ragione sia necessariamente che siano separabili linearmente. Se aumenti l'sd del rnorm negli input, l'errore scompare:
BenJWoodcroft

1
NRH: Un pensiero non correlato - sospetto che il Prof. Hastie potrebbe non apprezzare il fatto che tu abbia inserito la sua e-mail in testo semplice come questo, poiché potrebbe invitare spam (anche se è impossibile dirlo con certezza, ovviamente). Non intendo sembrare duro perché la tua risposta è stata molto utile ..
BenJWoodcroft,

2
@BenJWoodcroft, non è la separabilità lineare in quanto tale che provoca l'errore ma l'organizzazione geometrica dei tre gruppi lungo una linea. La separabilità lineare rende questa organizzazione più evidente nei dati campionati e se si aumenta sufficientemente la deviazione standard, glmnet non "scopre" l'organizzazione. Come mostra il tuo secondo esempio, in realtà non hai bisogno della separabilità lineare. Hai ragione sull'indirizzo email, grazie.
NRH,

3
Ricevo anche questo errore con glmnet 1.9.8 e con R 3.1.1 con il codice sopra e il codice fornito sulla vignetta con i dati di esempio.
user2030668,

1
Sto vedendo questo errore con i dati del mondo reale usando R 3.2.1 su Windows e glmnet 2.0-2. I dati di addestramento hanno 449 osservazioni su 229 predittori. La variabile di risposta ha 9 livelli. Qualsiasi suggerimento su come procedere sarebbe il benvenuto.
Kent Johnson,

-1

Per prima cosa converti la tua matrice, ad esempio

x senza risposta in numerico. Successivamente i coefficienti significativi che contribuiscono al modello trovano nei nomi di ricerca o nei nomi di ricerca come nella struttura dei dati le variabili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.