BookmarkSubscribeRSS Feed
toddtodd
Calcite | Level 5

Also, here is an example. Lhat_t = current loss_t * tmp2 + lhat_t-1 * tmp1

At each week lhat is calculated based on the lhat last week and the new current loss.

tmp1=0.986629
tmp2=0.013371
Weekidcurrent Losslhat
10.01200.0120
20.00500.0119
30.00000.0117
40.02300.0119

I am trying to write the code below as a loop.

data work.alldata_lhat;

set work.alldata_lhat;

by secid;

if count=1 then oldlhat=current_loss;

if count=1 then lhat=tmp1*oldlhat+tmp2*current_loss;

oldlhat=lag(lhat);if count> 1 then lhat=tmp1*oldlhat+tmp2*current_loss;

oldlhat=lag(lhat);if count> 2 then lhat=tmp1*oldlhat+tmp2*current_loss;

oldlhat=lag(lhat);if count> 3 then lhat=tmp1*oldlhat+tmp2*current_loss;

oldlhat=lag(lhat);if count> 4 then lhat=tmp1*oldlhat+tmp2*current_loss;

oldlhat=lag(lhat);if count> 5 then lhat=tmp1*oldlhat+tmp2*current_loss;

_loss;

3 REPLIES 3
esjackso
Quartz | Level 8

If I am understanding what you need, I dont think you need a macro for this. I dont have access to SAS right this second to verify this but I think something like this will work:

data work.alldata_lhat;

     set work.alldata_lhat;

     by secid;

     tmp1 = 0.986629;

     tmp2 = 0.013371;

     if first.secid then do;

          oldhat=current_loss;

          lhat=tmp1*oldlhat+tmp2*current_loss;

     end;

          else do;

               oldhat=lhat;

               lhat=tmp1*oldlhat+tmp2*current_loss;

          end;

     retain oldhat lhat;

run;

Tom
Super User Tom
Super User

What is the question?  The code looks really strange to me.  I would have expected to see something using a RETAIN statement to carry the value forward to use in calculating the new value.  You are not using the BY statement for anything.

data old;

  input Weekid current_Loss want ;

  secid=1;

cards;

1 0.0120 0.0120

2 0.0050 0.0119

3 0.0000 0.0117

4 0.0230 0.0119

;;;;

data new;

  retain tmp1 0.986629 tmp2 0.013371 ;

  set old;

  by secid ;

  if first.secid then oldhat=current_loss;

  lhat = tmp1*oldhat + tmp2*current_loss;

  output;

  oldhat=lhat;

  retain oldhat ;

run;


ID CURRENT_LOSS LHAT   WANT

1 0.012 0.012        0.012

2 0.005 0.011906403  0.0119

3 0     0.0117472025 0.0117

4 0.023 0.0118976636 0.0119

If you want to turn it into a macro then what part of the above changes?  Is it the constants used in the formula?

toddtodd
Calcite | Level 5

Thank you. I will try the code out. The example was for one secid. I have 25,000 secid where some of the secid have over 2400 weeks of loss information.

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 3 replies
  • 1199 views
  • 0 likes
  • 3 in conversation