本站分享:AI、大数据、数据分析师培训认证考试,包括:Python培训Excel培训Matlab培训SPSS培训SAS培训R语言培训Hadoop培训Amos培训Stata培训Eviews培训

stata如何实现连乘_STATA连乘编程

stata培训 cdadata 10528℃

stata如何实现连乘_STATA连乘编程

有如下格式数据:
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

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


*设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


参照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

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


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


很简洁的程序,我觉得sungmoo最棒的地方就是用最基础的功能解决问题,巧用加减乘除,而不是借助现有复杂函数。

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


可用循环实现。
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’])
}


您这个程序比我写的那个执行起来速度快很多。但是我发现个问题没搞明白。我的数据里面存在缺失值。用您这个程序最后的计算结果比我写那个程序多出许多缺失值,但是对于有结果的数值是完全一样的。用您的方法,我发现对于相同的ID,只要其中某date对应的Var1没数据,那整个这个ID的所有连乘就都没有结果了。用我的方法的话,不管缺失值出现在哪一行,只要下面有足够的连乘级数(比如下面6行有数据),那就会相应的结果(6阶级连乘)。

这里还是计算规则问题。设恰有36个观测值,做36阶连乘,从第2个观测值开始,是否应该有值(是否可能实现36阶连乘)?若其中有缺失值,36阶连乘的结果如何规定?

我一开始设置好了面板数据,时间序列是year month的格式,比如2002m6,对于任意ID,不管时间起点在哪里,任意连续的n阶连乘(我这里是要计算6阶,12阶,24阶,36阶连乘),只要中间没有缺失值就需要返回结果。如果连续的n阶,其中有缺失值,则返回缺失值。我写的那个循环就是这个效果。但是我写的这个和您的那个比起来,执行效率低很多。

转载请注明:数据分析 » stata如何实现连乘_STATA连乘编程

喜欢 (2)or分享 (0)