如何使用 SAS proc sql 计算权重中位数?

How to calculated median with weights using SAS proc sql?

要用权重计算变量 "value" 的平均值,我们可以简单地执行以下操作:

proc sql;
select sum(Value*Weight)/sum(Weight) as WeightedAverage
from table ;
quit; 

我们如何计算带有权重的变量 "value" 的中位数?我知道我们可以使用 proc 方法,但我更喜欢 proc sql.

中的解决方案

示例:

data table;
input value weight;
datalines;
1 1
2 1
3 2
;
run;

使用proc means,我们可以轻松得到均值(2.25)和中位数(2.5):

proc means data=table mean median; 
var value;
weight weight;
run;

使用上面的过程sql,我可以得到加权平均值:2.25。

如何得到中位数(即 2.5)?

proc sql 中还有一个 median() 函数(在 SAS 9.4 中可用)。

正常的中位数是这样的:

proc sql; select median(Value) as Median from table ; quit;

加权中位数可能是这样的,具体取决于您希望如何使用权重:

proc sql; select median(Value*Weight) as WeightedMedian from table ; quit;

示例:中位数将为 2.5

data have;
input value;
datalines;
1 
2 
3 
3
;
run;
proc sql;
create table want as 
select Median(value) as med
from have;
quit;

示例:分离数据,所以我们有 4 行 1、2、3、3 而不是 3

data have;
input value weight;
datalines;
1 1
2 1
3 2
;
run;

data have_seg;
set have;
retain freq;
freq= weight;
if(freq=1) then do; output; end;
else if freq > 1 then do; 
do i=1 to freq; weight=1; output; end;
end;
keep value weight;
run;