Fehler beim Ausführen von glmnet in Multinomial [geschlossen]

9

Das in dieser Frage erwähnte Problem wurde in Version 1.7.3 des R-Pakets glmnet behoben.

Ich habe einige Probleme beim Ausführen von glmnet mit family = multinomial und habe mich gefragt, ob ich auf etwas Ähnliches gestoßen bin oder mir möglicherweise sagen kann, was ich falsch mache.

Wenn ich meine eigenen Dummy-Daten eingebe, wird beim Ausführen der Fehler "Fehler beim Anwenden (nz, 1, Median): dim (X) muss eine positive Länge haben" gemeldet cv.glmnet, abgesehen davon, dass "es nicht funktioniert hat". war nicht sehr informativ für mich.

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

Hier ist eine visuelle Beschreibung des Problems, das ich versucht habe, glmnet zu lösen, wenn dies hilft:

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

Ich kann den Beispielcode aus den Paketdokumenten ausführen, was mich verdächtig macht, dass ich entweder etwas falsch verstehe oder dass es einen Fehler in glmnet gibt.

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")

Dies verwendet R Version 2.13.1 (2011-07-08) und glmnet 1.7.1, obwohl ich das gleiche Problem auf R 2.14.1 generieren kann. Irgendwelche Ideen Leute?

BenJWoodcroft
quelle

Antworten:

11

Es gibt einen subtilen Fehler.

Was passiert, ist Folgendes: In Ihrem künstlichen Datensatz befinden sich die drei Gruppenmittelwerte in einer Linie, und mit der relativ kleinen verwendeten Standardabweichung werden die drei Gruppen in Ihrem 10-dimensionalen Raum linear trennbar. Infolgedessen werden alle Parameter, die sich auf die zweite Gruppe beziehen, für alleλ auf 0 geschätzt . Prüfen

coef(glm)

Intern cv.glmnetwird aufgerufen, predictfür jedes die Anzahl der Koeffizienten ungleich Null zu bestimmen . Versuchenλ

predict(glm, type = "nonzero")

Die Struktur soll nach dem Lesen des cv.glmnetCodes eine Liste von Listen sein, aber der zweite Eintrag in der Liste ist NULL und keine Liste! Dies verursacht den Fehler. Es passiert in diesem Codeblock voncv.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))
}

Das Ergebnis der beiden verschachtelten sapplyAufrufe ist keine Matrix, wie beim letzten Aufruf von erwartet apply. Dies erzeugt den Fehler.

In der Praxis ist es sehr unwahrscheinlich, dass der Fehler auftritt, aber der Code sollte natürlich auch in extremen Fällen robust sein. Sie sollten das Problem dem Betreuer Trevor Hastie melden (seine E-Mail-Adresse ist unter dem Link aufgeführt).

NRH
quelle
Vielen Dank für die nachdenkliche und schnelle Antwort. Die meisten Dinge, die Sie sagen, scheinen richtig zu sein, aber ich bin nicht sicher, ob der Grund notwendigerweise darin besteht, dass sie linear trennbar sind. Wenn Sie den SD der Norm in den Eingaben erhöhen, verschwindet der Fehler:
BenJWoodcroft
1
NRH: Ein Gedanke, der nichts damit zu tun hat - ich vermute, dass Prof. Hastie es möglicherweise nicht zu schätzen weiß, dass Sie seine E-Mail so in einfachen Text setzen, da dies möglicherweise zu Spam führt (obwohl dies natürlich nicht sicher zu sagen ist). Ich will nicht zu hart klingen, da Ihre Antwort sehr hilfreich war.
BenJWoodcroft
2
@BenJWoodcroft, es ist nicht die lineare Trennbarkeit als solche, die den Fehler auslöst, sondern die geometrische Organisation der drei Gruppen entlang einer Linie. Die lineare Trennbarkeit macht diese Organisation in den abgetasteten Daten deutlicher. Wenn Sie die Standardabweichung ausreichend erhöhen, "entdeckt" glmnet die Organisation nicht. Wie Ihr zweites Beispiel zeigt, benötigen Sie die lineare Trennbarkeit nicht wirklich. Sie haben Recht mit der E-Mail-Adresse, danke.
NRH
3
Ich bekomme diesen Fehler auch mit glmnet 1.9.8 und mit R 3.1.1 mit dem obigen Code sowie dem Code auf der Vignette mit den Beispieldaten.
user2030668
1
Ich sehe diesen Fehler bei realen Daten unter Verwendung von R 3.2.1 unter Windows und glmnet 2.0-2. Die Trainingsdaten enthalten 449 Beobachtungen von 229 Prädiktoren. Die Antwortvariable hat 9 Ebenen. Vorschläge zur weiteren Vorgehensweise sind willkommen.
Kent Johnson
-1

Konvertieren Sie zum Beispiel zuerst Ihre Matrix

x ohne Antwort in numerisch. Danach werden die signifikanten Koeffizienten, die zum Modell beitragen, durch Such-Colnames oder Rownames wie in der Datenstruktur gefunden.

Muhammad Naeem
quelle