Sie sind auf Seite 1von 14

RANK TRANSFORMATION

/*soh*************************************************************************
Eli Lilly and Company - Global Statistical Sciences
CODE NAME
: smlaba6.sas
CODE TYPE
: program
PROJECT NAME (optional) : h9t-mc-nabj | ly2196044
DESCRIPTION
: laboratory tests - endocrinology
laboratory tests - biomarker
all randomized patients
h9t-mc-nabj - acute therapy phase
SOFTWARE/VERSION#
: sas/version 9.1
INFRASTRUCTURE
: sdd version 3.4
LIMITED-USE MODULES
: ../lums/base_path.sas
../lums/envt_1.sas
../lums/finish.sas
../lums/out2rtf.sas
../lums/ftnote.sas.sas
../lums/ttlfnote.sas
BROAD-USE MODULES
: N/A
INPUT
: ../final/data/shared/ads/subjinfo.sas7bdat
../final/data/shared/ads/labs.sas7bdat
../final/data
/shared/ads/visit.sas7bdat
OUTPUT
: ../final/programs_stat/tfl_output/smlaba61.rtf-table
../final/programs_stat/tfl_output/smlaba62.rtf-table
VALIDATION LEVEL
: 3
REQUIREMENTS
: home/lillyce/qa/ly2196044/h9t_mc_nabj/study_documenta
tion
ASSUMPTIONS
: N/A
--------------------------------------------------------------------------------------------------------------------------------------------------------------BROAD-USE MODULE/LIMITED-USE MODULE SPECIFIC INFORMATION : N/A
BROAD-USE MODULE TEMPORARY OBJECT PREFIX : N/A
PARAMETERS

: N/A

USAGE NOTES

: N/A

TYPICAL WAYS TO EXECUTE THIS CODE AND DESCRIPTION, if applicable : N/A


--------------------------------------------------------------------------------------------------------------------------------------------------------------REVISION HISTORY SECTION :
Author &
Ver# Peer Reviewer
Code History Description
---- ---------------- -----------------------------------------------1.0 Gurprit Singh
Original version of the code
Sudhanshu Chakraborty
**eoh************************************************************************/
%include &base_path;
libname db "&inlib";
libname md "&titlelib";
%put &outfile;
********************************************************************************
****************;

* creating macro smlaba6


