Clinwright Public work of Clinwright examples · free Start free

ADADAS

ADAS-Cog Analysis

BASIC DATA STRUCTURE · one record per subject per parameter per analysis visit per analysis date · keys USUBJID, PARAMCD, AVISIT, ADT

Variables

VariableLabelTypeLengthDerivation
STUDYIDStudy IdentifiertextPredecessor ADSL.STUDYID
SITEIDStudy Site IdentifiertextPredecessor ADSL.SITEID
SITEGR1Pooled Site Group 1textPredecessor ADSL.SITEGR1
USUBJIDUnique Subject IdentifiertextPredecessor QS.USUBJID
TRTSDTDate of First Exposure to Treatmentinteger8Predecessor ADSL.TRTSDT
TRTEDTDate of Last Exposure to Treatmentinteger8Predecessor ADSL.TRTEDT
TRTPPlanned TreatmenttextPredecessor ADSL.TRT01P
TRTPNPlanned Treatment (N)integer8Predecessor ADSL.TRT01PN
AGEAgeinteger8Predecessor ADSL.AGE
AGEGR1Pooled Age Group 1textPredecessor ADSL.AGEGR1
AGEGR1NPooled Age Group 1 (N)integer8Predecessor ADSL.AGEGR1N
RACERacetextPredecessor ADSL.RACE
RACENRace (N)integer8Predecessor ADSL.RACEN
SEXSextextPredecessor ADSL.SEX
ITTFLIntent-to-Treat Population FlagtextPredecessor ADSL.ITTFL
EFFFLEfficacy Population FlagtextPredecessor ADSL.EFFFL
COMP24FLCompleters of Week 24 Population FlagtextPredecessor ADSL.COMP24FL
AVISITAnalysis VisittextDerived based on windowing algorithm described in SAP, Section 8.2
AVISITNAnalysis Visit (N)integer8Assigned Sponsor
VISITVisit NametextPredecessor QS.VISIT
VISITNUMVisit Numberinteger8Predecessor QS.VISITNUM
ADYAnalysis Relative Dayinteger8ADY = ADT - TRTSDT + 1, if ADT>=TRTSDT. ADY = ADT - TRTSDT, if ADT<TRTSDT.
ADTAnalysis Dateinteger8SAS date from QS.QSDTC
PARAMParametertextPredecessor QS.QSTEST
PARAMCDParameter CodetextPredecessor QS.QSTESTCD
PARAMNParameter (N)integer8Assigned Sponsor
AVALAnalysis Valueinteger8
BASEBaseline Valueinteger8QS.QSSTRESN when QS.QSBLFL=Y (QS.VISITNUM=3)
CHGChange from Baselineinteger8AVAL - BASE, for post baseline records.
PCHGPercent Change from Baselineinteger8100* (CHG/BASE), for post baseline records.
ABLFLBaseline Record FlagtextPredecessor QS.QSBLFL
ANL01FLAnalysis Record Flag 01textIf multiple visits fall into the same visit window, then the one closest to the target date is chosen for analysis. These are flagged with ANL01FL="Y".
DTYPEDerivation TypetextValue: LOCF denotes that the LOCF imputation method was used to impute the value for the given parameter and analysis visit.
AWRANGEAnalysis Window Valid Relative RangetextWindow range, specified in the SAP.
AWTARGETAnalysis Window Targetinteger8Target day within the window, specified in the SAP.
AWTDIFFAnalysis Window Diff from Targetinteger8Absolute difference between AWTARGET and ADY
AWLOAnalysis Window Beginning Timepointinteger8Start day of the window, specified in the SAP.
AWHIAnalysis Window Ending Timepointinteger8End day of the window, specified in the SAP.
AWUAnalysis Window UnittextAssigned as "DAYS".
QSSEQSequence Numberinteger8Predecessor QS.QSSEQ

Program adadas.sas

Version 1, written from Clinwright's patterns, 2026-10-17, checks passed.

