BookmarkSubscribeRSS Feed
Fdomingos
Calcite | Level 5

Hi everyone!

 

I need to insert the variable "Contribuição Nova (D)" with the follow calculation that is in colun "Fórmula para calcúlo de D' in a macro:

 

Contribuição Junho
(A)
Probabilidade de Vida
(B)
Percentual Resgate
( C )
Contribuição Nova
(D)
Fórmula para calcúlo de D
423.510.98162118.856%              378.91=A1*B1*(1-C1)
 0.97971016.544%              346.93=D1*B2*(1-C2)
 0.97730246.568%              316.79=D2*B3*(1-C3)
 0.97458816.590%              288.39=D3*B4*(1-C4)
 0.97193416.612%              261.76=D6*B7*(1-C7)
 0.97010716.612%              237.15=D7*B8*(1-C8)

 

Attached the excel file to better understand.

 

I hope that anybody could help me with this case.

 

Thank you !

6 REPLIES 6
Jagadishkatam
Amethyst | Level 16
data want;
set have;
if nmiss(a,b,c)=0 then newvar=a*b*(1-c);
else if a eq . and nmiss(b,c,lag(d))=0 then newvar=lag(d)*b*(1-c);
run;
Thanks,
Jag
PaigeMiller
Diamond | Level 26

Show us your SAS code so far. Show us the SAS LOG.

 

Do not put data into .xlsx files, as many people will not download and open the files because Microsoft Office files can be a security risk. Instead, put (a portion of ) the data into actual SAS code so we can reproduce your data on our own computers. https://communities.sas.com/t5/SAS-Communities-Library/How-to-create-a-data-step-version-of-your-dat...

--
Paige Miller
Fdomingos
Calcite | Level 5

Follow bellow the code of the macro that I am using. It's too long because I need to use many premises, the line that I need to work are in red.

 


%macro calcular ;

%do cont=1 %to 115;
%let M=&cont;

data Proj&M. ; set base_ant ;

anobase = year(&dtref)+&M. ;
dt_ref = INTNX('year',&dtref,&M.,'S');
tempo = &M. ;

*Alteração do cálculo da rentabilidade;
rent_fundo = 0;

 

* idade no tempo = n do estudo ;
idade = idade_ref + &M. ;

* idade +1 ;
t = idade + 1 ;


*******************************************************************
Comutações - BR EMS Mortalidade Masculina
13/11/2012
*******************************************************************;

if idade = 0 then lx = 1000000 ;
if idade = 1 then lx = 999608.9 ;
if idade = 2 then lx = 999406.47919775 ;
if idade = 3 then lx = 999271.559323058 ;
if idade = 4 then lx = 999164.837120523 ;
if idade = 5 then lx = 999070.116293964 ;
if idade = 6 then lx = 998979.600541427 ;
if idade = 7 then lx = 998888.793295738 ;
if idade = 8 then lx = 998795.097526927 ;
if idade = 9 then lx = 998696.516450801 ;
if idade = 10 then lx = 998591.45357727 ;
if idade = 11 then lx = 998477.514292417 ;
if idade = 12 then lx = 998350.008713842 ;
if idade = 13 then lx = 998199.357697527 ;
if idade = 14 then lx = 998008.601800271 ;
if idade = 15 then lx = 997753.411000791 ;
if idade = 16 then lx = 997405.594161716 ;
if idade = 17 then lx = 996938.608862529 ;
if idade = 18 then lx = 996305.35345818 ;
if idade = 19 then lx = 995412.364969875 ;
if idade = 20 then lx = 994347.074656885 ;
if idade = 21 then lx = 993193.035442038 ;
if idade = 22 then lx = 992039.541050675 ;
if idade = 23 then lx = 990887.386327699 ;
if idade = 24 then lx = 989790.374902296 ;
if idade = 25 then lx = 988725.360458901 ;
if idade = 26 then lx = 987681.563095864 ;
if idade = 27 then lx = 986645.386368021 ;
if idade = 28 then lx = 985621.939108741 ;
if idade = 29 then lx = 984613.352178451 ;
if idade = 30 then lx = 983592.209670907 ;
if idade = 31 then lx = 982555.405122693 ;
if idade = 32 then lx = 981497.880740159 ;
if idade = 33 then lx = 980415.386727491 ;
if idade = 34 then lx = 979294.968023539 ;
if idade = 35 then lx = 978144.492295105 ;
if idade = 36 then lx = 976960.64401608 ;
if idade = 37 then lx = 975730.064388877 ;
if idade = 38 then lx = 974418.390463319 ;
if idade = 39 then lx = 973050.501926787 ;
if idade = 40 then lx = 971631.794294977 ;
if idade = 41 then lx = 970139.173532582 ;
if idade = 42 then lx = 968545.234870467 ;
if idade = 43 then lx = 966819.771534546 ;
if idade = 44 then lx = 964984.747608173 ;
if idade = 45 then lx = 963023.705604084 ;
if idade = 46 then lx = 960929.321649136 ;
if idade = 47 then lx = 958674.404902954 ;
if idade = 48 then lx = 956236.591758726 ;
if idade = 49 then lx = 953562.380506214 ;
if idade = 50 then lx = 950670.511874853 ;
if idade = 51 then lx = 947447.358571392 ;
if idade = 52 then lx = 943872.92392171 ;
if idade = 53 then lx = 939903.843889327 ;
if idade = 54 then lx = 935526.241736412 ;
if idade = 55 then lx = 930830.461318641 ;
if idade = 56 then lx = 925696.745158376 ;
if idade = 57 then lx = 920161.448901027 ;
if idade = 58 then lx = 914139.268266404 ;
if idade = 59 then lx = 907728.135336272 ;
if idade = 60 then lx = 900702.591887209 ;
if idade = 61 then lx = 893103.183978939 ;
if idade = 62 then lx = 884875.917448125 ;
if idade = 63 then lx = 876148.474761926 ;
if idade = 64 then lx = 866782.447566721 ;
if idade = 65 then lx = 856687.985860603 ;
if idade = 66 then lx = 845937.408326039 ;
if idade = 67 then lx = 834506.34072107 ;
if idade = 68 then lx = 822506.556794671 ;
if idade = 69 then lx = 809648.640794923 ;
if idade = 70 then lx = 796051.158626821 ;
if idade = 71 then lx = 781420.613987534 ;
if idade = 72 then lx = 765565.667871788 ;
if idade = 73 then lx = 748189.164568702 ;
if idade = 74 then lx = 729176.256337598 ;
if idade = 75 then lx = 708711.268444853 ;
if idade = 76 then lx = 687525.833368358 ;
if idade = 77 then lx = 665046.901236046 ;
if idade = 78 then lx = 641186.082494739 ;
if idade = 79 then lx = 615611.926764178 ;
if idade = 80 then lx = 589161.790963599 ;
if idade = 81 then lx = 560930.68976128 ;
if idade = 82 then lx = 531290.046345984 ;
if idade = 83 then lx = 500127.653709597 ;
if idade = 84 then lx = 468208.156505185 ;
if idade = 85 then lx = 435668.017373785 ;
if idade = 86 then lx = 401950.928873598 ;
if idade = 87 then lx = 367868.102786154 ;
if idade = 88 then lx = 333170.1947424 ;
if idade = 89 then lx = 299215.487515423 ;
if idade = 90 then lx = 265375.711954866 ;
if idade = 91 then lx = 233341.997464225 ;
if idade = 92 then lx = 203360.980917435 ;
if idade = 93 then lx = 175107.714461006 ;
if idade = 94 then lx = 148801.77281913 ;
if idade = 95 then lx = 124630.234280263 ;
if idade = 96 then lx = 102739.157963356 ;
if idade = 97 then lx = 83226.0021566182 ;
if idade = 98 then lx = 66133.7948677114 ;
if idade = 99 then lx = 51447.5688555105 ;
if idade = 100 then lx = 39093.8088449481 ;
if idade = 101 then lx = 28943.2499348309 ;
if idade = 102 then lx = 20817.2501731526 ;
if idade = 103 then lx = 14497.4910772864 ;
if idade = 104 then lx = 9738.47071905189 ;
if idade = 105 then lx = 6281.75866190033 ;
if idade = 106 then lx = 3870.73614007278 ;
if idade = 107 then lx = 2264.30825917676 ;
if idade = 108 then lx = 1248.17479404951 ;
if idade = 109 then lx = 642.501719761367 ;
if idade = 110 then lx = 305.381517153782 ;
if idade = 111 then lx = 132.120503886626 ;
if idade = 112 then lx = 51.0662262584795 ;
if idade = 113 then lx = 17.1906177970517 ;
if idade = > 114 then lx = 0 ;


