JMP > JSL > Skriptbeschleunigung für mehrere Aufrufe zum Anpassen des Modells (N > 2000)?Hallo JMP-Community,
Die Größe meiner Datensätze wird immer größer und die grundlegenden Skripte, die ich vor einiger Zeit erstellt habe (siehe unten), halten aus Geschwindigkeitsgründen nicht mit.
Ich würde mich sehr über Ideen freuen, wie man diese Art von Skript für eine bessere Geschwindigkeit optimieren kann. Ich vermute beispielsweise, dass Operationen wie "Concatenate" relativ langsam sind und es sinnvoll sein könnte, für diese Art von Operation mit Matrizen zu arbeiten.
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;
Alle Rückmeldungen sind willkommen.
Am besten,
TS
SkriptingBetreff: JMP > JSL > Skriptbeschleunigung für mehrere Aufrufe zum Anpassen des Modells (N > 2000)?Hallo JMP-Community,
Ich habe mit Matrizen als Behältnisse zum Aggregieren langer Sammlungen von Analyseausgabetabellen experimentiert und bisher meine Ausführungszeit um das ~5-fache beschleunigt (siehe unten). Die einzige kleine Unannehmlichkeit besteht darin, dass ich die Anmerkungen für die erfassten Ausgabetabellen neu erstellen musste, da (offensichtlich) Matrizen keinen Text enthalten.
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;
Betreff: JMP > JSL > Skriptbeschleunigung für mehrere Aufrufe zum Anpassen des Modells (N > 2000)?5X klingt großartig!
Möglicherweise gibt es auch eine unsichtbare Option für die Plattform, die hilfreich sein könnte.
(Probieren Sie den JSL-Profiler aus, der nächste Vorschlag ist möglicherweise völlig daneben. Es macht keinen Sinn, etwas schneller zu machen, das < 1% der Zeit verbraucht ...)
Wenn es immer noch nicht genug ist, können die letzten beiden Anweisungen in der Schleife der nächste Ort sein, an dem Sie nachsehen sollten. Ich denke, Ihre JSL ordnet die Arrays 2000 Mal bei zunehmend größeren Größen neu zu. Wenn Sie die Arrays vorab zuordnen können (mit der Funktion J(nr,nc,initvalue)) und mit etwas wie mtx_lsm[a::b,0] = temp_mtx_lsm[0,0] darin speichern, sparen Sie etwas Zeit .
Bearbeiten: Dies ist möglicherweise ein N^2-Problem, da es nicht nur neu zuordnet, sondern auch die Daten kopiert; Wenn Sie von einem Lauf von 1000 auf einen Lauf von 2000 gehen, wird die 4X (nicht 2X) Datenmenge kopiert.
Betreff: JMP > JSL > Skriptbeschleunigung für mehrere Aufrufe zum Anpassen des Modells (N > 2000)?Hi @Craige_Hales ,
Danke für den Vorschlag. Dank der von Ihnen empfohlenen Methode habe ich die Geschwindigkeit um weitere 33% verbessert.
Es gibt noch einige Optimierungen, die ich perfektionieren muss, aber ich habe mit einer Gesamtlaufzeit von etwa 450 Sekunden angefangen, mit meinen ersten Änderungen auf 91 Sekunden und jetzt auf 61 Sekunden.
Am besten
TS
Betreff: JMP > JSL > Skriptbeschleunigung für mehrere Aufrufe zum Anpassen des Modells (N > 2000)?Cool! Ich denke, die Community würde gerne sehen, was Sie getan haben, um dorthin zu gelangen, oder vielleicht zusammenfassen, wie wichtig verschiedene Änderungen waren.
@DonMcCormack