BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
desireatem
Pyrite | Level 9

Sir/Madam,

 

I am trying to plot a graph of trend for longitudinal data such that, at each visit I have the sample size, standard deviation at the point. The attached file  "mycode", contains  is my code the runs with error.  This link  " http://www2.sas.com/proceedings/forum2007/041-2007.pdf"  has the plot the way i want it to loo like with some code that I have tried to adapt. My first plots have sample sizes all over the place reather than at specific visit, there are two extra vertical lines. Please, also let me know is there is a simple way to correct my code.

 

Thank you,

Here is the code that doesnot work well:

 

%let t = 11; /* sample size */
%let NumSamples = 100; /* number of samples */
data Sim;
call streaminit(123);
do SampleID = 1 to &NumSamples; /* ID variable for each sample */
do PD=ranbin(0,1,.5);
do visit = 1 to &t;

JerKAP = rand("Uniform");
output;
end;
end;
end;
run;

 


proc sort data=sim;
by PD visit;
run;
proc summary data=sim;
by PD visit;
var JerKAP;
output out=mean1 (drop = _:) mean=mean n = n stderr = stderr ;
run;
*data mean1;
*set mean 1;
*keep visit PD Jer;
*run;

*symbol1 v=dot i=join;
symbol1 i = j value = W font = marker c = blue h = 0.5 line = 1 width = 1;
symbol2 i = j value = W font = marker c = red h = 0.5 line = 1 width = 1;
*axis1 label=(angle=90 "Jer+B1:B46k (AP) (m^2/s^5)");
*title " Jer+B1:B46k (AP) (m^2/s^5) by visit";
proc plot data=mean1;
plot mean*visit=PD;;
run; quit;


data meanstd;
set mean1;
if PD= 1 then visit = visit + 0.1;
yvalue = mean; output;
yvalue = mean + stderr; output;
yvalue = mean - stderr; output;
run;
symbol1 i = hiloj value = W font = marker c = blue h = 0.5 line = 1 width = 1;
symbol2 i = hiloj value = W font = marker c = red h =0.5 line = 1 width = 1;
proc gplot data = meanstd;
plot yvalue*visit =PD / vref = 110 135 lvref =2 href = 2 4 lhref = 1;
run; quit;


data numlabel;
length function sytle text $ 8;
retain function 'label' xsys ysys '2' hsys '3' style 'swissb' size 2 when 'a';
set mean1;
y = mean;
text = compress(n);
if PD = 0 then do;
color = 'blue'; x = visitnum + 0.1;
end;
else if PD = 1 then do;
color = 'red'; x = visitnum + 0.2;
end;
output;
run;
proc gplot data = meanstd;
plot yvalue*visit=PD/vref = 110 135 lvref = 2
href = 2 4 lhref = 1 annotate = numlabel;
*format armcd $armf.;
run; quit;

data anno1;
length function $8 text $8;
set mean1;
retain xsys ysys '2' hsys '1';
if n > 0 then do;
function = "Label"; x = visit; position = "5"; size = 3.5;
text = put(n, 2.); style = "swissb"; angle = 0;
if PD = 0 then do;
y = 94; color = "blue"; output;
end;
else do;
y = 92; color = "red"; output;
end;
end;
run;

data anno2;
length function $8 text $8 style $6;
retain xsys hsys "1" ysys "2" postion "5" angle 0 size 3.5;
PD = 0; x = 1; y = 94; style = "none"; color = "blue"; text = 'dot';
function = 'symbol'; output;
PD = 0; x = 4; y = 94; style = "swissb"; color = "blue"; text = "n =";
function = 'label'; output;
PD=1; x = 1; y = 92; style = "none"; color = "red"; text = 'dot';
function = 'symbol'; output;
PD=1; x = 4; y = 92; style = "swissb"; color = "red"; text = "n =";
function = 'label'; output;
run;

