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

如何使用SAS proc sql计算权重中值?,sql,sas,statistics,median,proc-sql,Sql,Sas,Statistics,Median,Proc Sql,要计算带有权重的变量“值”的平均值,我们可以简单地执行以下操作: proc sql; select sum(Value*Weight)/sum(Weight) as WeightedAverage from table ; quit; 我们如何计算带有权重的变量“值”的中值?我知道我们可以使用proc方法,但我更喜欢procsql中的解决方案 例如: data table; input value weight; datalines; 1 1 2 1 3 2 ; run; 使用proc平均

要计算带有权重的变量“值”的平均值,我们可以简单地执行以下操作:

proc sql;
select sum(Value*Weight)/sum(Weight) as WeightedAverage
from table ;
quit; 
我们如何计算带有权重的变量“值”的中值?我知道我们可以使用proc方法,但我更喜欢procsql中的解决方案

例如:

data table;
input value weight;
datalines;
1 1
2 1
3 2
;
run;
使用proc平均值,我们可以轻松获得平均值(2.25)和中位数(2.5):

使用上面的proc-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;

您的SAS版本是否为9.4及以上?任何不使用
PROC surveymans
的原因都意味着
?谢谢。是的,我正在运行SAS,例如Proc意味着可以工作,但我想知道在Proc sql中是否也有一种简单的方法来实现这一点……你能像Reeza最初问的那样澄清你的SAS版本吗?不是您的EG/SAS/等,而是版本号(9.3、9.4等)?SAS版本对于这个问题非常重要,因为在SAS 9.4之前,PROC SQL无法计算中值。您可以使用以下内容获取您的版本:
proc product\u status;运行我有SAS 9.4,可以在proc sql中执行media()。然而,我不知道如何考虑重量。权重变量就是频率。谢谢。然而,你建议的加权中值似乎不是我想要的。权重变量实际上是“值”的频率。欢迎您。我们将尽最大努力提供帮助。请在您的问题中添加您想要进行的计算,以便我们可以为您提供工作代码。您可以使用
中值(值)*中值(重量)
非常感谢您的帮助。假设我有三个值1,2,3。如果我有相应的权重为1,1,1。中位数应该是2(中间的数字)。然而,如果我有权重1,1,2,中位数应该是2.5(中位数是1,2,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;