2017-06-05 256 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

相關問題