SAS Programs For Making SDTM DM and EX Datasets: Yupeng Wang, PH.D., Data Scientist
SAS Programs For Making SDTM DM and EX Datasets: Yupeng Wang, PH.D., Data Scientist
Raw data
1. Metadata
1
Clinical Trials – Make SDTM DM and EX datasets
2. DM raw data
2
Clinical Trials – Make SDTM DM and EX datasets
Programs
Program 1: make_empty_dataset.sas
MACRO PARAMETERS:
metadatafile = the MS Excel file containing the dataset metadata
dataset = the dataset or domain name you want to extract*/
%macro make_empty_dataset(metadatafile=,dataset=);
proc import
datafile="&metadatafile"
out=_temp
dbms=xlsx
replace;
sheet="VARIABLE_METADATA";
run;
if _n_=1 then
call symput("vars", compress(put(nobs,3.)));
3
Clinical Trials – Make SDTM DM and EX datasets
retain keepstring;
keepstring = compress(keepstring) || "|" || left(variable);
if eof then
call symputx(upcase(compress("&dataset" || 'KEEPSTRING')),
left(trim(translate(keepstring," ","|"))));
run;
%mend make_empty_dataset;
Program 2: dm.sas
%include '/folders/myfolders/test1/common.sas';
%common;
proc format;
value trt
1 = "Active"
0 = "Placebo";
value gender
1 = "M"
2 = "F"
3 = "U";
value race
1 = "White"
2 = "Black"
3 = "Other";
run;
data source.demographic;
infile infl dlm='2C0D'x dsd missover;
length dob1 $10
randdt1 $10;
input subject trt gender race orace $ dob1 $ randdt1 $;
dob=input(dob1,mmddyy10.);
randdt=input(randdt1,mmddyy10.);
format dob randdt mmddyy10.;
uniqueid = 'UNI' || put(subject,3.);
gender1=put(gender,gender.);
4
Clinical Trials – Make SDTM DM and EX datasets
race1=put(race,race.);
trt1=put(trt,trt.);
label subject = "Subject Number"
trt = "Treatment"
gender = "Gender"
race = "Race"
orace = "Oher Race Specify"
dob = "Date of Birth"
uniqueid = "Company Wide Subject ID"
randdt = "Randomization Date";
drop dob1 randdt1 gender race;
rename gender1=gender race1=race;
run;
Program 3: ds.sas
%include '/folders/myfolders/test1/common.sas';
%common;
data source.dosing;
set ds.Sheet1;
if find(startdt,'/') then
do;
array var1(3) $4.;
do i=1 to 3;
var1(i)=scan(startdt,i,"/");
if var1(i)=' ' then
var1(i)='1';
end;
startdt1=mdy(input(var1(1),$4.), input(var1(2),$4.) , input(var1(3),$4.));
end;
else
startdt1=input(startdt,$10.)-21916;
if find(enddt,'/') then
do;
array var2(3) $4.;
do i=1 to 3;
var2(i)=scan(enddt,i,"/");
if var2(i)=' ' then
var2(i)='1';
end;
enddt1=mdy(input(var2(1),$4.), input(var2(2),$4.) , input(var2(3),$4.));
end;
else
enddt1=input(enddt,$10.)-21916;
uniqueid = 'UNI' || put(subject,3.);
format startdt1 enddt1 mmddyy10.;
drop i startdt enddt var11-var13 var21-var23;
rename startdt1=startdt enddt1=enddt;
run;
5
Clinical Trials – Make SDTM DM and EX datasets
Program 4: make_sort_order.sas
/* make_sort_order.sas creates a global macro variable called SORTSTRING where ** is the name of the dataset that
contains the metadata specified sort order for a given dataset.
MACRO PARAMETERS:
metadatafile = the file containing the dataset metadata
dataset = the dataset or domain name*/
%macro make_sort_order(metadatafile=,dataset=);
proc import
datafile="&metadatafile"
out=_temp
dbms=xlsx
replace;
sheet="TOC_METADATA";
run;
%mend make_sort_order;
Program 5: STDM_DM.sas
/* STDM_DM.sas creates the SDTM DM and SUPPDM datasets and saves them as permanent SAS datasets to the target
libref */
%include '/folders/myfolders/test1/common.sas';
%common;
**** GET FIRST AND LAST DOSE DATE FOR RFSTDTC AND RFENDTC;
proc sort
data=source.dosing(keep=subject startdt enddt)
out=dosing;
by subject startdt;
run;
6
Clinical Trials – Make SDTM DM and EX datasets
if first.subject then
do;
firstdose = .;
lastdose = .;
end;
firstdose = min(firstdose,startdt,enddt);
lastdose = max(lastdose,startdt,enddt);
drop startdt enddt;
if last.subject;
run;
data demog_dose;
merge demographic
dosing;
by subject;
run;
%include '/folders/myfolders/test1/make_sort_order.sas';
%make_sort_order(metadatafile=/folders/myfolders/test1/SDTM_METADATA.xlsx,dataset=DM);
proc sort
data=dm(keep = &DMKEEPSTRING)
7
Clinical Trials – Make SDTM DM and EX datasets
out=target.dm;
by &DMSORTSTRING;
run;
data suppdm;
set EMPTY_SUPPDM
dm;
keep &SUPPDMKEEPSTRING;
%make_sort_order(metadatafile=/folders/myfolders/test1/SDTM_METADATA.xlsx,dataset=SUPPDM);
proc sort
data=suppdm
out=target.suppdm;
by &SUPPDMSORTSTRING;
run;
Program 6: STDM_EX.sas
/* STDM_EX.sas creates the SDTM EX dataset and saves it as a permanent SAS dataset to the target libref */
%include '/folders/myfolders/test1/common.sas';
%common;
8
Clinical Trials – Make SDTM DM and EX datasets
%make_empty_dataset(metadatafile=/folders/myfolders/test1/SDTM_METADATA.xlsx,datase
t=EX);
%include '/folders/myfolders/test1/make_sdtm_dy2.sas';
%include '/folders/myfolders/test1/make_sort_order.sas';
studyid = 'XYZ123';
domain = 'EX';
usubjid = left(uniqueid);
exdose = dailydose;
exdostot = dailydose;
exdosu = 'mg';
exdosfrm = 'TABLET, COATED';
exstdtc=put(startdt,yymmdd10.);
exendtc=put(enddt,yymmdd10.);
run;
proc sort
data=ex;
by usubjid;
run;
if inex;
%make_sdtm_dy(refdate=rfstdtc,date=exstdtc);
%make_sdtm_dy(refdate=rfstdtc,date=exendtc);
**** in this simplistic case all subjects received the treatment they were
randomized to;
extrt = arm;
run;
9
Clinical Trials – Make SDTM DM and EX datasets
retain exseq;
if first.usubjid then
exseq = 1;
else
exseq = exseq + 1;
proc sort
data=ex(keep = &EXKEEPSTRING)
out=target.ex;
by &EXSORTSTRING;
run;
10