if t = 0 then lx_1 = 1000000 ;
if t = 1 then lx_1 = 999608.9 ;
if t = 2 then lx_1 = 999406.47919775 ;
if t = 3 then lx_1 = 999271.559323058 ;
if t = 4 then lx_1 = 999164.837120523 ;
if t = 5 then lx_1 = 999070.116293964 ;
if t = 6 then lx_1 = 998979.600541427 ;
if t = 7 then lx_1 = 998888.793295738 ;
if t = 8 then lx_1 = 998795.097526927 ;
if t = 9 then lx_1 = 998696.516450801 ;
if t = 10 then lx_1 = 998591.45357727 ;
if t = 11 then lx_1 = 998477.514292417 ;
if t = 12 then lx_1 = 998350.008713842 ;
if t = 13 then lx_1 = 998199.357697527 ;
if t = 14 then lx_1 = 998008.601800271 ;
if t = 15 then lx_1 = 997753.411000791 ;
if t = 16 then lx_1 = 997405.594161716 ;
if t = 17 then lx_1 = 996938.608862529 ;
if t = 18 then lx_1 = 996305.35345818 ;
if t = 19 then lx_1 = 995412.364969875 ;
if t = 20 then lx_1 = 994347.074656885 ;
if t = 21 then lx_1 = 993193.035442038 ;
if t = 22 then lx_1 = 992039.541050675 ;
if t = 23 then lx_1 = 990887.386327699 ;
if t = 24 then lx_1 = 989790.374902296 ;
if t = 25 then lx_1 = 988725.360458901 ;
if t = 26 then lx_1 = 987681.563095864 ;
if t = 27 then lx_1 = 986645.386368021 ;
if t = 28 then lx_1 = 985621.939108741 ;
if t = 29 then lx_1 = 984613.352178451 ;
if t = 30 then lx_1 = 983592.209670907 ;
if t = 31 then lx_1 = 982555.405122693 ;
if t = 32 then lx_1 = 981497.880740159 ;
if t = 33 then lx_1 = 980415.386727491 ;
if t = 34 then lx_1 = 979294.968023539 ;
if t = 35 then lx_1 = 978144.492295105 ;
if t = 36 then lx_1 = 976960.64401608 ;
if t = 37 then lx_1 = 975730.064388877 ;
if t = 38 then lx_1 = 974418.390463319 ;
if t = 39 then lx_1 = 973050.501926787 ;
if t = 40 then lx_1 = 971631.794294977 ;
if t = 41 then lx_1 = 970139.173532582 ;
if t = 42 then lx_1 = 968545.234870467 ;
if t = 43 then lx_1 = 966819.771534546 ;
if t = 44 then lx_1 = 964984.747608173 ;
if t = 45 then lx_1 = 963023.705604084 ;
if t = 46 then lx_1 = 960929.321649136 ;
if t = 47 then lx_1 = 958674.404902954 ;
if t = 48 then lx_1 = 956236.591758726 ;
if t = 49 then lx_1 = 953562.380506214 ;
if t = 50 then lx_1 = 950670.511874853 ;
if t = 51 then lx_1 = 947447.358571392 ;
if t = 52 then lx_1 = 943872.92392171 ;
if t = 53 then lx_1 = 939903.843889327 ;
if t = 54 then lx_1 = 935526.241736412 ;
if t = 55 then lx_1 = 930830.461318641 ;
if t = 56 then lx_1 = 925696.745158376 ;
if t = 57 then lx_1 = 920161.448901027 ;
if t = 58 then lx_1 = 914139.268266404 ;
if t = 59 then lx_1 = 907728.135336272 ;
if t = 60 then lx_1 = 900702.591887209 ;
if t = 61 then lx_1 = 893103.183978939 ;
if t = 62 then lx_1 = 884875.917448125 ;
if t = 63 then lx_1 = 876148.474761926 ;
if t = 64 then lx_1 = 866782.447566721 ;
if t = 65 then lx_1 = 856687.985860603 ;
if t = 66 then lx_1 = 845937.408326039 ;
if t = 67 then lx_1 = 834506.34072107 ;
if t = 68 then lx_1 = 822506.556794671 ;
if t = 69 then lx_1 = 809648.640794923 ;
if t = 70 then lx_1 = 796051.158626821 ;
if t = 71 then lx_1 = 781420.613987534 ;
if t = 72 then lx_1 = 765565.667871788 ;
if t = 73 then lx_1 = 748189.164568702 ;
if t = 74 then lx_1 = 729176.256337598 ;
if t = 75 then lx_1 = 708711.268444853 ;
if t = 76 then lx_1 = 687525.833368358 ;
if t = 77 then lx_1 = 665046.901236046 ;
if t = 78 then lx_1 = 641186.082494739 ;
if t = 79 then lx_1 = 615611.926764178 ;
if t = 80 then lx_1 = 589161.790963599 ;
if t = 81 then lx_1 = 560930.68976128 ;
if t = 82 then lx_1 = 531290.046345984 ;
if t = 83 then lx_1 = 500127.653709597 ;
if t = 84 then lx_1 = 468208.156505185 ;
if t = 85 then lx_1 = 435668.017373785 ;
if t = 86 then lx_1 = 401950.928873598 ;
if t = 87 then lx_1 = 367868.102786154 ;
if t = 88 then lx_1 = 333170.1947424 ;
if t = 89 then lx_1 = 299215.487515423 ;
if t = 90 then lx_1 = 265375.711954866 ;
if t = 91 then lx_1 = 233341.997464225 ;
if t = 92 then lx_1 = 203360.980917435 ;
if t = 93 then lx_1 = 175107.714461006 ;
if t = 94 then lx_1 = 148801.77281913 ;
if t = 95 then lx_1 = 124630.234280263 ;
if t = 96 then lx_1 = 102739.157963356 ;
if t = 97 then lx_1 = 83226.0021566182 ;
if t = 98 then lx_1 = 66133.7948677114 ;
if t = 99 then lx_1 = 51447.5688555105 ;
if t = 100 then lx_1 = 39093.8088449481 ;
if t = 101 then lx_1 = 28943.2499348309 ;
if t = 102 then lx_1 = 20817.2501731526 ;
if t = 103 then lx_1 = 14497.4910772864 ;
if t = 104 then lx_1 = 9738.47071905189 ;
if t = 105 then lx_1 = 6281.75866190033 ;
if t = 106 then lx_1 = 3870.73614007278 ;
if t = 107 then lx_1 = 2264.30825917676 ;
if t = 108 then lx_1 = 1248.17479404951 ;
if t = 109 then lx_1 = 642.501719761367 ;
if t = 110 then lx_1 = 305.381517153782 ;
if t = 111 then lx_1 = 132.120503886626 ;
if t = 112 then lx_1 = 51.0662262584795 ;
if t = 113 then lx_1 = 17.1906177970517 ;
if t = > 114 then lx_1 = 0 ;


