67%macro irmst_riskagg_linear( ds_in_configuration_table =
68 , ds_in_correlation_table =
69 , working_libname = work
70 , ds_out_risk_analysis_table =
88 create table &working_libname..bygroup_lookup as
89 select distinct scenario_id, reporting_dt
90 from &ds_in_configuration_table.;
94 data &working_libname..bygroup_lookup;
95 set &working_libname..bygroup_lookup;
101 select count(index), index into :bygroup_cnt, :bygroup_list separated by
" "
102 from &working_libname..bygroup_lookup;
106 data &working_libname..enhanced_configuration_unordered;
107 set &ds_in_configuration_table.;
109 declare hash h(dataset:
"&working_libname..bygroup_lookup");
110 h.definekey(
"scenario_id");
111 h.definedata(
"index");
121 data &working_libname..enhanced_correlation_table;
122 set &ds_in_correlation_table.;
124 declare hash h(dataset:
"&working_libname..bygroup_lookup");
125 h.definekey(
"scenario_id");
126 h.definedata(
"index");
136 %let valid_bygroup_list=;
137 %let valid_bygroup_cnt=0;
138 %
do bygroup_i=1 %to &bygroup_cnt.;
141 set &working_libname..enhanced_configuration_unordered(where=(index=&bygroup_i.)) end=last;
143 call symputx("config_dim",_N_,"L");
147 set &working_libname..enhanced_correlation_table(where=(index=&bygroup_i.)) end=last;
149 call symputx("corr_dim",_N_,"L");
152 %*let config_dim=%rsk_attrn(&working_libname..enhanced_configuration_i_by, nobs);
153 %*let corr_dim=%rsk_attrn(&working_libname..enhanced_correlation_i_by, nobs);
154 %if &config_dim.=&corr_dim. %then %do;
155 %let valid_bygroup_list=&valid_bygroup_list. &bygroup_i.;
156 %let valid_bygroup_cnt=%eval(&valid_bygroup_cnt.+1);
159 %put WARNING: The subgroup "scenario_id" identified by index=&bygroup_i. is not valid because the dimnsions of the configuration table are (&config_dim. x 1) while the dimension of the correlation table are (&corr_dim. x &corr_dim.).;
165 data &working_libname..enhanced_configuration_table;
166 set &working_libname..enhanced_correlation_table(keep=_NAME_ index) &working_libname..enhanced_configuration_unordered(obs=0);
168 declare hash h(dataset:"&working_libname..enhanced_configuration_unordered(rename=(name=_NAME_))");
169 h.definedata("EXPECTEDLOSS", "VALUEATRISK", "ECONOMIC_CAPITAL", "VALUEATRISK_ALPHA");
170 h.definekey("_NAME_","index");
193 EXPECTEDLOSS=j(&valid_bygroup_cnt.,1,.);
194 VALUEATRISK=j(&valid_bygroup_cnt.,1,.);
195 ECONOMIC_CAPITAL=j(&valid_bygroup_cnt.,1,.);
196 VALUEATRISK_ALPHA=j(&valid_bygroup_cnt.,1,.);
197 index=j(&valid_bygroup_cnt.,1,.);
200 %do valid_bygroup_i=1 %to &valid_bygroup_cnt.;
201 %let valid_bygroup_index=%scan(&valid_bygroup_list., &valid_bygroup_i., %str( ));
204 use &working_libname..enhanced_configuration_table(where=(index=&valid_bygroup_index.));
205 read all var {
"EXPECTEDLOSS"} into expected_loss;
206 read all var {
"VALUEATRISK"} into var;
207 read all var {
"VALUEATRISK_ALPHA"} into ALPHA;
208 close &working_libname..enhanced_configuration_table;
211 use &working_libname..enhanced_correlation_table(where=(index=&valid_bygroup_index.));
212 read all var {
"_name_"} into columns;
213 close &working_libname..enhanced_correlation_table;
216 use &working_libname..enhanced_correlation_table(where=(index=&valid_bygroup_index.));
217 read all var columns into risk_corr;
218 close &working_libname..enhanced_correlation_table;
221 EXPECTEDLOSS[&valid_bygroup_i.,1]=sum(expected_loss);
222 VALUEATRISK[&valid_bygroup_i.,1]=sqrt(var`*risk_corr*var);
223 if EXPECTEDLOSS[&valid_bygroup_i.,1]<0 then ECONOMIC_CAPITAL[&valid_bygroup_i.,1]=VALUEATRISK[&valid_bygroup_i.,1];
224 else ECONOMIC_CAPITAL[&valid_bygroup_i.,1]=VALUEATRISK[&valid_bygroup_i.,1]-EXPECTEDLOSS[&valid_bygroup_i.,1];
225 if ECONOMIC_CAPITAL[&valid_bygroup_i.,1]<0 then ECONOMIC_CAPITAL[&valid_bygroup_i.,1]=0;
226 index[&valid_bygroup_i.,1]=&valid_bygroup_index.;
228 VALUEATRISK_ALPHA[&valid_bygroup_i.,1]=ALPHA[1,1];
232 create &ds_out_risk_analysis_table. var {
"EXPECTEDLOSS" "VALUEATRISK" "ECONOMIC_CAPITAL" "VALUEATRISK_ALPHA" "index"};
234 close &ds_out_risk_analysis_table.;
240 data &ds_out_risk_analysis_table.;
241 set &ds_out_risk_analysis_table. &working_libname..enhanced_configuration_table(obs=0);
243 declare hash h(dataset:
"&working_libname..bygroup_lookup");
244 h.definekey(
"index");
245 h.definedata(
"scenario_id",
"reporting_dt");
252 drop rc name NValue table_id project_id load_id processed_dttm;
256 proc append base=&ds_out_risk_analysis_table.( keep= ENTITY_ID
264 data=&DS_IN_CONFIGURATION_TABLE.( keep= ENTITY_ID