data anno3;
length function $8 text $8;
retain xsys "3" ysys "2" function "label" size 3 color "gray" position "6" x 90;
y = 135; text = "ULN"; output;
y = 110; text = "LLN"; output;
run;

length xsys ysys hsys when position $1 function $8 style color $20 text $50;
retain xsys "2" ysys "1" hsys "1";
function = "move"; x = 2; y = 0; output;
function = "bar"; color = "grayE8"; style = "solid"; line = 3; when = "b";
x = 4; y = 100; output;
function = "move"; x = 3; y = 2; output;
function = "label"; text = "Treatment Period"; color = "black"; position = "b";
style = "'Arial'"; size = 5; when = "a"; output;
run;

data anno;
set anno4 anno1 anno2 anno3 ;
run;

symbol1 i = hiloctj c = blue line = 1 width = 5;
symbol2 i = hiloctj c = red line = 3 width = 5;
symbol3 i = none value = W font = marker c = blue h = 2.5;
symbol4 i = none value = W font = marker c = red h = 2.5;

axis1 label = (h = 12 a = 90 "Jer+B1:B46k (AP) (m^2/s^5")
minor = none value = (height = 4)
major = (width = 3 c = black)
width = 3 value = (t=1 " ")
order = (0 to 1 by 0.1);
axis2 label = (h = 12 "Visit")
minor = none value = (height = 4)
major = (width = 3 c = black)
value = (t=12 " ") width = 3
order = (1 to 6 by 1)
offset = (6,0);
axis3 label = none
order = (0 to 1 by 0.1)
value = none major = none
minor = none style = 0;
legend1 label = none
position = (top left inside)
offset = (0.5, -0.25)
across = 1
value = none

shape = symbol(8,3.5)
mode = share;
legend2 label = none
position = (top left inside)
offset = (0.5)
across = 1
shape = symbol(8,3.5)
mode = share
value = (h =4 t= 1 "Control" t = 2 "PD");

proc gplot data = meanstd;
plot yvalue*visit=PD /vaxis = axis1 haxis = axis2 legend = legend1
vref = 110 135 lvref = 2
href = 2 4 lhref = 1 annotate = anno;
plot2 mean*visit =PD / vaxis = axis3 haxis = axis2 legend = legend2;
*format armcd $armf.;
run; quit;

 

1 ACCEPTED SOLUTION

Accepted Solutions
SuzanneDorinski
Lapis Lazuli | Level 10

In the code that you shared, you have a set statement that refers to the anno4 data set, but there isn't an anno4 data set.  My guess is that there's a line missing in the code.  Right after the run statement for the anno3 data set is a length statement.  That's where the error is in the log when I run the code. 

 

I tried using PROC SGPLOT instead.

 


%let t = 11;

/* sample size */
%let NumSamples = 100;

/* number of samples */
data Sim;
	call streaminit(123);

	do SampleID=1 to &NumSamples;

		/* ID variable for each sample */
		do PD=ranbin(0, 1, .5);

			do visit=1 to &t;
				JerKAP=rand("Uniform");
				output;
			end;
		end;
	end;
run;

proc sort data=sim;
	by PD visit;
run;

proc summary data=sim;
	by PD visit;
	var JerKAP;
	output out=mean1 (drop=_:) mean=mean n=n stderr=stderr;
run;

* want treatment period displayed as 
* visits 2 through 4.  if we use 4
* as upper value in data step below,
* block is shaded between visits 2 and 
* 5.  so subtract 1 for upper value. ;

data meanstdREVISED;
	set mean1;
	yvalue=mean;
	high=yvalue + stderr;
	low=yvalue - stderr;
	if 2 le visit le 3 then treatment=1;
	else treatment=0;
run;

* have to sort if using block plot! ;

proc sort data=meanstdREVISED;
  by visit;
run;

proc format ;
	value pd_userfmt 0='Control' 1='PD';
	value treat 0=' ' 1='Treatment period';
run;

ods graphics / attrpriority=none;