prazo_t = prazo1 + tempo;


************************************************************************;

if TIPO_PRODUTO = 'PGBL' then do;
if prazo_t <= 1 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0190155283;
if 21 <= idade <= 30 then perc_resgate = 0.0712847902;
if 31 <= idade <= 35 then perc_resgate = 0.0676946333;
if 36 <= idade <= 40 then perc_resgate = 0.0685077466;
if 41 <= idade <= 45 then perc_resgate = 0.0684828745;
if 46 <= idade <= 50 then perc_resgate = 0.0605011893;
if 51 <= idade <= 55 then perc_resgate = 0.0628739629;
if 56 <= idade <= 60 then perc_resgate = 0.0644062518;
if 61 <= idade <= 65 then perc_resgate = 0.0572125491;
if 66 <= idade <= 70 then perc_resgate = 0.0567482963;
if idade => 71 then perc_resgate =0.0593693587;
end;

if prazo_t = 2 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0460049079;
if 21 <= idade <= 30 then perc_resgate = 0.0856837306;
if 31 <= idade <= 35 then perc_resgate = 0.0797938553;
if 36 <= idade <= 40 then perc_resgate = 0.0804787947;
if 41 <= idade <= 45 then perc_resgate = 0.0754482982;
if 46 <= idade <= 50 then perc_resgate = 0.0698438073;
if 51 <= idade <= 55 then perc_resgate = 0.0784374257;
if 56 <= idade <= 60 then perc_resgate = 0.067361419;
if 61 <= idade <= 65 then perc_resgate = 0.0774361868;
if 66 <= idade <= 70 then perc_resgate = 0.0849656128;
if idade => 71 then perc_resgate =0.0608775787;
end;

if prazo_t = 3 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0372711226;
if 21 <= idade <= 30 then perc_resgate = 0.0904364281;
if 31 <= idade <= 35 then perc_resgate = 0.0920603479;
if 36 <= idade <= 40 then perc_resgate = 0.0850675014;
if 41 <= idade <= 45 then perc_resgate = 0.0704669127;
if 46 <= idade <= 50 then perc_resgate = 0.0805600986;
if 51 <= idade <= 55 then perc_resgate = 0.0750272188;
if 56 <= idade <= 60 then perc_resgate = 0.0664717179;
if 61 <= idade <= 65 then perc_resgate = 0.0641014168;
if 66 <= idade <= 70 then perc_resgate = 0.0767582865;
if idade => 71 then perc_resgate =0.0643910512;
end;

