如何使用 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;
要用权重计算变量 "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;