Im ein früherer post , Ich erwähnte ein neues JMP-Add-In das kann verwendet werden, um Daten vor zu teilen Vorhersagemodellierung . In diesem Beitrag wird beschrieben, wie dies funktioniert und das Thema JMP Scripting Language (kurz JSL) ist daher unbedingt erforderlich.
Dies ist ein großes Thema, deshalb möchte ich hier nur die Anatomie eines JSL-Skripts zeigen, das etwas Nützliches leistet. Dieser Beitrag setzt voraus, dass Sie heruntergeladen und installiert haben das Add-In und wissen, was es tut. (Hinweis: Zum Herunterladen des Add-Ins ist ein kostenloser SAS-Login erforderlich.)
Wenn Sie in JMP 9 den Menüpunkt "Ansicht> Add-Ins ..." auswählen, sollte im Kombinationsfeld "Stratified Split" angezeigt werden. Wenn Sie dieses Element auswählen, erhalten Sie einen Link zum 'Home-Ordner' des Add-Ins. Wenn Sie diesen Link auswählen und auf 'stratifiedSplit.jsl' doppelklicken, wird der Quellcode im JMP-Editor geöffnet. Vergewissern Sie sich, dass Sie sich für die Anzeige der Zeilennummern im Editor entschieden haben ('Datei> Voreinstellungen' und dann 'Skripteditor' als 'Voreinstellungsgruppe' auswählen).
Die JSL kann wie folgt dekonstruiert werden:
(1) Zeilen 11-13: Die Standardproportionen, in die die Daten aufgeteilt werden sollen. Beachten Sie, dass ein Suffix '0', '1' oder '2' in einem Namen etwas bedeutet, das mit den Daten 'Training', 'Validation' oder 'Test' zu tun hat. .
(2) Zeilen 15-29: Eine Funktion, die aufgerufen wird, wenn Sie eines der Standardproportionen aktualisieren. Dabei wird überprüft, ob der neue Wert tatsächlich zwischen 0 und 1 liegt.
(3) Zeilen 31-55: Die Benutzeroberfläche - Hier werden alle Spalten der aktuellen Datentabelle angezeigt und Sie können die Antwortspalte auswählen. Sie können auch die standardmäßigen Split-Proportionen überschreiben.

(4) Zeilen 58-85: Zeigt Hilfe in einem neuen Fenster an, wenn die Schaltfläche "Hilfe" in (3) gedrückt wird.
(5) Zeilen 88-104: Wird ausgeführt, wenn die Schaltfläche 'OK' in (3) gedrückt wird, und überprüft, ob die tatsächlich angegebenen drei Proportionen immer noch Eins sind. Wenn nicht, wird (3) erneut mit den standardmäßigen Splitproportionen angezeigt.
(6) Zeilen 107-135: Überprüft, ob tatsächlich eine Antwortspalte ausgewählt wurde, und stoppt, falls nicht. Wenn eine Antwortspalte ausgewählt wurde, wird die Anzahl der unterschiedlichen Ebenen in dieser Spalte ermittelt. Wenn diese Spalte größer als 100 ist, können Sie die Option stoppen.
(7) Zeilen 138-182: Durch Verwenden einer Zuordnung, welche Zeilen der aktuellen Tabelle mit welcher Ebene der Antwortspalte (6) und den angegebenen Split-Anteilen (3) übereinstimmen, wird die neue Validierungsspalte erstellt. Anschließend wird mithilfe von Verteilung angezeigt, wie die Zeilen in der Tabelle zufällig aufgeteilt wurden.
Für diejenigen, die bereits mit JSL vertraut sind, ist der Code hier nicht auffällig. Auf einer höheren Ebene müssen jedoch immer Designentscheidungen getroffen werden. Kompromisse sind in der Regel erforderlich, wenn man bedenkt, dass das Endergebnis für den beabsichtigten Gebrauch "gerade gut genug" sein muss.
In diesem Fall wurde beispielsweise eine spezielle Entscheidung getroffen, die Fehlerprüfung in zwei Teile - (2) und (5) oben - aufzuteilen, um die Logik hinter der Benutzeroberfläche zu vereinfachen. Selbst wenn Sie mit JSL noch nicht vertraut sind, sollten Sie mit etwas Geduld und Hilfe des JSL-Handbuchs ('Hilfe> Bücher> Skript-Handbuch') die Details der einzelnen Codeabschnitte genau herausfinden können. Eine der besten Möglichkeiten, eine neue Sprache zu lernen, besteht schließlich darin, von etwas auszugehen, das funktioniert. Aus Platzgründen betrachten wir hier nur (6) und (7).
Wie bereits erwähnt, ist es eines der Schlüsselelemente bei diesem Problem, die Pegel in der Antwortspalte (6) herauszufinden. Obwohl es viele Möglichkeiten gibt, dies zu tun, die assoziatives Array ist das vielseitigste.
Das unten gezeigte Codefragment macht eine Tabelle zum Spielen. Zeile 5 bringt die 20 Werte von 'Response' in einen Vektor und Zeile 6 erstellt ein assoziatives Array und sendet eine 'Get Keys'-Nachricht, um die verschiedenen Werte in lexikographischer Reihenfolge anzuzeigen. Ein Vorteil des assoziativen Arrays ist, dass es mit jedem Datentyp funktioniert (nicht nur mit Zahlen, wie in diesem Fall). Beachten Sie jedoch, dass 'Get Keys' immer eine Liste zurückgibt. In Zeile 7 müssen wir also 'N Items ()' verwenden, um herauszufinden, wie viele Elemente diese Liste enthält.

