Stata:如何在打开新案例时统计一组中的'active'个案例?

Stata: How to count the number of 'active' cases in a group when new case is opened?

我对 Stata 比较陌生,我正在尝试计算员工在我的数据集中随时间打开的活跃案例数(例如,请参见下面的 link)。我尝试根据我在网上找到的示例使用 forvalues 编写循环,但不断得到

invalid syntax

对于每个 EmpID,我想计算在将新个案添加到队列时员工打开的个案数。因此,如果一个案例添加了 03/15/2015OpenDate 并且 EmpID 当时有两个其他案例打开,代码将分配一个2NumActiveWhenOpened 字段的值。如果 (1) 它的 OpenDate 小于新案例的 OpenDate & (2) 它的 CloseDate 大于新案例的 OpenDate.

下面的link提供了一个例子。我正在尝试编写一个循环来创建 NumActiveWhenOpened 列。任何帮助将不胜感激。谢谢!

http://i.stack.imgur.com/z4iyR.jpg

编辑

这是无效的代码。我确定它有几个问题,我不确定如何将计数存储在 [NumActiveWhenOpen] 字段中。


by EmpID: generate CaseNum = _n

egen group = group(EmpID)   
su group, meanonly

gen NumActiveWhenOpen = 0

  forvalues i = 1/ 'r(max)' {

    forvalues x = 1/CaseNum if group == `i'{

        count if OpenDate[_n] > OpenDate[_n-x] & CloseDate[_n-x] > OpenDate[_n] 
  } 
}

按照

的方式尝试一些东西
clear
set more off

*----- example data -----

input ///
caseid str15(open close) empid numact
1 "1/1/2010" "3/1/2010" 1 0
2 "2/5/2010" "" 1 1
3 "2/15/2010" "4/7/2010" 1 2
4 "3/5/2010" "" 1 2
5 "3/15/2010" "6/15/2010" 1 3
6 "3/24/2010" "3/24/2010" 1 .
1 "1/1/2010" "3/1/2010" 2 0
2 "2/5/2010" "" 2 1
3 "2/15/2010" "4/7/2010" 2 2
4 "3/5/2010" "" 2 2
5 "3/15/2010" "6/15/2010" 2 3
end

gen opend = date(open, "MDY")
gen closed = date(close, "MDY")
format %td opend closed
drop open close

order empid
list, sepby(empid)

*----- what you want -----

gen numact2 = .
sort empid caseid

forvalues i = 1/`=_N' {
     count if empid[`i'] == empid & /// a different count for each employee
         opend[`i'] <= closed       /// the date condition
         in 1/`i'              // no need to look at cases that have not yet occurred

     replace numact2 = r(N) - 1 in `i'
}

list, sepby(empid)

这会占用大量资源,因此如果您有大量数据集,则需要一些时间。原因是它循环观察检查条件。有关 r(N) 的解释,请参阅 help stored resultshelp return

好的读物是 Stata tip 51: Events in intervals,Stata 杂志,作者:Nicholas J. Cox。

请注意我是如何在代码中提供示例数据集的(参见 help input)。这就是我建议您在以后的问题中这样做的方式。这将节省其他人的时间并增加您得到答案的可能性。

这听起来像是 http://www.stata-journal.com/article.html?article=dm0068 中讨论的问题,但让我们尝试自包含。我不确定我是否理解这些定义,但这可能会有所帮助。

我会偷走罗伯托·费雷尔沙盒的一部分。

clear
set more off
input ///
caseid str15(open close) empid 
1 "1/1/2010" "3/1/2010" 1 
2 "2/5/2010" "" 1 
3 "2/15/2010" "4/7/2010" 1 
4 "3/5/2010" "" 1 
5 "3/15/2010" "6/15/2010" 1 
6 "3/24/2010" "3/24/2010" 1 
1 "1/1/2010" "3/1/2010" 2 
2 "2/5/2010" "" 2 
3 "2/15/2010" "4/7/2010" 2 
4 "3/5/2010" "" 2 
5 "3/15/2010" "6/15/2010" 2 
end

gen d1 = date(open, "MDY")
gen d2 = date(close, "MDY")
format %td d1 d2
drop open close

reshape long d, i(empid caseid) j(status) 
replace status = -1 if status == 2 
replace status = . if missing(d) 
bysort empid (d) : gen nopen = sum(status) 
bysort empid d : replace nopen = nopen[_N] 

l

想法是reshape让每对日期成为两个观察值。然后,如果我们用 1 对每个开盘进行编码,对每个闭盘进行 -1 编码,那么活跃案例的总数就是它们的累计和。就这样。以下是结果:

. l, sepby(empid)

     +---------------------------------------------+
     | empid   caseid   status           d   nopen |
     |---------------------------------------------|
  1. |     1        1        1   01jan2010       1 |
  2. |     1        2        1   05feb2010       2 |
  3. |     1        3        1   15feb2010       3 |
  4. |     1        1       -1   01mar2010       2 |
  5. |     1        4        1   05mar2010       3 |
  6. |     1        5        1   15mar2010       4 |
  7. |     1        6        1   24mar2010       4 |
  8. |     1        6       -1   24mar2010       4 |
  9. |     1        3       -1   07apr2010       3 |
 10. |     1        5       -1   15jun2010       2 |
 11. |     1        2        .           .       2 |
 12. |     1        4        .           .       2 |
     |---------------------------------------------|
 13. |     2        1        1   01jan2010       1 |
 14. |     2        2        1   05feb2010       2 |
 15. |     2        3        1   15feb2010       3 |
 16. |     2        1       -1   01mar2010       2 |
 17. |     2        4        1   05mar2010       3 |
 18. |     2        5        1   15mar2010       4 |
 19. |     2        3       -1   07apr2010       3 |
 20. |     2        5       -1   15jun2010       2 |
 21. |     2        4        .           .       2 |
 22. |     2        2        .           .       2 |
     +---------------------------------------------+

底线是不需要循环,但 by: 有很大帮助。此处有用的一个细节是累积和函数 sum() 忽略缺失值。