Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SAS计算加权平均值但排除对象本身_Sas - Fatal编程技术网

如何使用SAS计算加权平均值但排除对象本身

如何使用SAS计算加权平均值但排除对象本身,sas,Sas,我的数据集中有四个变量公司显示公司名称返回是公司在日期的返回Weight是该公司在市场上的权重 我希望将所有变量保留在原始文件中,并创建一个附加变量,即市场回报(排除公司本身)。股票“a”对应的市场收益率是在相同的日期市场中所有加权股票收益率的总和,不包括股票a。例如,如果市场a、b和c中有3只股票。a股的市场回报是回报(b)*[权重(b)/(权重(b)+权重(C))]+回报(C)*[权重(C)/(权重(b)+权重(C)]。同样,b股的市场回报是回报(a)*[权重(a)/(权重(a)+权重(C)

我的数据集中有四个变量<代码>公司显示公司名称<代码>返回是公司在日期的返回
Weight
是该公司在市场上的权重

我希望将所有变量保留在原始文件中,并创建一个附加变量,即市场回报(排除
公司
本身)。股票“a”对应的市场收益率是在相同的
日期
市场中所有加权股票收益率的总和,不包括股票a。例如,如果市场a、b和c中有3只股票。a股的市场回报是回报(b)*[权重(b)/(权重(b)+权重(C))]+回报(C)*[权重(C)/(权重(b)+权重(C)]。同样,b股的市场回报是回报(a)*[权重(a)/(权重(a)+权重(C)]+回报(C)*[权重(C)/(权重(a)+权重(C)]

我尝试使用proc summary,但在计算股票a的市场回报率时,此函数不能排除股票a

PROC SUMMARY NWAY DATA  ; 
    CLASS Date ; 

    VAR Return / WEIGHT = weight;

    OUTPUT
       OUT = output
       MEAN (Return) = MarketReturn;
RUN;

有人能教我如何解决这个问题吗?我对这个软件比较陌生,所以我不知道是否应该使用loop或者有更好的替代方法。

这可以通过一些奇特的代数来完成。不过,它不是内置的

基本上:

  • 构建“总体”市场回报
  • 构建一个一个股票一个股票的回报率(所以只需要一个股票的回报率)
  • 减去A占总数的部分
多亏了生成这些列表的简单数学,这样做很容易

总和=((平均值
A*Awgt
)+(剩余平均值*其权重之和))/(平均值之和+剩余wgt之和)

所以,为(剩余平均值*剩余平均值wgts/剩余wgts之和)求解

不包括总额:((所有总额的平均数*所有总额)-(所有总额的平均数*所有总额))/(所有总额-所有总额)

像这样的

data returns;
  input stock $ return weight;
  datalines;
A .50 1
B .75 2
C .33 1
;;;;
run;

proc means data=returns;
  class stock;
  types () stock; *this is the default;
  weight weight;
  output out=means_out mean= sumwgt= /autoname;
run;

data returns_excl;
  if _n_=1 then set means_out(where=(_type_=0) rename=(return_mean=tot_return return_sumwgt=tot_wgts));
  set means_out(where=(_type_=1));
  return_excl = (tot_return*tot_wgts-return_mean*return_sumwgt)/(tot_wgts-return_sumwgt);
run;