如何在SAS中使用权重创建分位数分组列?
如何在SAS中使用权重创建分位数分组列?
我完全理解你的困扰——PROC RANK虽然好用,但确实不支持加权分位数的计算。不过别担心,我们可以通过PROC UNIVARIATE先算出每个组的加权分位数分界点,再把这些分界点合并回原始数据,最后给每个观测分配对应的分组。下面是具体的实现步骤:
第一步:计算每组的加权分位数
首先用PROC UNIVARIATE按group分组,利用WEIGHT语句指定权重变量,输出我们需要的分位数(比如你要的四分位,就指定25、50、75这三个分位点)到一个单独的数据集:
/* 计算每组的加权四分位数分界点 */ proc univariate data=have noprint; by group; /* 按group分组计算 */ weight weight; /* 指定权重变量 */ /* 输出25%、50%、75%分位数,变量名前缀设为q_ */ output out=group_quantiles pctlpts=25 50 75 pctlpre=q_; run;
这个步骤会生成一个叫group_quantiles的数据集,每个group对应一行,包含q_25(25%分位数)、q_50(中位数)、q_75(75%分位数)三个变量。
第二步:合并原始数据与分位数分界点
接下来把原始数据和刚才生成的分位数数据集按group合并,这样每个观测都能拿到对应组的分位数分界点:
/* 合并原始数据和分位数 */ data want_with_quantiles; merge have group_quantiles; by group; run;
第三步:根据分位数分配分组
最后用条件判断语句(比如SELECT或者IF-THEN),根据每个观测的score落在哪个分位区间,生成对应的分组列。这里我们让分组编号和PROC RANK的输出逻辑一致(0到3,对应四个分位组):
/* 生成加权四分位分组列 */ data want; set want_with_quantiles; select; when(score <= q_25) score_quartiles = 0; /* 第一分位组 */ when(score <= q_50) score_quartiles = 1; /* 第二分位组 */ when(score <= q_75) score_quartiles = 2; /* 第三分位组 */ otherwise score_quartiles = 3; /* 第四分位组 */ end; /* 可以按需删除临时变量q_25、q_50、q_75 */ drop q_25 q_50 q_75; run;
额外说明
- 如果需要的不是四分位(比如要10分位),只需要修改
PROC UNIVARIATE里的pctlpts参数,比如pctlpts=10 20 30 40 50 60 70 80 90,然后对应调整后续的条件判断即可。 - 关于边界值的处理:上面的代码里把等于分位数的观测归到当前分位组,如果你需要调整逻辑(比如把等于25%分位数的归到下一组),只需要修改条件里的
<=为<即可。 - 如果某个组的所有
score都相同,PROC UNIVARIATE会输出相同的分位数值,这时候所有观测都会被分到同一个组,符合加权分布的实际情况。
把这些步骤整合起来,就是完整的可运行代码啦,你可以直接放到SAS里测试~
备注:内容来源于stack exchange,提问作者LuizZ
相关产品推荐
相关产品推荐

