楼主: xingxf
12572 12

[编程问题求助] STATA连乘编程 [推广有奖]

  • 0关注
  • 50粉丝

已卖:3687份资源

副教授

12%

还不是VIP/贵宾

-

威望
0
论坛币
60582 个
通用积分
772.5045
学术水平
224 点
热心指数
251 点
信用等级
138 点
经验
20775 点
帖子
753
精华
0
在线时间
522 小时
注册时间
2011-3-12
最后登录
2025-4-1

楼主
xingxf 发表于 2013-1-22 10:54:25 |AI写论文
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 ...
关键词:Stata tata Product sungmoo produc 编程

回帖推荐

sungmoo 发表于8楼  查看完整内容

可用循环实现。 bys id (date): g p=var1 if _n==1 by id: replace p=var1*p[_n-1] if _n>1 foreach i of num 6 12 24 36{ by id: g var`i'=cond(_n>1,p[_n+`i'-1]/p[_n-1],p[`i']) }

沙发
sungmoo 发表于 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



已有 1 人评分学术水平 热心指数 信用等级 收起 理由
xingxf + 5 + 5 + 5 热心帮助其他会员

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

藤椅
xingxf 发表于 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

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

谢谢!

板凳
dxystata 发表于 2013-1-24 08:17:23
如果是ID=A,Data=35 或 36呢

报纸
xingxf 发表于 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”就是用来解决这个问题的。

地板
xingxf 发表于 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
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 100 + 5 + 1 + 1 + 1 鼓励积极发帖讨论

总评分: 经验 + 100  论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

7
xingxf 发表于 2013-1-27 23:07:38
sungmoo 发表于 2013-1-22 10:54
*试一下
bys id (date): g p=var1 if _n==1
bys id: replace p=var1*p[_n-1] if _n>1
很简洁的程序,我觉得sungmoo最棒的地方就是用最基础的功能解决问题,巧用加减乘除,而不是借助现有复杂函数。

不过这个比起我改写您以前的那个循环程序,优点是执行效率高,不生成中间那些列,缺点是如果我还需要其它连乘结果,比如6,12,24阶连乘,那还需要再重复写最后两行。而那个循环程序的优点是一次写好,只需要最后keep那行添加几个Var就好了。

8
sungmoo 发表于 2013-1-28 07:57:09
比如6,12,24阶连乘,那还需要再重复写最后两行
可用循环实现。
bys id (date): g p=var1 if _n==1
by id: replace p=var1*p[_n-1] if _n>1
foreach i of num 6 12 24 36{
by id: g var`i'=cond(_n>1,p[_n+`i'-1]/p[_n-1],p[`i'])
}
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 100 + 10 + 1 + 1 + 1 热心帮助其他会员

总评分: 经验 + 100  论坛币 + 10  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

9
xingxf 发表于 2013-1-30 06:19:36
sungmoo 发表于 2013-1-28 07:57
可用循环实现。
bys id (date): g p=var1 if _n==1
by id: replace p=var1*p[_n-1] if _n>1
您这个程序比我写的那个执行起来速度快很多。但是我发现个问题没搞明白。我的数据里面存在缺失值。用您这个程序最后的计算结果比我写那个程序多出许多缺失值,但是对于有结果的数值是完全一样的。用您的方法,我发现对于相同的ID,只要其中某date对应的Var1没数据,那整个这个ID的所有连乘就都没有结果了。用我的方法的话,不管缺失值出现在哪一行,只要下面有足够的连乘级数(比如下面6行有数据),那就会相应的结果(6阶级连乘)。

10
sungmoo 发表于 2013-1-30 07:57:49
但是我发现个问题没搞明白。我的数据里面存在缺失值。
这里还是计算规则问题。设恰有36个观测值,做36阶连乘,从第2个观测值开始,是否应该有值(是否可能实现36阶连乘)?若其中有缺失值,36阶连乘的结果如何规定?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-26 03:06