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/2015 的 OpenDate
并且 EmpID
当时有两个其他案例打开,代码将分配一个2 到 NumActiveWhenOpened
字段的值。如果 (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 results
和 help 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()
忽略缺失值。
我对 Stata 比较陌生,我正在尝试计算员工在我的数据集中随时间打开的活跃案例数(例如,请参见下面的 link)。我尝试根据我在网上找到的示例使用 forvalues
编写循环,但不断得到
invalid syntax
对于每个 EmpID
,我想计算在将新个案添加到队列时员工打开的个案数。因此,如果一个案例添加了 03/15/2015 的 OpenDate
并且 EmpID
当时有两个其他案例打开,代码将分配一个2 到 NumActiveWhenOpened
字段的值。如果 (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 results
和 help 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()
忽略缺失值。