2017-06-05 6 views
0

私と一緒に熊!これは私がしばらく努力してきたプロジェクトであり、多くのことを試してみると、うまく動作しないようです。SASでアレイを線形補間する方法は?

以下は、新しいテーブルを作成するために使用している既存のコードです。既存の出力テーブル(claims.simulation_ISLPx)も下にあります。

私がしたいことは、メンバ(5,6,8,10,12)の「配列」を取って、5つのメンバグループのプロセスの5回の反復、6つのメンバグループの6回の反復を実行することです。 12人のメンバーグループに対して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

ちょっとユーザー667489、残念ながら、サンプル入力、または使用された値は、内部的に 'シミュレーション'ステップによって生成されます。 – 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

関連する問題