【发布时间】:2017-06-12 13:18:12
【问题描述】:
大家好,非常感谢您的帮助!我在下面的代码之前有一个名为“simulation_tracking3”的数据步骤,它输出如下内容:
CDFx Allowed_Claims
.06 120
.12 13
.15 1400
我的哈希表根据随机生成的值(从 0 到 1)对 Allowed_Claims 进行平均。例如,我们称这个过程 A,如果 Px = rand('Uniform',0,1) 产生 0.09,我希望它在 Px = .06 和 Px = 0.12 的 Allowed_Claims 值之间取平均值,即 (120+13)/2
数组的作用是它决定了我想要多少次 Process A 的迭代。数组是
Members {24} _temporary_ (5 6 8 10 12 15 20 25 30 40 50 60 70 80
90 100 125 150 175 200 250 300 400 500);
所以当循环开始时,它将执行过程 A 的 5 次迭代,从而产生 5 个平均“allowed_claims”值。我想要这五个索赔的总和。
然后,循环将继续执行过程 A 的 6 次迭代,并产生 6 个平均“allowed_claims”值。同样,我想要这 6 项索赔的总和。
输出表如下所示:
`
Member[i] Average_Expected_Claims
5 (sum of 5 'averaged 'claims)
6 (sum of 6 'averaged' claims)
8 (sum of 8 'averaged' claims)
我的问题是,在倒数第二次和最后一次迭代中,它使用相同的随机值来生成允许的声明。并且它没有以“运行总计”格式总结。
例如,5 个成员组的第四次和第五次迭代具有相同的允许声明,6 个成员组的第五次和第六次迭代具有相同的允许声明,等等。此外,输出表中生成的数字对应于 X-成员组,将允许的索赔值从第一次出现到倒数第二次相加。例如,对于 5 人组,允许索赔的总和为 1-4,而不是 1-5。
所以我看到的两个问题是:它不会生成唯一的随机值来计算允许的声明;它未能将最后一次出现添加到运行总数中。
5 成员生成的表的值如下所示:
allowed_claims _i_simul rand_value ac_average
805.61154253 1 0.4518515905 805.61154253
805.61154253 2 0.2017115643 0
5091.2264605 3 0.7019698818 4285.614918
8207.1931206 4 0.6518877812 3115.9666601
8207.1931206 5 0.6518877812 3115.9666601
下面是我的代码:
data simulation_members; *simulates allowed claims for each member in member array;
call streaminit(454);
array members [24] _temporary_ (5 6 8 10 12 15 20 25 30 40 50
60 70 80 90 100 125 150 175 200 250 300 400 500); *any number of members here is fine;
if _n_ eq 1 then do; * initiliaze the hash tables;
if 0 then set simulation_tracking3; * defines the variables used;
declare hash _iter(dataset:'simulation_tracking3', ordered: 'a'); *ordered = ascending - do not need a sort first;
_iter.defineKey('CDFx'); * key is artificial, but has to exist;
_iter.defineData('CDFx','Allowed_Claims'); * data variables to retrieve;
_iter.defineDone();
declare hiter hi_iter('_iter'); * the iterator object;
end;
do _i_member = 1 to dim(members); * iterate over members array;
call missing(claims_simulated);
do _i_simul = 1 to members[_i_member]-1;
rand_value = rand('Uniform',0,1);
do rc = hi_iter.first() by 0 until (hi_iter.next() ne 0 or CDFx gt rand_value);
end;
ac_max = allowed_claims;
rc = hi_iter.prev();
ac_min = allowed_claims;
ac_average = mean(ac_max,ac_min);
claims_simulated + ac_average;
put rand_value= claims_simulated=; *just for logging;
output;
end;
putlog;
output; *drop unnecessary columns;
end;
stop;
run;
【问题讨论】: