BookmarkSubscribeRSS Feed
SwapnaKumari
Fluorite | Level 6

Hi All,

I am trying to calculate 30 days moving standard deviation using Proc expand, and able to get the same in the output, I have used group by variable as per the requirement, Now the issue is in the result I am getting is having 0 value in every 1st observation in the output. I know The standard deviation of the first value of a considered data series is always zero, as it is not possible to calculate it with only one value. So I have requirement that the initial standard deviation shall be equal to the one of the second date.  Please find the below example for more clarity.

Example:

As of date

  1. Std.
  2. 28.11.

0 365

  1. 29.11.

365

  1. 30.11.

378

  1. 1.12.

371

  1. 2.12.

392

Below is the current code:-

PROC EXPAND DATA = temp1 OUT=Moving_Stdev ;

CONVERT Exposure = Moving_Stdev30 / TRANSFORMOUT=(MOVSTD 30);

by Instrument_Type Country;

RUN;

Can anyone please help me to achieve the above requirement, a sample code would really help.

Thanks in advance.

Regards,

Swapna

2)     

10 REPLIES 10
SwapnaKumari
Fluorite | Level 6

Apologies, I think the above example is not very clear so sending the more clear one on what I exactly need.

Example:

As of date

Std.
28/11/20140Instead of 0 it should pick up the 2nd value i.e 365
29/11/2014365
30/11/2014378
1/12/2014371
2/12/2014392

Regards,

Swapna

Ksharp
Super User

Code not tested.

data want;

merge Moving_Stdev  Moving_Stdev (firstobs=2 rename=(Std=_Std));

if Std=0 then Std=_Std;

run;

Xia Keshan

SwapnaKumari
Fluorite | Level 6

Hi Xia,

Perfect, It worked, Thank you... Smiley Happy

Regards,

Swapna

SwapnaKumari
Fluorite | Level 6

Hi Xia,

Now I want the 3 cell value of standard deviation also to be same as 2nd cell value of standard deviation. for example:-

As of dateStd.
28/11/20140Instead of 0 it should pick up the 2nd value i.e 365
29/11/2014365
30/11/20143653rd value should also be as same as 2nd value
1/12/2014371
2/12/2014392

It would be really great if you can please share a sample code for the above as well.

Regards,

Swapna

Ksharp
Super User

OK. Code not tested.

I don't know if there are some group variables , Just assuming not.

data want;

merge Moving_Stdev  Moving_Stdev (firstobs=2 rename=(Std=_Std));

if Std=0 then Std=_Std;

lag_Std=lag(Std);

if _n_ eq 3 then Std=lag_Std;

run;





Xia Keshan

SwapnaKumari
Fluorite | Level 6

Hi Xia,

Yes I do have the group variables please find the proc expand code which will give u insight of the group variables I have in my data set:-

PROC EXPAND DATA = temp1 OUT=Moving_Stdev ;

CONVERT Exposure = Moving_Stdev30 / TRANSFORMOUT=(MOVSTD 30);

by Instrument_Type Country;

RUN;


your code is running fine but i need the code which should change all the by group variable 3rd cell value with 2nd cell value


Regards,

Swapna

Ksharp
Super User

OK.

data want;

merge Moving_Stdev  Moving_Stdev (firstobs=2 rename=(Std=_Std));

by Instrument_Type Country;

if first.Country then do;n=0;Std=_Std;end;

n+1;

lag_Std=lag(Std);

if _n_ eq 3 then Std=lag_Std;

run;

SwapnaKumari
Fluorite | Level 6

Hi Xia,

I tried running the code shared by you.. It is working only for 1st group n failing for remaining groups. also now the first value 0 for the remaining groups are not replacing with the second value.. Smiley Sad

something is gong wrong can you please help.

Please find the same input::-

as_of_dateInstrument_TypeCountryTIMEMoving_Stdev30
28Nov2013Commercial loansAustralia00.00need to repalce 0 with 2nd value i.e 6.22
29Nov2013Commercial loansAustralia16.22
02Dec2013Commercial loansAustralia29.53need to replace 3rd value with 2nd value i.e 6.22
03Dec2013Commercial loansAustralia377.73
04Dec2013Commercial loansAustralia468.23
05Dec2013Commercial loansAustralia580.13`
28Nov2013Commercial loansAustria00.00
29Nov2013Commercial loansAustria130.55
02Dec2013Commercial loansAustria252.76
03Dec2013Commercial loansAustria350.97
04Dec2013Commercial loansAustria444.43
05Dec2013Commercial loansAustria542.34

Regards,

Swapna

Ksharp
Super User

Opss.

if _n_ eq 3 then Std=lag_Std;

-->

if n eq 3 then Std=lag_Std;

SwapnaKumari
Fluorite | Level 6

Hi Xia,

Thank you for your reply but your code is still not working with the groups it is only replacing the first group and remaining are still same.

anyways I found a different way to calculate the same, so sharing the code with you.. Smiley Happy

/*Replacing the 0 Values in stadev varibale with the 2nd value of Stdev*/

data temp1;

merge Moving_Stdev  Moving_Stdev (firstobs=2 rename=(Stdev=_Std));

if Stdev="0" then Stdev=_Std;

drop _Std;

run;


/*Replacing the 3rd Value in every group in stadev varibale with the 2nd value of Stdev*/

data Final ;

set temp1;

l2=lag1(Stdev);

if time = 3 then Stdev = l2;

drop time l2;

run;

Thanks for your help.. Smiley Happy

Regards,

Swapna

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 10 replies
  • 1901 views
  • 0 likes
  • 2 in conversation