Stata sum /平均值范围

时间:2014-05-29 06:43:40

标签: loops sum average stata

使用以下数据集。

id    date       date1a    date1b    date2a     date2b    variable
1   1/1/2000    2/6/2009  8/9/2009  7/14/2010  9/2/2010      7
1   1/2/2000    2/6/2009  8/9/2009  7/14/2010  9/2/2010      2
1   1/2/2000    2/6/2009  8/9/2009  7/14/2010  9/2/2010     11
...
1   1/1/2013    2/6/2009  8/9/2009  7/14/2010  9/2/2010      9
1   1/8/2013    2/6/2009  8/9/2009  7/14/2010  9/2/2010      8
2   2/2/2010    6/1/2010  7/9/2011  4/6/2012   5/1/2012      4
2   2/2/2010    6/1/2010  7/9/2011  4/6/2012   5/1/2012      3
2   2/2/2010    6/1/2010  7/9/2011  4/6/2012   5/1/2012      1
...
2   5/1/2012    6/1/2010  7/9/2011  4/6/2012   5/1/2012     1
2   5/1/2012    6/1/2010  7/9/2011  4/6/2012   5/1/2012     1

我想创建变量sum1average1以及sum2average2,这些变量在variable之间的日期范围内完成date1a的操作{1}}至date1b(适用于sum1average1)和date2adate2b(适用于sum2average2) 。

现在,我的方法很费力,容易出错,而且没有捕获我在同一天有重复条目的事实。另外,如果没有匹配datedate1b的{​​{1}},那么我需要手动进行修改。

date2b

1 个答案:

答案 0 :(得分:1)

当我看到

时,我停止阅读你的代码
local j = date1range

将被解释为

local j = date1range[1] 

因此无法成为一般解决方案的基础。

您可以初始化

 gen sum1 = . 
 gen average1 = . 

并根据相同的iddate1adate1b

进行分组
 egen group = group(id date1a date1b) 
 su group, meanonly 

然后循环显示group

的不同值
 quietly forval j = 1/`r(max)' { 
     * start and end dates and id should be identical in each group; this is just look-up 
     su date1a if group == `j', meanonly  
     local d1 = r(min) 
     su date1b if group == `j', meanonly 
     local d2 = r(min) 
     su id if group == `j', meanonly 
     local this = r(min) 

     su variable if id == `this' & inrange(date, `d1', `d2'), meanonly 
     replace sum1 = r(sum) if group == `j' 
     replace mean1 = r(mean) if group == `j' 
} 

另一笔款和均值应该适合同样的待遇。

http://www.stata-journal.com/sjpdf.html?articlenum=pr0033

中讨论了结构松散相似的一些问题