Error al ejecutar glmnet en multinomial [cerrado]

9

El problema mencionado en esta pregunta se solucionó en la versión 1.7.3 del paquete R glmnet.

Tengo algunos problemas al ejecutar glmnet con family = multinomial, y me preguntaba si ha encontrado algo similar o podría decirme qué estoy haciendo mal.

Cuando pongo mis propios datos ficticios, aparece el error "Error al aplicar (nz, 1, mediana): dim (X) debe tener una longitud positiva" cuando corro cv.glmnet, lo que aparte de decir "no funcionó" no fue muy informativo para mí.

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

Aquí hay una descripción visual del problema que estaba tratando de resolver glmnet, si eso ayuda:

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

Puedo ejecutar el código de ejemplo de los documentos del paquete, lo que me hace sospechar que estoy malinterpretando algo o que hay un error en 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")

Esto está utilizando R versión 2.13.1 (2011-07-08) y glmnet 1.7.1, aunque puedo generar el mismo problema en R 2.14.1. ¿Alguna idea de personas?

BenJWoodcroft
fuente

Respuestas:

11

Hay un error sutil.

λ

coef(glm)

cv.glmnetpredictλ

predict(glm, type = "nonzero")

Se supone que la estructura, al leer el cv.glmnetcódigo, es una lista de listas, pero la segunda entrada en la lista es NULL, ¡y no una lista! Esto causa el error. Sucede en este bloque de código decv.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))
}

El resultado devuelto por las dos sapplyllamadas anidadas no es una matriz como se esperaba en la última llamada de apply. Esto genera el error.

Puede ser muy poco probable que se encuentre con el error en la práctica, pero el código, por supuesto, debe ser robusto para casos extremos. Debe informar el problema al responsable de mantenimiento, Trevor Hastie (su correo electrónico aparece en el enlace).

NRH
fuente
Gracias por la respuesta reflexiva y rápida. La mayoría de las cosas que dices parecen ser correctas, pero no estoy seguro de que la razón sea necesariamente que son linealmente separables. Si aumenta el SD del rnorm en las entradas, el error desaparece:
BenJWoodcroft
1
NRH: Un pensamiento no relacionado: sospecho que el profesor Hastie puede no apreciar que ponga su correo electrónico en texto sin formato, ya que posiblemente invita al correo no deseado (aunque es imposible saberlo con certeza, por supuesto). No me refiero a sonar duro ya que su respuesta fue muy útil ..
BenJWoodcroft
2
@BenJWoodcroft, no es la separabilidad lineal como tal lo que desencadena el error, sino la organización geométrica de los tres grupos a lo largo de una línea. La separabilidad lineal hace que esta organización sea más obvia en los datos muestreados, y si aumenta la desviación estándar lo suficiente, glmnet no "descubre" la organización. Como muestra su segundo ejemplo, en realidad no necesita la separabilidad lineal. Tienes razón sobre la dirección de correo electrónico, gracias.
NRH
3
También obtengo este error con glmnet 1.9.8 y con R 3.1.1 con el código anterior, así como el código proporcionado en la viñeta con los datos de muestra.
usuario2030668
1
Estoy viendo este error con datos del mundo real usando R 3.2.1 en Windows y glmnet 2.0-2. Los datos de entrenamiento tienen 449 observaciones de 229 predictores. La variable de respuesta tiene 9 niveles. Cualquier sugerencia sobre cómo proceder sería bienvenida.
Kent Johnson
-1

Primero convierta su matriz por ejemplo

x sin respuesta en numérico. Después de eso, el (los) coeficiente (s) significativo (s) que contribuyen al modelo encuentra mediante la búsqueda de nombres de columnas o de fila como en la estructura de datos las variables.

Muhammad Naeem
fuente