Stata 如何检测组内变量的特定值组合(或条件)
我有一个调查数据集,其中包含住户ID和每个住户内的个人ID:个人1代表受访者本人。一些变量表示每个人与受访者的关系(例如,配偶2个,父母3个,等等),数据结构如下 ? 现在我要做的是检测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附加到新生成的
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,即一个指示符(或者在某些领域流行的糟糕术语中,是一个伪值)李>
稍微想想就知道了
问题的形式:做一切