Stata:检查组内不同变量的相等性

时间:2014-09-10 18:41:42

标签: stata

我有一个分组的数据集,我想检查以确保这些组不能进一步划分为不同的子组。组中的每个观察都有一个唯一的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。但我不知道如何编码。

1 个答案:

答案 0 :(得分:0)

您的xtset代码对我不起作用 - 也许我错过了一些东西。无论如何,这是一个(相当难看的)代码,它计算每个组中IDmatch_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

这可以完成这项工作,但肯定有一些方法可以改进这段代码 - 我不得不诉诸preserverestore,因为我无法使索引工作。我还想象使用xtsetreshape的东西可以更快,因为Stata中的行方式操作很慢。