*************************************************************************************************; * * CLIENT: ModernaTX, Inc. * PROTOCOL: mRNA-1273-P301 * * PURPOSE: Create analysis dataset adsl * * INPUT FILES: SDTM domains * OUTPUT FILES: ADSL.sas7bdat * * USAGE NOTES: * *************************************************************************************************; * Copyright 2020 Pharmaceutical Product Development, Inc. * All Rights Reserved. *************************************************************************************************; %include "madam.sas"; **Assign global macro variable DSETNAME to reflect the name of the final ADaM dataset**; %global DSETNAME; %let dsetname = adsl; proc format; value $trtn 'Placebo' = 1 'mRNA-1273' = 2; value $trtseqn 'Placebo' = 1 'Placebo-mRNA-1273' = 2 'mRNA-1273' = 3; value $reason 'ADVERSE EVENT' = 'Adverse Event' 'SAE' = 'Serious Adverse Event' 'SERIOUS ADVERSE EVENT' = 'Serious Adverse Event' 'DEATH' = 'Death' 'LOST TO FOLLOW-UP' = 'Lost to Follow-Up' 'PHYSICIAN DECISION' = 'Physician Decision' 'PREGNANCY' = 'Pregnancy' 'PROTOCOL DEVIATION' = 'Protocol Deviation' 'STUDY TERMINATED BY SPONSOR' = 'Study Terminated by Sponsor' 'WITHDRAWAL BY SUBJECT' = 'Withdrawal of Consent by Participant' 'COVID' = 'Due to SARS-CoV-2' 'OTHER' = 'Other'; value rtpcr 1 = 'Negative' 2 = 'Positive'; run; **Merge supplemental data onto parent domain**; %revsupp(libin=trans,libout=work,ds=dm,supp=suppdm,outds=dm_all); %revsupp(libin=trans,libout=work,ds=ds,supp=suppds,outds=ds_all); %revsupp(libin=trans,libout=work,ds=dd,supp=suppdd,outds=dd_all); %revsupp(libin=trans,libout=work,ds=ae,supp=suppae,outds=ae_all); %revsupp(libin=trans,libout=work,ds=ce,supp=suppce,outds=ce_all); %revsupp(libin=trans,libout=work,ds=cm,supp=suppcm,outds=cm_all); %revsupp(libin=trans,libout=work,ds=dv,supp=suppdv,outds=dv_all); %revsupp(libin=trans,libout=work,ds=vs,supp=suppvs,outds=vs_all); %*revsupp(libin=trans,libout=work,ds=ex,supp=suppex,outds=ex_all); data ex_all; set trans.ex; run; %revsupp(libin=trans,libout=work,ds=ie,supp=suppie,outds=ie_all); %revsupp(libin=trans,libout=work,ds=is,supp=suppis,outds=is_all); %revsupp(libin=trans,libout=work,ds=mh,supp=suppmh,outds=mh_all); %revsupp(libin=trans,libout=work,ds=mb,supp=suppmb,outds=mb_all); %revsupp(libin=trans,libout=work,ds=rp,supp=supprp,outds=rp_all); %revsupp(libin=trans,libout=work,ds=sv,supp=suppsv,outds=sv_all); %revsupp(libin=trans,libout=work,ds=face,supp=suppface,outds=face_all); proc sort tagsort data=dm_all; by usubjid subjid; run; proc sort tagsort data=sv_all; by usubjid subjid; run; proc sort tagsort data=ie_all out=ie_sub nodupkey; by usubjid subjid; run; /*************************** ae_all ***************************/ proc sort tagsort data=ae_all out=ae_dth(keep=usubjid subjid aeendtc) nodupkey; by usubjid subjid descending aeendtc; where AESDTH='Y' and ^missing(aeendtc); run; /****************************************************************/ /*************************** ce_all ***************************/ proc sort tagsort data=ce_all out=ce_covid(keep=usubjid cereasoc cestdtc) nodupkey; by usubjid ; where index(CEREASOC,'EVENT MEETS THE CHARTER DEFINITION OF COVID-19'); run; proc sort tagsort data=ce_all out=ce_ser_covid(rename=(cestdtc=ser_cestdtc cereasoc=ser_cereasoc) keep=usubjid cereasoc cestdtc) nodupkey; by usubjid ; where index(CEREASOC,'EVENT MEETS THE CHARTER DEFINITION OF SEVERE COVID-19'); run; /****************************************************************/ /*************************** dd_all ***************************/ data dd_all; set dd_all; array _dthsp(1) $200 DSDTHSP; run; proc sort tagsort data=dd_all; by usubjid subjid; run; /****************************************************************/ /*************************** ds_all ***************************/ data ds_all; set ds_all; *array _irt $200 irtvisdt; if index(epoch,'BLINDED') then _epoch = 'BLINDED'; else if index(epoch,'OPEN') then _epoch = 'OPEN'; run; proc sort tagsort data=ds_all out=ds_irt(rename=(irtvisdt=irtvisdtc) keep=usubjid subjid irtvisdt) nodupkey; by usubjid subjid irtvisdt; where ^missing(irtvisdt); run; proc sort tagsort data=ds_all; by usubjid subjid dsrefid dscat dsscat epoch dsseq; where not (dsterm='RANDOMIZED' and cmiss(dsspid,dsstdtc,enrollyn)=3); run; proc sort tagsort data=ds_all out=ds_open(keep=usubjid subjid dsstdtc rename=(dsstdtc=dsstdtc_open)); by usubjid subjid; where upcase(dsscat)='OPEN LABEL' and DSDECOD='INFORMED CONSENT OBTAINED'; run; proc sort tagsort data=ds_all out=ds_unblind(keep=usubjid subjid dsstdtc rename=(dsstdtc=dsstdtc_ubl)); by usubjid subjid; where DSDECOD='TREATMENT UNBLINDED'; run; data ds_blinded ds_blinded2; set ds_all(where=(upcase(dsscat)^='OPEN LABEL')); by usubjid subjid dsrefid dscat dsscat epoch dsseq; _usubjid=usubjid; dsdecod = put(dsdecod,$reason.); if first.dsscat then output ds_blinded; if first.epoch then output ds_blinded2; run; proc sort tagsort data=ds_blinded; by usubjid subjid descending dsstdtc; run; proc sql; create table enrol_ as select distinct usubjid,subjid,enrollyn,dsrefid from ds_blinded group by usubjid,subjid having dsstdtc=max(dsstdtc); create table enrol_n as select * from enrol_ group by usubjid,subjid having dsrefid=max(dsrefid) order by usubjid,subjid; quit; /****************************************************************/ /*************************** ex_all ***************************/ data ex_all; set trans.ex; where (extrt='mRNA1273' and exdose>0) or extrt^='mRNA1273'; if exstdtc>:exendtc then _exmaxdtc = exstdtc; else _exmaxdtc = exendtc; if missing(exstdtc) then exstdtc=exendtc; if visitnum>=36 then do; EXTRT2 = EXTRT; EXTRT = ''; end; run; proc sort tagsort data=ex_all; by usubjid exstdtc _exmaxdtc visitnum; where ^missing(exstdtc) and index(exstdtc,'-----')=0 and index(visit,'Uns')=0; run; data ex_exstdtc ex_dose1 ex_dose2 ex_old1 ex_old2; length DOSE2 $25; set ex_all; by usubjid exstdtc _exmaxdtc visitnum; if upcase(EXTRT)='PLACEBO' then EXTRT = 'Placebo'; else if upcase(EXTRT)='MRNA-1273' then EXTRT = 'mRNA-1273'; if upcase(EXTRT2)='PLACEBO' then EXTRT2 = 'Placebo'; else if upcase(EXTRT2)='MRNA-1273' then EXTRT2 = 'mRNA-1273'; if first.usubjid then do; _dom_exstdtc = domain; output ex_exstdtc; end; if last.visitnum and visitnum=2 then do; _dom_exdose1 = domain; DOSE1 = EXTRT; DOSE1EDT = _exmaxdtc; output ex_dose1; end; if last.visitnum and visitnum=6 then do; _dom_exdose2 = domain; _dose2dtc = exstdtc; DOSE2 = EXTRT; DOSE2EDT = _exmaxdtc; output ex_dose2; end; if first.visitnum and visitnum=36 then do; exstdtc_old1 = exstdtc; DOSE1_OPEN = EXTRT2; DOSE1EDT_OPEN = _exmaxdtc; OLDOS1FL = 'Y'; output ex_old1; end; if first.visitnum and visitnum=38 then do; exstdtc_old2 = exstdtc; DOSE2_OPEN = EXTRT2; DOSE2EDT_OPEN = _exmaxdtc; OLDOS2FL = 'Y'; output ex_old2; end; run; /****************************************************************/ /*************************** vs_all ***************************/ proc sort tagsort data=vs_all out=vs_sub; by usubjid subjid vstptref vscat vstestcd vstptnum vsdtc; where not missing(vsorres) and ^missing(vsdtc); run; data vs_sar1 vs_sar2; set vs_sub; by usubjid subjid vstptref vscat vstestcd vstptnum vsdtc; * To use for SAR1FL, SAR2FL; if last.vscat and vstestcd='TEMP' and upcase(vscat)='REACTOGENICITY' and index(compress(upcase(vstptref)),'DOSE1') then output vs_sar1; if last.vscat and vstestcd='TEMP' and upcase(vscat)='REACTOGENICITY' and index(compress(upcase(vstptref)),'DOSE2') then output vs_sar2; run; * To use for Height, Weight baseline results; %macro dsmb_or_not_hw; %if %index("&ADAM_SPEC.",DSMB) %then %do; data hei_wei0; merge vs_sub(in=a where=(^missing(vsstresc) and vstestcd in ('HEIGHT' 'WEIGHT' 'BMI'))) dm_all(in=b keep=usubjid subjid rfxstdtc) ds_blinded(where=(dsdecod='RANDOMIZED' and ^missing(dsstdtc)) keep=usubjid subjid dsstdtc dsdecod); by usubjid subjid; if a; run; data hei_wei; merge hei_wei0(in=a) ex_exstdtc(in=b keep=usubjid exstdtc); by usubjid; if a; if missing(rfxstdtc) then rfxstdtc = exstdtc; if missing(rfxstdtc) then do; rfxstdtc = dsstdtc; update_ = 'DSSTDTC'; end; update_rfxstdtc = rfxstdtc; updated_exstdtc = exstdtc; if vsdtc=rfxstdtc and index(vstpt,'POST') then delete; else if index(vsdtc,'T') and index(rfxstdtc,'T') and vsdtc<=rfxstdtc then output; else if (index(vsdtc,'T')=0 or index(rfxstdtc,'T')=0) then do; if cmiss(vsdtc,rfxstdtc)=0 and (substr(vsdtc,1,10)=substr(rfxstdtc,1,10) or vsdtc<=:rfxstdtc) and index(vstpt,'POST')=0 then output; end; drop dsdecod dsstdtc rfxstdtc; run; proc sort tagsort data=hei_wei; by usubjid subjid vstestcd descending vsdtc descending visitnum; run; proc sort tagsort data=hei_wei nodupkey; by usubjid subjid vstestcd; run; %end; %else %if %index("&ADAM_SPEC.",DSMB)=0 %then %do; data hei_wei; merge vs_sub(in=a where=(^missing(vsstresc) and vstestcd in ('HEIGHT' 'WEIGHT' 'BMI'))) dm_all(in=b keep=usubjid subjid rfxstdtc); by usubjid subjid; if a; if vsdtc=rfxstdtc and index(vstpt,'POST') then delete; else if index(vsdtc,'T') and index(rfxstdtc,'T') and vsdtc<=rfxstdtc then output; else if (index(vsdtc,'T')=0 or index(rfxstdtc,'T')=0) then do; if cmiss(vsdtc,rfxstdtc)=0 and (substr(vsdtc,1,10)=substr(rfxstdtc,1,10) or vsdtc<=:rfxstdtc) and index(vstpt,'POST')=0 then output; end; drop rfxstdtc; run; proc sort tagsort data=hei_wei; by usubjid subjid vstestcd descending vsdtc descending visitnum; run; proc sort tagsort data=hei_wei nodupkey; by usubjid subjid vstestcd; run; %end; %mend dsmb_or_not_hw; %dsmb_or_not_hw; /****************************************************************/ /*************************** face_all ***************************/ proc sort tagsort data=face_all out=face_sub; by usubjid fatptref; where missing(fastat) and not missing(fastresc); run; data face_sar1 face_sar2; set face_sub; by usubjid fatptref; if last.fatptref and compress(upcase(fatptref))='DOSE1' %if %index("&ADAM_SPEC.",DSMB) %then %do; and FAEVAL='STUDY SUBJECT' %end; then output face_sar1; if last.fatptref and compress(upcase(fatptref))='DOSE2' %if %index("&ADAM_SPEC.",DSMB) %then %do; and FAEVAL='STUDY SUBJECT' %end; then output face_sar2; run; /*****************************************************************/ /*************************** mh_all ***************************/ proc sort tagsort data=mh_all out=mh_rskf1(keep=usubjid subjid) nodupkey; by usubjid subjid; where MHTERM='LUNG DISEASE' and MHOCCUR='Y' and mhcat='RISK FACTOR FOR COVID-19'; run; proc sort tagsort data=mh_all out=mh_rskf2(keep=usubjid subjid) nodupkey; by usubjid subjid; where MHTERM='CARDIAC DISEASE' and MHOCCUR='Y' and mhcat='RISK FACTOR FOR COVID-19'; run; proc sort tagsort data=mh_all out=mh_rskf3(keep=usubjid subjid) nodupkey; by usubjid subjid; where MHTERM='SEVERE OBESITY' and MHOCCUR='Y' and mhcat='RISK FACTOR FOR COVID-19'; run; proc sort tagsort data=mh_all out=mh_rskf4(keep=usubjid subjid) nodupkey; by usubjid subjid; where MHTERM='DIABETES' and MHOCCUR='Y' and mhcat='RISK FACTOR FOR COVID-19'; run; proc sort tagsort data=mh_all out=mh_rskf5(keep=usubjid subjid) nodupkey; by usubjid subjid; where MHTERM='LIVER DISEASE' and MHOCCUR='Y' and mhcat='RISK FACTOR FOR COVID-19'; run; proc sort tagsort data=mh_all out=mh_rskf6(keep=usubjid subjid) nodupkey; by usubjid subjid; where MHTERM='HIV' and MHOCCUR='Y' and mhcat='RISK FACTOR FOR COVID-19'; run; /*****************************************************************/ /*************************** is_all ***************************/ proc sort tagsort data=is_all out=is_sub; by usubjid iscat isdtc; where not missing(isdtc); run; data is_min is_max; set is_sub; by usubjid iscat isdtc; if first.iscat then output is_min; if last.iscat then output is_max; run; /*****************************************************************/ /*************************** rp_all ***************************/ data rp_all; set rp_all; if rptestcd='CHILDPOT' then _rstestcdn = 0; else if rptestcd='SURSTL' then _rstestcdn = 1; else if rptestcd='PM' then _rstestcdn = 2; else if rptestcd='PARTSTL' then _rstestcdn = 3; else if rptestcd='PREMENAR' then _rstestcdn = 4; else if rptestcd='OTHSYS' then _rstestcdn = 5; else _rstestcdn = 9; run; proc sort tagsort data=rp_all; by usubjid subjid _rstestcdn; run; /****************************************************************/ %macro dsmb_or_not_rtpcr; %if %index("&ADAM_SPEC.",DSMB) %then %do; /*************************** SARS CoV-2 ***************************/ proc sort tagsort data=import.lab out=import_lab; by subjid visit lbdtm; where lbtestcd='39341'; run; data nasal_sars; length SUBJID $20 VISIT $40 LBDTM $25; set extract.nasal_sars; where lbperf='Yes'; SUBJID = subject; VISIT = Foldername; if ^missing(lbdat) then LBDTM = put(datepart(lbdat),yymmdd10.); run; proc sort tagsort data=nasal_sars; by subjid visit lbdtm; run; proc sort tagsort data=trans.dm out=trans_dm; by usubjid; run; proc sort tagsort data=ex_exstdtc out=exstdtc_sub(keep=usubjid exstdtc) nodupkey; by usubjid; run; data rt_pcr; length usubjid $50.; merge import_lab(in=a) nasal_sars(in=b drop=studyid siteid); by subjid visit lbdtm; if a; usubjid='mRNA-1273-P301-'||substr(subjid,1,5)||'-'||substr(subjid,6); drop subjid studyid siteid invid invnam sex race ageu; run; proc sort data=rt_pcr; by usubjid visit lbdtm; run; data rt_pcr_dm; merge rt_pcr(in=a) trans_dm exstdtc_sub; by usubjid; if a; if siresc=:'D' or siresc=:'P' then rtpcrbln = 2; else if ^missing(siresc) then rtpcrbln = 1; update_rfxstdtc = exstdtc; if ^missing(rtpcrbln) then mbstresc = siresc; mbdtc = lbdtm; if substr(lbdtm,1,10)<=:substr(update_rfxstdtc,1,10) and ^missing(update_rfxstdtc) and ^missing(lbdtm) then output; run; proc sort tagsort data=rt_pcr_dm; by usubjid descending lbdtm descending rtpcrbln; run; proc sort tagsort data=rt_pcr_dm nodupkey out=rtpcrbl_u(keep=usubjid subjid mbdtc mbstresc); by usubjid subjid; where ^missing(rtpcrbln); run; /*****************************************************************/ %end; %else %if %index("&ADAM_SPEC.",DSMB)=0 %then %do; /*************************** SARS CoV-2 ***************************/ proc sort tagsort data=mb_all out=mb_set; by usubjid subjid descending localfl visitnum mbdtc; where mbtestcd='SARSCOV2' and not(index(lowcase(mbstresc),'comment') or missing(mbstresc)); run; data mb_set; length USUBJID $25 SUBJID $20; set mb_set; run; * Baseline RT-PCR Test; data mb_set2; set mb_set; by usubjid subjid descending localfl visitnum mbdtc; if mbstresc=:'D' then mbstresc = 'Positive'; retain _localfl; if first.visitnum then _localfl = localfl; if _localfl='' then output; run; proc sort tagsort data=mb_set2; by usubjid subjid visitnum mbdtc; run; data rtpcrbl; merge mb_set2 dm_all(drop=studyid domain); by usubjid subjid; if substr(mbdtc,1,10)<=:substr(rfxstdtc,1,10) and ^missing(rfxstdtc) and ^missing(mbdtc) then output; run; proc sort tagsort data=rtpcrbl; by usubjid subjid descending mbdtc descending mbstresc; run; proc sort tagsort data=rtpcrbl out=rtpcrbl_u(keep=usubjid subjid mbdtc mbstresc) nodupkey; by usubjid subjid; run; * RT-PCR Test for Day 29; data mb_set3; merge mb_set dm_all(drop=studyid domain); by usubjid subjid; if mbstresc=:'D' then mbstresc = 'Positive'; mbdtc_29 = mbdtc; mbstresc_29 = mbstresc; if visit='Visit 2 Day 29' then output; run; proc sort tagsort data=mb_set3; by usubjid subjid descending mbstresc; run; proc sort tagsort data=mb_set3 out=rtpcrbl_u29(keep=usubjid subjid mbdtc_29 mbstresc_29) nodupkey; by usubjid subjid; run; /*****************************************************************/ %end; %mend dsmb_or_not_rtpcr; %dsmb_or_not_rtpcr; /*************************** ELECSYS ***************************/ proc sort tagsort data=is_all out=is_set; by usubjid subjid visitnum isdtc; where ^missing(isorres) and istestcd='SARSCOV2'; run; data elecsbl; merge is_set dm_all(drop=studyid domain); by usubjid subjid; if isstresc=:'D' then isstresc = 'Positive'; if substr(isdtc,1,10)<=:substr(rfxstdtc,1,10) and ^missing(rfxstdtc) and ^missing(isdtc) then output; run; proc sort tagsort data=elecsbl; by usubjid subjid descending isdtc descending isstresc; run; proc sort tagsort data=elecsbl out=elecsbl_u(keep=usubjid subjid isdtc isstresc) nodupkey; by usubjid subjid; run; /*****************************************************************/ **INSERT CODE TO GENERATE DATASET**; data all_merge_subjid; length RSKF1 RSKF2 RSKF3 RSKF4 RSKF5 RSKF6 $200; merge dm_all(in=dm rename=(protver=_protver)) rtpcrbl_u elecsbl_u rtpcrbl_u29 rp_all(where=(_rstestcdn=0) rename=(domain=_dom_chil rpstresc=_rpstresc_chil) keep=usubjid subjid domain rpstresc _rstestcdn) rp_all(where=(^missing(cbrsn)) rename=(domain=_dom_cbrsn) keep=usubjid subjid domain CBRSN) sv_all(where=(index(visit,'759')) rename=(domain=_domain_sv) keep=usubjid subjid domain visit) sv_all(where=(index(visit_old1,'OL-D1') and index(visit_old1,'Uns')=0) rename=(visit=visit_old1 svstdtc=svstdtc_old1) keep=usubjid subjid visit svstdtc) ds_blinded(where=(dsdecod='RANDOMIZED' and ^missing(_randdtc) and ^missing(dsrefid)) rename=(domain=_dom_rand dsstdtc=_randdtc) keep=usubjid subjid dsdecod dsstdtc dsrefid domain) ds_open ds_unblind dd_all(where=(_ddtestcd_dtc='DTHCAUS') rename=(ddtestcd=_ddtestcd_dtc ddstresc=dthcaus) keep=usubjid subjid ddtestcd dddtc DSDTHSP ddstresc) dd_all(where=(_ddtestcd_autop='AUTOPERF') rename=(ddtestcd=_ddtestcd_autop dddtc=_dddtc_auto) keep=usubjid subjid ddtestcd ddorres dddtc) ds_irt ae_dth ie_sub(rename=(domain=_dom_ie) keep=usubjid subjid domain) enrol_n(where=(enrollyn='N') keep=usubjid subjid enrollyn) ds_blinded(where=(dsscat='SCREEN FAILURE')rename=(domain=_dom_scrn) keep=usubjid subjid dsscat domain) ds_blinded(where=(_eos_dsscat='END OF STUDY') rename=(domain=_dom_eos dsstdtc=_eos_dsstdtc dsscat=_eos_dsscat dsdecod=_eos_reason dsterm=_eos_dsterm) keep=usubjid subjid dsscat dsdecod dsstdtc domain dsterm) ds_blinded(where=(_eot_dsscat='STUDY TREATMENT') rename=(domain=_dom_eot dsstdtc=_eot_dsstdtc dsscat=_eot_dsscat dsdecod=_eot_reason dsterm=_eot_dsterm) keep=usubjid subjid dsscat dsdecod dsstdtc domain dsterm) ds_blinded2(where=(_beot_dsscat='STUDY TREATMENT' and index(_beot_epoch,'BLINDED')) rename=(domain=_dom_beot dsstdtc=_beot_dsstdtc dsscat=_beot_dsscat dsdecod=_beot_reason dsterm=_beot_dsterm epoch=_beot_epoch) keep=usubjid subjid dsscat dsdecod dsstdtc domain dsterm epoch) ds_blinded2(where=(_leot_dsscat='STUDY TREATMENT' and index(_leot_epoch,'OPEN')) rename=(domain=_dom_leot dsstdtc=_leot_dsstdtc dsscat=_leot_dsscat dsdecod=_leot_reason dsterm=_leot_dsterm epoch=_leot_epoch) keep=usubjid subjid dsscat dsdecod dsstdtc domain dsterm epoch) mh_rskf1(in=inrskf1) mh_rskf2(in=inrskf2) mh_rskf3(in=inrskf3) mh_rskf4(in=inrskf4) mh_rskf5(in=inrskf5) mh_rskf6(in=inrskf6) vs_all(where=(_vstestcd_hei='HEIGHT' and _vsblfl_hei='Y' and _unit_cm='cm') rename=(domain=_dom_hei vstestcd=_vstestcd_hei vsblfl=_vsblfl_hei vsdtc=_vsdtc_hei vstpt=_vstpt_hei vsstresn=_vsstresn_hei vsstresu=_unit_cm) keep=usubjid subjid domain vstestcd vsblfl vsdtc vstpt vsstresn vsstresu) vs_all(where=(_vstestcd_wei='WEIGHT' and _vsblfl_wei='Y' and _unit_kg='kg') rename=(domain=_dom_wei vstestcd=_vstestcd_wei vsblfl=_vsblfl_wei vsdtc=_vsdtc_wei vstpt=_vstpt_wei vsstresn=_vsstresn_wei vsstresu=_unit_kg) keep=usubjid subjid domain vstestcd vsblfl vsdtc vstpt vsstresn vsstresu) hei_wei(where=(_heitestcd='HEIGHT' and _heiu='cm') rename=(domain=_hei vstestcd=_heitestcd vsstresn=_hein vsstresu=_heiu vsdtc=_vsdtc_hein vstpt=_vstpt_hein) keep=usubjid subjid domain vstestcd vsstresn vsstresu vsdtc vstpt) hei_wei(where=(_weitestcd='WEIGHT' and _weiu='kg') rename=(domain=_wei vstestcd=_weitestcd vsstresn=_wein vsstresu=_weiu vsdtc=_vsdtc_wein vstpt=_vstpt_wein) keep=usubjid subjid domain vstestcd vsstresn vsstresu vsdtc vstpt) vs_sar1(rename=(domain=_dom_vssar1 vsdtc=_vsdtc_sar1) keep=usubjid subjid domain vsdtc) vs_sar2(rename=(domain=_dom_vssar2 vsdtc=_vsdtc_sar2) keep=usubjid subjid domain vsdtc) ;by usubjid subjid; if inrskf1 then RSKF1 = 'Chronic Lung Disease'; if inrskf2 then RSKF2 = 'Significant Cardiac Disease'; if inrskf3 then RSKF3 = 'Severe Obesity'; if inrskf4 then RSKF4 = 'Diabetes'; if inrskf5 then RSKF5 = 'Liver Disease'; if inrskf6 then RSKF6 = 'Human Immunodeficiency Virus Infection'; if dm; run; data all_merge; merge all_merge_subjid(in=a) ce_covid ce_ser_covid ex_exstdtc(keep=usubjid _dom_exstdtc exstdtc) ex_dose1(keep=usubjid _dom_exdose1 DOSE1 DOSE1EDT) ex_dose2(keep=usubjid _dom_exdose2 _dose2dtc DOSE2 DOSE2EDT) ex_old1(keep=usubjid exstdtc_old1 DOSE1_OPEN DOSE1EDT_OPEN OLDOS1FL) ex_old2(keep=usubjid exstdtc_old2 DOSE2_OPEN DOSE2EDT_OPEN OLDOS2FL) face_sar1(rename=(domain=_dom_face1 fadtc=_fadtc_sar1) keep=usubjid domain fadtc) face_sar2(rename=(domain=_dom_face2 fadtc=_fadtc_sar2) keep=usubjid domain fadtc) is_min(where=(index(upcase(_iscat_bind_min),'BINDING')) rename=(domain=_dom_bind_min isdtc=_isdtc_bind_min iscat=_iscat_bind_min) keep=usubjid domain isdtc iscat) is_max(where=(index(upcase(_iscat_bind_max),'BINDING')) rename=(domain=_dom_bind_max isdtc=_isdtc_bind_max iscat=_iscat_bind_max) keep=usubjid domain isdtc iscat) is_min(where=(index(upcase(_iscat_neu_min),'NEUTRALIZING')) rename=(domain=_dom_neu_min isdtc=_isdtc_neu_min iscat=_iscat_neu_min) keep=usubjid domain isdtc iscat) is_max(where=(index(upcase(_iscat_neu_max),'NEUTRALIZING')) rename=(domain=_dom_neu_max isdtc=_isdtc_neu_max iscat=_iscat_neu_max) keep=usubjid domain isdtc iscat) ;by usubjid; if a; run; data assign;* here.scrfailure; length _war RACESPY $200 CHILBPYN $3 PROTVER TRT01P $25 RANDNUM SCOV2BL MINORITY $20 PREVSCR $1 AGEGR1 AGEGR2 STRATAV $40.; set all_merge(rename=(PREVSCR=prevyn)); * Childbearing Potential; CHILBPYN = _rpstresc_chil; CHILDBP = CHILBPYN; * Reason for No Childbearing Potential; CBNRS = cbrsn; * Protocol Version; PROTVER = _protver; * Was this participant screened previously; if ^missing(prevyn) then PREVSCR = PREVYN; * Race Specify; array _spy(9) $200 RACE1 RACE2 RACE3 RACE4 RACE5 RACE6 RACE7 RACE8 RACEOTH; if ^missing(RACE1) then RACE1 = 'White'; if ^missing(RACE2) then RACE2 = 'Black or African American'; if ^missing(RACE3) then RACE3 = 'Asian'; if ^missing(RACE4) then RACE4 = 'American Indian or Alaska Native'; if ^missing(RACE5) then RACE5 = 'Native Hawaiian or other Pacific Islander'; if ^missing(RACE6) then RACE6 = catx(': ','Other',RACEOTH); if ^missing(RACE7) then RACE7 = 'Unknown'; if ^missing(RACE8) then RACE8 = 'Not reported'; if cmiss(RACE1,RACE2,RACE3,RACE4,RACE5,RACE8,RACE6,RACE7)<7 or RACE='MULTIPLE' then RACESPY = catx(', ',RACE1,RACE2,RACE3,RACE4,RACE5,RACE6,RACE7,RACE8); else if upcase(RACE)='OTHER' then RACESPY = RACEOTH; else if ^missing(raceoth) then do; _war = 'Put Aler'||'t_C: RACESPY data issue.'; put _war subjid= RACE= RACEOTH=; if ^missing(RACEOTH) then RACESPY = RACEOTH; end; if RACE not in ('NOT REPORTED' 'UNKNOWN' '') then do; if RACE^='WHITE' then do; RACEGR1N = 2; RACEGR1 = 'Non-caucasian'; end; else if RACE='WHITE' then do; RACEGR1N = 1; RACEGR1 = 'Caucasian'; end; end; * Minority Flag; * Pooled Race and Ethnicity Group 1; if ETHNIC not in ('NOT REPORTED' 'UNKNOWN' '') or RACE not in ('NOT REPORTED' 'UNKNOWN' '') then do; if ETHNIC='HISPANIC OR LATINO' or RACE=:'AMER' or RACE=:'BLACK' or RACE=:'NAT' then MINORITY = 'Minority'; else MINORITY = 'Non-minority'; if not (RACE='WHITE' and ETHNIC^='HISPANIC OR LATINO') then RETHGR1 = 'Communities of Color'; else RETHGR1 = 'White'; if not (RACE='WHITE' and ETHNIC^='HISPANIC OR LATINO') then RETHGR1N = 2; else RETHGR1N = 1; end; * Randomization Number; RANDNUM = DSREFID; * COVID Infection Flag; if mbstresc=:'N' then RTPCRBL = 'Negative'; else if mbstresc=:'D' or mbstresc=:'P' then RTPCRBL = 'Positive'; if isstresc=:'N' then ELECSBL = 'Negative'; else if isstresc=:'P' then ELECSBL = 'Positive'; if RTPCRBL='Positive' or ELECSBL='Positive' then SCOV2BL = 'Positive'; else if RTPCRBL='Negative' and ELECSBL='Negative' then SCOV2BL = 'Negative'; * RT-PCR Test for Day 29; if mbstresc_29=:'N' then RTPCRD29 = 'Negative'; else if mbstresc_29=:'D' or mbstresc_29=:'P' then RTPCRD29 = 'Positive'; * Age Cohort; if lowcase(cohort)='>=18 and <65 years and not at risk' then do; STRATAR = '>=18 and <65 Years and Not at Risk'; STRATARN = 1; end; else if lowcase(cohort)='>=18 and <65 years and at risk' then do; STRATAR = '>=18 and <65 Years and at Risk'; STRATARN = 2; end; else if lowcase(cohort)='>=65 years' then do; STRATAR = '>=65 Years'; STRATARN = 3; end; if AGE>=65 then do; AGEGR1 = '>=65 Years'; AGEGR1N = 2; end; else if .=75 then do; AGEGR2 = '>=75 Years'; AGEGR2N = 3; end; if .. then DTHDT = DTHDT1; else DTHDT = DTHDT2; * TRTSDT/TRTEDT; %ISO2SAS(isodate=rfxstdtc, datec=trtsdtc, daten=TRTSDT,timec=_rfstm); %ISO2SAS(isodate=rfxendtc, datec=trtedtc, daten=TRTEDT,timec=_rfetm); ************************* Blinded Period *******************************; * TR01SDT - Dose1 START DATE in Blinded period; %if %index("&ADAM_SPEC.",DSMB) %then %do; %ISO2SAS(isodate=exstdtc, datec=_rfxstdtc, daten=TR01SDT, timec=_tr01stm); %end; %if %index("&ADAM_SPEC.",DSMB)=0 %then %do; %ISO2SAS(isodate=rfxstdtc, datec=_rfxstdtc, daten=TR01SDT, timec=_tr01stm); %end; if ^missing(_tr01stm) and ^missing(TR01SDT) then TR01SDTM = input(compress(put(TR01SDT,date9.)||':'||_tr01stm),datetime20.); * TR01EDT - Dose1 or Dose 2 END DATE in Blinded period; if DOSE1EDT>:DOSE2EDT then _exmaxdtc = DOSE1EDT; else _exmaxdtc = DOSE2EDT; if TR01SDT=. then _exmaxdtc = ''; %ISO2SAS(isodate=_exmaxdtc, datec=_rfxendtc, daten=TR01EDT, timec=_tr01etm); if ^missing(_tr01etm) and ^missing(TR01EDT) then TR01EDTM = input(compress(put(TR01EDT,date9.)||':'||_tr01etm),datetime20.); * DOSE2DT - Dose2 START DATE in Blinded period; %ISO2SAS(isodate=_dose2dtc, datec=_dose2dt_c, daten=DOSE2DT, timec=_dose2tm); if ^missing(_dose2tm) and ^missing(DOSE2DT) then DOS2DTM = input(compress(put(DOSE2DT,date9.)||':'||_dose2tm),datetime20.); ************************* Open Label *******************************; * TR02SDT - Dose1 START DATE in Open label; %ISO2SAS(isodate=exstdtc_old1, datec=old1dtc, daten=TR02SDT, timec=_old1tm); if ^missing(_old1tm) and ^missing(TR02SDT) then TR02SDTM = input(compress(put(TR02SDT,date9.)||':'||_old1tm),datetime20.); if ^missing(TR02SDT) then SAFCODT = TR02SDT; if ^missing(TR02SDTM) then SAFCODTM = TR02SDTM; * TR02EDT - Dose1 or Dose 2 END DATE in Open label; if DOSE1EDT_OPEN>:DOSE2EDT_OPEN then _exmaxdtc_open = DOSE1EDT_OPEN; else _exmaxdtc_open = DOSE2EDT_OPEN; if TR02SDT=. then _exmaxdtc_open = ''; %ISO2SAS(isodate=_exmaxdtc_open, datec=old2dtc, daten=TR02EDT, timec=_old2tm); if ^missing(_old2tm) and ^missing(TR02EDT) then TR02EDTM = input(compress(put(TR02EDT,date9.)||':'||_old2tm),datetime20.); * OLDOS2DT - Dose2 START DATE in Open label; %ISO2SAS(isodate=DOSE2EDT_OPEN, datec=old29dtc, daten=OLDOS2DT, timec=_old29tm); if ^missing(_old29tm) and ^missing(OLDOS2DT) then OLDO2DTM = input(compress(put(OLDOS2DT,date9.)||':'||_old29tm),datetime20.); * Efficacy Data Cutoff Date/Time; if cmderived='' and CMSTDTC^='' then EUAVACDT = input(substr(CMSTDTC,1,10),yymmdd10.); else if ^missing(sevdes_9) or ^missing(sevdes_13) then EUAVACDT = '11DEC2020'd; else if ^missing(sevdes_10) then EUAVACDT = '18DEC2020'd; else if ^missing(sevdes_11) then EUAVACDT = '27FEB2021'd; if cmderived^='' then do; if CMSTDTC^='' then dev_EUAVACDT1 = input(substr(CMSTDTC,1,10),yymmdd10.); if ^missing(sevdes_9) or ^missing(sevdes_13) then dev_EUAVACDT2 = '11DEC2020'd; else if ^missing(sevdes_10) then dev_EUAVACDT3 = '18DEC2020'd; else if ^missing(sevdes_11) then dev_EUAVACDT4 = '27FEB2021'd; EUAVACDT = max(of dev_EUAVACDT1-dev_EUAVACDT4); end; if EUAVACDT<=TR01EDT then _EUAVACDT = CUTOFFDT; else _EUAVACDT = EUAVACDT; EFFCODT = min(_EUAVACDT,CUTOFFDT); format EFFCODT EUAVACDT dev_EUAVACDT1 dev_EUAVACDT2 dev_EUAVACDT3 dev_EUAVACDT4 EXTDT date9.; run; data dv_effdt; set datev(in=a); * End of Study Date; %ISO2SAS(isodate=_eos_dsstdtc, datec=_eosdtc, daten=EOSDT); if EOSDT=. and DTHDT>. then EOSDT = DTHDT; * End of Treatment Status; %ISO2SAS(isodate=_eot_dsstdtc, datec=_eotdtc, daten=EOTDT); if ^missing(DOSE2DT) then EOTDT = DOSE2DT; %ISO2SAS(isodate=_beot_dsstdtc, datec=_beotdtc, daten=EOT01DT); if ^missing(DOSE2DT) then EOT01DT = DOSE2DT; %CALDY(stdt=EOT01DT,endt=TR01SDT,outdy=EOT01DY); if PDVDT<=TR01EDT then _PDVDT = "&SYSDATE9."d+1; else _PDVDT = PDVDT; if UBLDDT<=TR01EDT then _UBLDDT = "&SYSDATE9."d+1; else _UBLDDT = UBLDDT; if IRTVISDT<=TR01EDT then _IRTVISDT = "&SYSDATE9."d+1; else _IRTVISDT = IRTVISDT; if missing(EOSDT) then _EOSDT = "&SYSDATE9."d+1; else _EOSDT = EOSDT; if missing(DTHDT) then _DTHDT = "&SYSDATE9."d+1; else _DTHDT = DTHDT; * Period 01/02 Start Date; AP01SDT = RANDDT; AP01SSDT = RANDDT; AP02SDT = min(_PDVDT,_UBLDDT,_IRTVISDT); if AP02SDT>="&SYSDATE9."d+1 or AP02SDT>_EOSDT or AP02SDT>_DTHDT then AP02SDT = .; if TR02SDT>. then AP02SSDT = TR02SDT; else AP02SSDT = AP02SDT; * Period 01/02 End Date; if AP02SDT>. then AP01EDT = AP02SDT - 1; else AP01EDT = min(_EOSDT,_DTHDT); if AP01EDT>="&SYSDATE9."d+1 or AP01SDT=. then AP01EDT = .; if AP02SDT>. then AP02EDT = min(_EOSDT,_DTHDT); if AP02EDT>="&SYSDATE9."d+1 or AP02SDT=. then AP02EDT = .; if AP02SSDT>. then AP01SEDT = AP02SSDT - 1; else AP01SEDT = min(_EOSDT,_DTHDT); if AP01SEDT>="&SYSDATE9."d+1 or AP01SSDT=. then AP01SEDT = .; if AP02SSDT>. then AP02SEDT = min(_EOSDT,_DTHDT); if AP02SEDT>="&SYSDATE9."d+1 or AP02SSDT=. then AP02SEDT = .; format TR01SDTM TR01EDTM DOS2DTM datetime20. AP01SDT AP01EDT AP02SDT AP02EDT AP01SSDT AP01SEDT AP02SSDT AP02SEDT date9.; run; /*************************** dv_all ***************************/ proc sort tagsort data=dv_all; by usubjid subjid; run; proc sort tagsort data=dv_all out=dv_1 nodupkey; by usubjid subjid; where index(compress(sevdes),'*1-'); run; proc sort tagsort data=dv_all out=dv_2 nodupkey; by usubjid subjid; where index(compress(sevdes),'*2-'); run; proc sort tagsort data=dv_all out=dv_3 nodupkey; by usubjid subjid; where index(compress(sevdes),'*3-'); run; proc sort tagsort data=dv_all out=dv_8 nodupkey; by usubjid subjid; where index(compress(sevdes),'*8-'); run; proc sort tagsort data=dv_all out=dv_9 nodupkey; by usubjid subjid; where index(compress(sevdes),'*9-'); run; proc sort tagsort data=dv_all out=dv_10 nodupkey; by usubjid subjid; where index(compress(sevdes),'*10-'); run; proc sort tagsort data=dv_all out=dv_11 nodupkey; by usubjid subjid; where index(compress(sevdes),'*11-'); run; data dveff; merge dv_all(in=a) dv_effdt(keep=usubjid subjid EFFCODT); by usubjid subjid; if a; if input(dvstdtc,yymmdd10.)>EFFCODT>. then delete;; run; proc sort tagsort data=dveff out=dv_1eff nodupkey; by usubjid subjid; where index(compress(sevdes),'*1-'); run; proc sort tagsort data=dveff out=dv_2eff nodupkey; by usubjid subjid; where index(compress(sevdes),'*2-'); run; proc sort tagsort data=dveff out=dv_3eff nodupkey; by usubjid subjid; where index(compress(sevdes),'*3-'); run; proc sort tagsort data=dveff out=dv_8eff nodupkey; by usubjid subjid; where index(compress(sevdes),'*8-'); run; data dv_apedt; merge dv_all(in=a) dv_effdt(keep=usubjid subjid AP01EDT); by usubjid subjid; if a; if input(dvstdtc,yymmdd10.)>AP01EDT and dvstdtc^='' then delete; run; proc sort tagsort data=dv_apedt out=dv_1apedt nodupkey; by usubjid subjid; where index(compress(sevdes),'*1-'); run; proc sort tagsort data=dv_apedt out=dv_2apedt nodupkey; by usubjid subjid; where index(compress(sevdes),'*2-'); run; proc sort tagsort data=dv_apedt out=dv_3apedt nodupkey; by usubjid subjid; where index(compress(sevdes),'*3-'); run; proc sort tagsort data=dv_apedt out=dv_8apedt nodupkey; by usubjid subjid; where index(compress(sevdes),'*8-'); run; data dv_apsdt; merge dv_all(in=a) dv_effdt(keep=usubjid subjid AP02SDT); by usubjid subjid; if a; if input(dvstdtc,yymmdd10.)>AP02SDT and AP02SDT>. then delete; run; proc sort tagsort data=dv_apsdt out=dv_1apsdt nodupkey; by usubjid subjid; where index(compress(sevdes),'*1-'); run; /****************************************************************/ proc sql; create table flag1 as select a.*,b.sevdes as sevdes_1apedt from dv_effdt a left join dv_1apedt b on a.usubjid=b.usubjid and a.subjid=b.subjid; create table flag2 as select a.*,b.sevdes as sevdes_2apedt from flag1 a left join dv_2apedt b on a.usubjid=b.usubjid and a.subjid=b.subjid; create table flag3 as select a.*,b.sevdes as sevdes_3apedt from flag2 a left join dv_3apedt b on a.usubjid=b.usubjid and a.subjid=b.subjid; create table flag8 as select a.*,b.sevdes as sevdes_8apedt from flag3 a left join dv_8apedt b on a.usubjid=b.usubjid and a.subjid=b.subjid order by usubjid,subjid; create table flag1sdt as select a.*,b.sevdes as sevdes_1apsdt from flag8 a left join dv_1apsdt b on a.usubjid=b.usubjid and a.subjid=b.subjid; quit; data flag; merge flag1sdt(in=a) dv_1(rename=(sevdes=sevdes_1) keep=usubjid subjid sevdes) dv_2(rename=(sevdes=sevdes_2) keep=usubjid subjid sevdes) dv_3(rename=(sevdes=sevdes_3) keep=usubjid subjid sevdes) dv_8(rename=(sevdes=sevdes_8) keep=usubjid subjid sevdes) dv_1eff(rename=(sevdes=sevdes_1eff) keep=usubjid subjid sevdes) dv_2eff(rename=(sevdes=sevdes_2eff) keep=usubjid subjid sevdes) dv_3eff(rename=(sevdes=sevdes_3eff) keep=usubjid subjid sevdes) dv_8eff(rename=(sevdes=sevdes_8eff) keep=usubjid subjid sevdes); by usubjid subjid; if a; * Randomized Population Flag; if ^missing(_dom_rand) then RANDFL = 'Y'; else RANDFL = 'N'; if ^missing(sevdes_1apsdt) then RANDFL = 'N'; * Safety Population Flag; if (^missing(DOSE1EDT) or ^missing(DOSE2EDT)) and RANDFL='Y' then SAFFL = 'Y'; else SAFFL = 'N'; FASFL = SAFFL; if ^missing(sevdes_8apedt) and ^missing(sevdes_8eff) then SAFFL = 'N'; if (^missing(sevdes_8apedt) and ^missing(sevdes_8eff)) or (^missing(sevdes_2apedt) and ^missing(sevdes_2eff)) then FASFL = 'N'; * Vaccination 1 Flag; if ^missing(_dom_exdose1) then DOSE1FL = 'Y'; else DOSE1FL = 'N'; * Vaccination 2 Flag; if ^missing(_dom_exdose2) then DOSE2FL = 'Y'; else DOSE2FL = 'N'; if missing(OLDOS1FL) then OLDOS1FL = 'N'; if missing(OLDOS2FL) then OLDOS2FL = 'N'; * Completer Study Population Flag; if ^missing(_dom_eos) and upcase(_eos_reason)='COMPLETED' then COMPLFL = 'Y'; else if ^missing(_dom_eos) then COMPLFL = 'N'; else COMPLFL = ''; if ^missing(_domain_sv) and COMPLFL^='Y' then do; _war = 'Put Aler'||'t_C: COMPLFL, Subject '||strip(subjid)||' has final visit at Day 759.'; put _war; end; * First Solicited Safety Population Flag: based on CE; if SAFFL='Y' and (^missing(_fadtc_sar1) or ^missing(_vsdtc_sar1)) then SAR1FL = 'Y'; else SAR1FL = 'N'; * Second Solicited Safety Population Flag: based on CE; if SAFFL='Y' and DOSE2FL='Y' and (^missing(_fadtc_sar2) or ^missing(_vsdtc_sar2)) then SAR2FL = 'Y'; else SAR2FL = 'N'; * Solicited Safety Population Flag; if SAR1FL='Y' or SAR2FL='Y' then SARAFL = 'Y'; else SARAFL = 'N'; * Full Analysis Set bAb Population Flag - Binding Antibodies; if SAFFL='Y' and _isdtc_bind_min<:rfstdtc and ^missing(_isdtc_bind_min) and _isdtc_bind_max>:rfstdtc and ^missing(_isdtc_bind_max) then FASBABFL = 'Y'; else FASBABFL = 'N'; * Full Analysis Set bAb Population Flag - Neutralizing Antibodies; if SAFFL='Y' and _isdtc_neu_min<:rfstdtc and ^missing(_isdtc_neu_min) and _isdtc_neu_max>:rfstdtc and ^missing(_isdtc_neu_max) then FASNABFL = 'Y'; else FASNABFL = 'N'; * Modified Intent to Treat Population Flag; if FASFL='Y' and lowcase(SCOV2BL)='negative' then MITTFL = 'Y'; else MITTFL = 'N'; * COVID-19 Based on Adjudication; %ISO2SAS(isodate=cestdtc, datec=cestdt_c, daten=cestdtn); if ^missing(cereasoc) and cestdtn<=EFFCODT then COVIDAFL = 'Y'; else COVIDAFL = 'N'; %ISO2SAS(isodate=ser_cestdtc, datec=ser_cestdt_c, daten=ser_cestdtn); if ^missing(ser_cereasoc) and ser_cestdtn<=EFFCODT then CVDSVAFL = 'Y'; else CVDSVAFL = 'N'; ** xxDY; if RANDFL='Y' then new_TR01SDT = RANDDT; if SAFFL='Y' then new_TR01SDT = TR01SDT; %CALDY(stdt=EOSDT,endt=new_TR01SDT,outdy=EOSDY); %CALDY(stdt=EOTDT,endt=new_TR01SDT,outdy=EOTDY); run; data adsl; length TRT01A TRT02A $25 DCSREAS DCTREAS DCT01RS DCT02RS $100 DCSREASP DCT01RSP DCT02RSP FASEREAS FASEREAS1 FASEREAS2 SAFEREAS SAFEREAS1 SAFEREAS2 SAR1ERS SAR1ERS1 SAR1ERS2 SAR1ERS3 SAR2ERS SAR2ERS1 SAR2ERS2 SAR2ERS3 SAR2ERS4 PPEREAS PPEREAS1 PPEREAS2 PPEREAS3 PPEREAS4 PPEREAS5 FASBABRS FASNABRS MITTERS MITTERS1 MITTERS2 MITTERS3 MITTERS4 $200 DTHAUTOP $8 EOTSTT EOSSTT EOT01STT EOT02STT $20 TRTSEQP TRTSEQA $30; set flag; * Was autopsy performed; DTHAUTOP = ddorres; * Actual Treatment for Period 01; if index(DOSE1,'RNA') or index(DOSE2,'RNA') then TRT01A = 'mRNA-1273'; else TRT01A = DOSE1; if ^missing(TRT01A) then TRT01AN = input(put(TRT01A,$trtn.),best.); * Actual Treatment for Period 02; if index(DOSE1_OPEN,'RNA') or index(DOSE2_OPEN,'RNA') then TRT02A = 'mRNA-1273'; else TRT02A = DOSE1_OPEN; if ^missing(TRT02A) then TRT02AN = input(put(TRT02A,$trtn.),best.); * Planned Sequence of Treatments; if TRT01PN=1 and TRT02PN^=2 then TRTSEQP = 'Placebo'; else if TRT01PN=1 and TRT02PN=2 then TRTSEQP = 'Placebo-mRNA-1273'; else if TRT01PN=2 then TRTSEQP = 'mRNA-1273'; if ^missing(TRTSEQP) then TRTSEQPN = input(put(TRTSEQP,$trtseqn.),best.); * Actual Sequence of Treatments; if TRT01AN=1 and TRT02AN^=2 then TRTSEQA = 'Placebo'; else if TRT01AN=1 and TRT02AN=2 then TRTSEQA = 'Placebo-mRNA-1273'; else if TRT01AN=2 then TRTSEQA = 'mRNA-1273'; if ^missing(TRTSEQA) then TRTSEQAN = input(put(TRTSEQA,$trtseqn.),best.); * End of Study Status; if COMPLFL='Y' then EOSSTT = 'COMPLETED'; else if COMPLFL='N' then EOSSTT = 'DISCONTINUED'; else if COMPLFL^='Y' and DTHDT>. then EOSSTT = 'DISCONTINUED'; else EOSSTT = 'ONGOING'; if RANDFL='N' then EOSSTT = ''; * Reason for Discontinuation from Study; if COMPLFL='N' then do; DCSREAS = _eos_reason; if upcase(_eos_reason)^=upcase(_eos_dsterm) and upcase(_eos_reason) not in ('COVID' 'DUE TO SARS-COV-2' 'DEATH') and upcase(_eos_dsterm) not in ('COVID' 'DUE TO SARS-COV-2' 'WITHDRAWAL OF CONSENT' 'WITHDRAWAL OF CONSENT BY PARTICIPANT' 'WITHDRAWAL OF CONSENT BY PARTICIPANT,' 'WITHDRAWAL OF CONSENT BY PARTICIPANT.') then DCSREASP = _eos_dsterm; if compress(DCSREASP)='.' then DCSREASP = ''; end; if DCSREAS='' and DTHDT>. then DCSREAS = 'Death'; * Completer Treatment Population Flag; if ^missing(DOSE2DT) then _eotfl = 'Y'; else if ^missing(_dom_eot) and _eot_reason^='COMPLETED' then _eotfl = 'N'; else _eotfl = ''; if ^missing(DOSE2DT) then _beotfl = 'Y'; else if ^missing(_dom_beot) and _beot_reason^='COMPLETED' then _beotfl = 'N'; else _beotfl = ''; if (OLDOS2FL='Y' and TRT01AN^=2) or (OLDOS1FL='Y' and TRT01AN=2) then _leotfl = 'Y'; else if ^missing(_dom_leot) and _leot_reason^='COMPLETED' then _leotfl = 'N'; else _leotfl = ''; * End of Treatment Status; if _eotfl='Y' then EOTSTT = 'COMPLETED'; else if _eotfl='N' then EOTSTT = 'DISCONTINUED'; else EOTSTT = 'ONGOING'; if RANDFL='N' then EOTSTT = ''; * Reason for Discontinuation from Study; if _eotfl='N' then do; DCTREAS = _eot_reason; if upcase(_eot_reason)^=upcase(_eot_dsterm) and upcase(_eot_reason) not in ('COVID' 'DUE TO SARS-COV-2' 'DEATH') and upcase(_eot_dsterm) not in ('COVID' 'DUE TO SARS-COV-2' 'WITHDRAWAL OF CONSENT' 'WITHDRAWAL OF CONSENT BY PARTICIPANT' 'WITHDRAWAL OF CONSENT BY PARTICIPANT,' 'WITHDRAWAL OF CONSENT BY PARTICIPANT.') then DCTREASP = _eot_dsterm; end; * Period 1; if _beotfl='Y' then EOT01STT = 'COMPLETED'; else if _beotfl='N' then EOT01STT = 'DISCONTINUED'; if _beotfl='N' then do; DCT01RS = _beot_reason; if upcase(_beot_reason)^=upcase(_beot_dsterm) and upcase(_beot_reason) not in ('COVID' 'DUE TO SARS-COV-2' 'DEATH') and upcase(_beot_dsterm) not in ('COVID' 'DUE TO SARS-COV-2' 'WITHDRAWAL OF CONSENT' 'WITHDRAWAL OF CONSENT BY PARTICIPANT' 'WITHDRAWAL OF CONSENT BY PARTICIPANT,' 'WITHDRAWAL OF CONSENT BY PARTICIPANT.') then DCT01RSP = _beot_dsterm; end; ** spec udpates; if COMPLFL='N' and DCT01RS='' and EOT01STT^='COMPLETED' then do; EOT01STT = 'DISCONTINUED'; DCT01RS = 'Discontinuation from Study'; end; if TR01SDT=. then call missing(EOT01STT,DCT01RS); * Period 2; if _leotfl='Y' then EOT02STT = 'COMPLETED'; else if _leotfl='N' then EOT02STT = 'DISCONTINUED'; else if (TRT02PN=2 and OLDOS1FL^='Y' and OLDOS2FL^='Y') or (TRT01AN^=2 and TRT02PN=2 and OLDOS2FL^='Y') then EOT02STT = 'ONGOING'; if _leotfl='N' then do; DCT02RS = _leot_reason; if upcase(_leot_reason)^=upcase(_leot_dsterm) and upcase(_leot_reason) not in ('COVID' 'DUE TO SARS-COV-2' 'DEATH') and upcase(_leot_dsterm) not in ('COVID' 'DUE TO SARS-COV-2' 'WITHDRAWAL OF CONSENT' 'WITHDRAWAL OF CONSENT BY PARTICIPANT' 'WITHDRAWAL OF CONSENT BY PARTICIPANT,' 'WITHDRAWAL OF CONSENT BY PARTICIPANT.') then DCT02RSP = _leot_dsterm; end; %ISO2SAS(isodate=_leot_dsstdtc, datec=_leotdtc, daten=EOT02DT); if _leotfl='Y' and OLDOS2FL='Y' and TRT01AN^=2 then EOT02DT = OLDOS2DT; else if _leotfl='Y' and OLDOS1FL='Y' and TRT01AN=2 then EOT02DT = TR02EDT; %CALDY(stdt=EOT02DT,endt=TR02SDT,outdy=EOT02DY); ** spec udpates; if COMPLFL='N' and DCT02RS='' and EOT02STT^='COMPLETED' then do; EOT02STT = 'DISCONTINUED'; DCT02RS = 'Discontinuation from Study'; end; if TR02SDT=. then call missing(EOT02STT,DCT02RS); * Baseline Height (cm); HEIGHTBL = _hein; * Baseline Weight (kg); WEIGHTBL = _wein; * Baseline BMI (kg/m2); if cmiss(HEIGHTBL,WEIGHTBL)=0 then BMIBL = WEIGHTBL/((HEIGHTBL/100)*(HEIGHTBL/100)); * Reason for Safety Set Exclusion; if RANDFL='Y' and SAFFL='N' then SAFEREAS1 = 'Did not receive any vaccination'; FASEREAS1 = SAFEREAS1; if RANDFL='Y' and ((^missing(sevdes_1eff) and ^missing(sevdes_1apedt)) or (^missing(sevdes_2eff) and ^missing(sevdes_2apedt)) or (^missing(sevdes_8eff) and ^missing(sevdes_8apedt))) then FASEREAS2 = 'Had major protocol deviations'; FASEREAS = catx(', ',FASEREAS1,FASEREAS2); if RANDFL='Y' and (^missing(sevdes_1apedt) or ^missing(sevdes_8apedt)) then SAFEREAS2 = 'Had major protocol deviations'; SAFEREAS = catx(', ',SAFEREAS1,SAFEREAS2); * Reason for 1st Solicited Safety Set Exc; if RANDFL='Y' and SAFFL='N' then SAR1ERS1 = 'Did not receive any vaccination'; if RANDFL='Y' and (^missing(sevdes_1apedt) or ^missing(sevdes_8apedt)) then SAR1ERS2 = 'Had major protocol deviations'; if RANDFL='Y' and SAFFL='Y' and SAR1FL='N' then SAR1ERS3 = 'Did not contribute any solicited AR data for Vaccination #1'; SAR1ERS = catx(', ',SAR1ERS1,SAR1ERS2,SAR1ERS3); * Reason for 2nd Solicited Safety Set Exc; if RANDFL='Y' and SAFFL='N' then SAR2ERS1 = 'Did not receive any vaccination'; if RANDFL='Y' and (^missing(sevdes_1apedt) or ^missing(sevdes_8apedt)) then SAR2ERS2 = 'Had major protocol deviations'; if RANDFL='Y' and SAFFL='Y' and DOSE2FL='N' then SAR2ERS3 = 'Did not receive Vaccination #2'; if RANDFL='Y' and SAFFL='Y' and DOSE2FL='Y' and SAR2FL='N' then SAR2ERS4 = 'Did not contribute any solicited AR data for Vaccination #2'; SAR2ERS = catx(', ',SAR2ERS1,SAR2ERS2,SAR2ERS3,SAR2ERS4); * Reason for BAB Full Analysis Set Exc - Binding; if RANDFL='Y' and SAFFL='N' then FASBABRS = 'Did not receive any study vaccination'; else if RANDFL='Y' and SAFFL='Y' and FASBABFL='N' then FASBABRS = 'There were no immunogenicity results at baseline and at least one post-vaccination'; * Reason for NAB Full Analysis Set Exc - Neutralizing; if RANDFL='Y' and SAFFL='N' then FASNABRS = 'Did not receive any study vaccination'; else if RANDFL='Y' and SAFFL='Y' and FASNABFL='N' then FASNABRS = 'There were no immunogenicity results at baseline and at least one post-vaccination'; * Reason for Modified ITT Set Exclusion; if RANDFL='Y' and SAFFL='N' then MITTERS1 = 'Did not receive any vaccination'; if RANDFL='Y' and ((^missing(sevdes_1eff) and ^missing(sevdes_1apedt)) or (^missing(sevdes_8eff) and ^missing(sevdes_8apedt))) then MITTERS2 = 'Had major protocol deviations'; if RANDFL='Y' and lowcase(scov2bl)='positive' then MITTERS3 = 'PCR and/or serology positive at baseline'; if RANDFL='Y' and missing(scov2bl) then MITTERS4 = 'PCR and/or serology missing at baseline'; MITTERS = catx(', ',MITTERS1,MITTERS2,MITTERS3,MITTERS4); * Per-Protocol Population Flag; if MITTFL='Y' and (DOSE2FL='Y' and 21<=DOSE2DT-TR01SDT<=42 and DOSE2DT>. and TR01SDT>.) then PPROTFL = 'Y'; else do; _ppfl='#1'; PPROTFL = 'N'; end; if (^missing(sevdes_1apedt) and ^missing(sevdes_1eff)) or (^missing(sevdes_2apedt) and ^missing(sevdes_2eff)) or (^missing(sevdes_3apedt) and ^missing(sevdes_3eff)) or (^missing(sevdes_8apedt) and ^missing(sevdes_8eff)) then do; _ppfl='#2'; PPROTFL = 'N'; end; if ((TRT01A^=TRT01P and cmiss(DOSE1,DOSE2)<2) or (DOSE1^=DOSE2 and cmiss(DOSE1,DOSE2)=0)) then do; _ppfl='#3'; PPROTFL = 'N'; end; * Reason for Per-Protocol Set Exclusion; if PPROTFL='N' then do; if RANDFL='Y' and MITTFL='N' then PPEREAS1 = 'Excluded from mITT population'; if RANDFL='Y' and DOSE2FL='N' and (EFFCODT-TR01SDT>=42 or (EOTSTT='DISCONTINUED' and .42) then PPEREAS5 = 'Received Vaccination #2 out of window'; PPEREAS = catx(', ',PPEREAS1,PPEREAS2,PPEREAS3,PPEREAS4,PPEREAS5); end; * Pooled Risk Group 1; if RANDFL='Y' and cmiss(RSKF1,RSKF2,RSKF3,RSKF4,RSKF5,RSKF6)=6 then RISKGR1 = 'Not At Risk'; else if RANDFL='Y' then RISKGR1 = 'At Risk'; if RANDFL='Y' and cmiss(RSKF1,RSKF2,RSKF3,RSKF4,RSKF5,RSKF6)=6 then RISKGR1N = 2; else if RANDFL='Y' then RISKGR1N = 1; * Study Duration 1 to 4; if SAFFL='Y' then do; if ^missing(EOSDT) and ^missing(RANDDT) then STUDDUR1 = EOSDT-RANDDT+1; else if missing(EOSDT) and EOSSTT='ONGOING' and ^missing(RANDDT) then STUDDUR1 = CUTOFFDT-RANDDT+1; if ^missing(EOSDT) and ^missing(TR01SDT) then STUDDUR2 = EOSDT-TR01SDT+1; else if missing(EOSDT) and EOSSTT='ONGOING' and ^missing(TR01SDT) then STUDDUR2 = CUTOFFDT-TR01SDT+1; if ^missing(EOSDT) and ^missing(DOSE2DT) then STUDDUR3 = EOSDT-DOSE2DT+1; else if missing(EOSDT) and EOSSTT='ONGOING' and ^missing(DOSE2DT) then STUDDUR3 = CUTOFFDT-DOSE2DT+1; else if DOSE2FL='N' then STUDDUR3 = 0; end; if ^missing(TR01SDT) and ^missing(DOSE2DT) then STUDDUR4 = DOSE2DT - TR01SDT; * Study Duration 5 to 6; _ap02sdt = AP02SDT; if _ap02sdt=. then _ap02sdt = EOSDT; if _ap02sdt=. then _ap02sdt = CUTOFFDT; if _ap02sdt>. and RANDDT>. then STUDDUR5 = _ap02sdt - RANDDT + 1; _eosdt = EOSDT; if _eosdt=. then _eosdt = CUTOFFDT; if AP02SDT<=CUTOFFDT and _eosdt>. and AP02SDT>. then STUDDUR6 = _eosdt - AP02SDT + 1; * Time to Death; if DTHDT>. and TR01SDT>. then TTDTH1 = DTHDT - TR01SDT; if DTHDT>. and AP02SDT>. then TTDTH2 = DTHDT - AP02SDT; *drop _:; run; %if %index("&ADAM_SPEC.",DSMB) %then %do; proc sort tagsort data=adsl out=create_adsl; by subjid; run; proc sql; create table raw_unblnd as select distinct subject as subjid length=20,UNBLND_MRNA, datepart(UNBLND_IFCDAT) as UICDT format date9., datepart(UNBLNDDAT) as UBLDDT format date9. from extract.unblnd where UNBLND_MRNA='Yes' order by subjid; create table raw_ex as select distinct subject as subjid length=20,EXTRT2 as raw_EXTRT2, datepart(EXSTDAT) as OLD1DT format date9.,EXSTDTTIM as OLD1DTM from extract.ex where FOLDERNAME='Participant Decision Visit / OL-D1' and (EXYN='Yes' or upcase(EXTRT2)='MRNA-1273') order by subjid; create table raw_visit as select distinct subject as subjid length=20, datepart(VISITDAT) as PDVDT format date9. from extract.visit where index(FolderName,'Participant Decision Visit') order by subjid; quit; data adsl; merge create_adsl(in=a) raw_unblnd raw_ex raw_visit; by subjid; if a; ACOHORT = STRATAR; ACOHORTN = STRATARN; SARFL = SARAFL; if SCOV2BL='Negative' then COV19BL = 'Seronegative'; else if SCOV2BL='Positive' then COV19BL = 'Seropositive'; if ^missing(UNBLND_MRNA) then TRT02P = 'mRNA-1273'; if ^missing(raw_EXTRT2) then TRT02A = 'mRNA-1273'; run; %end; ** HERE library, stat datasets as IMPORTED data; data random_list; length usubjid $25. subjid $9.; set here.random_list(rename=(usubjid=usubjid0 subjid=subjid0)); usubjid=usubjid0; subjid=subjid0; run; proc sort tagsort data=random_list; by usubjid subjid; run; proc sort tagsort data=adsl; by usubjid subjid; run; data ccias_unblinded; length usubjid $25.; set here.ccias_unblinded(rename=(usubjid=usubjid1)); usubjid=usubjid1; run; proc sort tagsort data=ccias_unblinded nodupkey; by usubjid subjid; run; proc sort tagsort data=ccias_unblinded out=ccias_acovid nodupkey; by usubjid subjid; where ACOVIDFL='Y'; run; proc sort tagsort data=ccias_unblinded out=ccias_infect nodupkey; by usubjid subjid; where ACOVIDFL='Y' or INFECTFL='Y'; run; proc sort tagsort data=ccias_unblinded out=ccias_notrand nodupkey; by usubjid subjid; where (ACOVIDFL='Y' or INFECTFL='Y') and RANDSFL^='Y'; run; data additional_subcohort_unblinded; length usubjid $25.; set here.additional_subcohort_unblinded(rename=(usubjid=usubjid2)); usubjid=usubjid2; run; proc sort tagsort data=additional_subcohort_unblinded nodupkey; by usubjid subjid; run; data adsl2; length PPSIEREA1 PPSIEREA2 PPSIEREA3 PPSIEREA4 PPSIEREA5 PPSIEREA6 $200 USUBJID $25.; merge adsl(in=a) ccias_unblinded(in=b keep=usubjid subjid RANDSFL) additional_subcohort_unblinded(in=c keep=usubjid subjid) random_list(in=d keep=usubjid subjid) ccias_acovid(in=e keep=usubjid subjid) ccias_infect(in=f keep=usubjid subjid) ccias_notrand(in=g keep=usubjid subjid); by usubjid subjid; if d and RANDFL='Y' then RIGYAFL = 'Y'; else RIGYAFL = 'N'; if RANDFL='Y' and RANDSFL='Y' then RANDIGFL = 'Y'; else RANDIGFL = 'N'; if b and RANDFL='Y' then CCIASFL = 'Y'; else CCIASFL = 'N'; if c and RANDFL='Y' then RIG1DFL = 'Y'; else RIG1DFL = 'N'; if SCOV2BL='Negative' and (RANDIGFL='Y' or (TRT01PN=2 and e)) then COP1FL = 'Y'; else COP1FL = 'N'; if SCOV2BL='Negative' and (RANDIGFL='Y' or (TRT01PN=2 and f)) then COP2FL = 'Y'; else COP2FL = 'N'; if b and not (TRT01PN=1 and SCOV2BL='Negative' and g) and RANDFL='Y' then IGSFL = 'Y'; else IGSFL = 'N'; * Per-Protocol Random Subcohort for IG; * Below is similiar with PPROTFL/PPEREAS; if RANDIGFL='Y' and (DOSE2FL='Y' and 21<=DOSE2DT-TR01SDT<=42 and DOSE2DT>. and TR01SDT>.) and not ( ((^missing(sevdes_1apedt) and ^missing(sevdes_1eff)) or (^missing(sevdes_2apedt) and ^missing(sevdes_2eff)) or (^missing(sevdes_3apedt) and ^missing(sevdes_3eff)) or (^missing(sevdes_8apedt) and ^missing(sevdes_8eff)))) and missing(RSKF6) then PPSIFL = 'Y'; else do; _ppsifl='#1'; PPSIFL = 'N'; end; if ((TRT01A^=TRT01P and cmiss(DOSE1,DOSE2)<2) or (DOSE1^=DOSE2 and cmiss(DOSE1,DOSE2)=0)) then do; _ppsifl='#2'; PPSIFL = 'N'; end; if PPSIFL='N' then do; if RANDFL='Y' and RANDIGFL='N' then PPSIEREA1 = 'Not in random subcohort for immunogenicity'; if RANDFL='Y' and DOSE2FL='N' and (EFFCODT-TR01SDT>=42 or (EOTSTT='DISCONTINUED' and .42) then PPSIEREA5 = 'Received Vaccination #2 out of window'; if ^missing(RSKF6) then PPSIEREA6 = 'Human Immunodeficiency Virus Infection'; PPSIEREA = catx(', ',PPSIEREA1,PPSIEREA2,PPSIEREA3,PPSIEREA4,PPSIEREA5,PPSIEREA6); end; run; proc sort tagsort data=adsl2 out=adsl; by usubjid subjid; format _all_; run; %CLN_CARRIAGE(libin=work,selmems=&DSETNAME,enhanced=Y,from='0d0a0cC2A0'x,to='2020202020'x); **Generate final dataset by updating certain attributes. Optionally merge common variables & create sequence variable as needed**; %adam_dataset_update( ds=&DSETNAME, libin=work, libout=output, adsllib=adb, addcomvar=n, addseq=, dropinfmt=Y, mapspecfile=&ADAM_SPEC, maploc=&ADAM_SPEC_LOC, debug=N ); **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 );