楼主: xingxf
7758 15

[编程问题求助] 连续求和问题 [推广有奖]

  • 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-31 08:44:17 |AI写论文
1000论坛币
有如下格式面板数据,
ID        Date                   Var1           Var2
A         01/01/2001         0.61
A         02/01/2001         0.52
...
A         31/12/2010         0.96
...
B         01/01/2002         0.68
...
B         31/12/2009         0.72
...
Z         31/12/2010         0.66

对每一个ID的每一行,在Var2处,生成本ID Var1[_n-365]+...+Var1[_n-7],中间如果有缺失值,当成0处理。

按照以前我发的连乘的帖子中我写的那个循环程序是可以得出结果的,但是对于从[_n-365]一直相加到[_n-7],我写的那个循环的执行效率太低了。哪位有好办法么?

非常感谢!


sugmoo给了个不错的方法,运算速度非常快,我已评选为最佳,如果数据量大而没有缺失值,绝对是最好的方案。但是sum函数是把缺失值当0来处理。这个对我来说不是特别适用,没办法我自己也写了个循环程序如下,但是运行速度确实慢啊。

bys ID (Date): gen SUM1=Var1[_n-7]
forv i=2/358{
local j=`i'-1
bys ID (Date): gen SUM`i'=Var1[_n-7]+SUM`j'[_n-1]
}


最佳答案

sungmoo 查看完整内容

*与以往一样,楼主需要先说明计算规则。比如,数据中恰有366个观测值时,各观测值对应的结果应该是什么。 *当var1[_n-365]~var1[_n-7]存在缺失值或者无定义时,var2是缺失值;反之,var2为var1[_n-365]~var1[_n-7]之和。 bys id (date): g s=sum(var1) by id: g m=sum(var1==.) by id: g t=m[_n-7]-m[_n-366] if _n>366 by id: replace t=m[359] if _n==366 by id: g var2=s[_n-7]-s[_n-366] if _n>366&!t by id: repl ...
关键词:Local date 运算速度 forv 面板数据 成本 程序

回帖推荐

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

*与以往一样,楼主需要先说明计算规则。比如,数据中恰有366个观测值时,各观测值对应的结果应该是什么。 *当var1[_n-365]~var1[_n-7]存在缺失值或者无定义时,var2是缺失值;反之,var2为var1[_n-365]~var1[_n-7]之和。 bys id (date): g s=sum(var1) by id: g m=sum(var1==.) by id: g t=m[_n-7]-m[_n-366] if _n>366 by id: replace t=m[359] if _n==366 by id: g var2=s[_n-7]-s[_n-366] if _n>366&!t by id: repl ...

沙发
sungmoo 发表于 2013-1-31 08:44:18
*与以往一样,楼主需要先说明计算规则。比如,数据中恰有366个观测值时,各观测值对应的结果应该是什么。

*当var1[_n-365]~var1[_n-7]存在缺失值或者无定义时,var2是缺失值;反之,var2为var1[_n-365]~var1[_n-7]之和。

bys id (date): g s=sum(var1)
by id: g m=sum(var1==.)
by id: g t=m[_n-7]-m[_n-366] if _n>366
by id: replace t=m[359] if _n==366
by id: g var2=s[_n-7]-s[_n-366] if _n>366&!t
by id: replace var2=s[359] if _n==366&!t

藤椅
sungmoo 发表于 2013-1-31 09:19:41
连乘与连加是类似的。可以采用相同的思路:先求累加和,后隔n项求差即可。

板凳
xingxf 发表于 2013-1-31 10:26:42
sungmoo 发表于 2013-1-31 09:19
连乘与连加是类似的。可以采用相同的思路:先求累加和,后隔n项求差即可。
但是您写的那个连乘我没完全看懂,我自己搞那个运行速度太慢

报纸
liangsky 发表于 2013-1-31 10:39:50
循环语句能解决吧,其他也想不到。

地板
空山空语 在职认证  发表于 2013-1-31 11:41:23
可不可以利用merge,在原有数据集上生成若干滞后的数据集,merge后相加
等待

7
xingxf 发表于 2013-1-31 11:50:53
空山空语 发表于 2013-1-31 11:41
可不可以利用merge,在原有数据集上生成若干滞后的数据集,merge后相加
那比循环还要慢吧。

8
xingxf 发表于 2013-1-31 11:52:59
sungmoo 发表于 2013-1-31 10:55
与以往一样,楼主需要先说明计算规则。比如,数据中恰有372个观测值时,各观测值对应的结果应该是什么。
就是连加啊,中间如果有缺失值,当成0处理,还能返回结果的。

9
sungmoo 发表于 2013-1-31 15:46:05
按我的理解,若恰有365个值,则结果都是缺失值(“前365期”无定义)。
sum是把缺失值当0来处理是吧。如果希望在[_n-365]到[_n-7]之间都有数值,就显示结果,如果中间出现缺失值,就显示缺失值,怎么处理呢?
但是要求是对于一个ID的任何观察值,在[_n-365]到[_n-7]之间都有数值,那就要出结果,而不是对于这个ID,中间出现缺失值,整个ID都不返回结果了。
就是连加啊,中间如果有缺失值,当成0处理,还能返回结果的。
但是sum函数是把缺失值当0来处理。这个对我来说不是特别适用
楼主可否详细说一下你的计算法则?上面几条似乎相互矛盾?

10
xingxf 发表于 2013-1-31 22:25:22
sungmoo 发表于 2013-1-31 15:46
按我的理解,若恰有365个值,则结果都是缺失值(“前365期”无定义)。
您这个理解也可以,我以前写的那个连乘的程序就是出的这个结果。但是要求是对于一个ID的任何观察值,在[_n-365]到[_n-7]之间都有数值,那就要出结果,而不是对于这个ID,中间出现缺失值,整个ID都不返回结果了。

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

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