我的数据集中有四个变量。 Company
显示公司名称。 Return
是第Company
天Date
的返回。 Weight
是该公司在市场上的重要性。
我想将所有变量保留在原始文件中,并创建一个额外的变量,即市场回报(排除Company
本身)。股票'a'对应的市场收益是市场中相同Date
的所有加权股票收益的总和,不包括股票a。例如,如果市场中有3只股票a,b和c。股票a的市场回报是回报(b)* [重量(b)/(重量(b)+重量(C))] +回报(C)* [重量(C)/(重量(b)+重量(C)同样,股票b的市场回报是回报(a)* [权重(a)/(权重(a)+权重(C))] +回报(C)* [权重(C)/(权重(a) )+重量(C)]。
我尝试使用proc摘要但是这个函数在计算股票a的市场回报时不能排除股票a。
PROC SUMMARY NWAY DATA ;
CLASS Date ;
VAR Return / WEIGHT = weight;
OUTPUT
OUT = output
MEAN (Return) = MarketReturn;
RUN;
有人可以教我如何解决这个问题。我对这个软件比较陌生,所以我不知道我是否应该使用循环或者可能有更好的选择。
答案 0 :(得分:2)
这可以通过一些花哨的代数来完成。但这不是内置的东西。
基本上:
由于生成这些列表的简单数学运算,很容易做到这一点。
总和=((
A*Awgt
的平均值)+(余数的平均值*权重之和))/(Awgt的总和+剩余的总和)
所以,解决这个问题(休息的意思*休息的意思/休息时间的总和)。
独家总和:((所有wgts的总和的平均值) - (A *总和的平均值))/(所有wgts的总和 - A 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;