if prazo_t = 4 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0327808219;
if 21 <= idade <= 30 then perc_resgate = 0.0900201904;
if 31 <= idade <= 35 then perc_resgate = 0.0900201904;
if 36 <= idade <= 40 then perc_resgate = 0.088773671;
if 41 <= idade <= 45 then perc_resgate = 0.0817146249;
if 46 <= idade <= 50 then perc_resgate = 0.0670171706;
if 51 <= idade <= 55 then perc_resgate = 0.0833618708;
if 56 <= idade <= 60 then perc_resgate = 0.0804862357;
if 61 <= idade <= 65 then perc_resgate = 0.0741136246;
if 66 <= idade <= 70 then perc_resgate = 0.0518327786;
if idade => 71 then perc_resgate =0.0570641306;
end;

if prazo_t = 5 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0672953628;
if 21 <= idade <= 30 then perc_resgate = 0.0970985396;
if 31 <= idade <= 35 then perc_resgate = 0.0860174401;
if 36 <= idade <= 40 then perc_resgate = 0.0841035802;
if 41 <= idade <= 45 then perc_resgate = 0.0868799671;
if 46 <= idade <= 50 then perc_resgate = 0.0859142963;
if 51 <= idade <= 55 then perc_resgate = 0.0735356775;
if 56 <= idade <= 60 then perc_resgate = 0.079856301;
if 61 <= idade <= 65 then perc_resgate = 0.0757732464;
if 66 <= idade <= 70 then perc_resgate = 0.0689182499;
if idade => 71 then perc_resgate =0.0445960911;
end;

if prazo_t = 6 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0576379899;
if 21 <= idade <= 30 then perc_resgate = 0.0919044314;
if 31 <= idade <= 35 then perc_resgate = 0.0885659499;
if 36 <= idade <= 40 then perc_resgate = 0.0849234377;
if 41 <= idade <= 45 then perc_resgate = 0.0956214406;
if 46 <= idade <= 50 then perc_resgate = 0.0929210888;
if 51 <= idade <= 55 then perc_resgate = 0.0779617045;
if 56 <= idade <= 60 then perc_resgate = 0.0927592976;
if 61 <= idade <= 65 then perc_resgate = 0.0834530924;
if 66 <= idade <= 70 then perc_resgate = 0.0488719974;
if idade => 71 then perc_resgate =0.0551297661;
end;

if prazo_t = 7 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0341913498;
if 21 <= idade <= 30 then perc_resgate = 0.0857518227;
if 31 <= idade <= 35 then perc_resgate = 0.0886992814;
if 36 <= idade <= 40 then perc_resgate = 0.0856719978;
if 41 <= idade <= 45 then perc_resgate = 0.0855958007;
if 46 <= idade <= 50 then perc_resgate = 0.0876981057;
if 51 <= idade <= 55 then perc_resgate = 0.0782913482;
if 56 <= idade <= 60 then perc_resgate = 0.0783934262;
if 61 <= idade <= 65 then perc_resgate = 0.0942104545;
if 66 <= idade <= 70 then perc_resgate = 0.0865300595;
if idade => 71 then perc_resgate =0.0639427067;
end;

if prazo_t = 8 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0500681581;
if 21 <= idade <= 30 then perc_resgate = 0.0750561982;
if 31 <= idade <= 35 then perc_resgate = 0.0880945747;
if 36 <= idade <= 40 then perc_resgate = 0.0856628678;
if 41 <= idade <= 45 then perc_resgate = 0.0880153972;
if 46 <= idade <= 50 then perc_resgate = 0.0794757717;
if 51 <= idade <= 55 then perc_resgate = 0.0785740411;
if 56 <= idade <= 60 then perc_resgate = 0.0812560554;
if 61 <= idade <= 65 then perc_resgate = 0.0836129204;
if 66 <= idade <= 70 then perc_resgate = 0.0963263615;
if idade => 71 then perc_resgate =0.0730847819;
end;

if prazo_t = 9 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0588733339;
if 21 <= idade <= 30 then perc_resgate = 0.081869508;
if 31 <= idade <= 35 then perc_resgate = 0.0883179912;
if 36 <= idade <= 40 then perc_resgate = 0.0855431311;
if 41 <= idade <= 45 then perc_resgate = 0.0899047446;
if 46 <= idade <= 50 then perc_resgate = 0.0797824851;
if 51 <= idade <= 55 then perc_resgate = 0.0779276537;
if 56 <= idade <= 60 then perc_resgate = 0.0825928944;
if 61 <= idade <= 65 then perc_resgate = 0.084291643;
if 66 <= idade <= 70 then perc_resgate = 0.0966286909;
if idade => 71 then perc_resgate =0.0668822653;
end;

if prazo_t = 10 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0582962182;
if 21 <= idade <= 30 then perc_resgate = 0.0828883705;
if 31 <= idade <= 35 then perc_resgate = 0.0883058827;
if 36 <= idade <= 40 then perc_resgate = 0.0856719879;
if 41 <= idade <= 45 then perc_resgate = 0.0890213041;
if 46 <= idade <= 50 then perc_resgate = 0.080722418;
if 51 <= idade <= 55 then perc_resgate = 0.0776002657;
if 56 <= idade <= 60 then perc_resgate = 0.0835986081;
if 61 <= idade <= 65 then perc_resgate = 0.0829590482;
if 66 <= idade <= 70 then perc_resgate = 0.0953322729;
if idade => 71 then perc_resgate =0.0687979492;
end;