Sobald wir Werte für 'yLev' und 'nLevs' aus (6) haben, sind die Schritte in (7) wie folgt:
1. Erstellen Sie einen Vektor aus fehlenden Werten, "vVals", der später zum Auffüllen der neuen Validierungsspalte verwendet wird (Zeile 141).
2 Wiederholen Sie die verschiedenen Pegel in 'yLev' (Zeilen 143 bis 161).
3. Suchen Sie die Zeilennummern in 'yVals' (und damit die Datentabelle), die der aktuellen Ebene entsprechen, und speichern Sie diese in der Variablen 'stratum' (Zeile 145). Beachten Sie hierbei, dass die Syntax dafür davon abhängt, ob 'yVals' ein Vektor oder eine Liste ist (und daher, ob die ursprüngliche Antwortspalte den Datentyp 'Numeric' oder 'Character' hatte).
4 Die Variable 'stratumN' enthält die Anzahl der Zeilen, die der aktuellen Ebene entsprechen (Zeile 147). Konvertieren Sie die angegebenen Split-Proportionen in Ganzzahlen, und stellen Sie sicher, dass diese zu 'stratumN' (Zeilen 149 bis 154) summieren.
5 Erstellen Sie die Vektoren 'v0', 'v1' und 'v2' mit der korrekten Länge und den Werten '0', '1' und '2' (Zeilen 157 bis 159). Um sicherzustellen, dass der nachfolgende Schritt immer funktioniert, müssen wir die Möglichkeit berücksichtigen, dass eines der Proportionen 0,0 ist, und den entsprechenden Vektor auf '[]' setzen.
6 Stapeln Sie diese Vektoren am Ende (mit 'VConCat ()') und mischen Sie das Ergebnis so, dass die Werte '0', '1' und '2' zufällig verteilt werden. Weisen Sie diese Werte den korrekten Zeilen in 'vVals' zu, so dass die fehlenden Werte darin ersetzt werden (Zeile 160).
7. Wenn die Schleife abgeschlossen ist, erstellen Sie mit 'vVals' eine neue Validierungsspalte oder ersetzen Sie eine vorhandene Validierungsspalte (Zeilen 163 bis 170). Beachten Sie, dass wir eine Spalteneigenschaft 'Value Label' verwenden, sodass die ganzzahligen Werte von '0', '1' und '2' als 'Training', 'Validation' bzw. 'Test' angezeigt werden.
8 Verwenden Sie 'Distribution' mit einer 'By'-Variablen, um die Werte der Validierungsspalte für jede Ebene in der Antwort anzuzeigen.
Obwohl es sich um Routine handelt, gibt es vielleicht einige nicht offensichtliche Aspekte des Codes:
• Wir haben keine unnötigen Annahmen über den Datentyp oder den Modellierungstyp der von Ihnen ausgewählten Antwortspalte gemacht (der Code würde einwandfrei funktionieren, z. B. mit einer 'Numeric' -, 'Continuous'-Spalte, deren Werte zufällig sind' in Ebenen zusammengefasst).
• Fehlende Werte in der Antwortspalte werden als fehlende Werte an die erstellte Validierungsspalte weitergegeben, was wünschenswert ist. Beachten Sie jedoch, dass im Falle einer numerischen Spalte das '.' value verursacht einen günstigen JMP-Alert, wenn die Distribution-Plattform versucht, die Gruppe "By" mit "." zu verarbeiten. Werte. Bei einer Zeichenspalte wird die Nullzeichenfolge "" genauso wie die anderen Ebenen in der Gruppe "Durch" ohne Warnung verarbeitet.
• Der Ausdruck 'ColListBox ()' in Zeile 42 enthält keine Zeilenstatusspalten zur Auswahl, selbst wenn sie in der Tabelle vorhanden sind, was in diesem Fall wünschenswert ist.
Wenn Sie JMP verwenden und gerne mit Code basteln, gibt es viele Möglichkeiten, mehr zu erfahren. Sie könnten damit beginnen, dies zu betrachten Dateiaustauscheintrag .