Эй, ребята, спасибо вам большое, заранее, за вашу помощь! У меня есть шаг данных перед приведенным ниже кодом под названием «simulation_tracking3», который выводит что-то вроде:
CDFx Allowed_Claims
.06 120
.12 13
.15 1400
Моя хеш-таблица усредняет Allowed_Claims на основе случайно сгенерированного значения (от 0 до 1). Например, давайте назовем этот Процесс А, если Px = rand('Uniform',0,1)
дает 0,09, я хочу, чтобы он усреднялся между значениями Allowed_Claims, где Px = 0,06 и Px = 0,12, что составляет (120+13)/2.
Роль массива заключается в том, что он диктует, сколько итераций Процесса А я хочу. Массив
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);
Таким образом, когда цикл запускается, он выполняет 5 итераций процесса А, тем самым создавая 5 усредненных значений «разрешенных_притязаний». Мне нужна сумма этих пяти претензий.
Затем цикл продолжится и выполнит 6 итераций процесса A и выдаст 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 участников и т. д. суммирует допустимое значение утверждений от первого вхождения до второго и до последнего. Например, для группы из 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;