JMP > JSL > Accélération de script pour plusieurs appels au modèle d'ajustement (N > 2000) ?Salut la communauté JMP,
La taille de mes ensembles de données augmente et les scripts de base que j'ai créés il y a quelque temps (voir ci-dessous) ne suivent pas du point de vue de la vitesse.
J'apprécierais beaucoup d'avoir des idées sur la façon d'optimiser ce type de script pour une meilleure vitesse. Par exemple, je soupçonne que des opérations telles que "Concaténer" sont relativement lentes et il peut être judicieux de travailler avec des matrices pour ce type d'opération.
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;
Tous les commentaires sont les bienvenus.
Meilleur,
ST
ScriptRe : JMP > JSL > Accélération de script pour plusieurs appels au modèle d'ajustement (N > 2000) ?Salut la communauté JMP,
J'ai expérimenté des matrices comme réceptacles pour agréger de longues collections de tableaux de sortie d'analyse, et jusqu'à présent, j'ai accéléré mon temps d'exécution d'environ 5 fois (voir ci-dessous). Le seul inconvénient mineur est que j'ai dû reconstruire les annotations pour les tables de sortie capturées car (évidemment) les matrices ne contiennent pas de texte.
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;
Re : JMP > JSL > Accélération de script pour plusieurs appels au modèle d'ajustement (N > 2000) ?5X sonne bien !
Il pourrait également y avoir une option invisible pour la plate-forme qui pourrait aider.
(Essayez le profileur JSL, la prochaine suggestion peut être très erronée. Il ne sert à rien de faire quelque chose de plus rapide qui utilise moins de 1% du temps...)
Si cela ne suffit toujours pas, les deux dernières instructions de la boucle peuvent être le prochain endroit à regarder. Je pense que votre JSL réaffecte les tableaux 2000 fois à des tailles progressivement plus grandes. Si vous pouvez pré-allouer les tableaux (à l'aide de la fonction J(nr,nc,initvalue)) et les stocker avec quelque chose comme mtx_lsm[a::b,0] = temp_mtx_lsm[0,0] vous gagnerez du temps .
Edit : il s'agit potentiellement d'un problème N^2 car non seulement il réaffecte, mais il copie également les données ; passer d'une exécution de 1000 à une exécution de 2000 copiera 4X (pas 2X) la quantité de données.
Re : JMP > JSL > Accélération de script pour plusieurs appels au modèle d'ajustement (N > 2000) ?salut @Craige_Hales ,
Merci pour la suggestion. Grâce à la méthode que vous avez recommandée, j'ai encore amélioré la vitesse de 33%.
Il me reste encore quelques ajustements à perfectionner, mais j'ai commencé avec un temps d'exécution total d'environ 450 secondes, descendu à 91 secondes avec mes modifications initiales et à 61 secondes maintenant.
Meilleur
ST
Re : JMP > JSL > Accélération de script pour plusieurs appels au modèle d'ajustement (N > 2000) ?Frais! Je pense que la communauté aimerait voir ce que vous avez fait pour y arriver, ou peut-être résumer l'importance des différents changements.
@DonMcCormack