Extrahieren Sie die Vorhersageformel, ohne die Formel in der Datentabelle speichern zu müssen<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich schreibe ein Skript, um einen Satz verallgemeinerter linearer Modelle an Daten anzupassen und dann den AIC usw. zu extrahieren, um die Modellmittelung durchzuführen. Aufgrund der Art und Weise, wie JMP kategoriale Variablen in der Entwurfsmatrix für verallgemeinerte lineare Modelle kodiert (JMP verwendet eine Summen-zu-Null-Kodierung anstelle einer Eckpunktkodierung), ist es schwierig, die Vorhersagen mithilfe der geschätzten Koeffizienten im Modell zu mitteln fit (eine der Kategorien wird nie angezeigt und ich müsste umfangreiche Programmierung durchführen, um sie neu zu erstellen). Es scheint am einfachsten zu sein, einfach die Vorhersageformel der Plattform zu verwenden und dann die Modellgewichte in einer großen Formel auf diese Vorhersagen anzuwenden.
Soweit ich sehen kann, muss ich jedoch die Vorhersageformel in der Datentabelle für JEDES Modell speichern, und dann kann ich die Formel extrahieren und zur Verwendung an anderer Stelle speichern, indem ich etwas in der Art verwende
Modellfit << Vorhersageformel ;
Modellpredformel = verkohlen ( Spalte ( Daten , „P(PA)-Formel“ ) << Holen Sie sich die Formel ()) ;
Dabei ist „P(PA)-Formel“ die vorhergesagte Formel. Ich kann dann die Modellvorhersageformel (in Zeichenform) in meiner zusammenfassenden AIC-Tabelle speichern und schließlich eine Superformel erstellen, die eine gewichtete Summe der einzelnen Formeln ist ....
Dies verlangsamt das Skript jedoch erheblich, da die Vorhersagen für die gesamte Datentabelle berechnet werden und ich die Spalte für jede Modellanpassung hinzufügen und entfernen muss.
Gibt es also eine Möglichkeit, die tatsächliche Vorhersageformel aus einer Modellanpassung zu extrahieren, OHNE dass die Spalte zunächst in der Datentabelle gespeichert werden muss und JMP die Berechnungen tatsächlich durchführen muss?
Danke
Carl Schwarz
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenAb JMP Pro 13.0 gibt es eine einfachere Möglichkeit: die tatsächliche Vorhersageformel aus einer Modellanpassung extrahieren, OHNE die Spalte zuerst in der Datentabelle speichern zu müssen und JMP die Berechnungen tatsächlich durchführen zu lassen?“ Genau das bewirken die „Publish Prediction Formula“ und ihre Variationen; Die durch die Modellanpassung generierte Formel wird direkt in einer neuen JMP-Plattform namens gespeichert Formeldepot . Von dort aus können Sie es auf andere (kompatible) Tabellen anwenden, Scoring-Code (in mehreren Programmiersprachen) für die Bereitstellung generieren und JMP-Plattformen wie den Profiler und den Modellvergleich starten. Letzteres verfügt über einen Befehl zur Modellmittelung, der meiner Meinung nach Ihr ultimatives Ziel, ein Ensemble zu erstellen, umsetzt.
Leider wurde der Befehl „Veröffentlichen“ für die von Ihnen verwendete Generalized Linear Model Platform noch nicht hinzugefügt. Aber es ist für eine ganze Reihe anderer prädiktiver Modellierungsplattformen verfügbar – Neural, Partition, Standard Least Squares, um nur einige zu nennen.
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenJa, um dt zu bewerten, ist es gerecht
dt; oder wenn Sie Lust auf mehr haben, eval(dt);
Die Funktion open kann verschiedene Argumente akzeptieren. In vielen Fällen spielt die Reihenfolge der Argumente keine Rolle, in diesem Fall schon. „inset into“ fügt am Ende der Liste der Argumente in der Funktion hinzu, es sei denn, Sie geben an, dass es in einer bestimmten Reihenfolge mit dem dritten Argument erfolgen soll, das ich hier nicht verwendet habe.
Zugegeben, das sieht vielleicht wirklich komisch aus, aber es ist super praktisch.
Indem ich die open-Anweisung in einen Ausdruck einschließe, kann ich Argumente hinzufügen oder entfernen, bevor sie ausgewertet wird.
insert into fügt im Wesentlichen „,invisible“ hinzu, mit der Ausnahme, dass es sich nicht um eine Zeichenfolge handelt, die analysiert werden muss.
insert into fügt den Inhalt von invis mit einer kleinen Wendung hinzu. Wenn ich nur invis einfüge, würde das ausgewertete invis eingefügt. Das wollte ich nicht, also habe ich invis in „name expr“ eingeschlossen.Name expr(invis) wird als „unsichtbar“ ausgewertet und fügt das Common als Trennzeichen hinzu. Daher fügt name eval den Text des Ausdrucks hinzu, ohne dass dieser jemals Text ist.Leider klingt es umso schlimmer, je mehr ich versuche, es zu erklären.
In JSL könnten Sie im Wesentlichen mit dem Ausdruck einer leeren Funktion beginnen und diese mit allen benötigten Teilen und Teilen füllen.
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenOrdentlich ... aber ich verstehe nicht wirklich, wie „Einfügen in“ weiß, wo der „invis“-Ausdruck in den „dt“-Ausdruck eingefügt werden soll. Ich vermute, dass Expr den Ausdruck „parsiert“, um eine Art Baum zu erstellen und dann „einfügen in“ einfach das „invis“-Argument als weiteres Blatt im Baum hinzufügt?
Ich verstehe nicht gut genug, wie Argumente in JMP an Funktionen übergeben werden. Ich komme aus einem R-Hintergrund, wo es entweder positionell oder argument=value ist, und finde die Verwendung von Dingen wie Invisible in der Open()-Funktion durch JMP etwas seltsam, weil es kein String ist. Gibt es gute Referenzen für diese Art des Funktionsaufrufs?
Ich habe das noch nicht ausprobiert, gehe aber davon aus, dass Sie den Ausdruck „dt“ auswerten müssen, um die eigentliche Datentabelle zu öffnen.
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenetwas anders und kein Parsen
runsilent = 1 ;
invis = Ausdruck ( unsichtbar ) ; //Dies ist kein String oder eine Liste und wird nicht ausgewertet
dt = Ausdruck ( Offen ( „$SAMPLE_DATA/Big Class.jmp“ ) ) ;
Wenn ( runsilent == 1 , ich Einfügen in ( dt , Namensausdruck ( invis ) ) ) ; //Name Expr verwenden, um das Symbol des Ausdrucks zurückzugeben, ohne es auszuwerten.
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenDanke für die Vorschläge... Ich habe mir auch etwas ausgedacht
// Das Runsilent-Flag unten ist zum Debuggen nützlich. Setzen Sie es auf 0, um alles sichtbar zu machen. 1, um lautlos zu laufen
runsilent = 0 ;
evalu ( analysieren ( "data = Open( \!"SPPI_ Data_JMP_Revised.jmp\!""|| Wenn ( runsilent , ",\!"unsichtbar\!"" , " " ) || ");" )) ;
Beachten Sie, dass ich das Komma in die Zeichenfolge „,invisible“ einfügen musste, um einen Express zu erstellen, der funktioniert, wenn runsilent=0, um „leere“ Argumente im Aufruf zu vermeiden.
Carl.
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssen„Unsichtbar“ ist ein Schlüsselwort und daher nicht so einfach als Parameter festzulegen.Normalerweise verwende ich nur IF-Anweisungen:
Mein Vertrieb = Funktion ({ dt , Kol , doInvisible } , { Standardmäßig lokal } ,
Wenn ( doInvisible ,
dt << Verteilung ( Unsichtbar , Spalte ( Bewertung ( Kol ) ) )
,
dt << Verteilung ( Spalte ( Bewertung ( Kol ) ) )
)
) ;
dt = Offen ( „$SAMPLE_DATA/Big Class.jmp“ ) ;
Mein Vertrieb ( dt , "Höhe" , 1 ) ;
Wenn Sie ihn als Parameter festlegen möchten, können Sie den Befehl als Zeichenfolge erstellen und ihn dann analysieren und ausführen:
Mein Vertrieb = Funktion ({ dt , Kol , doInvisible } , { Standardmäßig lokal } ,
Wenn ( doInvisible ,
Stichwort = "Unsichtbar"
,
Stichwort = „“
) ;
Bewertung ( Analysieren ( Evaluierungseinlage ( „\[
dt << Distribution( ^keyword^, Column( "^col^" ) )
]\" ))) ;
) ;
dt = Offen ( „$SAMPLE_DATA/Big Class.jmp“ ) ;
Mein Vertrieb ( dt , "Höhe" , 1 ) ;
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenDie Berichte vom Fit erscheinen nie auf dem Bildschirm, aber ich habe die Berichte nie explizit unsichtbar gemacht. Ich sehe, dass es eine „unsichtbare“ Möglichkeit gibt, Anfälle auszulösen ...
Wenn ich beim Plattformstart die Option „Unsichtbar“ spezifiziere, verkürzt sich die Zeit von 45 Sekunden auf 30 Sekunden.
Die ursprüngliche Datentabelle ist sichtbar (in der die Vorhersageformeln nacheinander gespeichert werden) und die endgültige Zusammenfassungsdatentabelle (in der die Ergebnisse jeder Modellanpassung nacheinander hinzugefügt werden) ist ebenfalls sichtbar. Ich habe versucht, die ursprüngliche Datentabelle unsichtbar zu machen, und das beschleunigt die Sache wirklich (jetzt auf 15 Sekunden), selbst wenn die Vorhersagespalten hinzugefügt/entfernt werden.
Die endgültige Ergebnistabelle wurde sukzessive aufgebaut, sodass ich sehen konnte, wie die Zeilen sukzessive hinzugefügt wurden. Habe das auch unsichtbar gemacht und die Zeit wieder auf 8 Sekunden reduziert!
Der Flaschenhals scheint sich also eher auf Bildschirmvorgänge als auf die untergeordnete CPU-Zeit zu beziehen.
Jetzt sind die überarbeiteten Zeiten (im endgültigen, beschleunigten Drehbuch) verfügbar
56 % Modellanpassung
13 % erstellen Modellberichte
12 % schließen den Modellbericht (obwohl er unsichtbar ist?)
Wenn ich mir mein Protokoll ansehe, meine Zeile
Modellfit << Vorhersageformel ;
löste eine Warnmeldung über einen fehlenden booleschen Operator aus. Wenn ich es umschalte
Modellfit << Vorhersageformel(1) ;
Das Skript läuft immer noch einwandfrei, ohne dass eine Warnmeldung angezeigt wird. Allerdings kann ich in der JSL-Syntaxreferenz oder im Skripthandbuch keine Dokumentation dazu finden, was a
Modellfit << Vorhersageformel(0) ;
würdest du? Ich werde versuchen, ein kleines Skript zu schreiben, um zu sehen, ob letzteres die Vorhersageformel auch nicht auswerten würde.
Ich versuche jetzt, das Skript so zu ändern, dass die Option „unsichtbar“ im Handumdrehen festgelegt werden kann. Ich möchte so etwas machen
runsilent=1;
data << open("blah", if(run silence, "Invisible"));
aber JMP stoppt immer an diesem Punkt ... Ich habe immer Probleme damit, Nachrichten dynamisch zu machen, wenn „fest verdrahtete“ Codewörter benötigt werden. Zurück zu den Büchern....
Carl.
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenHaben Sie in Bezug auf die Zeitabläufe versucht, das Berichtsfenster „unsichtbar“ zu machen? Ich bin nur neugierig, ob sich dies auf Ihre oben genannte Zahl von 23 % auswirkt.
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenDanke Ian und Dave. Ich konnte die Vorhersageformel nirgendwo im ShowProperties-Baum finden, daher vermute ich, dass sie erst berechnet wird, wenn sie durch eine Aktion zum Speichern der Spalte angefordert wird.
Ich habe mein Skript mit und ohne Unterdrückung der Formelauswertung ausprobiert. Ohne Unterdrückung der Formel dauerte es 45 Sekunden. Mit Unterdrückung der Formel dauerte es 44 Sekunden. Ich glaube, ich habe mich geirrt, als ich angenommen habe, dass die Formelauswertung im Vergleich zu den eigentlichen Modellanpassungen, dem Extrahieren aus dem Bericht und dem Speichern von Informationen in einer neuen (Zusammenfassungs-)Datentabelle viel Zeit in Anspruch nahm.
Es kam mir nicht in den Sinn, das Drehbuch zu profilieren. Ich habe das gerade getan. Hier sind die Ergebnisse
11 % der Zeit, die für die Anpassung der Modelle aufgewendet wird
13 % der Zeit, die für die Erstellung der Berichte aufgewendet wird
47 % der Zeit, die für das Löschen der Spalte aufgewendet wurde, die für jedes Modell für die Vorhersagen verwendet wurde, mit: data << delete columns("P(PA) Formula");
23 % der Zeit, die ich damit verbringe, das Berichtsfenster zu schließen, nachdem ich die Informationen daraus extrahiert habe, mit: Modellbericht << Fenster schließen;
Ich fand das überraschend!
Carl
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenFWIW, ich denke, Dave könnte recht haben. Es gibt die Meldungen „<< Schätzungen abrufen“ und „<< Varianzkomponenten abrufen“, diese sind jedoch nicht immer verfügbar (abhängig von der Art der Anpassung). In Ihrem speziellen Fall könnte es sich lohnen, „ShowProperties()“ zu verwenden, um dies zu sehen.
Betreff: Vorhersageformel extrahieren, ohne die Formel in der Datentabelle speichern zu müssenIch bin mir nicht sicher, ob es eine Möglichkeit gibt, das zu tun, was Sie wollen.Mein Ansatz besteht darin, die Formelauswertung vor dem Speichern der Vorhersageformeln zu unterdrücken:
dt << Formel Eval(1) unterdrücken