我有一个分组的数据集,我想检查以确保这些组不能进一步划分为不同的子组。组中的每个观察都有一个唯一的ID
和另一个名为match_ID
的变量,对于一个两个成员的组,它是该组中另一个观察的ID号。对于拥有两名以上成员的组,每次比赛都会重复一次ID,因此三人组将列出所有三个ID两次:每次匹配一次。
两人小组的例子:
ID match_ID group_ID
1 2 55
2 1 55
三人小组的例子:
ID match_ID group_ID
1 2 99
1 3 99
2 1 99
2 3 99
3 1 99
3 2 99
我的计划是在每个组中使用第一个ID
,并确保它显示为该组所有其他成员的match_id
值。如果没有,则该组包含一个不同的子组。但这只适用于两个成员组(无论如何都不能包含子组),所以我认为需要针对ID
检查match_ID
的条件。组内的每个唯一 ID
。但我不知道如何编码。
答案 0 :(得分:0)
您的xtset
代码对我不起作用 - 也许我错过了一些东西。无论如何,这是一个(相当难看的)代码,它计算每个组中ID
和match_ID
的每个组合的匹配数,并在计数不是一个时报告结果。
// a program to run matches with by-groups
capture program drop match
program match, byable(recall)
marksample touse
preserve
qui drop if !`touse'
loca n=_n
loca N=_N
forval i=`n'/`N' {
qui count if (ID[`i']==match_ID[_n] & match_ID[`i']==ID[_n] & `i'!=_n)
if (`r(N)'!=1) {
loca n=obs[`i']
di "obs=`n' find `r(N)' matches"
}
}
restore
end
// fake example
clear
input ID match_ID group_ID
1 2 10
1 3 10
2 1 10
2 3 10
3 1 10
3 2 10
1 2 11
1 3 11
2 1 11
2 3 11
3 1 11
1 1 12
1 3 12
2 1 12
2 3 12
3 1 12
3 2 12
end
sort group_ID ID match_ID
gen obs=_n // unique identifier
list // no matches for obs=10, 12, and 14
by group_ID: match
这可以完成这项工作,但肯定有一些方法可以改进这段代码 - 我不得不诉诸preserve
和restore
,因为我无法使索引工作。我还想象使用xtset
或reshape
的东西可以更快,因为Stata中的行方式操作很慢。