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连乘编程