if prazo_t = 11 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0563;
if 21 <= idade <= 30 then perc_resgate = 0.0862;
if 31 <= idade <= 35 then perc_resgate = 0.0862;
if 36 <= idade <= 40 then perc_resgate = 0.0833;
if 41 <= idade <= 45 then perc_resgate = 0.0892;
if 46 <= idade <= 50 then perc_resgate = 0.0761;
if 51 <= idade <= 55 then perc_resgate = 0.0767;
if 56 <= idade <= 60 then perc_resgate = 0.0771;
if 61 <= idade <= 65 then perc_resgate = 0.0789;
if 66 <= idade <= 70 then perc_resgate = 0.08745327;
if idade => 71 then perc_resgate =0.0645926335;
end;

if prazo_t = 12 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0548;
if 21 <= idade <= 30 then perc_resgate = 0.082;
if 31 <= idade <= 35 then perc_resgate = 0.082;
if 36 <= idade <= 40 then perc_resgate = 0.0799;
if 41 <= idade <= 45 then perc_resgate = 0.087;
if 46 <= idade <= 50 then perc_resgate = 0.0699;
if 51 <= idade <= 55 then perc_resgate = 0.0742;
if 56 <= idade <= 60 then perc_resgate = 0.0731;
if 61 <= idade <= 65 then perc_resgate = 0.0753;
if 66 <= idade <= 70 then perc_resgate = 0.0885583145;
if idade => 71 then perc_resgate =0.0648971733;
end;

if prazo_t = 13 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0525;
if 21 <= idade <= 30 then perc_resgate = 0.0768;
if 31 <= idade <= 35 then perc_resgate = 0.0768;
if 36 <= idade <= 40 then perc_resgate = 0.0757;
if 41 <= idade <= 45 then perc_resgate = 0.084;
if 46 <= idade <= 50 then perc_resgate = 0.0623;
if 51 <= idade <= 55 then perc_resgate = 0.0711;
if 56 <= idade <= 60 then perc_resgate = 0.0681;
if 61 <= idade <= 65 then perc_resgate = 0.0707;
if 66 <= idade <= 70 then perc_resgate = 0.0885583145;
if idade => 71 then perc_resgate =0.0651773228;
end;

if prazo_t = 14 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0525;
if 21 <= idade <= 30 then perc_resgate = 0.0706;
if 31 <= idade <= 35 then perc_resgate = 0.0706;
if 36 <= idade <= 40 then perc_resgate = 0.0707;
if 41 <= idade <= 45 then perc_resgate = 0.0802;
if 46 <= idade <= 50 then perc_resgate = 0.0623;
if 51 <= idade <= 55 then perc_resgate = 0.0674;
if 56 <= idade <= 60 then perc_resgate = 0.0681;
if 61 <= idade <= 65 then perc_resgate = 0.0651;
if 66 <= idade <= 70 then perc_resgate = 0.0885583145;
if idade => 71 then perc_resgate =0.0654367007;
end;

if prazo_t = 15 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0525;
if 21 <= idade <= 30 then perc_resgate = 0.0634;
if 31 <= idade <= 35 then perc_resgate = 0.0634;
if 36 <= idade <= 40 then perc_resgate = 0.0649;
if 41 <= idade <= 45 then perc_resgate = 0.0756;
if 46 <= idade <= 50 then perc_resgate = 0.0623;
if 51 <= idade <= 55 then perc_resgate = 0.0631;
if 56 <= idade <= 60 then perc_resgate = 0.0681;
if 61 <= idade <= 65 then perc_resgate = 0.0585;
if 66 <= idade <= 70 then perc_resgate = 0.0885583145;
if idade => 71 then perc_resgate =0.0656781757;
end;

if prazo_t = 16 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0525;
if 21 <= idade <= 30 then perc_resgate = 0.0552;
if 31 <= idade <= 35 then perc_resgate = 0.0552;
if 36 <= idade <= 40 then perc_resgate = 0.0583;
if 41 <= idade <= 45 then perc_resgate = 0.0702;
if 46 <= idade <= 50 then perc_resgate = 0.0623;
if 51 <= idade <= 55 then perc_resgate = 0.0631;
if 56 <= idade <= 60 then perc_resgate = 0.0681;
if 61 <= idade <= 65 then perc_resgate = 0.0585;
if 66 <= idade <= 70 then perc_resgate = 0.0885583145;
if idade => 71 then perc_resgate =0.0659040605;
end;

if prazo_t =>17 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0525;
if 21 <= idade <= 30 then perc_resgate = 0.046;
if 31 <= idade <= 35 then perc_resgate = 0.046;
if 36 <= idade <= 40 then perc_resgate = 0.0509;
if 41 <= idade <= 45 then perc_resgate = 0.064;
if 46 <= idade <= 50 then perc_resgate = 0.0623;
if 51 <= idade <= 55 then perc_resgate = 0.0631;
if 56 <= idade <= 60 then perc_resgate = 0.0681;
if 61 <= idade <= 65 then perc_resgate = 0.0585;
if 66 <= idade <= 70 then perc_resgate = 0.0885583145;
if idade => 71 then perc_resgate =0.0661162467;
end;
end;


if TIPO_PRODUTO = 'VGBL' then do;
if prazo_t <= 1 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0964044485;
if 21 <= idade <= 30 then perc_resgate = 0.1136656619;
if 31 <= idade <= 35 then perc_resgate = 0.113581467;
if 36 <= idade <= 40 then perc_resgate = 0.1116534183;
if 41 <= idade <= 45 then perc_resgate = 0.111088891;
if 46 <= idade <= 50 then perc_resgate = 0.1085795857;
if 51 <= idade <= 55 then perc_resgate = 0.1073957312;
if 56 <= idade <= 60 then perc_resgate = 0.1061556817;
if 61 <= idade <= 65 then perc_resgate = 0.0926342869;
if 66 <= idade <= 70 then perc_resgate = 0.0862330475;
if idade => 71 then perc_resgate =0.0810662821;
end;


