我想标记纵向数据集中有多少独特的数据簇,并且群集的每个成员都带有群集计数。不同的群集是在id中共享一组日期的群集。这些不同的集群相对于先前(早期)集群的顺序创建了期望的结果。这种编码对于解决时间相关协变量分析所需的事件排序问题是必要的。
input id date
1 28jan2015
1 28jan2015
2 26nov2015
3 19oct2015
4 26dec2015
5 23dec2015
6 22may2015
6 23sep2015
6 23sep2015
7 14jan2015
7 27feb2015
7 30may2015
8 16apr2015
8 16apr2015
8 16apr2015
8 16apr2015
8 16apr2015
9 17jul2015
9 03oct2015
9 03oct2015
10 27jul2015
end
我试过了:
bys id (date): gen count_obs = [_n]
bys id date: gen count_interval_obs = [_n]
egen n_interval = group(id date)
导致每id
次观察总数的准确计数和date
内观察次数的枚举。但是,egen
函数group()
会识别每个唯一的日期集,但会在不考虑id
的情况下对这些组进行编号,并给出:
id wrong_cluster correct_cluster
1 28jan2015 1 1
1 28jan2015 1 1
2 26nov2015 2 1
3 19oct2015 3 1
4 26dec2015 4 1
5 23dec2015 5 1
6 22may2015 6 1
6 23sep2015 7 2
6 23sep2015 7 2
等
egen, group()
不能与by:
前缀一起使用。
任何帮助都将不胜感激。
托德
编辑:添加了为什么需要进行群集识别的说明。阐明了什么规则定义了一个集群。
答案 0 :(得分:1)
对于每个id
,当日期与前一个观察不同时,将1
添加到运行总和中。当满足1
内的条件时,sum()
即可实现。
clear
set more off
input id str15 date
1 28jan2015
1 28jan2015
2 26nov2015
3 19oct2015
4 26dec2015
5 23dec2015
6 22may2015
6 23sep2015
6 23sep2015
7 14jan2015
7 27feb2015
7 30may2015
8 16apr2015
8 16apr2015
8 16apr2015
8 16apr2015
8 16apr2015
9 17jul2015
9 03oct2015
9 03oct2015
10 27jul2015
end
gen date2 = date(date, "DMY")
format %td date2
drop date
list, sepby(id)
*----- what you want -----
bysort id (date2) : gen clust = sum(date2 != date2[_n-1])
list, sepby(id)
答案 1 :(得分:1)
egen
的{{1}}函数也有一条路线:
group()