在id变量

时间:2015-05-15 01:05:10

标签: stata

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

任何帮助都将不胜感激。

托德

编辑:添加了为什么需要进行群集识别的说明。阐明了什么规则定义了一个集群。

2 个答案:

答案 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)

@Roberto Ferrer直接采取了行动。根据他使用的逻辑,使用egen的{​​{1}}函数也有一条路线:

group()