全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
12485 12
2013-01-22
悬赏 100 个论坛币 已解决
有如下格式数据:
ID     Date     Var1      Var2
A          1        1.1       1.1*0.9*1.1*0.6*0.3*0.8
A          2        0.9       0.9*1.1*0.6*0.3*0.8*0.7
A          3        1.1       1.1*0.6*0.3*0.8*0.7*1.6
A          4        0.6       0.6*0.3*0.8*0.7*1.6*0.3
A          5        0.3       ...
A          6        0.8       ...
A          7        0.7       ...
A          8        1.6       ...
A          9        0.3       ...
...
A          36      0.8       ...
B          1        1.2       ...
...         
B          24      1.9       ...
...
Z          22      0.7       ...


要在Var2列对应行生成
gen Var2=Var1*Var1[_n+1]*Var1[_n+2]*Var1[_n+3]*Var1[_n+3]*Var1[_n+4]*Var1[_n+5]*Var1[_n+6]
这是6阶连乘的问题,如果是36阶连乘,那就写的太长了,有没有什么简便的方法可以解决这个问题?
另外,直接用prod函数好像解决不了我这个问题,因为我要求Var2每行都是Var1本行和下面n行的连乘。



参照sungmoo以前的程序,我改写了一个:

by ID: gen PRODUCT1=Var1
forv i=2/36{
loc j=`i'-1
g PRODUCT`i'=Var1*PRODUCT`j'[_n+1]
}
keep ID Date PRODUCT6 PRODUCT36

这个程序会生成36列,然后用keep保持想留下的n阶连乘,我这里是6和36

不知道哪位高人还有更简便的方法

谢谢!  




最佳答案

sungmoo 查看完整内容

*设var1无0值。 *当var1[_n]~var1[_n+35]存在缺失值或者无定义时,var2是缺失值;反之,var2为var1[_n]~var1[_n+35]之积。 bys id (date): g p=var1 if _n==1 by id: replace p=cond(var11 by id: g m=sum(var1==.) by id: g t=m[_n+35]-m[_n-1] if _n>1 by id: replace t=m[36] if _n==1 by id: g var2=cond(_n>1,p[_n+35]/p[_n-1],p[36]) if !t https://bbs.pinggu.org/thread-410308-1-1.html http://bbs.ping ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-1-22 10:54:26
*设var1无0值。

*当var1[_n]~var1[_n+35]存在缺失值或者无定义时,var2是缺失值;反之,var2为var1[_n]~var1[_n+35]之积。

bys id (date): g p=var1 if _n==1
by id: replace p=cond(var1<.,var1*p[_n-1],p[_n-1]) if _n>1
by id: g m=sum(var1==.)
by id: g t=m[_n+35]-m[_n-1] if _n>1
by id: replace t=m[36] if _n==1
by id: g var2=cond(_n>1,p[_n+35]/p[_n-1],p[36]) if !t


https://bbs.pinggu.org/thread-410308-1-1.html
https://bbs.pinggu.org/thread-410501-1-1.html



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-22 12:24:03
参照sungmoo以前的程序,我改写了一个:

by ID: gen PRODUCT1=Var1
forv i=2/36{
loc j=`i'-1
g PRODUCT`i'=Var1*PRODUCT`j'[_n+1]
}
keep ID Date PRODUCT6 PRODUCT36

这个程序会生成36列,然后用keep保持想留下的n阶连乘,我这里是6和36

不知道哪位高人还有更简便的方法

谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-24 08:17:23
如果是ID=A,Data=35 或 36呢
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-24 08:30:37
dxystata 发表于 2013-1-24 08:17
如果是ID=A,Data=35 或 36呢
您的意思是ID=A,到下面是ID=B的数据了,那么就不应该连乘了是吧?
我第一行写的“by ID: gen PRODUCT1=Var1”就是用来解决这个问题的。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-1-27 01:27:53
by ID: gen PRODUCT1=Var1
forv i=2/36{
loc j=`i'-1
g PRODUCT`i'=Var1*PRODUCT`j'[_n+1]
}
keep ID Date PRODUCT6 PRODUCT36
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群