%macro ad_adsl; *------------------------------------------------------------*; * ADSL.sas creates the ADaM ADSL data set * as permanent SAS datasets to the ADaM libref. *------------------------------------------------------------*; %include "..\setup.sas"; **** CREATE EMPTY ADSL DATASET CALLED EMPTY_ADSL; %let metadatafile=&path/data/adam-metadata/adam_metadata.xlsx; %make_empty_dataset(metadatafile=&metadatafile, dataset=ADSL) ** merge supplemental qualifiers into DM; %mergsupp(sourcelib=sdtm, domains=DM); ** find the change from baseline so that responders can be flagged ; ** (2-point improvement in pain at 6 months); %cfb(indata=sdtm.xp, outdata=responders, dayvar=xpdy, avalvar= xpstresn, keepvars=usubjid visitnum chg); data ADSL; merge EMPTY_ADSL DM (in = inDM) responders (in = inresp where=(visitnum=2)) ; by usubjid; * convert RFSTDTC to a numeric SAS date named TRTSDT; %dtc2dt(RFSTDTC, prefix=TRTS ); * create BRTHDT, RANDDT, TRTEDT; %dtc2dt(BRTHDTC, prefix=BRTH); %dtc2dt(RANDDTC, prefix=RAND); %dtc2dt(RFENDTC, prefix=TRTE); * created flags for ITT and safety-evaluable; ittfl = put(randdt, popfl.); saffl = put(trtsdt, popfl.); trt01p = ARM; trt01a = trt01p; trt01pn = input(put(trt01p, $trt01pn.), best.); trt01an = trt01pn; agegr1n = input(put(age, agegr1n.), best.); agegr1 = put(agegr1n, agegr1_.); RESPFL = put((.z <= chg <= -2), _0n1y.); run; **** SORT ADSL ACCORDING TO METADATA AND SAVE PERMANENT DATASET; %make_sort_order(metadatafile=&metadatafile, dataset=ADSL) proc sort data=adsl (keep = &ADSLKEEPSTRING) out=adam.adsl; by &ADSLSORTSTRING; run; %mend ad_adsl; %macro ad_adae; *---------------------------------------------------------------*; * ADAE.sas creates the ADaM ADAE-structured data set * for AE data (ADAE), saved to the ADaM libref. *---------------------------------------------------------------*; %include "setup.sas"; **** CREATE EMPTY ADAE DATASET CALLED EMPTY_ADAE; options mprint ;*symbolgen; %let metadatafile=&path/data/adam-metadata/ADAM_METADATA.xlsx; %make_empty_dataset(metadatafile=&metadatafile,dataset=ADAE) proc sort data = adam.adsl (keep = usubjid siteid country age agegr1 agegr1n sex race trtsdt trt01a trt01an saffl) out = adsl; by usubjid; data adae; merge sdtm.ae (in = inae) adsl (in = inadsl); by usubjid ; if inae and not inadsl then put 'PROB' 'LEM: Subject missing from ADSL?-- ' usubjid= inae= inadsl= ; rename trt01a = trta trt01an = trtan ; if inadsl and inae; %dtc2dt(aestdtc, prefix=ast, refdt=trtsdt); %dtc2dt(aeendtc, prefix=aen, refdt=trtsdt); if index(AEDECOD, 'PAIN')>0 or AEDECOD='HEADACHE' then CQ01NAM = 'PAIN EVENT'; else CQ01NAM = ' '; aereln = input(put(aerel, $aereln.), best.); aesevn = input(put(aesev, $aesevn.), best.); relgr1n = (aereln); ** group related events (AERELN>0); relgr1 = put(relgr1n, relgr1n.); if astdt>=trtsdt then trtemfl = 'Y'; format astdt aendt yymmdd10.; run; ** assign variable order and labels; data adae; retain &adaeKEEPSTRING; set EMPTY_adae adae; run; **** SORT adae ACCORDING TO METADATA AND SAVE PERMANENT DATASET; %make_sort_order(metadatafile=&metadatafile, dataset=ADAE) proc sort data=adae(keep = &adaeKEEPSTRING) out=adam.adae; by &adaeSORTSTRING; run; %mend ad_adae; %macro ad_adef; *---------------------------------------------------------------*; * ADEF.sas creates the ADaM BDS-structured data set * for efficacy data (ADEF), saved to the ADaM libref. *---------------------------------------------------------------*; %include "setup.sas"; **** CREATE EMPTY ADEF DATASET CALLED EMPTY_ADEF; options mprint ;*symbolgen; %let metadatafile=&path/data/adam-metadata/ADAM_METADATA.xlsx; %make_empty_dataset(metadatafile=&metadatafile,dataset=ADEF) ** calculate changes from baseline for all post-baseline visits; %cfb(indata=sdtm.xp, outdata=adef, dayvar=xpdy, avalvar=xpstresn); proc sort data = adam.adsl (keep = usubjid siteid country age agegr1 agegr1n sex race randdt trt01p trt01pn ittfl) out = adsl; by usubjid; data adef; merge adef (in = inadef) adsl (in = inadsl); by usubjid ; if not(inadsl and inadef) then put 'PROB' 'LEM: Missing subject?-- ' usubjid= inadef= inadsl= ; rename trt01p = trtp trt01pn = trtpn xptest = param xptestcd = paramcd visit = avisit xporres = avalc ; if inadsl and inadef; avisitn = input(put(visitnum, avisitn.), best.); %dtc2dt(xpdtc, refdt=randdt); retain crit1 "Pain improvement from baseline of at least 2 points"; RESPFL = put((.z <= chg <= -2), _0n1y.); if RESPFL='Y' then crit1fl = 'Y'; else crit1fl = 'N'; run; ** assign variable order and labels; data adef; retain &ADEFKEEPSTRING; set EMPTY_ADEF adef; run; **** SORT ADEF ACCORDING TO METADATA AND SAVE PERMANENT DATASET; %make_sort_order(metadatafile=&metadatafile,dataset=ADEF) proc sort data=adef(keep = &ADEFKEEPSTRING) out=adam.adef; by &ADEFSORTSTRING; run; %mend ad_adef; %macro ad_adtte; *---------------------------------------------------------------*; * ADTTE.sas creates the ADaM BDS-structured data set * for a time-to-event analysis (ADTTE), saved to the ADaM libref. *---------------------------------------------------------------*; %include "setup.sas"; **** CREATE EMPTY ADTTE DATASET CALLED EMPTY_ADTTE; options mprint ;*symbolgen; %let metadatafile=&path/data/adam-metadata/ADAM_METADATA.xlsx; %make_empty_dataset(metadatafile=&metadatafile, dataset=ADTTE) proc sort data = adam.adsl (keep = studyid usubjid siteid country age agegr1 agegr1n sex race randdt trt01p trt01pn ittfl trtedt) out = adtte; by usubjid; proc sort data = adam.adef (keep = usubjid paramcd chg adt visitnum xpseq) out = adef; where paramcd='XPPAIN' and visitnum>0 and (chg<0 or chg>0); by usubjid adt; data adef; set adef; by usubjid adt; drop paramcd visitnum; if first.usubjid; run; proc sort data = adam.adae (keep = usubjid cq01nam astdt trtemfl aeseq) out = adae; where cq01nam ne '' and trtemfl='Y'; by usubjid astdt; run; ** keep only the first occurence of a pain event; data adae; set adae; by usubjid astdt; if first.usubjid; run; ** get the sequence number for the last EX record; proc sort data = sdtm.ex (keep = usubjid exseq) out = lstex nodupkey; by usubjid exseq; data lstex; set lstex; by usubjid exseq; if last.usubjid; data adtte; merge adtte (in = inadtte rename=(randdt=startdt)) adef (in = inadef) adae (in = inadae) lstex (in = inlstex) ; by usubjid ; retain param "TIME TO FIRST PAIN RELIEF" paramcd "TTPNRELF"; rename trt01p = trtp trt01pn = trtpn ; length srcvar $10. srcdom $4.; if (.0 and (adt