/*==== 00-header ====*/
/*----------------------------------------------------------------------------
  Data set : ADADAS (ADAS-Cog Analysis)
  Reporting effort : CSR
  ADaM     : ADSL
  The header and the finalize step follow from the specification.
----------------------------------------------------------------------------*/
libname sdtm "/work/sdtm" access=readonly;
libname adam "/work/adam";
options validvarname=upcase nofmterr msglevel=i;

/*==== 10-inputs ====*/
/* The QS records of the parameters PARAMCD's codelist lists, with the subject's TRTSDT, TRTEDT, STUDYID, SITEID, SITEGR1, TRT01P, TRT01PN, AGE, AGEGR1, AGEGR1N, RACE, RACEN, SEX, ITTFL, EFFFL, COMP24FL from ADSL. */
proc sort data=sdtm.qs(keep=studyid domain usubjid qsseq qstestcd qstest qsorres qsstresc qsstresn qsblfl visitnum visit qsdtc where=(qstestcd in ('ACITM01', 'ACITM02', 'ACITM03', 'ACITM04', 'ACITM05', 'ACITM06', 'ACITM07', 'ACITM08', 'ACITM09', 'ACITM10', 'ACITM11', 'ACITM12', 'ACITM13', 'ACITM14'))) out=work._ds; by usubjid; run;
proc sort data=adam.adsl(keep=usubjid trtsdt trtedt studyid siteid sitegr1 trt01p trt01pn age agegr1 agegr1n race racen sex ittfl efffl comp24fl) out=work._adsl; by usubjid; run;
data work._ds;
  merge work._ds(in=_in) work._adsl;
  by usubjid;
  if _in;
  length trtp $200;
  trtp = trt01p;
  trtpn = trt01pn;
  length param $200;
  select (upcase(qstestcd));
    when ('ACITM01') param = 'Word Recall Task';
    when ('ACITM02') param = 'Naming Objects And Fingers (Refer To 5 C';
    when ('ACITM03') param = 'Delayed Word Recall';
    when ('ACITM04') param = 'Commands';
    when ('ACITM05') param = 'Constructional Praxis';
    when ('ACITM06') param = 'Ideational Praxis';
    when ('ACITM07') param = 'Orientation';
    when ('ACITM08') param = 'Word Recognition';
    when ('ACITM09') param = 'Attention/Visual Search Task';
    when ('ACITM10') param = 'Maze Solution';
    when ('ACITM11') param = 'Spoken Language Ability';
    when ('ACITM12') param = 'Comprehension Of Spoken Language';
    when ('ACITM13') param = 'Word Finding Difficulty In Spontaneous S';
    when ('ACITM14') param = 'Recall Of Test Instructions';
    otherwise param = '';
  end;
  if param = '' then do;
  select (upcase(qstest));
    when ('WORD RECALL TASK') param = 'Word Recall Task';
    when ('NAMING OBJECTS AND FINGERS (REFER TO 5 C') param = 'Naming Objects And Fingers (Refer To 5 C';
    when ('DELAYED WORD RECALL') param = 'Delayed Word Recall';
    when ('COMMANDS') param = 'Commands';
    when ('CONSTRUCTIONAL PRAXIS') param = 'Constructional Praxis';
    when ('IDEATIONAL PRAXIS') param = 'Ideational Praxis';
    when ('ORIENTATION') param = 'Orientation';
    when ('WORD RECOGNITION') param = 'Word Recognition';
    when ('ATTENTION/VISUAL SEARCH TASK') param = 'Attention/Visual Search Task';
    when ('MAZE SOLUTION') param = 'Maze Solution';
    when ('SPOKEN LANGUAGE ABILITY') param = 'Spoken Language Ability';
    when ('COMPREHENSION OF SPOKEN LANGUAGE') param = 'Comprehension Of Spoken Language';
    when ('WORD FINDING DIFFICULTY IN SPONTANEOUS S') param = 'Word Finding Difficulty In Spontaneous S';
    when ('RECALL OF TEST INSTRUCTIONS') param = 'Recall Of Test Instructions';
    when ('ADAS-COG(11) SUBSCORE') param = 'Adas-Cog(11) Subscore';
    otherwise param = qstest;
  end;
  end;
  length paramcd $200;
  paramcd = qstestcd;
  aval = qsstresn;
  length ablfl $200;
  ablfl = qsblfl;
