Optimieren Sie ein Modell, bevor Sie fit model ausführen, Listenfeld, das spezielle Spaltennamen nicht berücksichtigtIch möchte eine Kopie dieses Dialogfelds für Modelleffekte aus dem Anpassungsmodell erstellen:

Ziel ist es, ein Skript zu erstellen, das diesen Effektausdruck aus dem Modellskript liest, das DOE in der Tabelle speichert, es den Benutzern ermöglicht, den Effektausdruck zu optimieren und dann eine Analyse unter Verwendung des Fit-Modells mit dem neuen Effektausdruck durchzuführen.
Wenn Sie den Dialog im folgenden Skript ausführen, sehen Sie, dass er den Effektausdruck aus dem in der Tabelle gespeicherten Modellskript einliest. Fügt das in das Listenfeld ein, das Modell anpassen ähnelt, ermöglicht es Ihnen, es zu optimieren, und wenn Sie dann auf OK klicken, versucht es, das Listenfeld in einen neuen Effektausdruck zu zerlegen und einen benutzerdefinierten Modellanpassungsdialog mit diesem neuen Ausdruck zu starten.
Das Problem/der Unterschied liegt in der speziellen Namensspalte: Im ursprünglichen Ausdruck wird er als :name(„Höhe-“) gespeichert, aber wenn dieser Ausdruck aus dem Listenfeld abgerufen wird, wird er als „Höhe-“ gespeichert, was zu einer unvollständigen Mathematik wird Operation anstelle eines Spaltennamens. Wie wende ich also die speziellen Regeln für Spaltennamen auf Elemente aus diesem Listenfeld an? Gleiches gilt für gekreuzte und verschachtelte Begriffe mit der speziellen Namensspalte.
dt=Open("$SAMPLE_DATA/Big Class.jmp");
dt:height << Set Name( "Height-" );
FitModelScript = dt << Get table variable( "Fit Model" );
i = 1;
try(
While( !Is Empty( arg_i = Arg( parse(FitModelScript), i ) ),
If( Starts With( Char( Name Expr( arg_i ) ), "Effects" ),
EffectsExpr = Name Expr( arg_i );
Break();
,
i++
)
);
);
New Window( "Test",
Border Box( Left( 3 ), top( 2 ),
v list box(
H List Box(
Panel Box( "Select Columns",
v list box(
colListData = Col list box( All, width( 253 ), grouped, nLines( 20 ) ),
Spacer box(size(1,2))
)
),
Panel Box( "Cast Selected Columns into Roles",
Lineup Box( N Col( 2 ), Spacing( 3 ),
Button Box( "Response columns", colListYbox << Append( colListData << GetSelected ) ),
colListYbox = Col List Box( width( 200 ), nLines( 20 ), numeric, MinItems( 1 ) ),
)
),
Panel Box( "Model effects",
H List Box(
V List Box(
Button Box( "Main", LB << Append( colListData << GetSelected ) ),
Button Box( "Interact",
SelectedColumns = colListData << GetSelected();
For( i = 1, i <= N Items( SelectedColumns ), i++,
For( k = 1, k <= N Items( SelectedColumns ) - i, k++,
LB << Append( concat(SelectedColumns[i], " * ", SelectedColumns[i + k] ) )
)
);
),
Button Box( "Quadratic",
SelectedColumns = colListData << GetSelected();
For( i = 1, i <= N Items( SelectedColumns ), i++,
LB << Append( concat(SelectedColumns[i], " * ", SelectedColumns[i] ) )
);
),
Button Box( "Nest",
colListX = colListData << GetSelected();
For( i = 1, i <= N Items( colListX ), i++,
If(Column(colListX[i]) << Get Modeling Type() != "Nominal",
New window("Error",<<MODAL>0,
For( i = 1, i <= N Items( MainNest ), i++,
If(Contains(colListX, MainNest[i])==0,
LB << Append(concat(MainNest[i], "[", concat items(colListX, ", "), "]"));
LB << Remove Item(contains(LB << Get items( ),MainNest[i]));
,
New window("Error", <<MODAL></MODAL></MODAL>
SkripterstellungBetreff: Optimieren Sie ein Modell, bevor Sie fit model ausführen, Listenfeld, das spezielle Spaltennamen nicht berücksichtigtDanke!
Ja, ich versuche, jeden Spaltennamen zu unterstützen, weil ich sie nicht erstelle. Das Umbenennen ist die einzige Lösung, die ich gefunden habe und die wirklich funktioniert, aber ich mag es nicht, die Datentabellen von Personen auch nur vorübergehend zu ändern. Stattdessen werde ich sehen, ob ich dorthin gelangen kann, indem ich Modell anpassen direkt in das Dialogfeld "Neues Fenster" einbette und dies die Erstellung des Effektausdrucks übernehmen lasse. Auf diese Weise verliere ich einige Funktionen (Rückruf und andere Spaltenfelder sind ausfüllbar), aber es lohnt sich, einen robusten Effektausdrucksgenerator zu haben.
Betreff: Optimieren Sie ein Modell, bevor Sie fit model ausführen, Listenfeld, das spezielle Spaltennamen nicht berücksichtigtWenn Spaltennamen dieselben Zeichen enthalten, die zum Kreuzen oder Verschachteln von Begriffen verwendet werden...
Der einfachste Weg ist, dies zu verhindern. Wenn Ihr Skript solche Spalten erstellt, sollten Sie beispielsweise \{ \} anstelle von [ ] und \# anstelle von * verwenden. Wenn Sie andererseits versuchen, jeden möglichen Spaltennamen zu unterstützen, können Sie die Spaltennamen durchlaufen und Ersetzungen wie die oben erwähnten vornehmen, nachdem ein modales Warnfenster angezeigt wurde, das den Benutzer darüber informiert, dass die Spaltennamen vorübergehend geändert werden müssen. Sie können sie dann wieder ändern, wenn das Skript fertig ist.
Außerdem: Gibt es ein words()-Äquivalent, um alle Argumente eines Ausdruckstyps zu extrahieren? Jetzt muss ich Schleifen schreiben, um alle Argumente aus einem Ausdruck zu extrahieren.
Ich kenne keine analoge Funktion zu Wörtern für Ausdrucksargumente. Wenn Sie solche Listen so oft erstellen, würde vielleicht eine Funktion helfen? Beachten Sie, dass Sie den Ausdruck in nameexpr() einschließen müssen, wenn Sie ihn an die Funktion übergeben.
Beifall,
Brady
exp = Expr( note( a, b, c ) );
argList = function({ex},
{aList = {}, i=1},
While( i <= N Arg( ex ), Insert Into( aList, Arg( ex, i++ ) ) );
aList
);
argList(nameexpr(exp));
Betreff: Optimieren Sie ein Modell, bevor Sie fit model ausführen, Listenfeld, das spezielle Spaltennamen nicht berücksichtigtHallo,
Ich frage mich, ob es möglich wäre, ":Name(ColumnName)" um jeden Spaltennamen hinzuzufügen, und ob das das Problem lösen würde.Eine Möglichkeit, dies zu tun, könnte die Verwendung von Regex() sein.Ich habe etwas geschrieben, von dem ich denke, dass es ein Schritt in diese Richtung sein könnte, aber es ist immer noch nicht perfekt.Vielleicht könnte jemand mit mehr Wissen über Regex dabei helfen?:
colnames=dt<<GET column="" names=""></GET>
Betreff: Optimieren Sie ein Modell, bevor Sie fit model ausführen, Listenfeld, das spezielle Spaltennamen nicht berücksichtigt@brady_brady Ich habe es fast gelöst, aber es gibt immer noch ein Problem, auf das ich stoße: Wenn Spaltennamen dieselben Zeichen enthalten, die zum Kreuzen oder Verschachteln von Begriffen verwendet werden, wie teilen Sie sie in Spalten auf, wenn Sie von einer Listbox zurückkommen?
dt = New Table( "Test",
Add Rows( 3 ),
Compress File When Saved( 1 ),
New Column( "SCR[12]*34",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3] )
),
New Column( "SCR5[a]*",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [3, 2, 3] )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [4, 1, 4] )
)
);
new window("test", LB = list box());
LB << append((Column(1) << get name()) || " * " || (Column(2) << get name()));
LB << append((Column(1) << get name()) || "[" || (Column(2) << get name()) || "]");
LB << get items();Sie werden feststellen, dass die aus dem Listenfeld kommenden Elemente nur Zeichenfolgen sind. Wenn ich words() mit Splitter "*" oder "[]" verwende, bekomme ich zu viele Splits und die Ergebnisse sind keine Spaltenreferenzen mehr. Ich muss jedes Element in seine Bestandteile aufteilen, damit ich sie in :Name(" ") einpacken und sie erneut verschachteln/kreuzen und sie dem Effektausdruck für das Anpassungsmodell hinzufügen kann. Ich brauche auch eine Liste aller Spalten, die an einem der Begriffe für einen anderen Teil des Skripts beteiligt sind.
Wenn Sie eine Lösung kennen, beachten Sie bitte, dass der Anpassungsdialog Modell verschachteln und kreuzen mit mehr als 2 Variablen erlaubt.
Umgekehrt könnte ich beim Analysieren des Effektausdrucks aus dem Modellskript die Arg()-Funktion verwenden, um Spalten zu extrahieren und das Listenfeld zu füllen, aber das Zurückgehen funktioniert nicht, da es sich um einen Zeichenfolgentyp handelt.
Außerdem: Gibt es ein words()-Äquivalent, um alle Argumente eines Ausdruckstyps zu extrahieren? Jetzt muss ich Schleifen schreiben, um alle Argumente aus einem Ausdruck zu extrahieren.
Betreff: Optimieren Sie ein Modell, bevor Sie fit model ausführen, Listenfeld, das spezielle Spaltennamen nicht berücksichtigtDanke Brady, ich werde mich darum kümmern. Ich frage mich hauptsächlich, wie es mit gekreuzten, interagierenden und verschachtelten Begriffen umgehen wird, muss aber ein wenig damit spielen, um es zu überprüfen.
Ich muss auch sehen, ob ich etwas Ähnliches tun kann, wenn ich ein vorhandenes Modell mit diesen Begriffen in das Listenfeld importiere, da dies derzeit das "Name ("-Zeug zeigt. Ich melde mich wieder, sobald ich etwas Zeit hatte, mich zu vertiefen.
Wenn Sie darüber nachdenken, könnte es tatsächlich besser sein, das Element "Modelleffekte konstruieren" aus dem Dialogfeld "Modell anpassen" aufzurufen/wiederzuverwenden, indem Sie den Benutzer zur Interaktion mit diesem Fenster schicken und dann den Effektausdruck aus diesem Fenster zurücklesen. Allerdings nicht so hübsch.
Betreff: Optimieren Sie ein Modell, bevor Sie fit model ausführen, Listenfeld, das spezielle Spaltennamen nicht berücksichtigtEine Möglichkeit, dies zu tun, ist das Erstellen von Ausdrücken. Ein großer Vorteil dieses Ansatzes besteht darin, dass der Code im Gegensatz zu stringbasierten Ansätzen farbig bleibt, leicht lesbar ist und nur minimale Escape-Zeichen benötigt. Der Ablauf in diesem speziellen Fall lautet wie folgt:
- Antwortausdruck definieren und aufbauen,
- Effektausdruck definieren und aufbauen,
- Definieren Sie einen Fit-Model-Ausdruck mit Platzhaltern,
- Ersetzen Sie die Antwort- und Wirkungsausdrücke in die Platzhalter im Ausdruck „Modell anpassen“ und
- Führen Sie den Fit Model-Ausdruck aus.
Hinweis: Ich habe die Option „unsichtbar“ auskommentiert und die Änderung des Spaltennamens in ein try() eingeschlossen, um wiederholte Ausführungen zu ermöglichen.
Um dies auszuprobieren, ersetzen Sie Ihren Buttonbox("OK" ... )-Code durch den folgenden Code. Eine Spalte muss in das Listenfeld der Antwortspalte eingegeben werden, bevor auf „OK“ geklickt wird.
Beifall,
Brady
Button Box( "OK",
respList = colListYbox << get items();
respExpr = expr(Y());
for(i=1, i<=nitems(respList), i++,
insertinto(respExpr, parse(evalinsert(":name(\!"^respList[i]^\!")")))
);
effectsList = lb << get Items;
effectsExpr = expr(Effects());
for(i=1, i<=nitems(effectsList), i++,
insertinto(effectsExpr, parse(evalinsert(":name(\!"^effectsList[i]^\!")")))
);
jslExpr = expr(
try(FitModelDialogWindow << closewindow());
FitModelDialogWindow = Fit Model(
//invisible,
_Y_,
_EFFECTS_,
Keep dialog open( 1 ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" )
);
);
substituteInto(jslExpr,
expr(_Y_), nameexpr(respExpr),
expr(_EFFECTS_), nameexpr(effectsExpr)
);
jslExpr;
)