Hallo zusammen,
Beim Übergeben des Befehls <
Der Codeabschnitt, mit dem ich Schwierigkeiten habe, ist der folgende:
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( Eval( YCols ) ),
In( :Simulated Y )
);
Das Ausführen dieses Codeabschnitts führt zu folgendem Fehler: Die auszutauschende Spalte wurde nicht gefunden. und öffnet dann das Fenster, in dem Sie die Spalten auswählen sollen, die ein- und ausgeblendet werden sollen.
„report_of_interest“ ist das Berichtsfenster, in das ich den Simulate-Befehl sende. Speziell für NumberColBox(8), die Spalte „Schätzung“ im Bericht. NBSnum und RSnum sind die Anzahl der auszuführenden Bootstrap-Proben und eine zufällige Startvariable. Das Problem ist der Name der Spalte im Out( ) des Simulate( )-Befehls. Die In( )-Spalte ist kein Problem, da ich die simulierte Datenspalte nach Belieben benennen kann, aber die Spalte für die Out( )-Option ist keine Spalte, die ich wirklich umbenennen möchte oder so etwas. In diesem Fall speichere ich die simulierten Daten in der Datentabelle und benenne die Spalte in „Simulated Y“ um, damit ich sie bei Bedarf im Simulate-Befehl als In(:Simulated Y) referenzieren kann.
Zu Beginn des Codes wird der Benutzer aufgefordert, die Spalte auszuwählen, die als Antwortspalte für die Modellierung dienen soll. Dies ist YCols. Wenn Sie mit einer Spalte in einer Plattform arbeiten, können Sie sie oft einfach als Eval(YCols) und festlegen es akzeptiert es problemlos, zum Beispiel:
fm = avdt << Fit Model(
Y( Eval( YCols ) ),
Validation( :Validation ),
Effects( :Null Factor, Eval( XCols ) ),
Personality( "Generalized Regression" ),
Run( Fit( Estimation Method( Forward Selection ), Validation Method( Validation Column ) ) )
);
Führt ein Anpassungsmodell für die Y( )-Spalte korrekt aus. Der Befehl „Simulate( )“ möchte jedoch, dass die Spalte als bereichsbezogene Spalte referenziert wird, wie er es auch haben möchte, zum Beispiel :My Column To Model.
Nehmen wir an, dass die Spalte den Namen „My Column To Model“ hat, sodass die Variablen YCols und Eval(YCols) beide das folgende {„My Column To Model“} zurückgeben. Wenn der Simulationsbefehl an den Bericht gesendet wird, benötigt er den bereichsbezogenen Spaltennamen, etwa den folgenden:
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( :My Column To Model ),
In( :Simulated Y )
);
Das Problem ist, dass sich die Spalte, die ich modelliere, ändern kann, daher ändert sich ihr Name, und ich möchte die Spalte nicht so umbenennen, dass sie immer einen festen Namen wie :YData hat. Ich möchte mit einer Variablen wie YCols arbeiten, weiß aber nicht, wie ich mit dem Infix-Doppelpunktoperator (:) und einer Variablen wie YCols arbeiten soll, um den richtigen Spaltenverweis für den Befehl Simulate( ) zu erhalten.
Ich habe es versucht: As Column(dt, name), Column(dt, name), Column(number), Parse(":"||char(Column(avdt, Eval(YCols)))), Parse(":" ||Eval(YCols)[1]), und nichts davon funktioniert. Sie führen alle zu demselben oben erwähnten Fehler und öffnen ein neues Fenster, in dem Sie die Spalten auswählen können, die ein-/ausgetauscht werden sollen, wodurch die Automatisierung, die ich durchführen möchte, zunichte gemacht wird.
Jede Hilfe wird sehr geschätzt.
Danke!,
DS
Ich habe eine mögliche Lösung gefunden, aber sie ist sicherlich nicht effizient und ziemlich umständlich. Ich kann mir vorstellen, dass es bessere Lösungen gibt, und hoffe, dass mir jemand dabei helfen kann.
Ich habe festgestellt, dass es funktioniert, wenn man die Zeichenfolge zum Senden des Befehls in JSL erstellt und Eval(Parse()) verwendet, um es tatsächlich auszuführen. Auch hier ist es umständlich und nicht effizient, aber es funktioniert.
str = Eval Insert(
"report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out("
);
str2 = Eval Insert( " ),
In( :Simulated Y )
)" );
Eval( Parse( str || ":" || Char( Eval( YCols )[1] ) || str2 ) );Seltsame Lösung, und ich hoffe, dass jemand eine bessere Lösung hat, die er teilen kann.
Danke!,
DS
Ich habe auch Probleme mit solchen Dingen.Es ist vielleicht nicht die beste Lösung, aber der folgende Code sollte das tun, was Sie möchten.*Bearbeiten* Ich sehe, dass Sie bereits eine ähnliche Methode gefunden haben.=)
Eval(
Parse(
"\[report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( ]\"
|| YCols[1] || "\[ ),
In( :Simulated Y )
);]\"
)
);
Wenn ich eine Liste mit Spaltenverweisen erstellen muss und Eval nicht funktioniert, erstelle ich normalerweise die Ausdrücke und verwende dann Eval(Substitute())
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
cols = {"height", "weight"};
obj = Fit Model(
Y(:weight),
Effects(:age, :sex, :height),
Personality("Generalized Regression"),
Generalized Distribution("Normal"),
Run(
Fit(
Estimation Method(Lasso(Adaptive)),
Validation Method(AICc)
)
)
);
obj << (fit[1] << Save Simulation Formula);
rpt = Report(obj);
out_expr = Expr(Out());
For Each({colname}, cols,
Insert Into(out_expr, Name Expr(AsColumn(dt, colname)));
);
show(out_expr);
Eval(Substitute(
Expr(dtlst = rpt["Parameter Estimates for Original Predictors"][Number Col Box("Prob > ChiSquare")] <<SIMULATE></SIMULATE>Hallo @mmarchandTSI Und @jthi ,
Vielen Dank für das Feedback und die Ideen zur Lösung dieses Problems. Es sollte mich nicht allzu sehr überraschen, dass es mit JMP/JSL mehrere verschiedene Möglichkeiten gibt, dasselbe Problem zu lösen. Eines der großartigen Dinge an der Software. Dennoch finde ich es interessant, dass eine „einfachere“ Lösung nicht möglich ist. Ich schätze die Hilfe!
Danke,
DS