如何在SAS中通过数组进行线性插值?

如何在SAS中通过数组进行线性插值?,sas,Sas,容忍我!这是一个项目,我已经工作了一段时间,尝试了很多东西,但我似乎无法让它工作 下面是我用来创建新表的现有代码。现有的输出表(claims.simulation_ISLPx)也在下面 我想做的是获取一个成员的“数组”(5,6,8,10,12),为5个成员组运行5次迭代,为6个成员组运行6次迭代,…,为12个成员组运行12次迭代 “过程”应从U(0,1)中抽取一个随机值,然后用claims.SimulationsLPX表中的给定值对其进行线性插值,以确定组中的平均索赔(取总索赔并除以5、6、8、

容忍我!这是一个项目,我已经工作了一段时间,尝试了很多东西,但我似乎无法让它工作

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

我想做的是获取一个成员的“数组”(5,6,8,10,12),为5个成员组运行5次迭代,为6个成员组运行6次迭代,…,为12个成员组运行12次迭代

“过程”应从U(0,1)中抽取一个随机值,然后用claims.SimulationsLPX表中的给定值对其进行线性插值,以确定组中的平均索赔(取总索赔并除以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;

有几种方法可以迭代宏字符串。下面是一种基于您的示例的方法,尽管有更有效的方法。这将把Member_Count宏字符串转换为数据集,该数据集用于生成模拟。然后使用PROC摘要对每组的模拟进行平均

%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;

我不确定这是否是您想要的,我也不理解您关于插值的描述,但希望这能帮助您在问题上取得进展。

请更新您的问题,以包括示例输入和输出数据集。此外,我建议您了解更多。嘿,user667489,不幸的是,示例输入或使用的值是通过“模拟”步骤内部生成的。嘿,SunnyRJ。这是超级接近我需要的。通过插值,我的意思是如果Px=.010,并且我知道Px=.011和Px=.009的允许_声明的对应值,我可以找到一个线性近似值。