|
|
楼主

楼主 |
发表于 2007-5-21 06:37:38
|
只看该作者
实用临床试验报表举例
[code:1b1e8]********************************************************************************************************************
*** THIS SECTION OF SAS CODES IS TO CREATE A TABLE OUTPUT IN CLINICAL TRIALS, WHICH INCLUDE TWO PARTS: ***
*** ONE IS DESCRIPTIVE ANALYSIS FOR CONTINUOUS VARIABLE SBP AND ANOTHER PART IS CATEGORICAL ANALYSIS ***
*** FOR A CATEGORICAL VARIABLE P, WHICH REFLECTS FOUR CLASSES OF THE DIFFERENCE BETWEEN DBP AND SBP (PULSE BP). ***
*** NOTE: DBP = DIASTOLIC BLOOD PRESSURE ***
*** SBP = SYSTOLIC BLOOD PRESSURE ***
********************************************************************************************************************;
*----------------*
| FORMAT LIBRARY |
*----------------*;
proc format;
value stat 1='N'
2='Mean'
3='Median'
4='Maximum'
5='Minimum'
6='Standard Deviation';
value order 1='Categorical'
2='Numeric';
run;
*------------------*
| ORIGINAL DATASET |
*------------------*;
data jw1;
input cno patno sbp dbp; *** CNO=CENTER, PATNO=PATIENT NUMBER ***;
datalines;
1 1 120 80
1 2 110 85
1 3 115 70
2 4 120 65
2 5 120 80
;
run;
*-----------------------*
| CALCULATE SAMPLE SIZE |
*-----------------------*;
proc freq data=jw1;
table cno/out=total;
run;
data null;
set total;
call symput('Center_'||put(cno,1.),compress(put(count,3.)));
run;
*----------------------------*
| START CATEGORICAL ANALYSIS |
*----------------------------*;
*** GET THE DIFFERENCE OF DBP AND SBP(PULSE BP) AND CLASSIFY IT TO FOUR CLASSIFICATIONS ***;
data jw2;
set jw1;
diff=sbp-dbp;
if diff<30 then p=1;
else if 30<=diff<40 then p=2;
else if 40<=diff<50 then p=3;
else p=4;
run;
proc sort data=jw2 out=jw3;
by cno patno;
run;
*** FREQUENCY DISTRIBUTION FOR THE PULSE PRESSURE CLASSIFICATION ***;
proc freq data=jw3;
by cno;
tables p/out=freq;
run;
proc sort data=freq out=freq;
by p;
proc transpose data=freq out=cate prefix=cnt;
by p;
var count;
id cno;
run;
*** FILL IN BLANK CATEGORY OF PULSE BP ***;
data frame;
do p=1 to 4;
output;
end;
run;
*** FINAL CATEGORICAL ANALYSIS RESULTS DATASET ***;
data cate;
merge frame(in=a) cate(drop=_NAME_ _LABEL_);
by p;
if a;
array cnt(2) cnt1-cnt2;
do i=1 to 2;
if cnt(i)=. then cnt(i)=0;
end;
cnt3=cnt1+cnt2;
drop i;
pct1=cnt1/(&Center_1)*100;
pct2=cnt2/(&Center_2)*100;
pct3=cnt3/%eval(&Center_1+&Center_2)*100;
run;
*----------------------------*
| START DESCRIPTIVE ANALYSIS |
*----------------------------*;
data jw;
set jw1(in=a) jw1;
if a then cno=3;
run;
proc sort data=jw out=jw;
by cno patno;
run;
*** PROC MEANS ***;
proc means data=jw;
var sbp;
by cno;
output out=summary n=n mean=mean median=median max=max min=min std=std;
run;
data summary(rename=(i=stat a=reslt));
set summary;
array stat(*) n mean median max min std;
do i=1 to dim(stat);
a=stat(i);
output;
end;
format i stat.;
keep i a;
run;
proc sort data=summary out=summary;
by stat;
run;
proc transpose data=summary out=summary prefix=stat;
by stat;
var reslt;
run;
data summary(drop=_name_);
set summary;
run;
*-----------------------------------------*
| FINALIZE FINAL DATASET FOR MAKING TABLE |
*-----------------------------------------*;
data final;
set cate(in=a) summary(in=b);
if a then do;
var='c';
order=1;
end;
if b then do;
var='n';
order=2;
end;
run;
proc sort;
by order;
*---------------------*
| MAKING TABLE OUTPUT |
*---------------------*;
%let Center_3=%eval(&Center_1+&Center_2);
options nodate nocenter nonumber ls=90 ps=40;
data null;
file print header=header footnotes;
title 'Final Results';
note='Final';
spaces=(input(getoption('ls'),8.) - length(note))-1;
jnote=repeat('',spaces)||note;
call symput('r_note',jnote);
footnote "&r_note";
set final end=lastobs;
by order;
if first.order then put /@10 order order.;
if var='c' then
put @10 p
@30 cnt1 '(' pct1 best3. '%)'
@45 cnt2 '(' pct2 best3. '%)'
@60 cnt3 '(' pct3 best3. '%)';
else if var='n' then
put @10 stat stat.
@30 stat1 best3.
@45 stat2 best3.
@60 stat3 best3.;
if last.order then put;
if lastobs then do;
put @10 60*'-';
end;
return;
header:
n+1;
put @60 "Page " n " of " n+1 //;
put @10 60*'-';
put @10 'Parameter/' @30 'Center1' @45 'Center2' @60 'Total';
put @10 ' Class' @30 "(N=&Center_1)" @45 "(N=&Center_2)" @60 "(N=&Center_3)";
put @10 60*'-';
return;
run;[/code:1b1e8] |
|