;
********************************************************************************
****************;
%macro smlaba6(report_name= , var1=, var2=);
%put*****************now executing macro 'smlaba6'*****************;
********************************************************************************
****************;
*calling the envt_1 macro
;
********************************************************************************
****************;
%envt_1(reportname=&report_name);
********************************************************************************
****************;
*creating subjinfo, labs, visit datasets
;
********************************************************************************
****************;
proc sort data=db.subjinfo out=subjinfo(keep=invid subjid trt trtsort);
by invid subjid;
where subjitttr=1;
run;
proc sort data=db.labs out=labs(keep=invid subjid lbproc lbtest lbtestcd lbrn lb
ru lbnrhi
lbblvaltr lbchgbltr visid lbblflgtr lbfmt perflbnm);
by invid subjid visid;
where compress(lowcase(lbproc))= "&var1" and lowcase(compress(lbrestp))='si'
and visid = int(visid) and lbrn ne . and lbblvaltr ne . ;
run;
proc sort data=db.visit out=visit(keep=invid subjid visid plwkenrl);
by invid subjid visid;
where visid=int(visid);
run;
********************************************************************************
****************;
*merging subjinfo, visit and labs datasets
;
********************************************************************************
****************;
data combine;
merge subjinfo(in=a) labs(in=b);
by invid subjid;
if a and b;
%if %lowcase(&var1) = endo %then %do;
if lowcase(compress(lbtestcd)) in ("k92" "q20" "e38" "e96" "g12" "i72" "s87" "
bf8");
if visid in (3 6 9 11);
%end;
%else %if %lowcase(&var1) = bmkr %then %do;

if lowcase(compress(lbtestcd)) = "md4";
if visid in (3 6 8 10 11);
%end;
run;
proc sort data=combine;
by invid subjid visid;
run;
data combinex;
merge combine(in=a) visit(in=b);
by invid subjid visid;
if a and b;
run;
proc sql noprint;
create table combine1 as
select invid, subjid, lbtestcd, lbtest, lbru, trtsort, trt, visid, lbfmt, lbb
lflgtr, perflbnm,
avg(lbrn) as avg_lbrn, avg(lbchgbltr) as avg_lbchgbltr, avg(lbblvaltr) as avg
_lbblvaltr
from combinex
group by invid, subjid, lbtestcd,lbtest, lbru, visid
order by invid, subjid, lbtestcd,lbtest, lbru, visid, avg_lbrn;
quit;
data combine1;
set combine1;
by invid subjid lbtestcd lbtest lbru visid avg_lbrn;
if last.visid;
run;
proc sort data = combine1(rename=(avg_lbrn=lbrn
avg_lb
chgbltr=lbchgbltr
a
vg_lbblvaltr=lbblvaltr));
by lbtestcd lbtest;
run;
********************************************************************************
****************;
*starting do loop for labtests for each lab procedure
;
********************************************************************************
****************;
proc sql noprint;
select count(distinct lbtestcd) into: labcnt from combine1;
select distinct lbtestcd into: lbcds separated by ":" from combine1;
quit;
options nocenter pageno = 1;
%put &lbcds &labcnt;
%do r = 1 %to &labcnt;
%let lb = %scan(&lbcds,&r,":");

%put &lb;
data to_rank&r;
set combine1;
by lbtestcd lbtest;
if lowcase(compress(lbtestcd)) = lowcase(compress("&lb"));
call symput("cd" , strip(lbtest) ||' (' || strip(lbru) || ')' ) ;
if lbfmt = int(lbfmt) then do;
lbfmt = lbfmt + 3.1;
end;
else lbfmt = 9.3;
run;
%let cda=%nrstr(&cd);
proc sql noprint;
select distinct(lbfmt) into:labformat from to_rank&r ;
select distinct(perflbnm) into:labname from to_rank&r ;
quit;
%let labformat=&labformat;
%let labname=&labname;
********************************************************************************
****************;
*ranking the data
;
********************************************************************************
****************;
proc rank data = to_rank&r out = aa;
by lbtestcd lbtest;
var lbrn ;
ranks temp1;
run;
data bl pbl;
set aa;
if lbblflgtr = 1 then output bl;
if lbblflgtr ^= 1 and 3<=visid<=11 then output pbl;
run;
proc sort data=bl;
by lbtestcd invid subjid visid;
run;
data bl_a;
set bl;
by lbtestcd invid subjid visid;
if last.subjid;
rename temp1=bl_rank;
run;
proc sort data=pbl;
by lbtestcd invid subjid;
run;
data mixin;
merge bl_a(in=a) pbl(in=b);
by lbtestcd invid subjid;

if a and b;
value=temp1-bl_rank;
run;
data mixin&r;
set mixin;
where lowcase(compress(lbtestcd)) = lowcase(compress("&lb"));
run;
********************************************************************************
****************;
*deriving required statistics
;
********************************************************************************
****************;
proc sql
select
select
select
quit;

noprint;
count(distinct subjid) into :trt1&r from db.subjinfo where trtsort = 1;
count(distinct subjid) into :trt2&r from db.subjinfo where trtsort = 2;
count(distinct subjid) into :chk from mixin&r;

%let trt1&r=&&trt1&r;
%let trt2&r=&&trt2&r;
%let chk=&chk;
%if &chk > 0 %then %do;
proc sort data=mixin&r;
by trtsort;
run;
proc univariate data = mixin&r noprint;
by trtsort;
class visid;
var lbchgbltr;
where visid >= 3;
output out = stats0&r n = n1 mean = mean1 std = std1 min = min1 median = mid1
max = max1;
run;
data d1;
trtsort=1;
output;
trtsort=2;
output;
run;
data d2;
set d1;
by trtsort;
if first.trtsort then do;
%do i=4 %to 11;
visid=&i;
n1=0;
output;
%end;
end;
run;

proc sort data=d2;


by trtsort visid;
run;
proc sort data=stats0&r;
by trtsort visid;
run;
data stats0&r;
merge d2 stats0&r;
by trtsort visid;
run;
******************************************************************************;
* macro to find best covariance structure
;
******************************************************************************;
%macro find_cov;
%global covariance;
%put ***********************now executing find_cov macro**********************;
%let cov1 = un;
ods listing close;
ods output convergencestatus=fc_convergence1&r;
proc mixed data = mixin&r method=reml;
class trtsort visid subjid;
model value = trtsort bl_rank visid trtsort*visid bl_rank*visid/ddfm = kr s;
repeated visid /sub = subjid type = &cov1 r rcorr;
lsmeans trtsort trtsort*visid/cl pdiff;
run;
ods listing;
%if %sysfunc(exist(fc_convergence1&r)) %then %do;
proc sort data = fc_convergence1&r;
by status;
run;
%let covariance = &cov1;
data _null_;
set fc_convergence1&r;
call symput ("st&cov1" , compress(put(status,2.)));
run;
%end;
%else %let st&cov1=1;
%if &&st&cov1 ne 0 %then %do;
%let
%let
%let
%let
%let
%let
%let

cov2
cov3
cov4
cov5
cov6
cov7
cov8

=
=
=
=
=
=
=

toep;
cs;
vc;
ar(1);
toeph;
csh;
arh(1);

ods listing close;

%do i = 2 %to 8;
ods output convergencestatus=convergence1&r;
ods output fitstatistics=aic&i.(where = (compress(lowcase(descr)) = "aic(smaller
isbetter)"));
proc mixed data = mixin&r method=reml;
class trtsort visid subjid ;
model value = trtsort bl_rank visid trtsort*visid bl_rank*visid/ddfm = kr s;
repeated visid /sub = subjid type = &&cov&i r rcorr;
lsmeans trtsort trtsort*visid/cl pdiff;
run;
%end;
ods listing;
data finalx&r;
length variable $50;
format _all_;
informat _all_;
set %if %sysfunc(exist(aic2)) %then
%if %sysfunc(exist(aic3)) %then
%if %sysfunc(exist(aic4)) %then
%if %sysfunc(exist(aic5)) %then
%if %sysfunc(exist(aic6)) %then
%if %sysfunc(exist(aic7)) %then
%if %sysfunc(exist(aic8)) %then
%if %sysfunc(exist(aic2)) %then %do;
if b then do;
variable = "&cov2";
ord = 2;
end;
%end;
%if %sysfunc(exist(aic3)) %then %do;
if c then do;
variable = "&cov3";
ord = 3;
end;
%end;
%if %sysfunc(exist(aic4)) %then %do;
if d then do;
variable = "&cov4";
ord = 4;
end;
%end;
%if %sysfunc(exist(aic5)) %then %do;
if e then do;
variable = "&cov5";
ord = 5;
end;
%end;
%if %sysfunc(exist(aic6)) %then %do;
if f then do;
variable = "&cov6";
ord = 6;
end;
%end;
%if %sysfunc(exist(aic7)) %then %do;
if g then do;
variable = "&cov7";
ord = 7;

aic2(in=b);
aic3(in=c);
aic4(in=d);
aic5(in=e);
aic6(in=f);
aic7(in=g);
aic8(in=h);;

end;
%end;
%if %sysfunc(exist(aic8)) %then %do;
if h then do;
variable = "&cov8";
ord = 8;
end;
%end;
run;
********************************************************************************
****************;
*deleting the datasets
;
********************************************************************************
****************;
%do k = 2 %to 8 ;
%if %sysfunc(exist(aic&k)) %then %do;
proc datasets lib = work memtype =data nolist;
delete aic&k ;
run;
%end;
%end;
%if %sysfunc(exist(finalx&r)) %then %do;
proc sql noprint;
select count(*) into :max from finalx&r;
quit;
%let max = &max;
%if &max = 1 %then
proc sql noprint;
select variable
quit;
%end;
%else %if &max > 1
proc sql noprint;
select variable
quit;
%end;
%end;
%end;

%do;
into: covariance from finalx&r;
%then %do;
into: covariance from finalx&r having value = min(value);

%let covariance=&covariance;
%mend find_cov;
%find_cov;
%if %nrbquote(%upcase("&covariance")) = "UN" %then %let covariancemo = unstructu
red;
%else %if %nrbquote(%upcase("&covariance")) = "TOEP" %then %let covariancemo = t
oeplitz;
%else %if %nrbquote(%upcase("&covariance")) = "CS" %then %let covariancemo = com
pound symmetric;
%else %if %nrbquote(%upcase("&covariance")) = "AR(1)" %then %let covariancemo =
autoregressive;

%else %if %nrbquote(%upcase("&covariance"))


iance components;
%else %if %nrbquote(%upcase("&covariance"))
heterogeneous toeplitz;
%else %if %nrbquote(%upcase("&covariance"))
heterogeneous autoregressive(1);
%else %if %nrbquote(%upcase("&covariance"))
terogeneous compound symmetric;

= "VC" %then %let covariancemo = var


= "TOEPH" %then %let covariancemo =
= "ARH(1)" %then %let covariancemo =
= "CSH" %then %let covariancemo = he

******************************************************************************;
* calculating the using proc mixed statistics
;
******************************************************************************;
ods listing close;
proc mixed data = mixin&r method=reml;
class trtsort visid subjid;
model value = trtsort bl_rank visid trtsort*visid bl_rank*visid/ddfm = kr s;
repeated visid /sub = subjid type = &covariance r rcorr;
lsmeans trtsort trtsort*visid/ cl pdiff;
ods output diffs=diffs&r;
run;
ods listing;
proc sort data=stats0&r;
by visid;
run;
proc sort data=visit;
by visid;
run;
data visitx(keep = visid plwkenrl);
set visit;
by visid;
if last.visid;
run;
data statsm&r;
merge stats0&r(in=a) visitx;
by visid;
if a;
run;
%if %sysfunc(mod(&labformat,1)) = 0 %then %do;
data statsm&r;
length visid1 $15 ;
set statsm&r;
visid1 = compress(put(visid,3.)) ||"("|| compress(put(plwkenrl,4.)) ||")";
n = (put(n1,5.));
mean = (put(mean1,&labformat..1));
min = (put(min1,&labformat..1));
mid = (put(mid1,&labformat..1));
max = (put(max1,&labformat..1));
std = (put(std1,&labformat..1));
drop n1 mean1 mid1 min1 max1 std1;
run;
%end;

%else %do;
data statsm&r;
length visid1 $15 ;
set statsm&r;
visid1 = compress(put(visid,3.)) ||"("|| compress(put(plwkenrl,4.)) ||")";
n = (put(n1,5.));
mean = (put(mean1,&labformat.));
min = (put(min1,&labformat.));
mid = (put(mid1,&labformat.));
max = (put(max1,&labformat.));
std = (put(std1,&labformat.));
drop n1 mean1 mid1 min1 max1 std1;
run;
%end;
proc sort data=statsm&r(drop=plwkenrl visid);
by trtsort visid1;
run;
proc transpose data=statsm&r out=aaax prefix = vis name=name;
by trtsort;
id visid1;
var n mean min mid max std;
run;
data final&r;
set aaax;
if compress(lowcase(name))
if compress(lowcase(name))
if compress(lowcase(name))
if compress(lowcase(name))
if compress(lowcase(name))
if compress(lowcase(name))
run;

eq
eq
eq
eq
eq
eq

'n' then ord = 1;


'mean' then ord = 2;
'std' then ord = 3;
'min' then ord = 4;
'mid' then ord = 5;
'max' then ord = 6;

proc sort data=final&r;


by ord;
run;
data temp&r;
length name $25;
trtsort = 1;
name = "Placebo (N=&&trt1&r) ";
ord=0;
output;
trtsort = 2;
name = "LY2196044 (N=&&trt2&r)";
ord=0;
output;
run;
data final1&r;
length name $25;
merge final&r temp&r;
by ord;
run;
proc sort data=final1&r;

by ord trtsort;
run;
%if %sysfunc(exist(diffs&r)) %then %do;
data adiffs&r;
set diffs&r;
if lowcase(compress(effect)) = "trtsort";
keep ord probt trtsort;
ord=0;
trtsort=2;
run;
%end;
%else %do;
data adiffs&r;
ord=0;
probt = . ;
trtsort=2;
run;
%end;
data main&r;
length pmain $10;
merge adiffs&r final1&r;
by ord trtsort;
%if probt ne . %then %do;
pmain = put(probt,pvalj.);
%end;
%else %do;
pmain = "";
%end;
run;
proc sort data = main&r;
by descending trtsort ord ;
run;
%end;
%else %do;
data main&r;
trtsort = . ;
name = "text";
ord = . ;
vis4_1_ = "";
vis5_2_ = "";
vis6_4_ = "";
vis7_6_ = "";
vis8_8_ = "";
vis9_10_ = "";
vis10_12_ = "";
vis11_16_ = "";
pmain = "";
run;
%end;
********************************************************************************
***************;
* creating the format
;

********************************************************************************
***************;
proc format;
value $name
"text" =
"n" =
"mean" =
"std" =
"min" =
"mid" =
"max" =
"pvalue" =
run;

"No
"
"
"
"
"
"
"

Post-baseline records found."


Number of Patients"
Mean"
SD "
Minimum"
Median"
Maximum"
";

ods listing;
%ttlfnote(rptname = &report_name);
********************************************************************************
****************;
*generating the report
;
********************************************************************************
****************;
proc report data = main&r headline missing nowindows split="/";
%if &var1=bmkr %then %do;
column trtsort ord name ("Visit (Week)" "--"
(vis6_4_ vis8_8_ vis10_12_ vis11_16_) pmain);
define trtsort/noprint order order=data;
define ord/noprint order;
define name / "Treatment" width=21 format = $name. left spacing = 1 flow
;
define vis6_4_ / " 6 (4)" width=20 order order = data center;
define vis8_8_ / " 8 (8)" width=20 order order = data center;
define vis10_12_ / " 10 (12)" width=19 order order = data center;
define vis11_16_ / " 11 (16)" width=19 order order = data center;
define pmain / "Main Effect/ p-value*a" width = 21 order order = data ce
nter;
%end;
%else %do;
column trtsort ord name ("Visit (Week)" "--"
(vis6_4_ vis9_10_ vis11_16_) pmain);
define trtsort/noprint order order=data;
define ord/noprint order;
define name / "Treatment" width=21 format = $name. left spacing = 1 flow
;
define
define
define
define

vis6_4_ / "
vis9_10_ / "
vis11_16_ / "
pmain / "Main

6 (4)" width=30 order order = data center;


9 (10)" width=30 order order = data center;
11 (16)" width=20 order order = data center;
Effect/ p-value*a" width = 21 order order = data ce

nter;
%end;
break after trtsort/skip;
compute before _page_;
%ftnote(wrttyp = line, strtclm = 2,opt = tit);

line @2 " ";


line @2 130*"-";
%if &report_name=smlaba62 %then %do;
line @2 "Laboratory Name: &labname" ;
%end;
line @2 "Laboratory Test (unit): &cda" ;
line @2 "Variable Analyzed: Change from Baseline";
endcomp;
compute after _page_;
line @2 130*"-";
%ftnote(wrttyp = line, strtclm = 2,opt = foot);
endcomp;
run;
%end;
proc datasets lib=work memtype=data ;
save _ibx:;
quit;
%mend smlaba6;
***************************************************************************;
* creating macro cal
;
***************************************************************************;
%macro cal(num = );
%put ******************note: now executing macro 'cal'*********************;
filename tmpfile temp;
proc printto print = tmpfile;
run;
***************************************************************************;
* calling smlaba6 macro
;
***************************************************************************;
%if &num = 1 %then %do;
%envt_1(reportname = &report_name);
%smlaba6(report_name=smlaba61, var1= endo, var2=Endocrinology);
%end;
%if &num = 2 %then %do;
%envt_1(reportname = &report_name);
%smlaba6(report_name=smlaba62, var1= bmkr, var2=Biomarker);
%end;
proc printto print = print;
run;
%out2rtf(in=tmpfile,out=&outreport,orient=l,center= , outname=&outreppath);
filename tmpfile clear;
%mend cal;
%cal(num = 1);
%cal(num = 2);

%finish;

Das könnte Ihnen auch gefallen