BookmarkSubscribeRSS Feed
KBACHU
Fluorite | Level 6

Trying to run this code in SAS 94 windows environment. It takes much time in SAS 9.4 compared with SAS 9.2. Any suggestions on how to improve the performance?

 

ods _all_ close;
ods preferences;

data heights;
	input Family G$ Height @@;
	datalines;
1 F 67   1 F 66   1 F 64   1 M 71   1 M 72   2 F 63
2 F 63   2 F 67   2 M 69   2 M 68   2 M 70   3 F 63
3 M 64   4 F 67   4 F 66   4 M 67   4 M 67   4 M 69
;
run;

data input;
	set heights;

	if g eq 'F' then
		gf = 1;
	else gf = 0;
	drop g;

	if family=1 then
		do;
			indf1=1;
			indf2=0;
			indf3=0;
			indf4=0;
		end;
	else if family=2 then
		do;
			indf1=0;
			indf2=1;
			indf3=0;
			indf4=0;
		end;
	else if family=3 then
		do;
			indf1=0;
			indf2=0;
			indf3=1;
			indf4=0;
		end;
	else if family=4 then
		do;
			indf1=0;
			indf2=0;
			indf3=0;
			indf4=1;
		end;
run;

ods graphics on;

proc mcmc data=input outpost=postout nmc=50000 seed=7893 plots= (trace density) diag=none  monitor=(b0 b1) STATISTICS=summary
	statistics=interval;
	ods select  postsummaries postintervals tdpanel;;
	parms b0 0 b1 0 s2 1 s2g 1;
	prior b: ~ normal(0, var = 10000);
	prior s: ~ igamma(0.01, scale = 0.01);
	random gamma ~ normal(0, var = s2g) subject=family monitor=(gamma);
	mu = b0 + b1 * gf + gamma;
	model height ~ normal(mu, var = s2);
	ods output postintervals=pint postsummaries=psum;
run;

quit;

ods graphics off;

proc print data=pint;
run;

proc print data=psum;
run;
;
 

 

9 REPLIES 9
Reeza
Super User

I don't know about the rest of your code but you can simplify the if/then section:

 

array indf(4) indf1-indf4 (4*0); *initialize all to 0 to start with;

indf(family) = 1;	
KBACHU
Fluorite | Level 6
Hi Reeza, Thanks for your response. This is just a sample code I am testing. I have to run this with many simulations.
Reeza
Super User

Ok, can I assume then you've diagnosed the performance problem/bottleneck as being in PROC MCMC?

 

If so, how long is it currently taking and how long did it take before?

Also, in the upgrade from 9.2 to 9.4 did anything else change?

KBACHU
Fluorite | Level 6

There is almost a 15 seconds delay for the same program between 92 and 94. The time will increase a lot if I run with many simulations. I beleive part of the problem is with ods graphics. I heard that a lot has been changed in ods graphics between 92 and 94

Reeza
Super User

Yes, ODS Graphics are enhanced, and creating graphs is where it seems to lag. Given your specifications I assume you want a graph though.

 

Have you tried turning off 'show results as generated' option? That may also speed it up, since it writes it but isn't taking the time to try and display it. 

KBACHU
Fluorite | Level 6

I tried unchecking the option, but no change.

Reeza
Super User

This wasn't under Statistical Procedures, so I've moved it there to hopefully get a better response. 

 

SAS is always interested in when things change between versions, so tech support is probably a good next place to get help, if you haven't already. 9.2 to 9.4 is a big jump though...it's much easier to work with in a lot of ways.

Ksharp
Super User
Yeah. As you said, maybe ODS Graphic cost you lots of time, 
Try close all the destinations.

ods _all_ close;
proc mcmc ..........

Rick_SAS
SAS Super FREQ

1. This program takes about 2 seconds for me to run, so I am not seeing the performance problem you see. Most of that 2 seconds is creating output.

.

2. In the first line of your program, you close all the ODS destinations. This is usually a bad idea. Between 9.2 and 9.3, one of the biggest changes is that HTML became the default destination, instead of LISTING. HTML is a more complex destination and is slower than LISTING. For an apples-to-apples comparison, delete the first line and replace it with 

ODS HTML CLOSE;

ODS LISTING;

 

3. To learn why ODS _ALL_ CLOSE is a bad idea, see "Five reasons to use ODS EXCLUDE to suppress output"

 

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

What is ANOVA?

ANOVA, or Analysis Of Variance, is used to compare the averages or means of two or more populations to better understand how they differ. Watch this tutorial for more.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 9 replies
  • 1589 views
  • 0 likes
  • 4 in conversation