Modifica un modello prima di eseguire fit model, casella di riepilogo che non rispetta nomi di colonne specialiSto cercando di creare una copia di questa finestra di dialogo degli effetti del modello dal modello di adattamento:

L'obiettivo è creare uno script che leggerà in questa espressione degli effetti dallo script del modello che DOE salva nella tabella, consentire alle persone di modificare l'espressione dell'effetto e quindi eseguire alcune analisi utilizzando il modello di adattamento con la nuova espressione degli effetti.
Se esegui la finestra di dialogo nello script sottostante, vedrai che legge l'espressione degli effetti dallo script del modello memorizzato nella tabella. Lo inserisce nella casella di riepilogo che assomiglia a Fit Model, ti consente di modificarlo e quindi quando premi ok tenta di analizzare la casella di riepilogo in una nuova espressione di effetti e avviare una finestra di dialogo del modello di adattamento personalizzato con quella nuova espressione.
Il problema/differenza è nella colonna del nome speciale: nell'espressione originale è memorizzata come :name(“Height-”) ma quando si recupera quell'espressione dalla casella di riepilogo, viene memorizzata come “Height-” che diventa un valore matematico incompleto operazione invece di un nome di colonna. Quindi, come applico le regole speciali per i nomi delle colonne agli elementi di questa casella di riepilogo? Lo stesso vale per i termini incrociati e nidificati con la colonna del nome speciale.
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>
ScriptingRi: modificare un modello prima di eseguire il modello di adattamento, la casella di riepilogo non rispetta i nomi di colonna specialiGrazie!
Sì, sto cercando di supportare ogni nome di colonna perché non li creo. La ridenominazione è l'unica soluzione che ho trovato che funzioni davvero, ma non mi piace cambiare le tabelle dei dati delle persone nemmeno temporaneamente. Invece vedrò se riesco ad arrivarci incorporando Fit model direttamente nella nuova finestra di dialogo e lasciando che gestisca la creazione dell'espressione degli effetti. Perdo alcune funzionalità in questo modo (richiamo e altre caselle di colonne sono compilabili) ma vale la pena avere un robusto generatore di espressioni di effetti.
Ri: modificare un modello prima di eseguire il modello di adattamento, la casella di riepilogo non rispetta i nomi di colonna specialiSe i nomi delle colonne contengono gli stessi caratteri utilizzati per l'incrocio o l'annidamento dei termini...
Il modo più semplice è evitare che ciò accada. Se il tuo script crea tali colonne, prendi in considerazione, ad esempio, l'utilizzo di \{ \} al posto di [ ] e \# al posto di *. Se invece stai cercando di supportare qualsiasi nome di colonna possibile, puoi scorrere i nomi di colonna, effettuando sostituzioni come quelle sopra menzionate, dopo aver mostrato una finestra di avviso modale che informa l'utente che i nomi di colonna devono essere temporaneamente modificati. Potresti quindi cambiarli di nuovo quando lo script è finito.
Inoltre: esiste un equivalente words() per estrarre tutti gli argomenti di un tipo di espressione? Ora finisco per dover scrivere loop per estrarre tutti gli argomenti da un'espressione.
Non conosco una funzione analoga alle parole per argomenti di espressione. Se stai costruendo tali elenchi così spesso, forse una funzione potrebbe essere d'aiuto? Nota che devi racchiudere l'espressione in nameexpr() mentre la passi alla funzione.
Saluti,
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));
Ri: modificare un modello prima di eseguire il modello di adattamento, la casella di riepilogo non rispetta i nomi di colonna specialiCIAO,
Mi chiedo se sarebbe possibile aggiungere ":Name(ColumnName)" attorno al nome di ogni colonna e se ciò risolverebbe il problema.Un modo per farlo potrebbe essere usare Regex().Ho scritto qualcosa che penso possa essere un passo in questa direzione, ma non è ancora perfetto.Forse qualcuno con una maggiore conoscenza di Regex potrebbe aiutare con questo?:
colnames=dt<<GET column="" names=""></GET>
Ri: modificare un modello prima di eseguire il modello di adattamento, la casella di riepilogo non rispetta i nomi di colonna speciali@brady_brady L'ho quasi risolto ma c'è ancora un problema in cui mi imbatto: se i nomi delle colonne contengono gli stessi caratteri utilizzati per incrociare o nidificare i termini, come li dividi in colonne quando torni da una casella di riepilogo?
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();Noterai che gli elementi provenienti dalla casella di riepilogo sono solo stringhe. Se uso words() con splitter "*" o "[]" ottengo troppe divisioni e i risultati non sono più riferimenti di colonna. Ho bisogno di dividere ogni elemento nei suoi componenti in modo da poterli racchiudere in :Name(" ") e ri-annidarli/incrociarli e aggiungerli all'espressione degli effetti per il modello di adattamento. Ho anche bisogno di un elenco di tutte le colonne coinvolte in uno qualsiasi dei termini per un'altra parte dello script.
Se conosci una soluzione, considera che la finestra di dialogo del modello di adattamento consente l'annidamento e l'incrocio con più di 2 variabili.
Andando dall'altra parte, analizzando l'espressione degli effetti dallo script del modello, potrei utilizzare la funzione Arg() per estrarre le colonne e popolare la casella di riepilogo, ma tornando indietro non funziona in quanto è di tipo stringa.
Inoltre: esiste un equivalente words() per estrarre tutti gli argomenti di un tipo di espressione? Ora finisco per dover scrivere loop per estrarre tutti gli argomenti da un'espressione.
Ri: modificare un modello prima di eseguire il modello di adattamento, la casella di riepilogo non rispetta i nomi di colonna specialiGrazie Brady, esaminerò la cosa. Mi chiedo soprattutto come gestirà i termini incrociati, interagenti e nidificati, ma dovrò giocarci un po' per verificare.
Ho anche bisogno di vedere se posso fare qualcosa di simile quando importo un modello esistente con questi termini nella casella di riepilogo poiché questo mostra il "Nome (" attualmente. Riferirò i retroscena una volta che avrò avuto un po' di tempo per scavare.
Pensandoci, potrebbe effettivamente essere meglio chiamare/riutilizzare l'elemento Construct Model Effects dalla finestra di dialogo Fit Model inviando l'utente all'esterno per interagire con quella finestra e quindi rileggere l'espressione degli effetti da quella finestra. Non così carino però.
Ri: modificare un modello prima di eseguire il modello di adattamento, la casella di riepilogo non rispetta i nomi di colonna specialiUn modo per farlo è creare espressioni. Uno dei principali vantaggi di questo approccio è che, a differenza degli approcci basati su stringhe, il codice rimane colorato, facilmente leggibile e richiede caratteri di escape minimi. Il flusso in questo caso particolare è quello di:
- Definire e costruire l'espressione di risposta,
- Definisci e costruisci l'espressione degli effetti,
- Definire un'espressione di adattamento del modello con segnaposto,
- Sostituire le espressioni di risposta ed effetto nei segnaposto nell'espressione Stima modello e
- Eseguire l'espressione Stima modello.
Nota: ho commentato l'opzione "invisibile" e racchiuso la modifica del nome della colonna in un try() per consentire esecuzioni ripetute.
Per fare un tentativo, sostituisci il tuo codice buttonbox("OK" ... ) con il codice qui sotto. Una colonna deve essere inserita nella casella di riepilogo della colonna Risposta prima di fare clic su "OK".
Saluti,
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;
)