Stata 如何检测组内变量的特定值组合(或条件)

Stata 如何检测组内变量的特定值组合(或条件),stata,data-management,Stata,Data Management,我有一个调查数据集,其中包含住户ID和每个住户内的个人ID:个人1代表受访者本人。一些变量表示每个人与受访者的关系(例如,配偶2个,父母3个,等等),数据结构如下 ? 现在我要做的是检测var1中某些值的出现,如果出现,则检测var1和var2的值是否满足特定条件 例如,如果var1和var2满足 (var1 == 3 & var2 == 1) | (var1 == 4 & var2 == 1) 然后我可以为同一组中的每个个体(在本例中为家庭,表示家庭结构)将值1附加到新生成的

我有一个调查数据集,其中包含住户ID和每个住户内的个人ID:个人1代表受访者本人。一些变量表示每个人与受访者的关系(例如,配偶2个,父母3个,等等),数据结构如下

现在我要做的是检测
var1
中某些值的出现,如果出现,则检测
var1
var2
的值是否满足特定条件

例如,如果
var1
var2
满足

(var1 == 3 & var2 == 1) | (var1 == 4 & var2 == 1)
然后我可以为同一组中的每个个体(在本例中为家庭,表示家庭结构)将值1附加到新生成的变量,例如
var3
,否则为0

这似乎不是什么大问题,我想我应该雇用一些

 by group: egen 

命令,但我不确定。我过去常常应用命令,比如

gen l_w_p = 0
by hhid: replace l_w_p = 1 if (var1 == 3 & a2004 == 1) | (var2 == 4 & a2004 == 1)
by hhid: replace l_w_p = 2 if (var1 == 3 & a2004 == 2) & (var2 == 4 & a2004 == 2)

但它似乎不起作用。那需要某种循环吗

我很难弄明白你在问什么。一个好的策略是给出一个数据和期望输出的例子,尽可能简化到问题的本质。这比用文字描述数据容易得多

让我们从简单开始。假设您有如下数据:

hhid    x
1       1
1       2
2       0
2       1
您想标记
x
为2的家庭。一种方法是

bys hhid:egen tag=max(cond(x==2,1,0))

这将产生:

hhid   x   tag  
   1   1     1  
   1   2     1  
   2   0     0  
   2   1     0  
从内到外,为每个成员检查
x
是否为2。如果是,则成员将获得
1
。如果没有,他会得到一个
0
max()

条件可能变得更复杂,条件函数可以像俄罗斯玩偶一样嵌套

这里有一个更复杂的例子。假设您要标记有人在此数据集中拥有
x=2
(标记为
1
)或
y>=5
(标记为
2
)的家庭:

hhid   x   y  
   1   1   1  
   1   2   2  
   2   0   3  
   2   1   4  
   3   1   5  
   3   3   5  
我们首先检查
x
,然后检查
y
如果
x
条件为假:

bys hhid:egen tag=max(cond(x==2,1,cond(y>=5,2,0))

这将产生:

hhid   x   y   tag  
   1   1   1     1  
   1   2   2     1  
   2   0   3     0  
   2   1   4     0  
   3   1   5     2  
   3   3   5     2  

我很难弄明白你在问什么。一个好的策略是给出一个数据和期望输出的例子,尽可能简化到问题的本质。这比用文字描述数据容易得多

让我们从简单开始。假设您有如下数据:

hhid    x
1       1
1       2
2       0
2       1
您想标记
x
为2的家庭。一种方法是

bys hhid:egen tag=max(cond(x==2,1,0))

这将产生:

hhid   x   tag  
   1   1     1  
   1   2     1  
   2   0     0  
   2   1     0  
从内到外,为每个成员检查
x
是否为2。如果是,则成员将获得
1
。如果没有,他会得到一个
0
max()

条件可能变得更复杂,条件函数可以像俄罗斯玩偶一样嵌套

这里有一个更复杂的例子。假设您要标记有人在此数据集中拥有
x=2
(标记为
1
)或
y>=5
(标记为
2
)的家庭:

hhid   x   y  
   1   1   1  
   1   2   2  
   2   0   3  
   2   1   4  
   3   1   5  
   3   3   5  
我们首先检查
x
,然后检查
y
如果
x
条件为假:

bys hhid:egen tag=max(cond(x==2,1,cond(y>=5,2,0))

这将产生:

hhid   x   y   tag  
   1   1   1     1  
   1   2   2     1  
   2   0   3     0  
   2   1   4     0  
   3   1   5     2  
   3   3   5     2  

@迪米特里·马斯托夫(Dimitry V.Masterov)提供了一个很好的具体答案,但可以更全面地解决这个问题

正如他的回答所表明的那样

  • 形式上的问题:这个群体中有没有人具有这种特征?可以通过在组上使用
    egen
    max()
    函数,得到一个真的或假的表达式,得到0或1,即一个指示符(或者在某些领域流行的糟糕术语中,是一个伪值) 稍微想想就知道了

  • 形式问题:这个群体的所有成员都有这个特点吗?可以通过在组上使用
    egen
    min()
    函数将其转换为产生0或1的真或假表达式来解决
  • 整个故事在FAQ中得到了充实(因此,元课程是利用您可用的资源)

    一步之遥是关于团队其他成员的问题,也在常见问题解答中讨论

    有关可能有用的更全面的讨论,请参阅和

    另外两项评论:

    a。用这样的代码

    gen l_w_p = 0
    by hhid: replace l_w_p = 1 if (var1 == 3 & a2004 == 1) | (var2 == 4 & a2004 == 1)
    by hhid: replace l_w_p = 2 if (var1 == 3 & a2004 == 2) & (var2 == 4 & a2004 == 2)
    
    by:
    前缀对操作没有影响。代码仍然在单个级别工作,前缀不会将操作扩展到组。这就是为什么它“不工作”,通常是一个相当无用的错误报告


    b。轻度抽象在解释问题时很有用,但命名变量时的抽象只会使代码更难阅读。我不会使用变量名,比如
    var1
    var2
    ,这只会增加记忆内容的负担。使用能唤起记忆的名称,如
    any\u unemployeed
    any\u marted
    或其他任何名称。这不仅仅是个人风格,当你要求别人思考你的代码时(就像这里),能够轻松阅读它是一个很大的帮助

    @Dimitry V.Masterov提供了一个很好的具体答案,但可以更笼统地回答这个问题

    正如他的回答所表明的那样

  • 形式上的问题:这个群体中有没有人具有这种特征?可以通过在组上使用
    egen
    max()
    函数,得到一个真的或假的表达式,得到0或1,即一个指示符(或者在某些领域流行的糟糕术语中,是一个伪值) 稍微想想就知道了

  • 问题的形式:做一切