JMP > JSL > Accelerazione script per più chiamate per adattare il modello (N > 2000)?Ciao comunità JMP,
La dimensione dei miei set di dati sta aumentando e gli script di base che ho creato qualche tempo fa (vedi sotto) non stanno al passo dal punto di vista della velocità.
Apprezzerei molto sentire le idee su come ottimizzare questo tipo di script per una migliore velocità. Ad esempio, sospetto che operazioni come "Concatena" siano relativamente lente e potrebbe avere senso lavorare con le matrici per questo tipo di operazione.
Names Default to Here (1);
dt = Current Data Table ();
CList = dt << Get Column Names (string);
dtoutl = New Table ("LSM OUTPUT", "invisible");
dtoutp = New Table ("PVal OUTPUT", "invisible");
For (i = 1, i<= 2000, i++,
fm = dt << Fit Model(
Y( Column (i) ),
Effects( :VISIT, :TREATMENT, :VISIT * :TREATMENT, Column (i+2000) ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" ),
Run(
Column (i) << {Summary of Fit( 1 ), Analysis of Variance( 1 ),
Parameter Estimates( 1 ), Scaled Estimates( 0 ),
Plot Actual by Predicted( 0 ), Plot Regression( 0 ),
Plot Residual by Predicted( 0 ), Plot Studentized Residuals( 0 ),
Plot Effect Leverage( 0 ), Plot Residual by Normal Quantiles( 0 ),
Box Cox Y Transformation( 0 ), {:VISIT * :TRT01A <<
{LSMeans Contrast( [0 0 1 -1 0 0, 0 0 0 0 1 -1] )}}}
)
);
fmr = report (fm);
table_list = fmr << xpath ("//OutlineBox [text() = 'VISIT*TREATMENT']//TableBox");
temp_lsm = table_list [1];
temp_pval = table_list [2];
temp_tbl_lsm = temp_lsm << Make into Data Table (invisible (1));
temp_tbl_pval = temp_pval << Make into Data Table (invisible (1));
temp_tbl_lsm << New column ("ID", character, nominal, << set each value (CList [i]));
temp_tbl_pval << New column ("ID", character, nominal, << set each value (CList [i]));
fmr << close window;
dtoutl << Concatenate (Data table (temp_tbl_lsm), "Append to First Table");
Wait (0);
dtoutp << Concatenate (Data table (temp_tbl_pval), "Append to First Table");
Close (temp_tbl_lsm, NoSave);
Close (temp_tbl_pval, NoSave);
);
dtoutl << Bring Window to Front;
dtoutp << Bring Window to Front;
Tutti i feedback sono i benvenuti.
Migliore,
TS
ScriptingRi: JMP > JSL > Accelerazione script per più chiamate per adattare il modello (N > 2000)?Ciao comunità JMP,
Ho sperimentato le matrici come ricettacoli per aggregare lunghe raccolte di tabelle di output di analisi e finora ho accelerato il mio tempo di esecuzione di ~ 5 volte (vedi sotto). L'unico piccolo inconveniente è che ho dovuto ricostruire le annotazioni per le tabelle di output catturate perché (ovviamente) le matrici non contengono testo.
Names Default to Here (1);
st = Today();
dt = Current Data Table ();
dts = dt << Summary( Group( :VISIT, :TRT01A ), Freq( "None" ), Weight( "None" ), invisible );
annot_lsm = {};
met_l = {};
annot_pv = {};
CList = dt << Get Column Names (string);
For (j = 1, j <= N Rows (dts), j++,
insert into (annot_lsm, dts:VISIT [j] || ", " || dts:TRT01A [j]);
);
annot_pv = annot_lsm;
annot_pv = Concat To(annot_pv, {"Estimate","Std Error", "t Ratio", "Prob>|t|", "SS", "Lower 95%", "Upper 95%"});
Close (dts, NoSave);
mtx_lsm = [];
mtx_pval = [];
For (i = 1, i<= 2000, i++, //2000
fm = dt << Fit Model(
Y( Column (i) ),
Effects( :VISIT, :TRT01A, :VISIT * :TRT01A, Column (i+2000) ),
Personality( "Standard Least Squares" ),
Emphasis( "Minimal Report" ),
Run(
Column (i) << {Summary of Fit( 1 ), Analysis of Variance( 1 ),
Parameter Estimates( 1 ), Scaled Estimates( 0 ),
Plot Actual by Predicted( 0 ), Plot Regression( 0 ),
Plot Residual by Predicted( 0 ), Plot Studentized Residuals( 0 ),
Plot Effect Leverage( 0 ), Plot Residual by Normal Quantiles( 0 ),
Box Cox Y Transformation( 0 ), {:VISIT * :TRT01A <<
{LSMeans Contrast( [0 0 1 -1 0 0, 0 0 0 0 1 -1] )}}}
)
);
fmr = report (fm);
insert into (met_l, CList [i]);
table_list = fmr << xpath ("//OutlineBox [text() = 'VISIT*TRT01A']//TableBox");
temp_lsm = table_list [1];
temp_pval = table_list [2];
temp_mtx_lsm = temp_lsm << Get as Matrix;
temp_mtx_pval = temp_pval << Get as Matrix;
fmr << close window;
mtx_lsm = mtx_lsm |/ temp_mtx_lsm;
mtx_pval = mtx_pval |/ temp_mtx_pval ;
);
dtoutl = as Table (mtx_lsm);
dtoutp = as Table (mtx_pval);
dtoutl << new column ("COMP", Character, Nominal);
dtoutl << new column ("MET_ID", Character, Nominal);
dtoutl:Col1 << set name ("LSMEAN");
dtoutl:Col2 << set name ("STDERR");
dtoutl:Col3 << set name ("UPPER CI");
dtoutl:Col4 << set name ("LOWER CI");
dtoutl << Begin Data Update;
For Each Row( dtoutl, :COMP = annot_lsm[Sequence( 1, N Items (annot_lsm), 1, 1 )] );
For each row( dtoutl, :MET_ID = met_l[Sequence (1,N Items (met_l), 1, 6)] );
dtoutl << End Data Update;
dtoutp << new column ("LABEL", Character, Nominal);
dtoutp << new column ("MET_ID", Character, Nominal);
dtoutp << Begin Data Update;
For Each Row( dtoutp, :LABEL = annot_pv[Sequence( 1, N Items (annot_pv), 1, 1 )] );
For each row( dtoutp, :MET_ID = met_l[Sequence (1,N items (met_l), 1, 13)] );
dtoutp << End Data Update;
Ri: JMP > JSL > Accelerazione script per più chiamate per adattare il modello (N > 2000)?5X suona alla grande!
Potrebbe anche esserci un'opzione invisibile per la piattaforma che potrebbe aiutare.
(Prova il profiler JSL, il prossimo suggerimento potrebbe essere fuori base. Non ha senso fare qualcosa di più veloce che utilizza < 1% del tempo...)
Se ancora non è abbastanza, le ultime due istruzioni nel ciclo potrebbero essere il prossimo posto in cui cercare. Penso che il tuo JSL stia riassegnando gli array 2000 volte a dimensioni progressivamente maggiori. Se puoi pre-allocare gli array (usando la funzione J(nr,nc,initvalue)) e memorizzarli in essi con qualcosa come mtx_lsm[a::b,0] = temp_mtx_lsm[0,0] risparmierai un po' di tempo .
Modifica: questo è potenzialmente un problema N^2 perché non solo rialloca, ma copia anche i dati; passando da un'esecuzione di 1000 a una di 2000 copierà 4X (non 2X) la quantità di dati.
Ri: JMP > JSL > Accelerazione script per più chiamate per adattare il modello (N > 2000)?Ciao @Craige_Hales ,
Grazie per il suggerimento. Grazie al metodo che mi hai consigliato, ho migliorato la velocità di un altro 33%.
Ci sono ancora alcune modifiche che devo perfezionare, ma ho iniziato con un tempo di esecuzione totale di circa 450 secondi, fino a 91 secondi con le mie modifiche iniziali e fino a 61 secondi ora.
Migliore
TS
Ri: JMP > JSL > Accelerazione script per più chiamate per adattare il modello (N > 2000)?Freddo! Penso che la community vorrebbe vedere cosa hai fatto per arrivarci, o forse riassumere quanto siano stati importanti i diversi cambiamenti.
@DonMcCormack