run;

/*==== 20-parameters ====*/
/* PARAMN: the code of PARAM. */
proc format;
  invalue paramn_ (upcase just)

    "WORD RECALL TASK" = 1

    "NAMING OBJECTS AND FINGERS (REFER TO 5 C" = 2

    "DELAYED WORD RECALL" = 3

    "COMMANDS" = 4

    "CONSTRUCTIONAL PRAXIS" = 5

    "IDEATIONAL PRAXIS" = 6

    "ORIENTATION" = 7

    "WORD RECOGNITION" = 8

    "ATTENTION/VISUAL SEARCH TASK" = 9

    "MAZE SOLUTION" = 10

    "SPOKEN LANGUAGE ABILITY" = 11

    "COMPREHENSION OF SPOKEN LANGUAGE" = 12

    "WORD FINDING DIFFICULTY IN SPONTANEOUS S" = 13

    "RECALL OF TEST INSTRUCTIONS" = 14

    "ADAS-COG(11) SUBSCORE" = 15

    other = .;
run;
data work._ds;
  set work._ds;
  if param ne '' then paramn = input(param, paramn_.);
run;

/*==== 25-derived-parameters ====*/
/* AVAL of ACTOT (Adas-Cog(11) Subscore): the sum of ACITM01, ACITM02, ACITM04, ACITM05, ACITM06, ACITM07, ACITM08, ACITM11, ACITM12, ACITM13, ACITM14 at the same visit. */
proc sort data=work._ds(where=(paramcd in ('ACITM01', 'ACITM02', 'ACITM04', 'ACITM05', 'ACITM06', 'ACITM07', 'ACITM08', 'ACITM11', 'ACITM12', 'ACITM13', 'ACITM14'))) out=work._items; by usubjid visitnum; run;
data work._total;
  set work._items;
  by usubjid visitnum;
  retain _sum _n;
  if first.visitnum then do; _sum = 0; _n = 0; end;
  if not missing(aval) then do; _sum = _sum + aval; _n = _n + 1; end;
  if last.visitnum then do;
    if _n = 11 then aval = _sum;
    else aval = .;
    paramcd = "ACTOT";
    param = 'Adas-Cog(11) Subscore';
    paramn = 15;
    /* Not one item's: its record of the domain. */
    call missing(qsseq, qstestcd, qstest, qsorres, qsstresc, qsstresn);
    output;
  end;
  drop _sum _n;
run;

/* A visit without all its items: the total the SDTM data have for it. */
proc sort data=sdtm.qs(keep=usubjid visitnum qstestcd qsstresn where=(qstestcd = 'ACTOT'))
          out=work._sdtmtotal(keep=usubjid visitnum qsstresn rename=(qsstresn=_sdtm)) nodupkey;
  by usubjid visitnum;
run;
data work._total;
  merge work._total(in=_in) work._sdtmtotal;
  by usubjid visitnum;
  if _in;
  if missing(aval) then aval = _sdtm;
  drop _sdtm;
run;

data work._ds; set work._ds work._total; run;

/*==== 30-timing ====*/
/* ADT: QS.QSDTC as a SAS date. */
data work._ds;
  set work._ds;
  length _dtc $10;
  _dtc = qsdtc; /* (its first 10 characters: SUBSTR would complain of a shorter variable) */
  if length(_dtc) = 10 then adt = input(_dtc, ?? yymmdd10.);

  format adt date9.;
  drop _dtc;
run;

/* ADY: day of ADT relative to TRTSDT; no day 0. */
data work._ds;
  set work._ds;
  if nmiss(adt, trtsdt) = 0 then ady = adt - trtsdt + (adt >= trtsdt);
run;

