2017-06-12 75 views
0

嘿,你們非常感謝你,提前,你的幫助!我有以下稱爲「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; 

回答

0

這有什麼好做RNG和一切與編程邏輯。 它不是兩次生成一個數字,而是兩次輸出同一行。

刪除有*drop unnecessary columns;評論的output,並更新循環以刪除-1

+0

謝謝喬。所以我刪除的「輸出」,它在做什麼? – indiansrulz

+1

輸出一行到數據集 - 在這種情況下,一個額外的。 ('output'是告訴SAS實際向目標數據集寫入內容,如果你沒有'output'語句,它假設'run',但是不管怎麼說,它會經常寫入。) – Joe

+0

oh okay。這使得現在更有意義。感謝你的幫助! – indiansrulz