【问题标题】:Stata sum/average over a range一定范围内的统计总和/平均值
【发布时间】:2014-05-29 06:43:39
【问题描述】:

使用以下数据集。

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

我想创建变量sum1average1sum2average2,它们在date1adate1b 的日期范围之间完成variable 的操作(对于@987654329 @ 和 average1) 和 date2adate2b(对于 sum2average2)。

现在,我的方法很费力,容易出错,并且没有捕捉到我在同一天有重复条目的事实。另外,如果没有与date1bdate2b 匹配的date,那么我需要手动进行编辑。

sort date
gen date1range = date1b - date1a
local j = date1range
forval i = 1/`j' {
    by id: gen variableforcalc`i' = variable[_n-`i']
}
egen sum1 = rowtotal(variableforcalc*)
egen average1 = rowmean(variableforcalc*)
gen dateflag = 0
replace dateflag = 1 if date == date1b

【问题讨论】:

  • 平均值必须是相同的id?
  • @NickCox 都在id 内,我编辑了这个问题。谢谢
  • 我还是觉得你需要把问题说清楚。

标签: loops sum average stata


【解决方案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中讨论了一些结构松散相似的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多