/*==== 40-visits ====*/
/* AVISIT: the analysis visit whose window holds ADY (Baseline <=1, Week 8 2-84, Week 16 85-140, Week 24 >140). */
data work._ds;
  set work._ds;
  length avisit $40 awrange $20 awu $4;
  if missing(ady) then call missing(avisit, avisitn);

  else if ady <= 1 then do;
    avisit = "Baseline"; avisitn = 0; awtarget = 1; awlo = .; awhi = 1; awrange = "<=1";
  end;

  else if 2 <= ady <= 84 then do;
    avisit = "Week 8"; avisitn = 8; awtarget = 56; awlo = 2; awhi = 84; awrange = "2-84";
  end;

  else if 85 <= ady <= 140 then do;
    avisit = "Week 16"; avisitn = 16; awtarget = 112; awlo = 85; awhi = 140; awrange = "85-140";
  end;

  else if 141 <= ady then do;
    avisit = "Week 24"; avisitn = 24; awtarget = 168; awlo = 141; awhi = .; awrange = ">140";
  end;

  if not missing(avisitn) then do;
    awtdiff = abs(ady - awtarget);
    awu = 'DAYS';
  end;
run;

/*==== 50-baseline ====*/
/* BASE: AVAL of the baseline record (ABLFL = 'Y'), per subject and PARAMCD. */
proc sort data=work._ds; by usubjid paramcd; run;
data work._base(keep=usubjid paramcd base);
  set work._ds(where=(ablfl = 'Y'));
  base = aval;
run;
data work._ds;
  merge work._ds work._base;
  by usubjid paramcd;
run;

/* The baseline record without an analysis visit (a screening value, the test not done on the day of the first dose): the Baseline analysis visit. */
data work._ds;
  set work._ds;
  if ablfl = 'Y' and missing(avisit) then do; avisit = 'Baseline'; avisitn = 0; _blvis = 1; end;
run;
/* (Then a record of the same subject and PARAMCD at the Baseline visit that is not the baseline, the day of the first dose without a value: no analysis visit.) */
proc sort data=work._ds; by usubjid paramcd descending _blvis; run;
data work._ds;
  set work._ds;
  by usubjid paramcd;
  retain _blmov;
  if first.paramcd then _blmov = (_blvis = 1);
  if _blmov and ablfl ne 'Y' and avisit = 'Baseline' then call missing(avisit, avisitn);
  drop _blvis _blmov;
run;

/* CHG: AVAL - BASE, after baseline only. */
data work._ds;
  set work._ds;
  if nmiss(aval, base) = 0 and ablfl ne 'Y' and adt > trtsdt then chg = aval - base;
run;

/* PCHG: 100 * CHG / BASE, where BASE is not 0. */
data work._ds;
  set work._ds;
  if not missing(chg) and base not in (., 0) then pchg = 100 * chg / base;
run;

/*==== 70-other ====*/
/* DTYPE: at each analysis visit after baseline (8, 16, 24) without a value, the last value before it (DTYPE = LOCF),
   per subject and PARAMCD: the record carried forward, at the visit it fills. */
/* Each window's record: the one nearest its target day (the one analyzed), the earlier on a tie. */
proc sort data=work._ds(where=(avisitn in (8, 16, 24) and not missing(aval))) out=work._obs;
  by usubjid paramcd avisitn awtdiff ady;
run;
data work._obs; set work._obs; by usubjid paramcd avisitn; if first.avisitn; run;
data work._grid;
  set work._obs(keep=usubjid paramcd);
  by usubjid paramcd;
  if first.paramcd;
  do avisitn = 8, 16, 24; output; end;
run;
data work._missing;
  merge work._grid(in=_want) work._obs(in=_have keep=usubjid paramcd avisitn);
  by usubjid paramcd avisitn;
  if _want and not _have;
run;
proc sql;
  create table work._locf as
  select o.*, m.avisitn as _to
  from work._missing as m, work._obs as o
  where o.usubjid = m.usubjid and o.paramcd = m.paramcd and o.avisitn < m.avisitn
  order by o.usubjid, o.paramcd, _to, o.avisitn;
