Document text
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM]***********************************************************************************************;
** Program Name : admh.sas **;** Date Created : 17Nov2021 **;** Programmer Name : **;
** Purpose : Create admh dataset **;** Input data : mh suppmh adsl **;** Output data : admh.sas7bdat **;***********************************************************************************************;options mprint mlogic symbolgen mprint symbolgen mlogic nocenter missing=" ";
proc datasets library=WORK kill nolist nodetails;
quit;
**Setup the environment**;
%let oprot=/Volumes/app/cdars/prod/sites/cdars4/prjC459/nda2_unblinded_esub/sbla1215_esub_sdtm/saseng/cdisc3_0/data/sdtm;%let protori=/Volumes/app/cdars/prod/sites/
cdars4/prjC459/nda2_unblinded_esub/sbla1215_esub_adam/saseng/cdisc3_0;
%let prot=/Volumes/app/cdars/prod/sites/cdars4/prjC459/nda2_unblinded_esub/sbla1215_esub_adam/saseng/cdisc3_0/analysis/eSUB;*Path for external files;%let expath=/Volumes/app/cdars/prod/sites/cdars4/prjC459/nda2_unblinded_esub/sbla1215_esub_adam/saseng/cdisc3_0/output/xpt;
libname dataprot "&oprot." access=readonly;
libname datvprot "&protori./data_vai" access=readonly;libname datvout "&prot./data_vai";libname viewpx "/Volumes/app/saseng/prod/cdisc3_0/view/" access=readonly;
proc printto print="&prot./output/admh.rpt"
log="&prot./logs/admh.log" new;run;
******************************************************************************************;
* Specification 1 *;* Merge MH dataset with SUPPMH dataset. *;******************************************************************************************;
proc sql noprint;
select distinct QNAM into :_suppmh_keep_vars separated by " " from dataprot.suppmh;quit;
*****************************************************************;
*Specification 1: Reading INPUT SDTM and Supplemental Datasets *;*Subsetting Supplemental Dataset based on _supp_subset parameter*;*****************************************************************;
data _spmdel_supp_dsin_subset;
(b) (4), (b)
(6)
FDA-CBER-2022-5812-0072437
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] set dataprot.suppmh;
where;
run;
data _spmdel_sdtm_ds;
set dataprot.mh;run;
*******************************************************************************;
*Specification 2: Supplemental Dataset will be merged with SDTM for all values*;*of IDVAR including missing values. *;* a. Find whether IDVAR has a missing a value *;* b. Calculate number of non-missing values for IDVAR *;* c. Checking whether non-missing value of IDVAR is character or Numeric *;*******************************************************************************;
proc sql noprint;
select NMISS(distinct idvar) into :_cntvar from _spmdel_supp_dsin_subset; select N(distinct idvar) into :_cntvar1 from _spmdel_supp_dsin_subset;quit;
proc sql noprint;
select distinct idvar into :_idvar1 - :_idvar1 from _spmdel_supp_dsin_subset where idvar is not missing;quit;
data _spmdel_supp_dsin_subset_idvar1;
set _spmdel_supp_dsin_subset; where idvar="MHSEQ";run;
************************************************************;
*Specification 3:Tranposing Supplemental Dataset *;************************************************************;
proc sort data=_spmdel_supp_dsin_subset_idvar1;
by studyid usubjid idvar idvarval; quit;
proc transpose data=_spmdel_supp_dsin_subset_idvar1
out=_spmdel_supp_dsin_idvar1_h; by studyid usubjid idvar idvarval; id qnam; idlabel qlabel; var qval; quit; ************************************************************; *Specification 4:Creating IDVAR from IDVARVAL *; ************************************************************;
data _spmdel_temp(keep=MHSEQ);
set _spmdel_sdtm_ds;run;
FDA-CBER-2022-5812-0072438
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM]data _spmdel_suppds1 (drop=idvar idvarval _NAME_ _LABEL_);
set _spmdel_supp_dsin_idvar1_h;
if idvar="MHSEQ";
MHSEQ=input(idvarval, best12.);run;
******************************************************************************;
*Specification 5: If IDVAR is character or Numeric then Merge condition is *;*STUDYID USUBJID IDVAR else when IDVAR is missing the Merge condition will be*;*STUDYID USUBJID *;******************************************************************************;**********************************************************************;*Specification 6: Merging SDTM and intermediate Supplemental Datasets*;**********************************************************************;*******************************************************************************;* SPECIFICATION 1 - Check the existence of keep or drop variables in the *;* keep or drop dataset option and quit if necessary. *;* 1. Call util_parm_valid to check for the valid values of macro variable *;* _join. Valid values are F R L I. Default value is F for full join. *;* 2. Call util_var_exist. *;* 3. If any of the keep or drop variables specified in the keep or drop *;* dataset option do not exist then display an error message in the log *;* and stop further execution of this macro. *;*******************************************************************************;;*******************************************************************************;* SPECIFICATION 2 - Merge the datasets. *;* 1.Sort the datasets by key merge-by variables. *;* 2.Merge the datasets using full join, inner join,left join or right join. *;* Default is full join. *;* 3.Generate a list of subjects not having any matching observations based on *;* key-by variables. *;*******************************************************************************;
proc sort data=_spmdel_sdtm_ds out=_ds1;
by STUDYID USUBJID MHSEQ;run;
proc sort data=_spmdel_suppds1 out=_ds2;
by STUDYID USUBJID MHSEQ;run;
data _spmdel_sdtm_temp_out1;
merge _ds1(in=d1) _ds2(in=d2); by STUDYID USUBJID MHSEQ;
if d1;
run;
;
**********************************************************************;*Specification 7: Final Merged output dataset *;
**********************************************************************;
FDA-CBER-2022-5812-0072439
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM]data _mh;
set _spmdel_sdtm_temp_out1;run;
*********************************************************************;
*Specification 8: Deleting all temporary local datasets *;*********************************************************************;
proc datasets library=work;
delete _spmdel:;quit;
;
******************************************************************************************;* Specification 2 *;* Check for required variables in MH dataset. If missing, then bail out. *;******************************************************************************************;******************************************************************************************;* Specification 1 *;* Call util_chkvars to check for the existence of required and expected variables. *;* Req: STUDYID USUBJID MHSEQ MHTERM MHCAT DICTVER *;* Exp: MHBDSYCD MHSOC *;******************************************************************************************;options MPRINT MLOGIC SYMBOLGEN;options MPRINT SYMBOLGEN MLOGIC;;******************************************************************************************;* Specification 2 *;* If MHCAT or MHTERM have missing values, then drop record and display *;* the dropped record in a supplemental listing. *;******************************************************************************************;
data _mh _droprecs;
set _mh;
if MHCAT eq ' ' or MHTERM eq ' ' then
do; output _droprecs; end; else do; output _mh; end;run;
proc sort data=_droprecs out=_droprecs(keep=STUDYID USUBJID MHSEQ MHTERM MHCAT
DICTVER MHBDSYCD MHSOC); by usubjid;run;
******************************************************************************************;
* Specification 3 *;* Abort the program if required and expected variables do not exist. *;
FDA-CBER-2022-5812-0072440
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM]******************************************************************************************;
;
******************************************************************************************;* Specification 3 *;* Check for the existence of optional and conditional variables before using them. *;******************************************************************************************;options MPRINT MLOGIC SYMBOLGEN;options MPRINT SYMBOLGEN MLOGIC;;******************************************************************************************;* Specification 4 *;* Impute partial date from G_ADMH_DIAGNOSIS_DATE (if exists) into ASTDT with flag ASTDTF.*;* Impute partial date from MHENDTC (if exists) into AENDT with flag AENDTF. *;* Impute partial date from MHDTC (if exists) into ADT with flag ADTF. *;******************************************************************************************;
data _mh;
set _mh; ******************************************************************************************; * SPECIFICATION 1 *; * Call parsem macro for each variable in macro call to split the supplied values into *; * separate words by / delimiter. *; ******************************************************************************************; ; ; ; ; ******************************************************************************************; * SPECIFICATION 2 *; * -Process Date (if requested in macro call) *; * Substring isodate into year, month and day. *; * Based upon _imputation_rule_date (start or stop), impute missing values in date. *; * If _impdateflag is supplied in macro call, then the highest date imputed will *; * be populated. *; * If only year exists, then month and day will be imputed and flag will contain 'M'. *; * if year and month exist, then day will be imputed and flag will contain 'D'. *; ******************************************************************************************;
if ^missing(MHSTDTC) then
do; length yr $4 mm dd $2; yr=substr(MHSTDTC, 1, 4); mm=substr(MHSTDTC, 6, 2); dd=substr(MHSTDTC, 9, 2); ;
if yr ne ' ' then
do; dflag=' ';
if (dd eq " " or dd eq "-T") and mm ne " " then
do; dd='01';
dflag='D';
FDA-CBER-2022-5812-0072441
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] end;
if mm eq " " or mm eq "--" then
do; mm='01'; dd='01'; dflag='M'; end; newdate=(trim(left(yr))||'-'||trim(left(mm))||'-'||trim(left(dd))); ASTDT=input(newdate, ??is8601da.); format ASTDT date9.; ASTDTF=dflag; end; drop yr mm dd dflag newdate; end; ******************************************************************************************; * SPECIFICATION 3 *; * -Process Time (if requested in macro call) *; * Substring isodate into hour, minutes and seconds. *; * Based upon _imputation_rule_time (start or stop), impute missing values in time. *; * If _imptimeflag is supplied in macro call, then the highest time imputed will *; * be populated. *; * If no time exists,then hour, minutes and seconds are imputed and flag will contain 'H'*; * if only hour exists,then minutes and seconds will be imputed and flag will contain 'M'*; * if hour and minutes exist, then seconds will be imputed and flag will contain 'S' *; ******************************************************************************************; ; ******************************************************************************************; * SPECIFICATION 1 *; * Call parsem macro for each variable in macro call to split the supplied values into *; * separate words by / delimiter. *; ******************************************************************************************; ; ; ; ; ******************************************************************************************; * SPECIFICATION 2 *; * -Process Date (if requested in macro call) *; * Substring isodate into year, month and day. *; * Based upon _imputation_rule_date (start or stop), impute missing values in date. *; * If _impdateflag is supplied in macro call, then the highest date imputed will *; * be populated. *; * If only year exists, then month and day will be imputed and flag will contain 'M'. *; * if year and month exist, then day will be imputed and flag will contain 'D'. *; ******************************************************************************************;
if ^missing(MHENDTC) then
do; length yr $4 mm dd $2; yr=substr(MHENDTC, 1, 4); mm=substr(MHENDTC, 6, 2); dd=substr(MHENDTC, 9, 2);
;
FDA-CBER-2022-5812-0072442
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] if yr ne ' ' then
do; dflag=' ';
if (dd eq " " or dd eq "-T") and mm ne " " then
do; fakedate=input(((trim(left(yr))||'-'||trim(left(mm))||'-'||'01')), ??is8601da.); format fakedate date9.; tempdate=intnx('month', fakedate, 1)-1; dd=strip(put(day(tempdate), best.)); dflag='D'; end;
if (dd eq " " or dd eq "-T") and mm eq " " or mm eq "--" then
do; mm='12'; dd='31'; dflag='M'; end; newdate=(trim(left(yr))||'-'||trim(left(mm))||'-'||trim(left(dd))); AENDT=input(newdate, ??is8601da.); format AENDT date9.; AENDTF=dflag; drop fakedate tempdate; end; drop yr mm dd dflag newdate; end; ******************************************************************************************; * SPECIFICATION 3 *; * -Process Time (if requested in macro call) *; * Substring isodate into hour, minutes and seconds. *; * Based upon _imputation_rule_time (start or stop), impute missing values in time. *; * If _imptimeflag is supplied in macro call, then the highest time imputed will *; * be populated. *; * If no time exists,then hour, minutes and seconds are imputed and flag will contain 'H'*; * if only hour exists,then minutes and seconds will be imputed and flag will contain 'M'*; * if hour and minutes exist, then seconds will be imputed and flag will contain 'S' *; ******************************************************************************************; ; ******************************************************************************************; * SPECIFICATION 1 *; * Call parsem macro for each variable in macro call to split the supplied values into *; * separate words by / delimiter. *; ******************************************************************************************; ; ; ; ; ******************************************************************************************; * SPECIFICATION 2 *; * -Process Date (if requested in macro call) *; * Substring isodate into year, month and day. *;
FDA-CBER-2022-5812-0072443
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] * Based upon _imputation_rule_date (start or stop), impute missing values in date. *;
* If _impdateflag is supplied in macro call, then the highest date imputed will *;
* be populated. *; * If only year exists, then month and day will be imputed and flag will contain 'M'. *; * if year and month exist, then day will be imputed and flag will contain 'D'. *; ******************************************************************************************;
if ^missing(MHDTC) then
do; length yr $4 mm dd $2; yr=substr(MHDTC, 1, 4); mm=substr(MHDTC, 6, 2); dd=substr(MHDTC, 9, 2); ;
if yr ne ' ' then
do; dflag=' ';
if (dd eq " " or dd eq "-T") and mm ne " " then
do; dd='01'; dflag='D'; end;
if mm eq " " or mm eq "--" then
do; mm='01'; dd='01'; dflag='M'; end; newdate=(trim(left(yr))||'-'||trim(left(mm))||'-'||trim(left(dd))); ADT=input(newdate, ??is8601da.); format ADT date9.; ADTF=dflag; end; drop yr mm dd dflag newdate; end; ******************************************************************************************; * SPECIFICATION 3 *; * -Process Time (if requested in macro call) *; * Substring isodate into hour, minutes and seconds. *; * Based upon _imputation_rule_time (start or stop), impute missing values in time. *; * If _imptimeflag is supplied in macro call, then the highest time imputed will *; * be populated. *; * If no time exists,then hour, minutes and seconds are imputed and flag will contain 'H'*; * if only hour exists,then minutes and seconds will be imputed and flag will contain 'M'*; * if hour and minutes exist, then seconds will be imputed and flag will contain 'S' *; ******************************************************************************************; ;run;
*****************************************************************************************;
* SPECIFICATION 1: *;
FDA-CBER-2022-5812-0072444
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM]* Protocol Specific Imputation Rules. *;
*****************************************************************************************;
data _mh;
set _mh;run;
;
******************************************************************************************;* Specification 5 *;* Join ADSL variables(identified in ADMH.txt as G_ADSL_VARS) onto MH dataset. *;* Check the existence of reference date variable. *;******************************************************************************************;******************************************************************************************;* Specification 1 *;* Define local and global macro variables. *;******************************************************************************************;******************************************************************************************;* Specification 2 *;* Call utility util_num_periods to get number of periods in ADSL *;* Parse G_ADSL_VARS to get all variables with Period XX *;* Replace Period XX with actual period number *;* Parse APXX variables if not part of G_ADSL_VARS and add them to process. Purpose is to *;* handle them separatly if user does not intend to keep them in final ADAM. *;******************************************************************************************;Options NoMprint NoMlogic MLOGIC;;options MPRINT MLOGIC SYMBOLGEN;options MPRINT SYMBOLGEN MLOGIC;;******************************************************************************************;*Specification 3 *;*Create a list of all Treatment Time related column names from user input of G_ADSL_VARS *;*Create a Master List of all Treatment Time related column names from datvprot.adsl *;*Compare User list with Master List *;*Bailout if any of the columns of Master List are not specified by USER *;******************************************************************************************;
data _tmpcol2(keep=_usrlst);
length _usrlst $20; drop _string; _string="SUBJID SITEID AGE AGEU AGEGR1 AGEGR1N SEX SEXN RACE RACEN ARACE ARACEN RANDFL SAFFL COMPLFL ARM ARMCD ACTARM ACTARMCD TRTSDT TRTSTM TRTSDTM TRTEDT TRTETM TRTEDTM TRT01A TRT01AN TRT02A TRT02AN TRT01P TRT01PN TRT02P TRT02PN TR01SDT TR01STM TR01SDTM TR01EDT TR01ETM TR01EDTM TR02SDT TR02STM TR02SDTM TR02EDT TR02ETM TR02EDTM VAX101 VAX102 VAX10U VAX201 VAX202 VAX20U VAX101DT VAX102DT VAX10UDT VAX201DT VAX202DT VAX20UDT UNBLNDDT RANDDT COHORT COHORTN DOSALVL DOSALVLN DOSPLVL DOSPLVLN DS30KFL PHASE PHASEN AGEGR4 AGEGR4N HIVFL PEDIMMFL PEDREAFL DS3KFL AGETR01 AGETRU01 AP01SDT AP01STM AP01SDTM AP01EDT AP01ETM AP01EDTM AP02SDT AP02STM AP02SDTM AP02EDT AP02ETM AP02EDTM";
do until(_usrlst=' ');
_count+1;
_usrlst=scan(_string, _count);
FDA-CBER-2022-5812-0072445
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] output;
end;
run;
proc sql noprint;
create table _tmpcol4 as select distinct upcase(_usrlst) as _usrlst from _tmpcol2 where upcase(_usrlst) like 'TR%' or upcase(_usrlst) like 'AP%';quit;
proc contents data=datvprot.adsl out=_tmpcol(keep=NAME) noprint;
proc sql noprint; select distinct upcase(NAME) into : _masterlist separated by " " from _tmpcol where (upcase(name) like 'TR%' or upcase(name) like 'AP%') and (prxmatch('/TR\d{2}STM\b/', Name) or prxmatch('/TR\d{2}ETM\b/', Name) or prxmatch('/TR\d{2}SDT\b/', Name) or prxmatch('/TR\d{2}EDT\b/', Name) or upcase(Name) in ('TRTEDT', 'TRTSDT', 'TRTETM', 'TRTSTM') or prxmatch('/AP\d{2}[EDT\b|SDT\b]/', Name) or prxmatch('/AP\d{2}[STM\b|ETM\b]/', Name) or prxmatch('/AP\d{2}[SDTM\b|EDTM\b]/', Name) );quit;
data _tmpcol3(keep=_mstrlst);
length _mstrlst $20; drop _string; _string="TR01EDT TR01ETM TR01SDT TR01STM TR02EDT TR02ETM TR02SDT TR02STM TRTEDT TRTETM TRTSDT TRTSTM";
do until(_mstrlst=' ');
_count+1; _mstrlst=scan(_string, _count); output; end;run;
proc sql noprint;
select distinct(a._mstrlst) into :_usrlst_missing separated by ' ' from _tmpcol3 as a where a._mstrlst not in (select _usrlst from _tmpcol4);quit;
******************************************************************************************;
* Specification 4 *;* Call util_chkvars to check for existence of variables defined in G_ADSL_VARS *;******************************************************************************************;options MPRINT MLOGIC SYMBOLGEN;options MPRINT SYMBOLGEN MLOGIC;;options MPRINT MLOGIC SYMBOLGEN;options MPRINT SYMBOLGEN MLOGIC;;******************************************************************************************;* Specification 5 *;* Call gen_merge_ds to merge the input dataset with adsl dataset by usubjid *;******************************************************************************************;
*******************************************************************************;
FDA-CBER-2022-5812-0072446
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM]* SPECIFICATION 1 - Check the existence of keep or drop variables in the *;
* keep or drop dataset option and quit if necessary. *;
* 1. Call util_parm_valid to check for the valid values of macro variable *;* _join. Valid values are F R L I. Default value is F for full join. *;* 2. Call util_var_exist. *;* 3. If any of the keep or drop variables specified in the keep or drop *;* dataset option do not exist then display an error message in the log *;* and stop further execution of this macro. *;*******************************************************************************;;options MPRINT MLOGIC SYMBOLGEN;options MPRINT MLOGIC SYMBOLGEN;option nonotes;
proc sql noprint;
create table _list_ (name char(32)); insert into _list_ values("G_VEXIST") values(""); select name into:G_NOMATCH separated by ' ' from _list_ where name not in (select name from dictionary.macros); drop table _list_;quit;
option NOTES;
options MPRINT SYMBOLGEN MLOGIC;;
data _null_;
length _retlist _retlst2 $2000 _column $40; dsid=open(upcase("DATVPROT.ADSL")); i=1;
do while (scan("USUBJID SUBJID SITEID AGE AGEU AGEGR1 AGEGR1N SEX SEXN RACE RACEN
ARACE ARACEN RANDFL SAFFL ARM ARMCD ACTARM ACTARMCD TRTSDT TRTSTM TRTSDTM TRTEDT TRTETM TRTEDTM TRT01A TRT01AN TRT02A TRT02AN TRT01P TRT01PN TRT02P TRT02PN TR01SDT TR01STM TR01SDTM TR01EDT TR01ETM TR01EDTM TR02SDT TR02STM TR02SDTM TR02EDT TR02ETM TR02EDTM VAX101 VAX102 VAX10U VAX201 VAX202 VAX20U VAX101DT VAX102DT VAX10UDT VAX201DT VAX202DT VAX20UDT UNBLNDDT RANDDT COHORT COHORTN DOSALVL DOSALVLN DOSPLVL DOSPLVLN DS30KFL PHASE PHASEN AGEGR4 AGEGR4N HIVFL PEDIMMFL PEDREAFL DS3KFL AGETR01 AGETRU01 TR01SDT TR01STM TR01SDTM TR01EDT TR01ETM TR01EDTM TR02SDT TR02STM TR02SDTM TR02EDT TR02ETM TR02EDTM", i, '') > ''); _column=upcase(scan("USUBJID SUBJID SITEID AGE AGEU AGEGR1 AGEGR1N SEX SEXN RACE RACEN ARACE ARACEN RANDFL SAFFL ARM ARMCD ACTARM ACTARMCD TRTSDT TRTSTM TRTSDTM TRTEDT TRTETM TRTEDTM TRT01A TRT01AN TRT02A TRT02AN TRT01P TRT01PN TRT02P TRT02PN TR01SDT TR01STM TR01SDTM TR01EDT TR01ETM TR01EDTM TR02SDT TR02STM TR02SDTM TR02EDT TR02ETM TR02EDTM VAX101 VAX102 VAX10U VAX201 VAX202 VAX20U VAX101DT VAX102DT VAX10UDT VAX201DT VAX202DT VAX20UDT UNBLNDDT RANDDT COHORT COHORTN DOSALVL DOSALVLN DOSPLVL DOSPLVLN DS30KFL PHASE PHASEN AGEGR4 AGEGR4N HIVFL PEDIMMFL PEDREAFL DS3KFL AGETR01 AGETRU01 TR01SDT TR01STM TR01SDTM TR01EDT TR01ETM TR01EDTM TR02SDT TR02STM TR02SDTM TR02EDT TR02ETM TR02EDTM", i, ''));
if varnum(dsid, _column) then
do;
FDA-CBER-2022-5812-0072447
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] _retlist=trim(left(_retlist))||' '||_column;
_retlst2=trim(left(_retlst2))||'/'||_column;
end; i=i+1; end; dsid=close(dsid); call symput('g_vexist', trim(left(compbl(_retlist)))); call symput('g_vexist2', trim(left(_retlst2))||'/');run;
options MPRINT SYMBOLGEN MLOGIC;
;*******************************************************************************;* SPECIFICATION 2 - Merge the datasets. *;* 1.Sort the datasets by key merge-by variables. *;* 2.Merge the datasets using full join, inner join,left join or right join. *;* Default is full join. *;* 3.Generate a list of subjects not having any matching observations based on *;* key-by variables. *;*******************************************************************************;
proc sort data=_mh out=_ds1;
by USUBJID;run;
proc sort data=datvprot.adsl out=_ds2;
by USUBJID;run;
data _mh;
merge _ds1(in=d1) _ds2(in=d2 keep=Usubjid SUBJID SITEID AGE AGEU AGEGR1 AGEGR1N SEX SEXN RACE RACEN ARACE ARACEN RANDFL SAFFL ARM ARMCD ACTARM ACTARMCD TRTSDT TRTSTM TRTSDTM TRTEDT TRTETM TRTEDTM TRT01A TRT01AN TRT02A TRT02AN TRT01P TRT01PN TRT02P TRT02PN TR01SDT TR01STM TR01SDTM TR01EDT TR01ETM TR01EDTM TR02SDT TR02STM TR02SDTM TR02EDT TR02ETM TR02EDTM VAX101 VAX102 VAX10U VAX201 VAX202 VAX20U VAX101DT VAX102DT VAX10UDT VAX201DT VAX202DT VAX20UDT UNBLNDDT RANDDT COHORT COHORTN DOSALVL DOSALVLN DOSPLVL DOSPLVLN DS30KFL PHASE PHASEN AGEGR4 AGEGR4N HIVFL PEDIMMFL PEDREAFL DS3KFL AGETR01 AGETRU01 TR01SDT TR01STM TR01SDTM TR01EDT TR01ETM TR01EDTM TR02SDT TR02STM TR02SDTM TR02EDT TR02ETM TR02EDTM); by USUBJID;
if d1;
run;
;
;
data _mh;
merge _mh (in=a) datvprot.adsl (in=b keep=usubjid); by usubjid;
if a and b;
run;
FDA-CBER-2022-5812-0072448
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM]options MPRINT MLOGIC SYMBOLGEN;
options MPRINT SYMBOLGEN MLOGIC;;******************************************************************************************;* Specification 6 *;* Calculate Study Day *;* If MHCAT is Primary Diagnosis or Secondary Diagnosis then derive ADURN *;* sg4: add GENERAL MEDICAL HISTORY for covid study *;******************************************************************************************;
data _mh;
length ADURU $10.; set _mh; ******************************************************************************************; * Specification 1 *; * Calculate the study day using the dates supplied by the user. *; ******************************************************************************************;
If ^Missing(ASTDT) and ^Missing(TRTSDT) then
do;
If ASTDT lt TRTSDT then
ASTDY=ASTDT - TRTSDT; Else If ASTDT ge TRTSDT then ASTDY=ASTDT - TRTSDT + 1; end; ; ******************************************************************************************; * Specification 1 *; * Calculate the study day using the dates supplied by the user. *; ******************************************************************************************;
If ^Missing(AENDT) and ^Missing(TRTSDT) then
do;
If AENDT lt TRTSDT then
AENDY=AENDT - TRTSDT; Else If AENDT ge TRTSDT then AENDY=AENDT - TRTSDT + 1; end; ;
if upcase(MHCAT) in ('PRIMARY DIAGNOSIS', 'SECONDARY DIAGNOSIS',
'GENERAL MEDICAL HISTORY') then do; _utilflg='N';
if ((_utilflg eq 'Y') and (MHDUR ne ' ')) then
do; ******************************************************************************************; * SPECIFICATION 1 *;
* -Call SAS Function 'call is8601_convert' to convert _isodur duration variable to a SAS*;
FDA-CBER-2022-5812-0072449
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] * time variable. *;
* -By using conversion factor: *;
* -if _conv_to_unit = DAYS, then convert default hours to number of days *; * -if _conv_to_unit = WEEKS, then convert default hours to number of weeks *; * -if _conv_to_unit = MONTHS, then convert default hours to number of months *; * -if _conv_to_unit = YEARS, then convert default hours to number of years *; ******************************************************************************************;
if MHDUR ne ' ' then
do; call is8601_convert('du', 'du', MHDUR, dur1); ; ; ADURN=round((dur1/(24*60*60*365.25)), 0.01); drop dur1; end; else do; ADURN=.; end; ;
if ADURN ne . then
do; ADURU="YEARS"; end; end; else do; ADURN=round(((ADT - ASTDT + 1)/365.25), 0.01);
if ADURN ne . then
do; ADURU="YEARS"; end; end; drop _utilflg; end;run;
******************************************************************************************;
* Specification 7 *;* Attach attributes to all variables as per ADaM Spec *;******************************************************************************************;
proc import file="&expath./comorbidity-categories.xlsx" out=_comobi dbms=xlsx
replace; RXLX; getnames=yes;run;
proc import file="&expath./report-cci-aids-hiv-30oct2020.xlsx" out=_hiv
dbms=xlsx replace;
FDA-CBER-2022-5812-0072450
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] RXLX;
datarow=17;
getnames=no;run;
data _hiv;
set _hiv; CAT='AIDS/HIV';run;
proc import file="&expath./report-cci-any-malignancy-06aug2021.xlsx" out=_mali
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _mali;
set _mali; CAT='Any malignancy';run;
proc import file="&expath./report-cci-cerebrovascular-30oct2020.xlsx" out=_cere
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _cere;
set _cere; CAT='Cerebrovascular disease';run;
proc import file="&expath./report-cci-chf-30oct2020.xlsx" out=_chf dbms=xlsx
replace; RXLX; datarow=17; getnames=no;run;
data _chf;
set _chf; CAT='Congestive heart failure';run;
proc import file="&expath./report-cci-dementia-30oct2020.xlsx" out=_deme
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _deme;
FDA-CBER-2022-5812-0072451
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] set _deme;
CAT='Dementia';
run;
proc import file="&expath./report-cci-diabetes-with-comp-06aug2021.xlsx"
out=_diabe_c dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _diabe_c;
set _diabe_c; CAT='Diabetes with chronic complication';run;
proc import file="&expath./report-cci-diabetes-without-comp-30oct2020.xlsx"
out=_diabe dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _diabe;
set _diabe; CAT='Diabetes without chronic complication';run;
proc import file="&expath./report-cci-hemiplegia-30oct2020.xlsx" out=_hemip
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _hemip;
set _hemip; CAT='Hemiplegia or paraplegia';run;
proc import file="&expath./report-cci-leukemia-30oct2020.xlsx" out=_leuk
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _leuk;
set _leuk; CAT='Leukemia';run;
proc import file="&expath./report-cci-lymphoma-30oct2020.xlsx" out=_lymph
dbms=xlsx replace;
FDA-CBER-2022-5812-0072452
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] RXLX;
datarow=17;
getnames=no;run;
data _lymph;
set _lymph; CAT='Lymphoma';run;
proc import file="&expath./report-cci-metastatic-tumour-30oct2020.xlsx"
out=_metas dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _metas;
set _metas; CAT='Metastatic solid tumor';run;
proc import file="&expath./report-cci-mi-30oct2020.xlsx" out=_mi dbms=xlsx
replace; RXLX; datarow=17; getnames=no;run;
data _mi;
set _mi; CAT='Myocardial infarction';run;
proc import file="&expath./report-cci-mild-liver-30oct2020.xlsx" out=_mild
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _mild;
set _mild; CAT='Mild liver disease';run;
proc import file="&expath./report-cci-mod-sev-liver-06aug2021.xlsx" out=_modsev
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _modsev;
FDA-CBER-2022-5812-0072453
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] set _modsev;
CAT='Moderate or severe liver disease';
run;
proc import file="&expath./report-cci-peptic-ulcer-30oct2020.xlsx" out=_peptic
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _peptic;
set _peptic; CAT='Peptic ulcer disease';run;
proc import file="&expath./report-cci-periph-vasc-30oct2020.xlsx" out=_peri
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _peri;
set _peri; CAT='Peripheral vascular disease';run;
proc import file="&expath./report-cci-pulmonary-30oct2020.xlsx" out=_pulm
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _pulm;
set _pulm; CAT='Chronic pulmonary disease';run;
proc import file="&expath./report-cci-renal-30oct2020.xlsx" out=_renal
dbms=xlsx replace; RXLX; datarow=17; getnames=no;run;
data _renal;
set _renal; CAT='Renal disease';run;
proc import file="&expath./report-cci-rheumatic-06aug2021.xlsx" out=_rheuma
dbms=xlsx replace;
FDA-CBER-2022-5812-0072454
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] RXLX;
datarow=17;
getnames=no;run;
data _rheuma;
set _rheuma; CAT='Rheumatic disease';run;
data _pt;
length a b $ 200 c CAT $ 100; set _hiv _mali _cere _chf _deme _diabe_c _diabe _hemip _leuk _lymph _metas _mi _mild _modsev _peptic _peri _pulm _renal _rheuma; drop d e f;run;
data report_cci;
set _pt; mhptcd=input(b, best.); rename a=term;
proc sort;
by mhptcd;run;
proc transpose data=report_cci out=t_cci prefix=CAT;
by mhptcd term; var CAT;run;
proc sort data=_mh;
by mhptcd;run;
data _mh;
merge _mh (in=a) t_cci(in=b); by mhptcd; if agegr4n=1; if a & b then COMORBFL='Y'; else COMORBFL='N';
if a;
drop _NAME_ term;run;
options MPRINT MLOGIC SYMBOLGEN;
options MPRINT SYMBOLGEN MLOGIC;;
data admh;
retain STUDYID USUBJID SUBJID SITEID MHSEQ MHTERM MHDECOD MHPTCD MHBODSYS
FDA-CBER-2022-5812-0072455
file:///J/...5-0%20(0211)/0211/m5/datasets/c4591001/analysis/adam/programs-6mth/125742-45_S211_M5_c4591001-A_6mth-P-admh-sas.txt[7/5/2023 10:22:48 AM] MHBDSYCD MHLLT MHLLTCD MHPTCD MHHLT MHHLTCD MHHLGT MHHLGTCD MHSOC
MHSOCCD
MHCAT MHSTDTC MHENDTC MHENRTPT MHENTPT DICTVER MHSPID ASTDT ASTDTF ASTDY AENDT AENDTF AENDY COMORBFL CAT1 CAT2 ADT ADTF ADURN ADURU DICTVER USUBJID SUBJID SITEID AGE AGEU AGEGR1 AGEGR1N SEX SEXN RACE RACEN ARACE ARACEN RANDFL SAFFL ARM ARMCD ACTARM ACTARMCD TRTSDT TRTSTM TRTSDTM TRTEDT TRTETM TRTEDTM TRT01A TRT01AN TRT02A TRT02AN TRT01P TRT01PN TRT02P TRT02PN TR01SDT TR01STM TR01SDTM TR01EDT TR01ETM TR01EDTM TR02SDT TR02STM TR02SDTM TR02EDT TR02ETM TR02EDTM VAX101 VAX102 VAX10U VAX201 VAX202 VAX20U VAX101DT VAX102DT VAX10UDT VAX201DT VAX202DT VAX20UDT UNBLNDDT RANDDT COHORT COHORTN DOSALVL DOSALVLN DOSPLVL DOSPLVLN DS30KFL PHASE PHASEN AGEGR4 AGEGR4N HIVFL PEDIMMFL PEDREAFL DS3KFL AGETR01 AGETRU01; attrib ASTDT length=8. label="Analysis Start Date" COMORBFL length=$1. label="Comorbidity Flag" CAT1 length=$100. label="Charlson Comorbidity Index Category 1" CAT2 length=$100. label="Charlson Comorbidity Index Category 2" ASTDTF length=$1. label="Analysis Start Date Imputation Flag" ASTDY label="Analysis Start Relative Day" AENDT length=8. label="Analysis End Date" AENDTF length=$1. label="Analysis End Date Imputation Flag" AENDY label="Analysis End Relative Day" ADT length=8. label="Analysis Date" ADTF length=$1. label="Analysis Date Imputation Flag" ADURN length=8. label="Analysis Duration (N)" ADURU length=$10. label="Analysis Duration Units"; set _mh(keep=STUDYID USUBJID SUBJID SITEID MHSEQ MHTERM MHDECOD MHPTCD MHBODSYS MHBDSYCD MHLLT MHLLTCD MHPTCD MHHLT MHHLTCD MHHLGT MHHLGTCD MHSOC MHSOCCD MHCAT MHSTDTC MHENDTC MHENRTPT MHENTPT DICTVER MHSPID ASTDT ASTDTF ASTDY AENDT AENDTF AENDY COMORBFL CAT1 CAT2 ADT ADTF ADURN ADURU DICTVER USUBJID SUBJID SITEID AGE AGEU AGEGR1 AGEGR1N SEX SEXN RACE RACEN ARACE ARACEN RANDFL SAFFL ARM ARMCD ACTARM ACTARMCD TRTSDT TRTSTM TRTSDTM TRTEDT TRTETM TRTEDTM TRT01A TRT01AN TRT02A TRT02AN TRT01P TRT01PN TRT02P TRT02PN TR01SDT TR01STM TR01SDTM TR01EDT TR01ETM TR01EDTM TR02SDT TR02STM TR02SDTM TR02EDT TR02ETM TR02EDTM VAX101 VAX102 VAX10U VAX201 VAX202 VAX20U VAX101DT VAX102DT VAX10UDT VAX201DT VAX202DT VAX20UDT UNBLNDDT RANDDT COHORT COHORTN DOSALVL DOSALVLN DOSPLVL DOSPLVLN DS30KFL PHASE PHASEN AGEGR4 AGEGR4N HIVFL PEDIMMFL PEDREAFL DS3KFL AGETR01 AGETRU01);run;
options MPRINT MLOGIC SYMBOLGEN;
options MPRINT SYMBOLGEN MLOGIC;;
proc sort data=admh out=datvout.admh(label='Medical History Analysis Dataset');
by MHCAT USUBJID MHSPID MHTERM;run;
proc printto;
run;
FDA-CBER-2022-5812-0072456