楼主: reality1989
7937 9

[其他] stata 循环问题forv [推广有奖]

  • 0关注
  • 0粉丝

硕士生

75%

还不是VIP/贵宾

-

威望
0
论坛币
93 个
通用积分
6.9121
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
1111 点
帖子
112
精华
0
在线时间
222 小时
注册时间
2009-2-27
最后登录
2022-9-23

楼主
reality1989 发表于 2011-4-8 23:27:11 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有三百家公司,每家公司有24个月的数据,要求对每家公司进行:从13月开始到24月,分别对前面12个月的数据进行加总,怎么用forv实现这个操作
二维码

扫码加我 拉你入群

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

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

关键词:Stata forv tata For

沙发
arlionn 在职认证  发表于 2011-4-10 10:25:34
tsset id month
bysort id: egen sum_x = sum(x) if month>12

藤椅
ctx5518 发表于 2011-4-10 11:10:03
1. reshape 数据成wide格式
2. forvalue a = 1 / 12 {
         local b = `i' + 12
         local c = `i'  + 11
         egen total`b' = rowtotal(var`a'  - var`c')
      }
3. reshape 数据成long格式

板凳
jzhyue 发表于 2011-4-10 12:07:04
ctx5518 发表于 2011-4-10 11:10
1. reshape 数据成wide格式
2. forvalue a = 1 / 12 {
         local b = `i' + 12
         local c = `i'  + 11
         egen total`b' = rowtotal(var`a'  - var`c')
      }
3. reshape 数据成long格式
非常迂回的方法,不过也能实现

bys id (month):gen sum_x=sum(x)
bys id (month):gen sum12=sum_x[_n-1]-sum_x[_n-13]

报纸
voodoo 发表于 2011-4-10 20:15:08
挺常见的问题,但竟然想不到简单的解决方法,可叹!
当初一看到这个问题就想到“移动窗口”,也即rolling或tssmooth,但可惜要想真正实现好像都不简单。

下面是个不迂回,但“丑陋的”方法:
bysort id (month): gen sum_x =x[_n-1]+x[_n-2]+x[_n-3]+x[_n-4]+x[_n-5]+x[_n-6]+x[_n-7]+x[_n-8]+x[_n-9]+x[_n-10]+x[_n-11]+x[_n-12]
巫毒上传,必属佳品!
坛友下载,三思后行!

地板
jzhyue 发表于 2011-4-10 21:02:00
voodoo 发表于 2011-4-10 20:15
挺常见的问题,但竟然想不到简单的解决方法,可叹!
当初一看到这个问题就想到“移动窗口”,也即rolling或tssmooth,但可惜要想真正实现好像都不简单。

下面是个不迂回,但“丑陋的”方法:
bysort id (month): gen sum_x =x[_n-1]+x[_n-2]+x[_n-3]+x[_n-4]+x[_n-5]+x[_n-6]+x[_n-7]+x[_n-8]+x[_n-9]+x[_n-10]+x[_n-11]+x[_n-12]
这是个最直接的方法,也是最容易想到却不愿意用的方法(输入太繁琐)。
这是个滑动求和的运算
有一个问题:如果存在缺失值的话,这个式子可能就不成立。(ctx5518的方法却可以有效避免)

7
sungmoo 发表于 2011-4-11 13:04:45
jzhyue 发表于 2011-4-10 12:07
bys id (month):gen sum_x=sum(x)
bys id (month):gen sum12=sum_x[_n-1]-sum_x[_n-13]
这样,每公司第13月无结果吧。

8
jzhyue 发表于 2011-4-11 18:22:17
sungmoo 发表于 2011-4-11 13:04
jzhyue 发表于 2011-4-10 12:07
bys id (month):gen sum_x=sum(x)
bys id (month):gen sum12=sum_x[_n-1]-sum_x[_n-13]
这样,每公司第13月无结果吧。
bys id (month):gen sum_x=sum(x)
bys id (month):gen sum12=sum_x[_n-1]-sum_x[_n-13]
bys id (month):replace sum12=sum_x[_n-1] if _n==13


*如何在代数式中消除缺失值的影响?sungmoo不知有什么好的办法。

9
sungmoo 发表于 2011-4-12 06:49:35
jzhyue 发表于 2011-4-11 18:22
bys id (month):gen sum_x=sum(x)
bys id (month):gen sum12=sum_x[_n-1]-sum_x[_n-13]
bys id (month):replace sum12=sum_x[_n-1] if _n==13
个人感觉,以上方法已经足够了(也可以先sort id month,以后各步只by id:)。

10
sungmoo 发表于 2011-4-12 07:10:05
voodoo 发表于 2011-4-10 20:15 当初一看到这个问题就想到“移动窗口”,也即rolling或tssmooth,但可惜要想真正实现好像都不简单
*可自动按公司计算前12月移动和(或平均值)
xtset company month
tssmooth ma moving_s=12*x, window(12)
replace moving_s=. if month<13

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-17 09:02