*************************************************************************************************; * * CLIENT: ModernaTX, Inc. * PROTOCOL: mRNA-1273-P301 * * PURPOSE: Create analysis dataset admb * * INPUT FILES: SDTM domains * OUTPUT FILES: ADMB.sas7bdat * * USAGE NOTES: * *************************************************************************************************; * Copyright 2020 Pharmaceutical Product Development, Inc. * All Rights Reserved. *************************************************************************************************; options noquotelenmax; %include "madam.sas"; **Assign global macro variable DSETNAME to reflect the name of the final ADaM dataset**; %global DSETNAME; %let dsetname = admb; %let adslvar=tr01sdt tr01edt dose2dt dos2dtm tr01sdtm tr01edtm tr02sdt oldos2dt dose1fl dose2fl eosdt dthdt randfl saffl EUAVACDT AP02SDT; **Merge supplemental data onto parent domain**; %revsupp(libin=trans,libout=work,ds=mb,supp=suppmb,outds=mb_all); proc sort tagsort data=mb_all; by usubjid subjid mbcat mbscat mbtestcd mbdtc; where missing(mbstat); run; **INSERT CODE TO GENERATE DATASET**; data mb_adsl; length usubjid $25 subjid $20; merge mb_all(in=a) adb.adsl(in=b keep=USUBJID subjid &adslvar.); by usubjid subjid; if a and b; run; data mb_adsl; length PARAMCD $8 avalc $50 PARAM $50 _: $200; set mb_adsl; * parcat1, paramcd/param; parcat1 = mbcat; PARAMCD = mbtestcd; PARAM = mbtest; * results AVAL; AVAL = .; if mbstresc=:'N' then AVALC = 'Negative'; else if mbstresc=:'D' or mbstresc=:'P' or mbstresc=:'Y' then AVALC = 'Positive'; else AVALC = mbstresc; if mbstresc^=:'See' then _mbstresc = mbstresc; * Analysmb Date/time; rev_mbdtc = tranwrd(mbdtc,'TUN:UN',''); %ISO2SAS(isodate=rev_mbdtc, datec=_mbdtc, daten=ADT, timec=_atmc); if index(_atmc,'--')=0 and ^missing(_atmc) then ATM = input(_atmc,time5.); if index(_atmc,'--')=0 and ^missing(_atmc) and ^missing(ADT) then ori_ADTM = input(compress(put(ADT,date9.)||':'||_atmc),datetime20.); ADTM = .; %caldy(stdt=ADT,endt=TR01SDT,outdy=ADY); * Period; if .tr01sdt>. and ^missing(mbtptnum) then addsortn = put(adt,yymmdd10.)||' - '||put(mbtptnum,z3.); else if (visit=:'Ill' or visit=:'Conva' or index(visit,'OL-D')) and adt>tr01sdt>. and missing(mbtptnum) and index(visit,'Uns') then addsortn = put(adt,yymmdd10.)||' - 999'; else if (visit=:'Ill' or visit=:'Conva' or index(visit,'OL-D')) and adt>tr01sdt>. and missing(mbtptnum) then addsortn = put(adt,yymmdd10.); else if (visit=:'Ill' or visit=:'Conva' or index(visit,'OL-D')) and missing(mbdtc) then addsortn = '0000'; format ADTM datetime20. ADT date9. ATM time5.; run; * Baseline Record Flag & Analysmb Windows & CHG/PCHG; %ablfl(indst=mb_adsl,outdst=base_chg, seq=mbseq, basec=Y, avisit_type=3, stresc=_mbstresc, tpt=, illtpt=mbtpt, tptnum=isstresn_, uns_blank=Y, addsortn=addsortn); proc sort data=base_chg out=base_chg2; by usubjid paramcd mbdtc avisit mbtpt; run; data base_chg2; length ATPT $20; set base_chg2; by usubjid paramcd mbdtc avisit mbtpt; ADTM = ori_ADTM; ** ATPT, ATPTN; if index(avisit,'Ill') then do; ATPT = 'Day '||compress(scan(derived_avisit,2,'Day')); if missing(scheill_update) and missing(MBTPT) and (index(ori_visit,'Uns') or missing(ori_visit)) then do; if ATPT='Day 999' then do; AVISIT = ''; AVISITN = .; end; ATPT = ''; AWRANGE = ''; AWTARGET = .; AWTDIFF = .; end; else if ATPT='Day 999' then do; AVISIT = ''; AVISITN = .; ATPT = ''; AWRANGE = ''; AWTARGET = .; AWTDIFF = .; end; /* Data Issue */ if compress(ATPT) in ('Unscheduled' 'Day' 'DayUnscheduled') then do; ATPT = ''; AWRANGE = ''; AWTARGET = .; AWTDIFF = .; AVISIT = tranwrd(tranwrd(avisit,'Day Unscheduled',''),'Day',''); if _ill_set=0 then AVISITN = 100; else AVISITN = 100*_ill_set; end; if index(ori_visit,'Uns') and ADT-_ill_dat>34 then do; ATPT = ''; AWRANGE = ''; AWTARGET = .; AWTDIFF = .; end; else if index(ori_visit,'Uns') and mbtpt='Day 1' and missing(_ill_dat) and first.mbtpt then do; ATPT = ''; AWRANGE = ''; AWTARGET = .; AWTDIFF = .; end; else if index(ori_visit,'Uns') and mbtpt^='Day 1' and missing(_ill_dat) then do; ATPT = ''; AWRANGE = ''; AWTARGET = .; AWTDIFF = .; end; else if visit='Illness Visit Day 3 - Day 21' and mbtpt='' and missing(_ill_dat) then do; ATPT = ''; AWRANGE = ''; AWTARGET = .; AWTDIFF = .; end; end; if ^missing(ATPT) then ATPTN = input(compress(scan(ATPT,2,' ')),best.); if avisitn>=100 then _uns = 0; run; proc sort tagsort data=base_chg2; by usubjid paramcd avisitn descending _avaln2 _uns descending sort_avalc adt mbtptnum mbseq; run; * Analysmb Flag 01; data admb; set base_chg2; by usubjid paramcd avisitn descending _avaln2 _uns descending sort_avalc adt mbtptnum mbseq; if first.avisitn and _avaln2=1 and avisitn>. then ANL01FL = 'Y'; else if ABLFL='Y' then ANL01FL = 'Y'; STUDYID='mRNA-1273-P301'; /*SDTM DATA ISSUE */ drop &adslvar:; run; **Generate final dataset by updating certain attributes. Optionally merge common variables & create sequence variable as needed**; %TRTA(dsname=&DSETNAME); %adam_dataset_update( ds=&DSETNAME, libin=work, libout=output, adsllib=adb, addcomvar=Y, addseq=, dropinfmt=Y, mapspecfile=&ADAM_SPEC, maploc=&ADAM_SPEC_LOC ); **Generate Value Level Metadata values for the ad dataset**; %* dod_vlm( type=ADAM, selmems=&DSETNAME, excmems=, specloc=&ADAM_SPEC_LOC, specname=&ADAM_SPEC, debug=N ); **Generate Enhanced Controlled Terminology for the ad dataset**; %* dod_enhcd_ct( type=ADAM, selmems=&DSETNAME, excmems=, specloc=&ADAM_SPEC_LOC, specname=&ADAM_SPEC, map_ct_nm=, map_ct_loc=, debug=N );