quit;
data work._locf;
  set work._locf;
  by usubjid paramcd _to;
  if last._to;
  avisitn = _to;
  length dtype $8;
  dtype = 'LOCF';
  drop _to;
run;
/* The visit's name and window, as the observed records have it. */
proc sort data=work._obs(keep=avisitn avisit awtarget awlo awhi awrange) out=work._avisit nodupkey; by avisitn; run;
proc sort data=work._locf; by avisitn; run;
data work._locf;
  merge work._locf(in=_in drop=avisit awtarget awlo awhi awrange) work._avisit;
  by avisitn;
  if _in;
  awtdiff = abs(ady - awtarget);
run;
data work._ds; set work._ds work._locf; run;

/* ANL01FL: in each window of USUBJID, PARAMCD and AVISITN, the record nearest the target day (the earlier on a tie). */
proc sort data=work._ds;
  by usubjid paramcd avisitn awtdiff ady;
run;
data work._ds;
  set work._ds;
  by usubjid paramcd avisitn;
  length anl01fl $1;
  if not missing(avisitn) and first.avisitn then anl01fl = 'Y';
  else anl01fl = '';
run;

/*==== 89-final ====*/
/* The data set as derived; the finalize step keeps the specification's variables. */
data work._final;
  set work._ds;
run;

