2017-06-06 67 views
0

我想引用数组中的表,最终在数据步骤中使用进程。这里是代码:是否可以在数组语句中使用表?

proc sql; 
create table claims.iterations 
    as select Allowed_Claims, Px1 
    from simulation 
    order by Allowed_Claims, Px1; 
quit; 
data simulation_iterations; 
    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); 
    array ****** ; 
    do i = 1 to 24; 
    do j = 1 to Members{i}-1; 
     Px2 = rand('Uniform',0,1); 
     if Px2 > 0.5 then Px2=Px2;   
     output; 
     end; 
    output; 
    end; 
run; 

是否有可能这样做?虽然没有显示,但我想使用表格来尝试为“成员”数组中的值进行线性插值。

编辑:

欲插用于基于随机生成的值(从0到1)Allowed_Claims。下面列出了我基于我的线性插值的精简表。

Allowed_Claims Px1 
25.224545313 0.0008129708 
34.767797696 0.0014747668 
35.367278291 0.0015210493 
42.616660238 0.0021191153 
52.495185148 0.0030343735 
52.652599162 0.0030497846 
53.26904904  0.0031103676 
57.183442582 0.0035034118 

例如,让我们称此方法A中,如果Px2 = rand('Uniform',0,1)产生0.0010,我希望它的Allowed_Claims值之间进行内插,其中Px1中= 0.0008129708和Px1中= 0.0014747668。

该数组的作用是它决定了我想要的进程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); 

所以循环开始时,其将执行5次迭代方法A的,从而产生内插5“allowed_claims”值。我希望得到这五个索赔的平均值。

然后,循环将继续并执行过程A的6次迭代并产生6个内插的“allowed_claims”值。再次,我想要这6个索赔的平均值。

我想输出表的样子:

`

Member[i] Average_Expected_Claims 
    5    (average of 5 interpolated claims) 
    6    (average of 6 interpolated claims) 
    8    (average of 8 interpolated claims) 
+1

你想插入什么?你想用什么公式?显示一些实际值和公式以及结果插值。然后讨论如何缩减将该公式应用于示例数据中的多个变量和值。 – Tom

+0

仅仅是您想要将数据集中的所有观察结果包含到结果集中?例如,如果您的datastep中只有DO I = 1到24循环,那么您是否希望这意味着claim.iteration中的每个值都会在输出数据集中复制24次?如果是这样,那么在set语句中使用POINT =选项。 – Tom

+0

嘿,汤姆,我编辑了上面的问题,使其更加清晰。 – indiansrulz

回答

1

下面是如何使用散列表进行此操作的示例。它与这个用法中的数组非常相似 - 因为没有“查找关键字”,所以我们只需加载它并创建一个迭代器,然后遍历迭代器,就像数组一样(除非你无法获取确切的位置)。令人遗憾的是,没有VLOOKUP类型的功能可以给你最接近的匹配 - 你必须迭代,直到找到正确的。

这不是绝对最有效的过程,特别是我做了比我需要更多的迭代器调用(因为我可以将最后一次看到的允许声明存储在变量中)。我不打扰,因为坦率地说,这是不值得的,只是再次调用迭代器没有太大的区别,但我想为了提高效率,如果在你的机器上花费很长时间,你可能希望以不同的方式做。我怀疑它会。

*Just setting up the example iterations dataset; 
data iterations; 
    call streaminit(7); 
    retain allowed_claims 20; 
    do px1 = 0.05 to 1 by 0.05; 
    allowed_claims + rand('Uniform')*5; 
    output; 
    end; 
run; 


data simulated_iterations2; 
    call streaminit(8);  *init the random generator; 
    array Members [5] _temporary_ (5 6 8 10 12); *any number of members here is fine; 
    if _n_ eq 1 then do;   *initialize the hash tables; 
    if 0 then set iterations;  *defines the variables used; 
    declare hash _iter(dataset:'iterations', ordered:'a'); *ordered = ascending - do not need a sort first; 
    _iter.defineKey('px1');     * key is artificial, but has to exist; 
    _iter.defineData('px1','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];  * iterate for the member value; 

     rand_value = rand('Uniform');   * the number to interpolate; 
     do rc= hi_iter.first() by 0 until (hi_iter.next() ne 0 or px1 gt rand_value); 
     *do nothing;       * here we are doing the work in the DO statement, looping until we find the value greater than the rand value; 
     end; 
     ac_max = allowed_claims;     * your 'max' interpolation value; 
     rc = hi_iter.prev();      * back up one; 
     ac_min = allowed_claims;     * your 'min' interpolation value; 
     claims_simulated + (mean(ac_min,ac_max))/members[_i_member]; *add the mean of the two interpolation values divided by the total number we are going to do to the total - avoids us having to do another array to store these and get mean of; 
     put rand_value= claims_simulated=;  *just for logging; 
    end; 
    putlog; 
    output; 
    end; 

    stop; 

run; 
+0

嘿乔,非常感谢你!如果我可以欠你......我会的。 – indiansrulz

+0

Hey Joe,如果我想重复“插入”过程(比如说25次)并将它们添加到现有表格中,我会在哪里添加额外的“do”语句 – indiansrulz

+0

Hey Joe,我将如何使此过程更高效? – indiansrulz

0

不,这是不可能做到这一点,反而有hash tables的概念,这将是一个合适的解决方案来实现相同类型的查找。

SAS中的数组基本上是变量名称列表,它们不是C#或其他类型的实际数据类型。

+0

嘿乔我更新了我的问题,使其更容易理解,也许您可​​以就如何解决我的问题提供另一条建议! – indiansrulz

相关问题