SAS中文论坛

标题: 实用临床试验报表举例 [打印本页]

作者: shiyiming    时间: 2007-5-21 06:37
标题: 实用临床试验报表举例
[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]
作者: shiyiming    时间: 2007-5-21 18:42
标题: @
so so

只有描述,没有检验。

可以改成宏,让其更通用些。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2