/*==== 90-finalize ====*/
/* 90-finalize: from the specification; the variables, their order and attributes are not changed here. */
/* The text variables the specification gives no length: as long as their longest value (at least 1). */
%let _len1 = 1; %let _len2 = 1; %let _len3 = 1; %let _len4 = 1; %let _len5 = 1; %let _len6 = 1; %let _len7 = 1; %let _len8 = 1; %let _len9 = 1; %let _len10 = 1; %let _len11 = 1; %let _len12 = 1; %let _len13 = 1; %let _len14 = 1; %let _len15 = 1; %let _len16 = 1; %let _len17 = 1; %let _len18 = 1; %let _len19 = 1; %let _len20 = 1;
data _null_;
  length _ren _asg _siz $32767;
  _dsid = open('work._final');
  if varnum(_dsid, 'STUDYID') > 0 then do; _ren = catx(' ', _ren, 'STUDYID=_rz1'); _asg = catx(' ', _asg, 'STUDYID = _rz1;');
    _siz = catx(' ', _siz, '_len1 = max(_len1, lengthn(STUDYID));'); end;
  if varnum(_dsid, 'SITEID') > 0 then do; _ren = catx(' ', _ren, 'SITEID=_rz2'); _asg = catx(' ', _asg, 'SITEID = _rz2;');
    _siz = catx(' ', _siz, '_len2 = max(_len2, lengthn(SITEID));'); end;
  if varnum(_dsid, 'SITEGR1') > 0 then do; _ren = catx(' ', _ren, 'SITEGR1=_rz3'); _asg = catx(' ', _asg, 'SITEGR1 = _rz3;');
    _siz = catx(' ', _siz, '_len3 = max(_len3, lengthn(SITEGR1));'); end;
  if varnum(_dsid, 'USUBJID') > 0 then do; _ren = catx(' ', _ren, 'USUBJID=_rz4'); _asg = catx(' ', _asg, 'USUBJID = _rz4;');
    _siz = catx(' ', _siz, '_len4 = max(_len4, lengthn(USUBJID));'); end;
  if varnum(_dsid, 'TRTP') > 0 then do; _ren = catx(' ', _ren, 'TRTP=_rz5'); _asg = catx(' ', _asg, 'TRTP = _rz5;');
    _siz = catx(' ', _siz, '_len5 = max(_len5, lengthn(TRTP));'); end;
  if varnum(_dsid, 'AGEGR1') > 0 then do; _ren = catx(' ', _ren, 'AGEGR1=_rz6'); _asg = catx(' ', _asg, 'AGEGR1 = _rz6;');
    _siz = catx(' ', _siz, '_len6 = max(_len6, lengthn(AGEGR1));'); end;
  if varnum(_dsid, 'RACE') > 0 then do; _ren = catx(' ', _ren, 'RACE=_rz7'); _asg = catx(' ', _asg, 'RACE = _rz7;');
    _siz = catx(' ', _siz, '_len7 = max(_len7, lengthn(RACE));'); end;
  if varnum(_dsid, 'SEX') > 0 then do; _ren = catx(' ', _ren, 'SEX=_rz8'); _asg = catx(' ', _asg, 'SEX = _rz8;');
    _siz = catx(' ', _siz, '_len8 = max(_len8, lengthn(SEX));'); end;
  if varnum(_dsid, 'ITTFL') > 0 then do; _ren = catx(' ', _ren, 'ITTFL=_rz9'); _asg = catx(' ', _asg, 'ITTFL = _rz9;');
    _siz = catx(' ', _siz, '_len9 = max(_len9, lengthn(ITTFL));'); end;
  if varnum(_dsid, 'EFFFL') > 0 then do; _ren = catx(' ', _ren, 'EFFFL=_rz10'); _asg = catx(' ', _asg, 'EFFFL = _rz10;');
    _siz = catx(' ', _siz, '_len10 = max(_len10, lengthn(EFFFL));'); end;
  if varnum(_dsid, 'COMP24FL') > 0 then do; _ren = catx(' ', _ren, 'COMP24FL=_rz11'); _asg = catx(' ', _asg, 'COMP24FL = _rz11;');
    _siz = catx(' ', _siz, '_len11 = max(_len11, lengthn(COMP24FL));'); end;
  if varnum(_dsid, 'AVISIT') > 0 then do; _ren = catx(' ', _ren, 'AVISIT=_rz12'); _asg = catx(' ', _asg, 'AVISIT = _rz12;');
    _siz = catx(' ', _siz, '_len12 = max(_len12, lengthn(AVISIT));'); end;
  if varnum(_dsid, 'VISIT') > 0 then do; _ren = catx(' ', _ren, 'VISIT=_rz13'); _asg = catx(' ', _asg, 'VISIT = _rz13;');
    _siz = catx(' ', _siz, '_len13 = max(_len13, lengthn(VISIT));'); end;
  if varnum(_dsid, 'PARAM') > 0 then do; _ren = catx(' ', _ren, 'PARAM=_rz14'); _asg = catx(' ', _asg, 'PARAM = _rz14;');
    _siz = catx(' ', _siz, '_len14 = max(_len14, lengthn(PARAM));'); end;
  if varnum(_dsid, 'PARAMCD') > 0 then do; _ren = catx(' ', _ren, 'PARAMCD=_rz15'); _asg = catx(' ', _asg, 'PARAMCD = _rz15;');
    _siz = catx(' ', _siz, '_len15 = max(_len15, lengthn(PARAMCD));'); end;
  if varnum(_dsid, 'ABLFL') > 0 then do; _ren = catx(' ', _ren, 'ABLFL=_rz16'); _asg = catx(' ', _asg, 'ABLFL = _rz16;');
    _siz = catx(' ', _siz, '_len16 = max(_len16, lengthn(ABLFL));'); end;
  if varnum(_dsid, 'ANL01FL') > 0 then do; _ren = catx(' ', _ren, 'ANL01FL=_rz17'); _asg = catx(' ', _asg, 'ANL01FL = _rz17;');
    _siz = catx(' ', _siz, '_len17 = max(_len17, lengthn(ANL01FL));'); end;
  if varnum(_dsid, 'DTYPE') > 0 then do; _ren = catx(' ', _ren, 'DTYPE=_rz18'); _asg = catx(' ', _asg, 'DTYPE = _rz18;');
    _siz = catx(' ', _siz, '_len18 = max(_len18, lengthn(DTYPE));'); end;
  if varnum(_dsid, 'AWRANGE') > 0 then do; _ren = catx(' ', _ren, 'AWRANGE=_rz19'); _asg = catx(' ', _asg, 'AWRANGE = _rz19;');
    _siz = catx(' ', _siz, '_len19 = max(_len19, lengthn(AWRANGE));'); end;
  if varnum(_dsid, 'AWU') > 0 then do; _ren = catx(' ', _ren, 'AWU=_rz20'); _asg = catx(' ', _asg, 'AWU = _rz20;');
    _siz = catx(' ', _siz, '_len20 = max(_len20, lengthn(AWU));'); end;
  _rc = close(_dsid);
  if _ren ne '' then _ren = cats('(rename=(', _ren, '))');
  call symputx('_ren', _ren);
  call symputx('_asg', _asg);
  call symputx('_siz', _siz);
