10 votos

Error al ejecutar glmnet en multinomial

El problema mencionado en esta pregunta se corrigió en la versión 1.7.3 de el paquete de R glmnet.

Estoy teniendo algunos problemas de ejecución de los glmnet con la familia=multinomial, y se preguntaba ha encontrado algo similar o que podría ser capaz de decirme qué estoy haciendo mal.

Cuando me pongo mis propios datos de prueba en el error "error al aplicar(nz, 1, mediana) : dim(X) debe tener un positivo longitud" se notifican cuando ejecuto cv.glmnet, que aparte de decir "no trabajo" no era enormemente 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

He aquí una descripción visual de que el problema estaba tratando de conseguir glmnet a resolver, si eso le ayuda a:

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

Soy capaz de ejecutar el código de ejemplo de que el paquete de google docs, lo que me hace suspcious que estoy bien de la incomprensión algo o que hay un error en la 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 es usar la versión R de 2.13.1 (2011-07-08) y glmnet 1.7.1, aunque puede generar el mismo problema en R 2.14.1. Las ideas de la gente?

11voto

Nathan Long Puntos 30303

Hay un error sutil.

Lo que está sucediendo es la siguiente: En su artificial conjunto de datos, los tres del grupo de medios están en una línea, y con el tamaño relativamente pequeño de la desviación estándar utilizado, los tres grupos se linealmente separables en su 10 dimensiones del espacio. Como consecuencia, todos los parámetros relacionados con el segundo grupo se estima en 0 para todos los $\lambda$. Verificación

coef(glm)

Internamente en cv.glmnet hay una llamada a predict a determinar para cada una de las $\lambda$ el número de no-cero de los coeficientes. Trate de

predict(glm, type = "nonzero")

La estructura es, a partir de la lectura de la cv.glmnet código, se supone para ser una lista de listas, pero la segunda entrada en la lista es NULO, y no una lista! Esto hace que el error. Sucede en este bloque de código de 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))
}

El resultado devuelto por los dos anidada sapply de las llamadas no es una matriz, como se esperaba en la última llamada de apply. Esto genera el error.

Podría ser muy raro para que se ejecute en el error en la práctica, pero el código supuesto debe ser robusto para casos extremos. Usted debe reportar el problema al mantenedor, Trevor Hastie (su correo electrónico aparece en el enlace).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X