全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
3206 4
2011-04-20
本人是stata新手,但是这个项目要求要用stata做并且要提交do file。 真心向各位大虾求助,望不吝赐教!

数据:company(上万个)data (yy-mm-dd,不连续,不规律)value
数据量非常庞大,几乎不可能用手工修正调整。
目标:对相对应的company 和data, 求data往前三十日的value平均值,用新变量30mean表示


举例:
company                         data               value                        30mean
a                            01.02.03                  1                            =1
a                            01.03.19                  2                            =2
a                            01.03.22                  3                            =(2+3)/2
a                            01.04.02                  4                            =(2+3+4)/3
a                            01.05.01                  5                            =(4+5)/2
b                            01.02.23                  6                            =6
b                            01.03.05                  7                            =(6+7)/2
b                            01.06.01                  8                            =8
b                            01.06.30                  9                            =(8+9)/2
c                            01.03.07                  10                          =10
c                            01.04.12                  11                          =11
二维码

扫码加我 拉你入群

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

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

全部回复
2011-4-21 09:06:47
*-https://bbs.pinggu.org/thread-1082398-1-1.html

*-Given by Arlion, http://toran.cn/arlion

*-2011-04-21

clear
input str10 company str30 date int value str30 mean30
a        2001.02.03        1        "=1"
a        2001.03.19        2        "=2"
a        2001.03.22        3        "=(2+3)/2"
a        2001.04.02        4        "=(2+3+4)/3"
a        2001.05.01        5        "=(4+5)/2"
b        2001.02.23        6        "=6"
b        2001.03.05        7        "=(6+7)/2"
b        2001.06.01        8        "=8"
b        2001.06.30        9        "=(8+9)/2"
c        2001.03.07        10       "=10"
c        2001.04.12        11       "=11"
end

compress

gen tt = subinstr(date, ".", "-", .)
gen t1 = date(tt, "YMD")
gen t2 = t1
format t2 %tdCY-m-D   

egen id = group(company)
tsset id t2
tsfill

tssmooth ma mean=value, window(30 1 0)
br

drop if t1==.
br


*-结果如下:
list  company date value mean30 id t2 mean, sep(0) clean
       company         date   value       mean30       id            t2            mean  
  1.         a   2001.02.03       1           =1               1   2001-Feb-03      1  
  2.         a   2001.03.19       2           =2               1   2001-Mar-19       2  
  3.         a   2001.03.22       3           =(2+3)/2     1   2001-Mar-22       2.5  
  4.         a   2001.04.02       4           =(2+3+4)/3 1   2001-Apr-02       3  
  5.         a   2001.05.01       5           =(4+5)/2     1   2001-May-01      4.5  
  6.         b   2001.02.23       6           =6               2   2001-Feb-23      6  
  7.         b   2001.03.05       7           =(6+7)/2     2   2001-Mar-05      6.5  
  8.         b   2001.06.01       8           =8               2   2001-Jun-01      8  
  9.         b   2001.06.30       9           =(8+9)/2     2   2001-Jun-30      8.5  
10.         c   2001.03.07      10          =10             3   2001-Mar-07     10  
11.         c   2001.04.12      11          =11             3   2001-Apr-12      11
二维码

扫码加我 拉你入群

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

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

2011-4-22 03:18:45
非常感谢版主大人!!!!太给力了~

可是我发现在我的数据里面,date有重复的值,也即是有同一天有几个不同value的情况(目前看到有一天超过三十个值的)。系统提示tsset不能运行,这该怎么办呢?
二维码

扫码加我 拉你入群

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

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

2011-4-22 07:13:54
对stata还是没什么概念,想了一晚上没想出改进的办法,只好另辟蹊径。
希望没有错误,欢迎赐教:

(date转换成数值之后)
gen id=company
gen t=date
gen v=value
gen sum=v
gen mm=1
forvalues n=1/1000{
forvalues i=1/1000{
if t[`n']-t[`n'-`i']<30 & id[`n']==id[`n'-`i']{
replace sum = sum + v[`n'-`i'] in `n'
replace mm = mm +1 in `n'
}
}
}
gen mean=sum/mm
br
二维码

扫码加我 拉你入群

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

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

2011-4-22 08:38:45
juiliennewang 发表于 2011-4-22 07:13 只好另辟蹊径
*按楼主这一思路,试一下:

clear
inp str1 company  str8 data value
a 01.02.03 1
a 01.03.19 2
a 01.03.22 3
a 01.04.02 4
a 01.05.01 5
b 01.02.23 6
b 01.03.05 7
b 01.06.01 8
b 01.06.30 9
c 01.03.07 10
c 01.04.12 11
end
g d=date(data,"20YMD")
form d %td
egen id=group(company)
g mean30=.
levelsof id,l(id)
levelsof d,l(d)
foreach i of num `id'{
foreach j of num `d'{
egen a=mean(value) if id==`i'&(`j'-d<30)&(`j'-d>=0)
replace mean30=a if d==`j'&id==`i'
drop a
}
}
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群