run;
data _null_;
  set work._final end=_end;
  retain _len1 1 _len2 1 _len3 1 _len4 1 _len5 1 _len6 1 _len7 1 _len8 1 _len9 1 _len10 1 _len11 1 _len12 1 _len13 1 _len14 1 _len15 1 _len16 1 _len17 1 _len18 1 _len19 1 _len20 1;
  &_siz
  if _end then do;
    call symputx('_len1', _len1);
    call symputx('_len2', _len2);
    call symputx('_len3', _len3);
    call symputx('_len4', _len4);
    call symputx('_len5', _len5);
    call symputx('_len6', _len6);
    call symputx('_len7', _len7);
    call symputx('_len8', _len8);
    call symputx('_len9', _len9);
    call symputx('_len10', _len10);
    call symputx('_len11', _len11);
    call symputx('_len12', _len12);
    call symputx('_len13', _len13);
    call symputx('_len14', _len14);
    call symputx('_len15', _len15);
    call symputx('_len16', _len16);
    call symputx('_len17', _len17);
    call symputx('_len18', _len18);
    call symputx('_len19', _len19);
    call symputx('_len20', _len20);
  end;
run;
data adam.adadas(label="ADAS-Cog Analysis");
  attrib
    STUDYID  length=$&_len1 label="Study Identifier"
    SITEID   length=$&_len2 label="Study Site Identifier"
    SITEGR1  length=$&_len3 label="Pooled Site Group 1"
    USUBJID  length=$&_len4 label="Unique Subject Identifier"
    TRTSDT   length=8 label="Date of First Exposure to Treatment" format=DATE9.
    TRTEDT   length=8 label="Date of Last Exposure to Treatment" format=DATE9.
    TRTP     length=$&_len5 label="Planned Treatment"
    TRTPN    length=8 label="Planned Treatment (N)"
    AGE      length=8 label="Age"
    AGEGR1   length=$&_len6 label="Pooled Age Group 1"
    AGEGR1N  length=8 label="Pooled Age Group 1 (N)"
    RACE     length=$&_len7 label="Race"
    RACEN    length=8 label="Race (N)"
    SEX      length=$&_len8 label="Sex"
    ITTFL    length=$&_len9 label="Intent-to-Treat Population Flag"
    EFFFL    length=$&_len10 label="Efficacy Population Flag"
    COMP24FL length=$&_len11 label="Completers of Week 24 Population Flag"
    AVISIT   length=$&_len12 label="Analysis Visit"
    AVISITN  length=8 label="Analysis Visit (N)"
    VISIT    length=$&_len13 label="Visit Name"
    VISITNUM length=8 label="Visit Number"
    ADY      length=8 label="Analysis Relative Day"
    ADT      length=8 label="Analysis Date" format=DATE9.
    PARAM    length=$&_len14 label="Parameter"
    PARAMCD  length=$&_len15 label="Parameter Code"
    PARAMN   length=8 label="Parameter (N)"
    AVAL     length=8 label="Analysis Value"
    BASE     length=8 label="Baseline Value"
    CHG      length=8 label="Change from Baseline"
    PCHG     length=8 label="Percent Change from Baseline"
    ABLFL    length=$&_len16 label="Baseline Record Flag"
    ANL01FL  length=$&_len17 label="Analysis Record Flag 01"
    DTYPE    length=$&_len18 label="Derivation Type"
    AWRANGE  length=$&_len19 label="Analysis Window Valid Relative Range"
    AWTARGET length=8 label="Analysis Window Target"
    AWTDIFF  length=8 label="Analysis Window Diff from Target"
    AWLO     length=8 label="Analysis Window Beginning Timepoint"
    AWHI     length=8 label="Analysis Window Ending Timepoint"
    AWU      length=$&_len20 label="Analysis Window Unit"
    QSSEQ    length=8 label="Sequence Number"
  ;
  set work._final&_ren;
  &_asg
  keep STUDYID SITEID SITEGR1 USUBJID TRTSDT TRTEDT TRTP TRTPN AGE AGEGR1 AGEGR1N RACE RACEN SEX ITTFL EFFFL COMP24FL AVISIT AVISITN VISIT VISITNUM ADY ADT PARAM PARAMCD PARAMN AVAL BASE CHG PCHG ABLFL ANL01FL DTYPE AWRANGE AWTARGET AWTDIFF AWLO AWHI AWU QSSEQ;