proc sgplot data=meanstdREVISED;
	block x=visit block=treatment / valueattrs=(weight=bold size=10)
        valuevalign=bottom filltype=alternate
        fillattrs=(color=white) 
        altfillattrs=(color=yellow)
        transparency=.8;
	scatter x=visit y=yvalue / group=pd yerrorlower=low yerrorupper=high 
		markerattrs=(size=12) errorbarattrs=(thickness=3) name='scatter';
	styleattrs datasymbols=(circlefilled diamondfilled) datalinepatterns=(solid 
		shortdash);
	series x=visit y=yvalue / group=pd name='series';
	yaxis values=(0 to 1 by .1);
	xaxis label='Visit' values=(1 to 11 by 1);
	keylegend 'scatter' 'series' / location=inside down=2;
	format pd pd_userfmt. treatment treat. ;
	xaxistable n / class=pd location=outside colorgroup=pd valueattrs=(weight=bold 
		size=10) labelattrs=(weight=bold size=10) title='Sample size at each visit' 
		titleattrs=(weight=bold size=10);
run;

 

This is the output:

 

ODS Graphics version of plot with sample size and standard deviation at each visit.png

View solution in original post

7 REPLIES 7
RW9
Diamond | Level 26 RW9
Diamond | Level 26

You know the drill by now, attached office files will not be donwloaded, they are a security risk.  Post test data in the form of a datastep, show the code you have used, and the output you want.

desireatem
Pyrite | Level 9

%let t = 11; /* sample size */
%let NumSamples = 100; /* number of samples */
data Sim;
call streaminit(123);
do SampleID = 1 to &NumSamples; /* ID variable for each sample */
do PD=ranbin(0,1,.5);
do visit = 1 to &t;

JerKAP = rand("Uniform");
output;
end;
end;
end;
run;

 


proc sort data=sim;
by PD visit;
run;
proc summary data=sim;
by PD visit;
var JerKAP;
output out=mean1 (drop = _:) mean=mean n = n stderr = stderr ;
run;
*data mean1;
*set mean 1;
*keep visit PD Jer;
*run;

*symbol1 v=dot i=join;
symbol1 i = j value = W font = marker c = blue h = 0.5 line = 1 width = 1;
symbol2 i = j value = W font = marker c = red h = 0.5 line = 1 width = 1;
*axis1 label=(angle=90 "Jer+B1:B46k (AP) (m^2/s^5)");
*title " Jer+B1:B46k (AP) (m^2/s^5) by visit";
proc plot data=mean1;
plot mean*visit=PD;;
run; quit;


data meanstd;
set mean1;
if PD= 1 then visit = visit + 0.1;
yvalue = mean; output;
yvalue = mean + stderr; output;
yvalue = mean - stderr; output;
run;
symbol1 i = hiloj value = W font = marker c = blue h = 0.5 line = 1 width = 1;
symbol2 i = hiloj value = W font = marker c = red h =0.5 line = 1 width = 1;
proc gplot data = meanstd;
plot yvalue*visit =PD / vref = 110 135 lvref =2 href = 2 4 lhref = 1;
run; quit;


data numlabel;
length function sytle text $ 8;
retain function 'label' xsys ysys '2' hsys '3' style 'swissb' size 2 when 'a';
set mean1;
y = mean;
text = compress(n);
if PD = 0 then do;
color = 'blue'; x = visitnum + 0.1;
end;
else if PD = 1 then do;
color = 'red'; x = visitnum + 0.2;
end;
output;
run;
proc gplot data = meanstd;
plot yvalue*visit=PD/vref = 110 135 lvref = 2
href = 2 4 lhref = 1 annotate = numlabel;
*format armcd $armf.;
run; quit;

data anno1;
length function $8 text $8;
set mean1;
retain xsys ysys '2' hsys '1';
if n > 0 then do;
function = "Label"; x = visit; position = "5"; size = 3.5;
text = put(n, 2.); style = "swissb"; angle = 0;
if PD = 0 then do;
y = 94; color = "blue"; output;
end;
else do;
y = 92; color = "red"; output;
end;
end;
run;

