Data defines the model by dint of genetic programming, producing the best decile table.


Spreading Multiple (Monthly) Obserations into a Single Observation
 ~ Monthly Quantitative Fields are Summed ~

Bruce Ratner, Ph.D.

title1' Multiple (Monthly Payment) Observations ';

data multi_obs;
input @1 ID $2. @4 month_paid mmddyy10. @16 amount_paid dollar5.;
format month_paid mmddyys10.;
format amount_paid dollar5.;
cards;
BR 1/9/2000     $12
BR 2/5/2007     $67
BR 3/12/2007   $34
BR 4/6/2007     $56
BR 5/11/2007   $67
BR 6/4/2007     $78
BR 7/8/2007     $12
BR 8/13/2007   $97
BR 9/30/2007   $84
BR 10/1/2007   $86
BR 11/20/2007 $68
BR 12/7/2007   $88
AR 6/23/2007   $23
AR 7/21/2007   $45
AR 8/11/2007   $55
AR 9/22/2007   $87
AR 10/25/2007 $90
AR 12/18/2007 $45
AR 5/5/2008     $45
CC 5/3/2006     $10
CC 6/2/2006     $11
CC 8/1/2006     $12
CC 9/12/2006   $13
DD 9/23/2010   $199
;
run;

proc print;
run;

data multi_obs;
set multi_obs;
format amount_paid 10.2;
mon = month(month_paid);
year = year(month_paid);
run;

proc sort;by ID year mon;
run;

%let dsn = multi_obs;
data _NULL_;
set &dsn end=EOF;
retain maxyr 0000 minyr 9999;
maxyr = max(maxyr,year);
minyr = min(minyr,year);
if EOF then do; 
     rangemon = 12*(sum(maxyr,-minyr) + 1);
     call symput('allmon',trim(left(put(rangemon,6.)))); 
     call symput('first',trim(left(put(minyr,6.))));
end;

data multi_obs_spread ;
retain ID begyr mon1-mon&allmon ;
set &dsn;
by ID;
array mons (&allmon) mon1-mon&allmon;
if first.ID then do; 
     do i= 1 to &allmon; 
     mons(i) = .;
end; 
     begyr = year;
end;
diff = year - &first;
calcmon = diff*12 + mon;
mons(calcmon) = amount_paid;
if last.ID then do; 
     output;
end;
keep ID begyr mon1-mon&allmon;
run;

proc print data=multi_obs_spread;
run;

For more information about this article, call Bruce Ratner at 516.791.3544 or 1 800 DM STAT-1; or e-mail at br@dmstat1.com.
Sign-up for a free GenIQ webcast: Click here.