run;
proc sort data=adam.adadas; by USUBJID PARAMCD AVISIT ADT; run;

Data (first 20 of 14,724 records, uploaded)

STUDYIDSITEIDSITEGR1USUBJIDTRTSDTTRTEDTTRTPTRTPNAGEAGEGR1AGEGR1NRACERACENSEXITTFLEFFFLCOMP24FLAVISITAVISITNVISITVISITNUMADYADTPARAMPARAMCDPARAMNAVALBASECHGPCHGABLFLANL01FLDTYPEAWRANGEAWTARGETAWTDIFFAWLOAWHIAWUQSSEQ
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYBaseline0BASELINE312014-01-02Word Recall TaskACITM01133YY<=1101DAYS5001
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 1616WEEK 16101262014-05-07Word Recall TaskACITM01143133.333333333333336Y85-1401121485140DAYS5031
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 2424WEEK 24121682014-06-18Word Recall TaskACITM0113300Y>1401680141DAYS5046
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 88WEEK 88632014-03-05Word Recall TaskACITM01123-1-33.333333333333336Y2-84567284DAYS5016
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYBaseline0BASELINE312014-01-02Naming Objects And Fingers (Refer To 5 CACITM02211YY<=1101DAYS5002
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 1616WEEK 16101262014-05-07Naming Objects And Fingers (Refer To 5 CACITM02201-1-100Y85-1401121485140DAYS5032
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 2424WEEK 24121682014-06-18Naming Objects And Fingers (Refer To 5 CACITM02201-1-100Y>1401680141DAYS5047
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 88WEEK 88632014-03-05Naming Objects And Fingers (Refer To 5 CACITM02201-1-100Y2-84567284DAYS5017
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYBaseline0BASELINE312014-01-02Delayed Word RecallACITM03333YY<=1101DAYS5003
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 1616WEEK 16101262014-05-07Delayed Word RecallACITM03313-2-66.66666666666667Y85-1401121485140DAYS5033
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 2424WEEK 24121682014-06-18Delayed Word RecallACITM03323-1-33.333333333333336Y>1401680141DAYS5048
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 88WEEK 88632014-03-05Delayed Word RecallACITM0333300Y2-84567284DAYS5018
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYBaseline0BASELINE312014-01-02CommandsACITM04400YY<=1101DAYS5004
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 1616WEEK 16101262014-05-07CommandsACITM044000Y85-1401121485140DAYS5034
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 2424WEEK 24121682014-06-18CommandsACITM044000Y>1401680141DAYS5049
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 88WEEK 88632014-03-05CommandsACITM044000Y2-84567284DAYS5019
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYBaseline0BASELINE312014-01-02Constructional PraxisACITM05533YY<=1101DAYS5005
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 1616WEEK 16101262014-05-07Constructional PraxisACITM05523-1-33.333333333333336Y85-1401121485140DAYS5035
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 2424WEEK 24121682014-06-18Constructional PraxisACITM0553300Y>1401680141DAYS5050
CDISCPILOT0170170101-701-10152014-01-022014-07-02Placebo063<651WHITE1FYYYWeek 88WEEK 88632014-03-05Constructional PraxisACITM05523-1-33.333333333333336Y2-84567284DAYS5020