data anno2;
length function $8 text $8 style $6;
retain xsys hsys "1" ysys "2" postion "5" angle 0 size 3.5;
PD = 0; x = 1; y = 94; style = "none"; color = "blue"; text = 'dot';
function = 'symbol'; output;
PD = 0; x = 4; y = 94; style = "swissb"; color = "blue"; text = "n =";
function = 'label'; output;
PD=1; x = 1; y = 92; style = "none"; color = "red"; text = 'dot';
function = 'symbol'; output;
PD=1; x = 4; y = 92; style = "swissb"; color = "red"; text = "n =";
function = 'label'; output;
run;

data anno3;
length function $8 text $8;
retain xsys "3" ysys "2" function "label" size 3 color "gray" position "6" x 90;
y = 135; text = "ULN"; output;
y = 110; text = "LLN"; output;
run;

length xsys ysys hsys when position $1 function $8 style color $20 text $50;
retain xsys "2" ysys "1" hsys "1";
function = "move"; x = 2; y = 0; output;
function = "bar"; color = "grayE8"; style = "solid"; line = 3; when = "b";
x = 4; y = 100; output;
function = "move"; x = 3; y = 2; output;
function = "label"; text = "Treatment Period"; color = "black"; position = "b";
style = "'Arial'"; size = 5; when = "a"; output;
run;

data anno;
set anno4 anno1 anno2 anno3 ;
run;

symbol1 i = hiloctj c = blue line = 1 width = 5;
symbol2 i = hiloctj c = red line = 3 width = 5;
symbol3 i = none value = W font = marker c = blue h = 2.5;
symbol4 i = none value = W font = marker c = red h = 2.5;

axis1 label = (h = 12 a = 90 "Jer+B1:B46k (AP) (m^2/s^5")
minor = none value = (height = 4)
major = (width = 3 c = black)
width = 3 value = (t=1 " ")
order = (0 to 1 by 0.1);
axis2 label = (h = 12 "Visit")
minor = none value = (height = 4)
major = (width = 3 c = black)
value = (t=12 " ") width = 3
order = (1 to 6 by 1)
offset = (6,0);
axis3 label = none
order = (0 to 1 by 0.1)
value = none major = none
minor = none style = 0;
legend1 label = none
position = (top left inside)
offset = (0.5, -0.25)
across = 1
value = none

shape = symbol(8,3.5)
mode = share;
legend2 label = none
position = (top left inside)
offset = (0.5)
across = 1
shape = symbol(8,3.5)
mode = share
value = (h =4 t= 1 "Control" t = 2 "PD");

proc gplot data = meanstd;
plot yvalue*visit=PD /vaxis = axis1 haxis = axis2 legend = legend1
vref = 110 135 lvref = 2
href = 2 4 lhref = 1 annotate = anno;
plot2 mean*visit =PD / vaxis = axis3 haxis = axis2 legend = legend2;
*format armcd $armf.;
run; quit;

 

SuzanneDorinski
Lapis Lazuli | Level 10

In the code that you shared, you have a set statement that refers to the anno4 data set, but there isn't an anno4 data set.  My guess is that there's a line missing in the code.  Right after the run statement for the anno3 data set is a length statement.  That's where the error is in the log when I run the code. 

 

I tried using PROC SGPLOT instead.

 


%let t = 11;

/* sample size */
%let NumSamples = 100;

/* number of samples */
data Sim;
	call streaminit(123);

	do SampleID=1 to &NumSamples;

		/* ID variable for each sample */
		do PD=ranbin(0, 1, .5);

			do visit=1 to &t;
				JerKAP=rand("Uniform");
				output;
			end;
		end;
	end;
run;

proc sort data=sim;
	by PD visit;
run;