if prazo_t = 2 then do;
if 0 <= idade <= 20 then perc_resgate = 0.1116656086;
if 21 <= idade <= 30 then perc_resgate = 0.1203548812;
if 31 <= idade <= 35 then perc_resgate = 0.1203548812;
if 36 <= idade <= 40 then perc_resgate = 0.1196743779;
if 41 <= idade <= 45 then perc_resgate = 0.1181813854;
if 46 <= idade <= 50 then perc_resgate = 0.1169540945;
if 51 <= idade <= 55 then perc_resgate = 0.1121172922;
if 56 <= idade <= 60 then perc_resgate = 0.109371471;
if 61 <= idade <= 65 then perc_resgate = 0.1000036454;
if 66 <= idade <= 70 then perc_resgate = 0.0938845863;
if idade => 71 then perc_resgate =0.0956293341;
end;

if prazo_t = 3 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0962238168;
if 21 <= idade <= 30 then perc_resgate = 0.1153373576;
if 31 <= idade <= 35 then perc_resgate = 0.1153373576;
if 36 <= idade <= 40 then perc_resgate = 0.1153373576;
if 41 <= idade <= 45 then perc_resgate = 0.1126951329;
if 46 <= idade <= 50 then perc_resgate = 0.1148956033;
if 51 <= idade <= 55 then perc_resgate = 0.1143092873;
if 56 <= idade <= 60 then perc_resgate = 0.0969757675;
if 61 <= idade <= 65 then perc_resgate = 0.0952214687;
if 66 <= idade <= 70 then perc_resgate = 0.1033877971;
if idade => 71 then perc_resgate =0.0899598358;
end;

if prazo_t = 4 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0933836693;
if 21 <= idade <= 30 then perc_resgate = 0.1308167179;
if 31 <= idade <= 35 then perc_resgate = 0.1323200766;
if 36 <= idade <= 40 then perc_resgate = 0.1276333596;
if 41 <= idade <= 45 then perc_resgate = 0.1269720606;
if 46 <= idade <= 50 then perc_resgate = 0.1276010317;
if 51 <= idade <= 55 then perc_resgate = 0.1257958834;
if 56 <= idade <= 60 then perc_resgate = 0.1225347406;
if 61 <= idade <= 65 then perc_resgate = 0.1172562986;
if 66 <= idade <= 70 then perc_resgate = 0.1240413407;
if idade => 71 then perc_resgate =0.0968892547;
end;

if prazo_t = 5 then do;
if 0 <= idade <= 20 then perc_resgate = 0.1019291932;
if 21 <= idade <= 30 then perc_resgate = 0.1228947511;
if 31 <= idade <= 35 then perc_resgate = 0.1232482019;
if 36 <= idade <= 40 then perc_resgate = 0.1203404301;
if 41 <= idade <= 45 then perc_resgate = 0.123015238;
if 46 <= idade <= 50 then perc_resgate = 0.1127065459;
if 51 <= idade <= 55 then perc_resgate = 0.1149985911;
if 56 <= idade <= 60 then perc_resgate = 0.1081059344;
if 61 <= idade <= 65 then perc_resgate = 0.0993748847;
if 66 <= idade <= 70 then perc_resgate = 0.1056344693;
if idade => 71 then perc_resgate =0.0992798909;
end;

if prazo_t = 6 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0847233143;
if 21 <= idade <= 30 then perc_resgate = 0.1130459001;
if 31 <= idade <= 35 then perc_resgate = 0.1196099112;
if 36 <= idade <= 40 then perc_resgate = 0.1196099112;
if 41 <= idade <= 45 then perc_resgate = 0.1178504226;
if 46 <= idade <= 50 then perc_resgate = 0.1162078679;
if 51 <= idade <= 55 then perc_resgate = 0.114773282;
if 56 <= idade <= 60 then perc_resgate = 0.1124871876;
if 61 <= idade <= 65 then perc_resgate = 0.0977603363;
if 66 <= idade <= 70 then perc_resgate = 0.0910580546;
if idade => 71 then perc_resgate =0.094442619;
end;

if prazo_t = 7 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0673829576;
if 21 <= idade <= 30 then perc_resgate = 0.1076980801;
if 31 <= idade <= 35 then perc_resgate = 0.1137059079;
if 36 <= idade <= 40 then perc_resgate = 0.1135685188;
if 41 <= idade <= 45 then perc_resgate = 0.1099915037;
if 46 <= idade <= 50 then perc_resgate = 0.1136253324;
if 51 <= idade <= 55 then perc_resgate = 0.1034984188;
if 56 <= idade <= 60 then perc_resgate = 0.102109848;
if 61 <= idade <= 65 then perc_resgate = 0.0936842761;
if 66 <= idade <= 70 then perc_resgate = 0.0946490111;
if idade => 71 then perc_resgate =0.0936000601;
end;

if prazo_t = 8 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0735727618;
if 21 <= idade <= 30 then perc_resgate = 0.1022165152;
if 31 <= idade <= 35 then perc_resgate = 0.1052575574;
if 36 <= idade <= 40 then perc_resgate = 0.1036631365;
if 41 <= idade <= 45 then perc_resgate = 0.0994831336;
if 46 <= idade <= 50 then perc_resgate = 0.1052575574;
if 51 <= idade <= 55 then perc_resgate = 0.0983803611;
if 56 <= idade <= 60 then perc_resgate = 0.1029668338;
if 61 <= idade <= 65 then perc_resgate = 0.0879881828;
if 66 <= idade <= 70 then perc_resgate = 0.0893549456;
if idade => 71 then perc_resgate =0.0789667751;
end;

if prazo_t = 9 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0738141513;
if 21 <= idade <= 30 then perc_resgate = 0.0976223472;
if 31 <= idade <= 35 then perc_resgate = 0.1028402816;
if 36 <= idade <= 40 then perc_resgate = 0.1025550291;
if 41 <= idade <= 45 then perc_resgate = 0.0988026969;
if 46 <= idade <= 50 then perc_resgate = 0.0979339325;
if 51 <= idade <= 55 then perc_resgate = 0.0986498182;
if 56 <= idade <= 60 then perc_resgate = 0.087400427;
if 61 <= idade <= 65 then perc_resgate = 0.0815342811;
if 66 <= idade <= 70 then perc_resgate = 0.081914309;
if idade => 71 then perc_resgate =0.064;
end;

