Optimieren Sie ein Modell, bevor Sie „Fit Model“ ausführen. Das Listenfeld berücksichtigt keine speziellen SpaltennamenIch möchte eine Kopie dieses Modelleffektdialogs aus dem Fit-Modell erstellen:

Ziel ist es, ein Skript zu erstellen, das diesen Effektausdruck aus dem Modellskript einliest, das DOE in der Tabelle speichert, es den Benutzern ermöglicht, den Effektausdruck zu optimieren und dann eine Analyse durchzuführen, indem das Modell mit dem neuen Effektausdruck angepasst wird.
Wenn Sie den Dialog im folgenden Skript ausführen, werden Sie sehen, dass der Effektausdruck aus dem in der Tabelle gespeicherten Modellskript eingelesen wird. 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, wird versucht, das Listenfeld in einen neuen Effektausdruck zu analysieren 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(„Height-“) gespeichert, aber beim Abrufen dieses Ausdrucks aus dem Listenfeld wird er als „Height-“ 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>
Erweiterte statistische ModellierungVerbraucher- und MarktforschungMassenanpassungQualitäts- und VerfahrenstechnikBetreff: Optimieren Sie ein Modell, bevor Sie „Modell anpassen“ ausführen. Das Listenfeld berücksichtigt keine speziellen SpaltennamenDanke!
Ja, ich versuche, jeden Spaltennamen zu unterstützen, da ich sie nicht erstelle. Das Umbenennen ist die einzige Lösung, die meiner Meinung nach wirklich funktioniert, aber ich mag es nicht, die Datentabellen von Leuten auch nur vorübergehend zu ändern. Stattdessen werde ich versuchen, dieses Ziel zu erreichen, indem ich „Modell anpassen“ direkt in das neue Fensterdialogfeld einbette und die Erstellung des Effektausdrucks damit überlasse. Auf diese Weise verliere ich einige Funktionen (Rückruf und andere ausfüllbare Spaltenfelder), aber es lohnt sich, einen robusten Effektausdrucksgenerator zu haben.
Betreff: Optimieren Sie ein Modell, bevor Sie „Modell anpassen“ ausführen. Das Listenfeld berücksichtigt keine speziellen SpaltennamenWenn Spaltennamen dieselben Zeichen enthalten, die zum Kreuzen oder Verschachteln von Begriffen verwendet werden ...
Der einfachste Weg besteht darin, dies zu verhindern. Wenn Ihr Skript solche Spalten erstellt, sollten Sie beispielsweise die Verwendung von \{ \} anstelle von [ ] und \# anstelle von * in Betracht ziehen. Wenn Sie andererseits versuchen, jeden möglichen Spaltennamen zu unterstützen, können Sie durch die Spaltennamen blättern und Ersetzungen wie die oben genannten vornehmen, nachdem ein modales Warnfenster angezeigt wird, 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 Word()-Äquivalent zum Extrahieren aller Argumente eines Ausdruckstyps? 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.
Prost,
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 „Modell anpassen“ ausführen. Das Listenfeld berücksichtigt keine speziellen SpaltennamenHallo,
Ich frage mich, ob es möglich wäre, „:Name(ColumnName)“ um jeden Spaltennamen herum 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 ist, aber es ist immer noch nicht perfekt.Vielleicht könnte jemand mit mehr Regex-Kenntnissen dabei helfen?:
colnames=dt<<GET column="" names=""></GET>
Betreff: Optimieren Sie ein Modell, bevor Sie „Modell anpassen“ ausführen. Das Listenfeld berücksichtigt keine speziellen Spaltennamen@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 dann in Spalten auf, wenn Sie aus einer Listbox zurückkehren?
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 dem Splitter „*“ oder „[]“ verwende, erhalte ich zu viele Teilungen und die Ergebnisse sind keine Spaltenreferenzen mehr. Ich muss jedes Element in seine Bestandteile aufteilen, damit ich sie in :Name(" ") einschließen und sie erneut verschachteln/kreuzen und zum Effektausdruck für das Anpassungsmodell hinzufügen kann. Außerdem benötige ich eine Liste aller Spalten, die an einem der Begriffe für einen anderen Teil des Skripts beteiligt sind.
Wenn Sie eine Lösung kennen, bedenken Sie bitte, dass der Dialog „Modell anpassen“ das Verschachteln und Kreuzen mit mehr als zwei Variablen ermöglicht.
Umgekehrt könnte ich beim Analysieren des Effektausdrucks aus dem Modellskript die Funktion Arg() verwenden, um Spalten zu extrahieren und das Listenfeld zu füllen, aber zurückgehend funktioniert das nicht, da es sich um einen String-Typ handelt.
Außerdem: Gibt es ein Word()-Äquivalent zum Extrahieren aller Argumente eines Ausdruckstyps? Jetzt muss ich Schleifen schreiben, um alle Argumente aus einem Ausdruck zu extrahieren.
Betreff: Optimieren Sie ein Modell, bevor Sie „Modell anpassen“ ausführen. Das Listenfeld berücksichtigt keine speziellen SpaltennamenDanke Brady, ich werde mir das ansehen. Ich frage mich hauptsächlich, wie es mit gekreuzten, interagierenden und verschachtelten Begriffen umgeht, muss aber ein wenig damit experimentieren, um das 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 hier derzeit der Inhalt „Name(“ angezeigt wird. Ich melde mich wieder, sobald ich etwas Zeit hatte, mich damit auseinanderzusetzen.
Wenn man darüber nachdenkt, könnte es tatsächlich besser sein, das Element „Modelleffekte erstellen“ aus dem Dialogfeld „Modell anpassen“ aufzurufen/wiederzuverwenden, indem man den Benutzer zur Interaktion mit diesem Fenster schickt und dann den Effektausdruck aus diesem Fenster wieder einliest. Allerdings nicht so hübsch.
Betreff: Optimieren Sie ein Modell, bevor Sie „Modell anpassen“ ausführen. Das Listenfeld berücksichtigt keine speziellen SpaltennamenEine Möglichkeit, dies zu erreichen, besteht darin, Ausdrücke aufzubauen. 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 erfordert. Der Ablauf in diesem speziellen Fall ist wie folgt:
- Definieren und erstellen Sie den Antwortausdruck.
- Definieren und bauen Sie den Effektausdruck auf,
- Definieren Sie einen Fit Model-Ausdruck mit Platzhaltern.
- Ersetzen Sie die Antwort- und Wirkungsausdrücke durch die Platzhalter im Fit Model-Ausdruck und
- Führen Sie den Fit Model-Ausdruck aus.
Hinweis: Ich habe die Option „unsichtbar“ auskommentiert und die Änderung des Spaltennamens in einen try() eingeschlossen, um wiederholte Ausführungen zu ermöglichen.
Um dies auszuprobieren, ersetzen Sie Ihren Buttonbox("OK" ... )-Code durch den folgenden Code. Bevor Sie auf „OK“ klicken, muss eine Spalte in das Listenfeld der Antwortspalte eingegeben werden.
Prost,
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;
)