Codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCiao a tutti,
Questa domanda è in relazione a un post Qui che genera piacevolmente una colonna non dinamica per riassumere un elenco di altre colonne.
Il problema che sto riscontrando è come riassumere le colonne (usando JSL) quando hai un elenco di N altre colonne e hai una formula dinamica.
Ho un elenco di colonne nella mia tabella di dati, diciamo ColList, e voglio generare una nuova colonna con una formula che somma semplicemente gli N elementi in ColList. Qualcosa che stavo pensando è così:
Names Default to Here (1);
dt = Open("$Sample_Data/2D Gaussian Process Example.jmp");<BR />ColList = dt << Get Column Names;
dt << New Column("Sum", Formula(Sum(ColList)));Questo chiaramente non funziona perché ColList è un elenco di colonne: ColList = {"col1", "col2", ..., "colN"}. Ho provato a creare una stringa e ad usare Eval(Parse()) e Eval Insert() in questo modo:
Names Default to Here (1);
dt = Current Data Table();
str = Eval Insert("dt << New Column(\!"Sum\!", Formula(Sum(Eval(ColList))));");
Eval(Parse(str));Ma ancora senza fortuna. Il codice JSL genererà la colonna con una formula, ma avrà valori di riga vuoti perché mostra ancora Eval(ColList) nella formula invece di essere la formula effettiva, che dovrebbe essere simile a: Sum(:col1, :col2, : col3, ..., :colN).
Non riesco a capire cosa sto sbagliando nel passare dall'elenco {""} di colonne al riferimento alle colonne con i due punti :.
Ogni aiuto è molto apprezzato.
Grazie!,
DS
Consumatori e ricerche di mercatoQualità e ingegneria di processoOggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCIAO @SM ,
Grazie mille per la tua soluzione. Funziona perfettamente per le mie tabelle di dati con cui sto lavorando. Avevo bisogno di modificare un po' le cose per tenere conto del fatto che molte delle tabelle di dati con cui lavoro hanno altri tipi di dati, quindi ho solo bisogno di considerare i dati continui numerici. Ad ogni modo, funziona correttamente e compila correttamente le medie multivariate, gli sviluppatori std e le correlazioni X. Sto usando JMP 16 EA, se è importante.
Grazie per l'aiuto! Ho anche pubblicato nell'altro thread della richiesta originale riguardante la matrice di correlazione in modo che la persona possa, si spera, beneficiare del codice per scalare fino a N dimensioni.
Grazie!,
DS
Oggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoEcco un approccio. Prima crea in modo iterativo Factors() e poi, in un secondo passaggio, crea l'espressione Simulator() completa includendo gli argomenti valutati per X Correlations().
// Iteratively build the Factors expression
fs = Expr( Factors() );
For( i = 1, i <= N Items( ColList ), i++,
Insert Into(
fs,
Eval Expr( Expr( collist[i] ) << multivariate( Expr( MMean[i] ), Expr( MSD[i] ) ) )
)
);
// Make the complete Simulator expression
sim = Eval Expr(
sim_design << Simulator(
1,
Expr( Name Expr( fs ) ),
X Correlations( 1, Expr( ColList ), Expr( corr_mat ) ),
N Runs( 1e4 )
)
);
// Name Expr( sim ) // Run this line to show the expression in the log
// Launch Profiler and run the Simulator expression
sim_design = Profiler( Y( :Pred ) );
sim;
Tuttavia, la matrice delle correlazioni X sembra (nella maggior parte dei casi) essere ignorata. Solo zeri nel rapporto.
Inoltre, quando le correlazioni vengono immesse manualmente nel profiler e salvando ed eseguendo lo script, le correlazioni vengono perse. Anche se sono conservati nello script salvato. Non so perché.
Oggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCIAO @SM ,
Ho una domanda correlata (quindi non un altro post) con cui spero che il tuo metodo di scripting possa aiutarti. Ha a che fare con la posta Qui . Quello che sto cercando di fare ora è fondamentalmente generalizzare ciò che è stato inserito nel post originale da una matrice di correlazione 4x4 a una matrice NxN arbitraria quando "alimenta" informazioni al simulatore nel profilo.
Dall'altro post originale, c'è uno script che può generare la matrice di correlazione NxN e, dal tuo input, può generare una colonna di "previsione" (la somma delle altre N colonne). Dove sto attraversando un periodo difficile è il seguente: quando chiami la funzione Simulator (), hai quanto segue per passarlo:
Simulatore(stato=0|1, , )
Quindi, dall'altro post originale, la soluzione per passare l'elenco corretto di fattori ("tpListY") e la matrice di correlazione ("corr.mat"), il codice JSL necessario per avere Eval Insert() racchiuso attorno alla chiamata da inviare Simulator() al report Profiler e quindi eseguire un Eval(Parse()) intorno a quello.
La sfida ora è come generalizzare correttamente questo in modo che quando si chiama Simulator() e si definiscono i fattori, è possibile farlo su quel ColList.
ColList potrebbe essere qualcosa del tipo: ColList = {A, B, C, D, ...} e c'è una media e una deviazione standard associate per ogni colonna A, B, C, ....
Qual è la sintassi corretta per chiamare il simulatore in modo che inserisca la media corretta e Std Dev per ciascun fattore? Esempio:
sim_design = Profiler(Y(:Pred), Invisible);
new = Eval Insert(
"sim_design << Simulator(
1,
Factors(
:A << mutlivariate(Mmean[1], MSD[1])),
:B << mutlivariate(Mmean[2], MSD[2])),
:C << mutlivariate(Mmean[3], MSD[3])), //etc. for the N columns in the made up table.
),
X Correlations(
1,
Eval(ColList),
Eval(corr_mat)
),
NRuns(1e6)
);");
Eval(Parse(new));Dalla tabella dati originale, viene realizzato un secondo modello con il numero di colonne (N) utilizzate per generare la matrice di correlazione (corr_mat). Quella tabella di simulazione è quella che somma le colonne per creare la colonna :Pred che viene utilizzata come funzione fittizia da inviare al Profiler. Le variabili Mmean e MSD sono vettori che contengono la media e la deviazione standard delle N colonne A attraverso qualunque.
Senza dover scrivere esplicitamente in ogni colonna e la media corrispondente, mi piacerebbe avere questo più automatizzato in modo che possa gestire qualsiasi numero di colonne.
Quale sarebbe un buon modo per farlo?
Ho anche problemi con Eval(corr_mat) che inserisce effettivamente i valori della matrice di correlazione nelle voci X Correlations.
La tabella dati e lo script allegati dovrebbero aiutare a capire cosa sto tentando.
Grazie!,
DS
Aggiorna, scusa ho aggiunto il file sbagliato, ora ha la tabella dati corretta.
Oggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCIAO @SM ,
È una soluzione perfetta, grazie! Mi piace quanto sia semplice ed elegante.
Ho dovuto modificare un po' il mio codice perché farlo a modo tuo ha ancora un problema quando l'elenco è strutturato come: {"A", "B", "C", ...}. Ma se l'elenco è strutturato come {A, B, C, ...} allora valuta bene l'espressione. Le due liste sono generate in modo leggermente diverso e le virgolette eliminano davvero Eval().
Grazie!,
DS
Oggetto: codice JSL necessario per generare una colonna formula dinamica che somma le colonne da un elencoCi sono diversi modi per farlo. Preferisco creare una variabile per l'espressione desiderata utilizzando EvalExpr() e quindi utilizzare NameExpr() per trasferire l'expessione (non valutata) nell'argomento Formula().
Names Default To Here( 1 );
dt = Open( "$Sample_Data/2D Gaussian Process Example.jmp" );
ColList = dt << Get Column Names;
F = Eval Expr( Sum( Expr( ColList ) ) );
dt << New Column( "Sum", Formula( Name Expr( F ) ) );