在 id 变量中保留集群中每个成员的集群编号

Retain the cluster number for each member of a cluster within an id variable

我想标记纵向数据集中有多少个独特的数据集群,并让集群的每个成员都携带集群计数。不同的集群是那些在一个 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: 前缀一起使用。

如有任何帮助,我们将不胜感激。

托德

编辑:添加了为什么需要集群标识的解释。阐明了定义集群的规则。

对于每个 id,当日期与之前的观测值不同时,将 1 添加到 运行 总和。当满足sum()里面的条件时,1实现。

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)

@Roberto Ferrer 给出了一个直接的方法。从他使用的逻辑可以看出,还有一条路由使用了egengroup()函数:

egen group = group(id date2)
bysort id (group): gen clust2 = sum(group != group[_n-1])