S3 und Reihenfolge der Klassen

8

Ich hatte immer Schwierigkeiten, die Dokumentation darüber zu verstehen, wie S3-Methoden aufgerufen werden, und diesmal beißt es mich zurück.

Ich entschuldige mich für mehr als eine Frage, aber sie sind alle eng miteinander verwandt. Tief im Herzen einer komplexen Reihe von Funktionen, erstelle ich eine Menge von glmnet passt, insbesondere Logistik. Jetzt gibt glmnet documentation seinen Rückgabewert an, um beide Klassen "glmnet" und (für logistische Regression) "lognet" zu haben. In der Tat sind diese in dieser Reihenfolge angegeben.

Betrachtet man jedoch das Ende der Implementierung von glmnet , nach dem Aufruf von (der internen Funktion) lognet , das die Klasse von fit auf "lognet" setzt, sehe ich diese Codezeile kurz vor der Rückkehr (der Variable fit ):

%Vor%

Daraus würde ich schließen, dass die Reihenfolge der Klassen tatsächlich "lognet", "glmnet" ist.

Leider hatte die Passform, die ich hatte, (wie der Arzt es vorschlägt):

%Vor%

Das Problem dabei ist die Art und Weise, wie S3-Methoden dafür versendet werden, insbesondere predict . Hier ist der Code für predict.lognet :

%Vor%

Ich habe einen Kommentar hinzugefügt, um meine Argumentation zu erklären. Jetzt, wenn ich call an dieser myfit mit einer neuen Datamatrix mydata und type="response" vorhersage, wie folgt:

%Vor%

, ich erhalte nicht wie in der Dokumentation die vorhergesagten Wahrscheinlichkeiten, sondern die Linearkombinationen, was genau das Ergebnis des Aufrufs von predict.glmnet ist.

Ich habe versucht, die Reihenfolge der Klassen wie folgt umzukehren:

%Vor%

Und dann den vorhergesagten Anruf wiederholen: siehe da: es funktioniert! Ich mache die Wahrscheinlichkeiten.

Also, hier kommen einige Fragen:

  1. Habe ich recht, wenn ich das gelernt habe? S3-Methoden werden der Reihe nach versandt der Erscheinung der Klassen?
  2. Habe ich Recht, wenn ich den Code einnehme? glmnet würde die falsche Reihenfolge verursachen für den korrekten Versand von predict ?
  3. In meinem Code gibt es nichts manipuliert Klassen explizit / sichtbar nach meinem Wissen. Was könnte die Bestellung veranlassen ändern?

Der Vollständigkeit halber: Hier ist ein Beispielcode, mit dem Sie herumspielen können (wie ich es jetzt selbst mache):

%Vor%

Abhängig von den erzeugten Daten ist der Unterschied mehr oder weniger offensichtlich (in meinem wahren Datensatz habe ich negative Werte in den sogenannten Wahrscheinlichkeiten bemerkt, so habe ich das Problem aufgegriffen), aber Sie sollten tatsächlich einen Unterschied sehen.

Danke für jede Eingabe.

Bearbeiten :

Ich habe gerade die schreckliche Wahrheit herausgefunden: Entweder funktionierte der Auftrag in glmnet 1.5.2 (das ist auf dem Server vorhanden, wo ich den eigentlichen Code ausgeführt habe, was dazu geführt hat, dass die Klassenreihenfolge umgekehrt wurde), aber der Code von 1.6 erfordert der Auftrag, "lognet", "glmnet" zu sein. Ich muss noch überprüfen, was in 1.7 passiert.

Danke an @Aaron, dass er mich an die Grundlagen der Informatik erinnert hat (außer "wenn alles andere fehlschlägt, starte neu": "check your versions"). Ich hatte fälschlicherweise angenommen, dass ein Paket der Götter des statistischen Lernens vor dieser Art von Fehlern geschützt wäre, und an @Gavin, um meine Rekonstruktion der Funktionsweise von S3 zu bestätigen.

    
Nick Sabbe 23.06.2011, 22:16
quelle

1 Antwort

6

Ja, die Reihenfolge des Versands ist in der Reihenfolge, in der die Klassen im Klassenattribut aufgeführt sind. Im einfachen Fall des Alltags, ja, ist die erste angegebene Klasse diejenige, die zuerst durch den Methodenversand ausgewählt wurde, und nur wenn sie keine Methode für diese Klasse findet (oder NextMethod aufgerufen wird), geht sie weiter zum zweite Klasse oder fehlgeschlagene Suche nach einer default -Methode.

Nein, ich denke nicht, dass Sie Recht haben, dass die Reihenfolge der Klassen im Code falsch ist. Die Dokumentation erscheint falsch. Die Absicht ist eindeutig, predict.lognet() zuerst zu nennen, das Arbeitspferd predict.glmnet() zu verwenden, um die Basisberechnungen für alle Arten von Lasso / Elastic-Net-Modellen durchzuführen, die von glmnet angepasst wurden allgemeine Vorhersagen. Das predict.glmnet() wird nicht aus dem glmnet NAMESPACE exportiert, während die anderen Methoden vielleicht auch aussagen.

Ich bin nicht sicher, warum Sie die Ausgabe von diesem denken:

%Vor%

ist falsch? Ich bekomme eine Matrix von 10 Zeilen und 21 Spalten, wobei die Spalten sich auf die Intercept-only-Modellvorhersage plus Vorhersagen bei 20 Lambda-Werten beziehen, bei denen Modellkoeffizienten entlang des Lasso / elastischen Netzpfads berechnet wurden. Diese scheinen keine linearen Kombinationen zu sein und sind eine der Antwortskalen, wie Sie es gewünscht haben.

Die Reihenfolge der Klassen ändert sich nicht. Ich glaube, Sie missverstehen, wie der Code funktionieren soll. Es liegt ein Fehler in der Dokumentation vor, da dort die Reihenfolge falsch angegeben ist. Aber der Code funktioniert so, wie ich es sollte.

    
Gavin Simpson 23.06.2011, 23:15
quelle

Tags und Links