2017-06-05 260 views
0

熊与我!这是我一直在努力的一个项目,尝试了很多东西,但我似乎无法使其发挥作用。如何通过SAS中的数组进行线性插值?

下面是我用来创建一个新表的现有代码。现有的输出表(claims.simulation_ISLPx)也在下面。

我想要做的是取成员(5,6,8,10,12)的“数组”,并为5个成员组运行5次迭代,为6个成员组运行6次迭代。 ..,12个成员组的迭代。

“过程”应从U(0,1)中绘制一个随机值,然后用claim.simulationISLPx表中的给定值线性插入它以确定组中的平均索赔(它将花费总索赔除以5,6,8,10或12)。

我不知道什么添加到我的代码。任何帮助将非常感激。

/*从输入零充气数正态函数,并允许付费式*/

%let P_0 = .25; 
%let Mean = 8.9; 
%let Std_Dev = 1.8; 
%let ISL = 50000; 
%let Deductible = 1750; 
%let COINS = .80; 
%let OOPM = 2000; 
%let Min_Paid = 253.08; 
%let Ind_Cap_Claim = 2500000; 
%let Iterations = 10; 
%let Distribution = 'Lognormal'; 
%let Member_Count = (5,6,8,10,12,15,20,25,30,40,50,60,70,80,90,100,125,150,175,200,250,300,400,500) 

libname claims 



data simulation; 
    do i = 1 to &Iterations; 
     Px = rand('Uniform',&P_0,1); 
     Px1 = rand('Uniform',0,1);/*generate random numbers from 0 to 1*/ 
      if Px>= %sysevalf(&P_0) then 
     Allowed_Claims = quantile(&Distribution,Px1,%sysevalf(&Mean),%sysevalf(&Std_Dev)); /*inverse of cdf*/ 
     output; 
    end; 
run; 

proc sql; 
    create table claims.simulation_ISLPx as 
    select Allowed_Claims, Px1 
     from simulation 
     order by Allowed_Claims,Px1; 
quit; 

proc sql; 
alter table claims.simulation_ISLPx add Paid_Claims_NoISL float; 
    update claims.simulation_ISLPx 
     set Paid_Claims_NoISL = min(max(0,Allowed_Claims - %sysevalf(&OOPM), min(Allowed_Claims, 
           %sysevalf(&Min_Paid) + max(Allowed_Claims - %sysevalf(&Deductible)*%sysevalf(&COINS),0))), 
           %sysevalf(&Ind_Cap_Claim)); 
alter table claims.simulation_ISLPx add Paid_Claims_AfterISL float; 
    update claims.simulation_ISLPx 
     set Paid_Claims_AfterISL = min(Paid_Claims_NoISL, %sysevalf(&ISL)); 
alter table claims.simulation_ISLPx add Total_Cost float; 
    update claims.simulation_ISLPx 
     set Total_Cost = Paid_Claims_NoISL - Paid_Claims_AfterISL; 
quit; 

proc sql; 
select * from claims.simulation_ISLPx; 
run; 
quit; 

下面是什么样的我想过做

%let Member_Count= [5,6,8,10,12,15,20,25,30,40,50,60,70,80,90,100,125,150,175,200,250,300,400,500]; 


data simulation_interpolation; 
    do i = 1 to &Member_Count[0]; 
    xyz = rand('uniform',0,1); 
     if xyz >= 0 then Px = xyz; 
     output; 
     end; 
     run; 
    proc print data= simulation_interpolation; 
    run; 
+0

请更新您的问题以包含样本输入和输出数据集。另外,我建议你进一步了解[在SAS中使用阵列](http://www2.sas.com/proceedings/sugi30/242-30.pdf)。 – user667489

+0

嗨user667489,不幸的是,样本输入或使用的值是通过“模拟”步骤在内部生成的。 – indiansrulz

回答

0

有几种方法迭代通过宏字符串。以下是我将根据您的示例使用的一种方法,但有更高效的方法。这会将Member_Count宏字符串转换为数据集,并使用该数据集来生成模拟。然后使用PROC SUMMARY来平均每个组的模拟。

%let Member_Count= [5,6,8,10,12,15,20,25,30,40,50,60,70,80,90,100,125,150,175,200,250,300,400,500]; 

*** GET MACRO STRING AND CONVERT INTO A DATASET - ONE RECORD PER ITEM ***; 
data start; 
    *** COMPRESS BRACKETS FROM MACRO STRING ***; 
    temp = compress("&member_count.", '[]'); 
    *** COUNT THE NUMBER OF COMMAS IN STRING AND ADD 1 ***; 
    n = count(temp, ',') + 1; 
    *** LOOP OVER STRING - GET MEMBER_COUNT, CONVERT TO NUMERIC, AND OUTPUT ***; 
    do i = 1 to n; 
     member_count = input(scan(temp, i), best8.); 
     output; 
    end; 
run; 

data simulation_interpolation; 
    set start(keep=member_count); 
    do i = 1 to member_count ; 
     xyz = rand('uniform',0,1); 
     if xyz >= 0 then Px = xyz; 
     output; 
    end; 
run; 

proc print data= simulation_interpolation; 
run; 

*** USE PROC SUMMARY TO CALCUATE AVERAGE FOR EACH GROUP OF ITERATIONS ***; 
proc summary data=simulation_interpolation nway; 
    class member_count; 
    var px; 
    output out=stats mean=mean; 
run; 

我不知道这是你想要什么,我不明白你对插值的描述,但希望这可以帮助您在您的问题取得进展。

+0

Hey SunnyRJ。这非常接近我所需要的。通过插值,我的意思是如果Px = .010并且我知道Allowed_Claims的相应值,其中Px = .011和Px = .009,我可以找到线性近似值。 – indiansrulz

相关问题