Erro ao executar glmnet no multinomial [fechado]

9

O problema mencionado nesta pergunta foi corrigido na versão 1.7.3 do pacote R glmnet.

Estou tendo alguns problemas ao executar o glmnet com family = multinomial e queria saber se encontrou algo semelhante ou pode me dizer o que estou fazendo de errado.

Quando insiro meus próprios dados fictícios, o erro "Erro na aplicação (nz, 1, mediana): dim (X) deve ter um comprimento positivo" é relatado quando executo cv.glmnet, o que, além de dizer "não funcionou" não foi muito informativo para mim.

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

Aqui está uma descrição visual do problema que eu estava tentando resolver o glmnet, se isso ajudar:

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

Sou capaz de executar o código de exemplo nos documentos do pacote, o que me faz suspeitar que estou entendendo algo errado ou que há um erro no 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")

Isso está usando o R versão 2.13.1 (08-07-2011) e o glmnet 1.7.1, embora eu possa gerar o mesmo problema no R 2.14.1. Alguma idéia pessoal?

BenJWoodcroft
fonte

Respostas:

11

Há um bug sutil.

λ

coef(glm)

cv.glmnetpredictλ

predict(glm, type = "nonzero")

A estrutura é, da leitura do cv.glmnetcódigo, suposta ser uma lista de listas, mas a segunda entrada na lista é NULL, e não uma lista! Isso causa o erro. Isso acontece neste bloco 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))
}

O resultado retornado das duas sapplychamadas aninhadas não é uma matriz conforme o esperado na última chamada de apply. Isso gera o erro.

Pode ser muito improvável que ocorra um erro na prática, mas é claro que o código deve ser robusto para casos extremos. Você deve relatar o problema ao mantenedor, Trevor Hastie (o email dele está listado no link).

NRH
fonte
Obrigado pela resposta rápida e atenciosa. A maioria das coisas que você diz parece estar correta, mas não sei se o motivo é necessariamente o fato de serem linearmente separáveis. Se você aumentar o sd do rnorm nas entradas, o erro desaparece:
BenJWoodcroft
11
NRH: Um pensamento não relacionado - eu suspeito que o Prof. Hastie pode não gostar de você colocar seu e-mail em texto simples como esse, pois possivelmente convida a spam (embora seja impossível dizer com certeza, é claro). Eu não quero parecer que dura como a sua resposta foi muito útil ..
BenJWoodcroft
2
@BenJWoodcroft, não é a separabilidade linear que desencadeia o erro, mas a organização geométrica dos três grupos ao longo de uma linha. A separabilidade linear torna essa organização mais óbvia nos dados amostrados e, se você aumentar o desvio padrão suficientemente, o glmnet não "descobrirá" a organização. Como mostra o seu segundo exemplo, você realmente não precisa da separabilidade linear. Você está certo sobre o endereço de e-mail, obrigado.
NRH 20/01/12
3
Também estou recebendo esse erro no glmnet 1.9.8 e no R 3.1.1 com o código acima, bem como o código fornecido na vinheta com os dados de amostra.
user2030668
11
Estou vendo esse erro com dados do mundo real usando o R 3.2.1 no Windows e o glmnet 2.0-2. Os dados de treinamento têm 449 observações de 229 preditores. A variável de resposta possui 9 níveis. Quaisquer sugestões sobre como proceder serão bem-vindas.
Kent Johnson
-1

Primeiro converta sua matriz, por exemplo

x sem resposta para numérico. Depois disso, o (s) coeficiente (s) significativo (s) que contribuem para o modelo encontra por nomes de colunas ou nomes de nomes de pesquisa, como na estrutura de dados, as variáveis.

Muhammad Naeem
fonte