【问题标题】:Do loop - random number is generating the same number twice and isn't adding it in a running total做循环 - 随机数两次生成相同的数字并且没有将其添加到运行总数中
【发布时间】: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;

【问题讨论】:

    标签: sas hashtable do-loops


    【解决方案1】:

    这与 RNG 无关,与编程逻辑有关。 它不是两次生成数字,而是两次输出同一行。

    删除具有*drop unnecessary columns; 注释的output,并更新循环以删除-1

    【讨论】:

    • 谢谢乔。那么我删除的output,它在做什么?
    • 向数据集输出一行 - 在这种情况下,是额外的一行。 (output 是告诉 SAS 实际向目标数据集写入内容的原因。如果您没有 output 语句,它会在 run; 上假设一个,但否则它会写入您告诉它的频率。)
    • 哦,好吧。现在更有意义了。感谢您的所有帮助!
    • 嘿乔我如何让输出再次显示总数?我得到了正确的总数,但 _i_simul 显示为 6、7、9 等。而不是 5,6,8。
    • 它总是高一 - 因为当whiletountil 条件为false 时它会退出循环。所以试验次数将比循环变量少一。
    猜你喜欢
    • 1970-01-01
    • 2013-10-22
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多