以下是我用来创建新表的现有代码。现有的输出表(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 :(得分: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;
我不确定这是你想要的,我不理解你关于插值的描述,但希望这可以帮助你在你的问题上取得进展。