嘿,你們非常感謝你,提前,你的幫助!我有以下稱爲「simulation_tracking3」的代碼之前一個數據步驟,其輸出是這樣的:做循環 - 隨機數字生成相同的數字兩次,並沒有增加它在運行總數
CDFx Allowed_Claims
.06 120
.12 13
.15 1400
我的哈希表的平均值根據一個隨機生成的值(從0到1)Allowed_Claims。例如,如果Px = rand('Uniform',0,1)
產生.09,我希望它在Allowed_Claims值(其中Px = .06和Px = 0.12,即(120 + 13)/ 2)之間平均,如果Px = rand('Uniform',0,1)
產生.09,該數組是指決定AI需要多少迭代。該數組是
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次迭代方法A的,由此產生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;
謝謝喬。所以我刪除的「輸出」,它在做什麼? – indiansrulz
輸出一行到數據集 - 在這種情況下,一個額外的。 ('output'是告訴SAS實際向目標數據集寫入內容,如果你沒有'output'語句,它假設'run',但是不管怎麼說,它會經常寫入。) – Joe
oh okay。這使得現在更有意義。感謝你的幫助! – indiansrulz