if prazo_t = 10 then do;
if 0 <= idade <= 20 then perc_resgate = 0.077986794;
if 21 <= idade <= 30 then perc_resgate = 0.0967429545;
if 31 <= idade <= 35 then perc_resgate = 0.1009618855;
if 36 <= idade <= 40 then perc_resgate = 0.1020911857;
if 41 <= idade <= 45 then perc_resgate = 0.0976777582;
if 46 <= idade <= 50 then perc_resgate = 0.1002601588;
if 51 <= idade <= 55 then perc_resgate = 0.0924751781;
if 56 <= idade <= 60 then perc_resgate = 0.0824;
if 61 <= idade <= 65 then perc_resgate = 0.0759714746;
if 66 <= idade <= 70 then perc_resgate = 0.0736758055;
if idade => 71 then perc_resgate =0.0451;
end;

if prazo_t = 11 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0745336756;
if 21 <= idade <= 30 then perc_resgate = 0.0990315709;
if 31 <= idade <= 35 then perc_resgate = 0.0758;
if 36 <= idade <= 40 then perc_resgate = 0.0919;
if 41 <= idade <= 45 then perc_resgate = 0.0787;
if 46 <= idade <= 50 then perc_resgate = 0.0859;
if 51 <= idade <= 55 then perc_resgate = 0.0739;
if 56 <= idade <= 60 then perc_resgate = 0.0711;
if 61 <= idade <= 65 then perc_resgate = 0.0582;
if 66 <= idade <= 70 then perc_resgate = 0.0526;
if idade => 71 then perc_resgate =0.0451;
end;

if prazo_t = 12 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0731414936;
if 21 <= idade <= 30 then perc_resgate = 0.0977264003;
if 31 <= idade <= 35 then perc_resgate = 0.0643;
if 36 <= idade <= 40 then perc_resgate = 0.0817;
if 41 <= idade <= 45 then perc_resgate = 0.0665;
if 46 <= idade <= 50 then perc_resgate = 0.0756;
if 51 <= idade <= 55 then perc_resgate = 0.0615;
if 56 <= idade <= 60 then perc_resgate = 0.058;
if 61 <= idade <= 65 then perc_resgate = 0.0582;
if 66 <= idade <= 70 then perc_resgate = 0.0342;
if idade => 71 then perc_resgate =0.0451;
end;

if prazo_t = 13 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0718608103;
if 21 <= idade <= 30 then perc_resgate = 0.0965257596;
if 31 <= idade <= 35 then perc_resgate = 0.0643;
if 36 <= idade <= 40 then perc_resgate = 0.0701;
if 41 <= idade <= 45 then perc_resgate = 0.0527;
if 46 <= idade <= 50 then perc_resgate = 0.0639;
if 51 <= idade <= 55 then perc_resgate = 0.0475;
if 56 <= idade <= 60 then perc_resgate = 0.058;
if 61 <= idade <= 65 then perc_resgate = 0.0582;
if 66 <= idade <= 70 then perc_resgate = 0.0342;
if idade => 71 then perc_resgate =0.0451;
end;

if prazo_t = 14 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0706750827;
if 21 <= idade <= 30 then perc_resgate = 0.0954141401;
if 31 <= idade <= 35 then perc_resgate = 0.0643;
if 36 <= idade <= 40 then perc_resgate = 0.0701;
if 41 <= idade <= 45 then perc_resgate = 0.0527;
if 46 <= idade <= 50 then perc_resgate = 0.0639;
if 51 <= idade <= 55 then perc_resgate = 0.0475;
if 56 <= idade <= 60 then perc_resgate = 0.058;
if 61 <= idade <= 65 then perc_resgate = 0.0582;
if 66 <= idade <= 70 then perc_resgate = 0.0342;
if idade => 71 then perc_resgate =0.0451;
end;

if prazo_t => 15 then do;
if 0 <= idade <= 20 then perc_resgate = 0.0695711968;
if 21 <= idade <= 30 then perc_resgate = 0.094379247;
if 31 <= idade <= 35 then perc_resgate = 0.0643;
if 36 <= idade <= 40 then perc_resgate = 0.0701;
if 41 <= idade <= 45 then perc_resgate = 0.0527;
if 46 <= idade <= 50 then perc_resgate = 0.0639;
if 51 <= idade <= 55 then perc_resgate = 0.0475;
if 56 <= idade <= 60 then perc_resgate = 0.058;
if 61 <= idade <= 65 then perc_resgate = 0.0582;
if 66 <= idade <= 70 then perc_resgate = 0.0342;
if idade => 71 then perc_resgate =0.0451;
end;
end;


*****************************************************************;
if TIPO_PRODUTO = 'PGBL' then do ;
if idade < 45 then conversao_benef = 0 ;
if 45 <= idade <=49 then conversao_benef = 0.0002248949 ;
if 50 <= idade <=54 then conversao_benef = 0.0016358182 ;
if 55 <= idade <=59 then conversao_benef = 0.001590492143609;
if 60 <= idade <=64 then conversao_benef = 0.00642865683454636 ;
if 65 <= idade <=70 then conversao_benef = 0.00311600788055233 ;
if idade > 70 then conversao_benef = 0 ;
end;

if TIPO_PRODUTO = 'VGBL' then do ;
if idade < 45 then conversao_benef = 0 ;
if 45 <= idade <=49 then conversao_benef = 0.0000063079 ;
if 50 <= idade <=54 then conversao_benef = 0.0000063079 ;
if 55 <= idade <=59 then conversao_benef = 0.0000474506 ;
if 60 <= idade <=64 then conversao_benef = 0.000201594312207188 ;
if 65 <= idade <=70 then conversao_benef = 0.00008890812 ;
if idade > 70 then conversao_benef = 0 ;
end;


npx= lx_1 / lx ;

if idade > 115 then npx = 0 ;
if lx_1 = . then npx = 0 ;

