l*********g 发帖数: 177 | 1 我想实现的功能其实挺简单:
for i=1,....,n;
V_{i,0}=1;
Y_{i,t+1}=R_{i,t+1}-H_{i,t+1};
D_{i,t+1}=Y_{i,t+1}*V_{i,t};
V_{i,t+1}=H_{i,t+1}*V_{i,t};
这儿i代表比如不同的asset,t代表时间。
我的code:
proc sort data=Portfolios; by PortID time; run;
data tt;
set Portfolios;
lagPortID=lag(PortID);
lagV=lag(V);
Y=R-H;
if lagPortID ne PortID then lagV=1;
D=Y*lagV;
V=H*lagV;
run;
我的code中的PortID就是指代上面的那个index i, Portfolios的column结构就是
time PortID R H
我的问题是为什么结果中除了每个PortID的第一个observation的lagV是1,其他时间的
lagV全是missing,自然相应的D和V columns也是全missing的。请大拿告诉我的code错
在哪儿啊?我猜测可能是和sas的运行data step的规则有关,可是我查了查也不知道原
因。非常感谢大家!! | k*******a 发帖数: 772 | 2 你的portfolios的column本来没有V,那么当然都是missing | l*********g 发帖数: 177 | 3 但是我的目的就是在portfolios中增加2个column:V和D,自然原来是没有这个
v column啊。
还不太理解你的建议哦,那么该怎样改code啊?
【在 k*******a 的大作中提到】 : 你的portfolios的column本来没有V,那么当然都是missing
| l*********g 发帖数: 177 | | m**u 发帖数: 17 | 5 lagV=lag(V);这一步的时候没有V, 所以V, lag(V)都是missing.
可以写成
array ...;
do i = 1 to n;
...
【在 l*********g 的大作中提到】 : 但是我的目的就是在portfolios中增加2个column:V和D,自然原来是没有这个 : v column啊。 : 还不太理解你的建议哦,那么该怎样改code啊?
| k*******a 发帖数: 772 | 6 你可能加一句 V=lagV
【在 l*********g 的大作中提到】 : 但是我的目的就是在portfolios中增加2个column:V和D,自然原来是没有这个 : v column啊。 : 还不太理解你的建议哦,那么该怎样改code啊?
| l*********g 发帖数: 177 | 7 但是每次循环的时候不是都是先运行lagV=lag(V)么?关于这个step我的目前理解是sas
应该是把上一次循环算出的V赋值给lagV吧。而因为我在code中有这么一句
if lagPortID ne PortID then lagV=1;
就能保证每个PortID group的第一个observation的lagV能被赋值为1,从而第一个
observation的V就能算出来而并非missing。这样从每个PortID group的第二个
observation开始就照理都能通过运行lagV=lag(V)得到非missisng的lagV啊,因为前一
次observation的V都是有值,而非missing啊。
请高人指教我这儿是哪里想错了啊?是不是和sas运行lag(。)语句和其他语句的顺序
有关啊?
先谢谢了哦!!
【在 m**u 的大作中提到】 : lagV=lag(V);这一步的时候没有V, 所以V, lag(V)都是missing. : 可以写成 : array ...; : do i = 1 to n; : ...
| l*********g 发帖数: 177 | 8 唉,还是不work哦。还有没有什么建议哦?
先谢谢哦!
【在 k*******a 的大作中提到】 : 你可能加一句 V=lagV
| l*********g 发帖数: 177 | | s*****r 发帖数: 790 | 10 因为你的V需要不停的更新。 我猜lag是一开始把column提出来, 并不一直更新。
try this.
proc sort data=Portfolios; by PortID time; run;
data tt;
set Portfolios;
by portid time;
retain tt 0;
y=r-h;
if first.portid then do;
v=0;tt=v;
end;
else do;
d=y*tt;
v=h*tt;
tt=v;
end;
run;
【在 l*********g 的大作中提到】 : 我想实现的功能其实挺简单: : for i=1,....,n; : V_{i,0}=1; : Y_{i,t+1}=R_{i,t+1}-H_{i,t+1}; : D_{i,t+1}=Y_{i,t+1}*V_{i,t}; : V_{i,t+1}=H_{i,t+1}*V_{i,t}; : 这儿i代表比如不同的asset,t代表时间。 : 我的code: : proc sort data=Portfolios; by PortID time; run; : data tt;
| l*********g 发帖数: 177 | 11 work了哦!!
真的是lag 函数的问题哦!!看来不能总是完全依赖lag来做。
真的非常感谢大拿的帮助!!
【在 s*****r 的大作中提到】 : 因为你的V需要不停的更新。 我猜lag是一开始把column提出来, 并不一直更新。 : try this. : proc sort data=Portfolios; by PortID time; run; : data tt; : set Portfolios; : by portid time; : retain tt 0; : y=r-h; : if first.portid then do; : v=0;tt=v;
|
|