Michael A
Michael A

Reputation: 4615

How do I use PROC EXPAND to fill in time series observations within a panel (longitudinal) data set?

I'm using this SAS code:

data test1;
    input cust_id $
          month
          category $
          status $;
datalines;
A 200003 ABC C
A 200004 DEF C
A 200006 XYZ 3
B 199910 ASD X
B 199912 ASD C
;
quit;

proc sql;
    create view test2 as
        select cust_id, input(put(month, 6.), yymmn6.) as month format date9., 
               category, status from test1 order by cust_id, month asc;
quit;

proc expand data=test2 out=test3 to=month method=none;
    by cust_id;
    id month;
quit;

proc print data=test3;
    title "after expand";
quit;

and I want to create a dataset that looks like this:

Obs cust_id month category status 
1 A 01MAR2000 ABC C 
2 A 01APR2000 DEF C
3 A 01MAY2000 .   .  
4 A 01JUN2000 XYZ 3 
5 B 01OCT1999 ASD X 
6 B 01NOV1999 .   .
7 B 01DEC1999 ASD C 

but the output from proc expand just says "Nothing to do. The data set WORK.TEST3 has 0 observations and 0 variables." I don't want/need to change the frequency of the data, just interpolate it with missing values.

What am I doing wrong here? I think proc expand is the correct procedure to use, based on this example and the documentation, but for whatever reason it doesn't create the data.

Upvotes: 1

Views: 1856

Answers (1)

DomPazz
DomPazz

Reputation: 12465

You need to add a VAR statement. Unfortunately, the variables need to be numeric. So just expand the month by cust_id. Then join back the original values.

proc expand data=test2 out=test3 to=month ;
    by cust_id;
    id month;
    var _numeric_;
quit;

proc sql noprint;
create table test4 as
select a.*,
       b.category,
       b.status
    from test3 as a
      left join
         test2 as b
    on a.cust_id = b.cust_id
     and a.month = b.month;
quit;

proc print data=test4;
    title "after expand";
quit;

Upvotes: 1

Related Questions