proc summary data=sim;
	by PD visit;
	var JerKAP;
	output out=mean1 (drop=_:) mean=mean n=n stderr=stderr;
run;

* want treatment period displayed as 
* visits 2 through 4.  if we use 4
* as upper value in data step below,
* block is shaded between visits 2 and 
* 5.  so subtract 1 for upper value. ;

data meanstdREVISED;
	set mean1;
	yvalue=mean;
	high=yvalue + stderr;
	low=yvalue - stderr;
	if 2 le visit le 3 then treatment=1;
	else treatment=0;
run;

* have to sort if using block plot! ;

proc sort data=meanstdREVISED;
  by visit;
run;

proc format ;
	value pd_userfmt 0='Control' 1='PD';
	value treat 0=' ' 1='Treatment period';
run;

ods graphics / attrpriority=none;

proc sgplot data=meanstdREVISED;
	block x=visit block=treatment / valueattrs=(weight=bold size=10)
        valuevalign=bottom filltype=alternate
        fillattrs=(color=white) 
        altfillattrs=(color=yellow)
        transparency=.8;
	scatter x=visit y=yvalue / group=pd yerrorlower=low yerrorupper=high 
		markerattrs=(size=12) errorbarattrs=(thickness=3) name='scatter';
	styleattrs datasymbols=(circlefilled diamondfilled) datalinepatterns=(solid 
		shortdash);
	series x=visit y=yvalue / group=pd name='series';
	yaxis values=(0 to 1 by .1);
	xaxis label='Visit' values=(1 to 11 by 1);
	keylegend 'scatter' 'series' / location=inside down=2;
	format pd pd_userfmt. treatment treat. ;
	xaxistable n / class=pd location=outside colorgroup=pd valueattrs=(weight=bold 
		size=10) labelattrs=(weight=bold size=10) title='Sample size at each visit' 
		titleattrs=(weight=bold size=10);
run;

 

This is the output:

 

ODS Graphics version of plot with sample size and standard deviation at each visit.png

desireatem
Pyrite | Level 9

Thank you Suzzanne, how do I take out the yellow marked "treatment period"?

desireatem
Pyrite | Level 9

I want to delete the treatment period from the code. Once I take out treatment, this is what I get: 

327 ods graphics / attrpriority=none;
328 title" "
329 proc sgplot data=meanstdREVISED;
330 block x=visit / valueattrs=(weight=bold size=10)
-
79
76
ERROR 79-322: Expecting a BLOCK.
ERROR 76-322: Syntax error, statement will be ignored.
331 valuevalign=bottom filltype=alternate
332 fillattrs=(color=white)
333 altfillattrs=(color=yellow)
334 transparency=.8;
335 scatter x=visit y=yvalue / group=pd yerrorlower=low yerrorupper=high
336 markerattrs=(size=12) errorbarattrs=(thickness=3) name='scatter';
337 styleattrs datasymbols=(circlefilled diamondfilled) datalinepatterns=(solid
338 shortdash);
339 series x=visit y=yvalue / group=pd name='series';
340 yaxis values=(0 to 1 by .1);
341 xaxis label='Visit' values=(1 to 11 by 1);
342 keylegend 'scatter' 'series' / location=inside down=2;
343 format pd pd_userfmt. ;
344 xaxistable n / class=pd location=outside colorgroup=pd valueattrs=(weight=bold
345 size=10) labelattrs=(weight=bold size=10) title='Sample size at each visit'
346 titleattrs=(weight=bold size=10);
347 run;

NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROCEDURE SGPLOT used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds

SuzanneDorinski
Lapis Lazuli | Level 10

The BLOCK statement in PROC SGPLOT is what produced the yellow shading for the treatment period.  If you delete that statement or comment it out, you won't see the treatment period in the graphic.

desireatem
Pyrite | Level 9

Thank You!!!

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 7 replies
  • 3777 views
  • 3 likes
  • 3 in conversation