perc_aporte = 0.007495029;

 

* 1) Atualiza contribuição para novo exercicio

CONTRIB_NOVO=CONTRIB_ant* npx * (1 - perc_resgate);


* 2) Abertura das Demais Variaveis ;
* se converteu em aposentadoria não aporta mais;
*if marca = 1 then perc_aporte = 0 ;
Aporte = SALDO_PROV_ant*npx*perc_aporte;
Resgate = (SALDO_PROV_ant*npx*perc_resgate);
Resgate_Morte = SALDO_PROV_ant*(1-npx) ;
Contrib = CONTRIB_NOVO ;

if aporte < 0 then aporte = 0 ;
if resgate < 0 then resgate = 0 ;
if Contrib < 0 then Contrib = 0 ;
if resgate_Morte < 0 then resgate_morte = 0 ;

if aporte = . then aporte = 0 ;
if resgate = . then resgate = 0 ;
if Resgate_Morte = . then Resgate_Morte = 0 ;
if contrib = . then contrib = 0 ;

total_entradas = (aporte + contrib) ;
/*if total_entradas not eq 0 then do ;
vl_carregamento = total_entradas * carregamento ; */
/*end; else vl_carregamento = 0 ;*/

* Devemos utilizar a Rentabilidade Nominal e deduzir a TAF para chegar no Saldo PMBaC no final de t;
rent_taf = ((1+rent_fundo)/(1+taf_aa))-1;

* Qtdade do tempo ;
qtde = qtde_ant* npx * (1 - perc_resgate);

* PGBL / VGBL ;
if TIPO_PRODUTO in ('PGBL' 'VGBL') then
SALDO_PROV_novo0 = SALDO_PROV_ant*npx*(1+rent_fundo)+(SALDO_PROV_ant*npx*perc_aporte)*((1+rent_fundo))-(SALDO_PROV_ant*npx*perc_resgate)*((1+ rent_fundo)) + CONTRIB_NOVO*(( 1+ rent_fundo));

* Variavel Saldo Concessão em Benefício
Condições: a) só entra em beneficio 1 vez, b) ao entrar em beneficio não contribui mais apenas resgata ou morre;
Entrada_benef = 0;
if conversao_benef not eq 0 then do ;
Entrada_benef = SALDO_PROV_novo0 * conversao_benef ;
qtde_benef = qtde * conversao_benef ;
marca = 1 ;
end;


if TIPO_PRODUTO in ('PGBL' 'VGBL') then SALDO_PROV_novo = SALDO_PROV_novo0 - Entrada_benef ;

if SALDO_PROV_novo = . then SALDO_PROV_novo = 0 ;

* RENTABILIDADE PGBL / VGBL ;
if TIPO_PRODUTO in ('PGBL' 'VGBL') THEN DO ;
Rentabilidade = SALDO_PROV_novo - SALDO_PROV_ant - aporte + resgate + resgate_morte - contrib_novo + Entrada_benef;
end;

*Zera movimento negativos;
if rentabilidade < 0 then rentabilidade = 0 ;
if Entrada_benef < 0 then Entrada_benef = 0 ;

if Rentabilidade = . then Rentabilidade = 0 ;
if Entrada_benef = . then Entrada_benef = 0 ;

if Contrib = . then Contrib = 0 ;

* Calculo TAF que Retorna para a Seguradora líquido de impostos;
TAF_Banco = (mean(SALDO_PROV_ant)*&DA );
Taf_seguradora = taf_banco * 0.12 ;


* >>>> Resultado por plano <<<< ;
proc means data=Proj&M. nway noprint;
class anobase TIPO_PRODUTO TABUA_ATUARIAL juros EXCEDENTE_FINANCEIRO Indice;
var SALDO_PROV_ant Contrib Aporte Resgate Resgate_Morte Entrada_benef Rentabilidade
SALDO_PROV_novo TAF_Banco Taf_seguradora qtde qtde_benef;
format SALDO_PROV_ant Contrib Aporte Resgate Resgate_Morte Entrada_benef
Rentabilidade SALDO_PROV_novo TAF_Banco Taf_seguradora qtde qtde_benef commax15.2;
output out=tot&M. sum= ;
run;

proc append base = Total_Fluxo_acum DATA=tot&M. force ; run;


* Cria base de Entradas em Beneficio ;
Data proj_benef&M.;
set Proj&M. ;

if idade => 115 then delete ;
if marca = 1 ;
anobase = &M. ;
if entrada_benef not eq 0 ;
format Entrada_benef qtde_benef commax15.8 ;
keep anobase TIPO_PRODUTO Processo_SUSEP PLANOS_NOMES
TABUA_ATUARIAL juros EXCEDENTE_FINANCEIRO idade Entrada_benef Indice qtde_benef;

proc append base = Total_Fluxo_Benef DATA=Proj&M.; run;

%end;
%mend calcular;
%calcular;
run;

Fdomingos
Calcite | Level 5

I've tried, but didn't work.

 

Follow bellow the code that I was using:

 

CONTRIB_NOVO_1 = CONTRIB_ant;
IF tempo = 1 THEN do;
CONTRIB_NOVOt = CONTRIB_NOVO_1 * npx * (1 - perc_resgate);
CONTRIB_NOVO_ant = CONTRIB_NOVOt;

retain CONTRIB_NOVOt CONTRIB_NOVO_ant;
else do;
CONTRIB_NOVOt = lag0(CONTRIB_NOVO_ant) * npx * (1 - perc_resgate);
CONTRIB_NOVO_ant = lag0(CONTRIB_NOVOt);
end;

Kurt_Bremser
Super User

lag0() will return the current value. To look back into the previous observation, use lag().

 

And do not use any of the lag() functions in a conditional branch. Make sure that lag() functions are called once per every data step iteration, or they won't fill their queue correctly.

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

Mastering the WHERE Clause in PROC SQL

SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 6 replies
  • 1711 views
  • 0 likes
  • 4 in conversation