如何在stata中跨分层数据(家庭个体)写入循环?

如何在stata中跨分层数据(家庭个体)写入循环?,stata,data-manipulation,Stata,Data Manipulation,我现在正在做一个家庭调查数据集,我想根据某些成员与户主的关系给他们额外的身份证。更具体地说,我需要确定户主及其配偶(如果已婚)的成年子女,并为他们分配“子家庭ID” 变量为:hhid-住户IDpid-个人IDrelhead-与head的关系 关于relhead,1代表头部,6代表儿童,7代表公婆子女。下面是一些示例数据,包括最后一列中的预期结果。我假设只要一个6后面跟着一个7,他们就构成了一对夫妻,属于同一个子家庭 hhid pid relhead sub

我现在正在做一个家庭调查数据集,我想根据某些成员与户主的关系给他们额外的身份证。更具体地说,我需要确定户主及其配偶(如果已婚)的成年子女,并为他们分配“子家庭ID”

变量为:
hhid
-住户ID<代码>pid-个人ID
relhead
-与head的关系

关于
relhead
1
代表头部,
6
代表儿童,
7
代表公婆子女。下面是一些示例数据,包括最后一列中的预期结果。我假设只要一个
6
后面跟着一个
7
,他们就构成了一对夫妻,属于同一个子家庭

         hhid   pid  relhead         sub_hhid(desired)
          50     1    1                  1
          50     2    3                  1
          50     3    6                  2
          50     4    6                  3
          50     5    7                  3
        -----------------------------------------------
          67     1    1                  1
          67     3    6                  2
          67     4    7                  2
以下是一些想法:

一个家庭可能有已婚和未婚的成年子女,家庭结构有点复杂,所以我想写一些家庭成员之间的循环

基本的想法是在外环中,我们确定孩子呆在家里,然后检查是否有配偶在场,如果有,我们给这对夫妇一个指标,如果没有,我们继续并给单身孩子其他指标。在遍历了一个家庭中所有可能的成员之后,我们得到了一系列家庭内部ID。为了便于进一步分析,我需要某种外部ID变量来分隔子族

* Define N as the total number of household, n as number of individual household size
* sty_chil is indicator for adult child who living with parents(head) 
* sty_chil_sp is adult child's spouse
* "hid" and "ind_id" are local macros
forvalue hid=1/N {
  forvalue ind_id= 1/n {
       if sty_chil[`ind_id']==1 {
          check if sty_chil_sp[`ind_id+1']==1 {
          if yes then assign sub_hhid to this couples *a 6-7 pairs,identifid as couple
                                  } 
                      else                    { * single 6 identifid as single child
           assign sub_hhid to this child
                               }
          else         {         *Other relationships rather than 6, move forward
               ++ind_id           the members within a household
                       }
                   ++hid         *move forward across  households
                    }  
内置的stata
by,sort:
功能非常强大,但在这里,我想处理属于特定标准的部分家庭成员,而不涉及其他成员,因此if-else类型的循环对我来说更自然(即使是
by:
也可以达到我的目标,当情况变得不那么简单时,它总是太圆滑了,我们不能用尽所有可能的家庭模式)

一个直接的问题是,我不知道如何在房屋ID和个人ID之间写入循环,因为我过去使用
by
命令获取家庭规模(外部循环的增量)(我不确定在这种情况下它是1还是家庭成员的数字),和我不确定混合使用by和if循环是否是一种好的编程实践,我倾向于在这种情况下编写“完整循环”。请给我一些如何实现我的目标的线索,并为我提供(说明)伪代码。


另外一个问题是,我无法通过命令找到包含
内容的ado文件,它是否存在?

我将从用于创建匹配的假设是否合理的问题中抽象出来。相反,让这成为一个例子,说明在不使用显式循环的情况下,可以获得所需结果逻辑和订阅的使用(请参阅帮助订阅
)可以让您走得更远

clear
set more off

*----- example data -----

input ///
hhid   pid  relhead  sub_hhid
50     1    1          1
50     3    6          2
50     4    6          3
50     5    7          3
67     1    1          1
67     3    6          2
67     4    7          2
67     5    6          3
end

list, sepby(hhid)

*----- what you want -----

bysort hhid (pid): gen hhid2 = sum( !(relhead == 7 & relhead[_n-1] == 6) )

list, sepby(hhid)
正如您所看到的,一行代码就可以让您到达目的地。原因如下:

  • sum()
    给出运行的总和。
    sum()
    的参数作为条件,可以是True也可以是False。
    表示逻辑而不是(请参见
    帮助运算符

  • 如果是而不是关系是儿媳/女婿,前一个关系是儿媳/女婿,则条件的计算结果为True,值为1,将运行总和增加1。如果计算结果为False,则表示关系是儿媳/女婿,前一个关系为daughter/son,则其值为0,且运行总和不会增加。这将给出您所寻求的结果

  • 您可以使用
    by:
    前缀来执行此操作,因为您希望独立地检查每个原始家庭

  • 对于每个原始家庭的第一次观察,情况总是评估为真。这是因为不存在“以前”的观察(关系),Stata认为
    relhead
    缺失(,非常大的数字)因此,不等于6。对于每个分组的第一次观察,这将运行总和从0到1,依此类推

  • 一句话:通过:
    学习如何使用
    ,并利用Stata提供的功能。不要逆流游泳;不要在这里游泳

    编辑 请注意,不要逐步更改示例数据集,您应该从一开始就提供一个具有代表性的示例。如果不这样做,可能会导致最初的答案是正确的,完全不充分的

    对于修改后的示例,请添加:

    replace hhid2 = 1 if !inlist(relhead,6,7)
    
    这将简单地将任何不是6岁或7岁的人分配到与户主相同的家庭。假设户主总是有
    hhid2==1
    。如果户主可以有
    hhid2!=1
    ,则

    bysort hhid (relhead): replace hhid2 = hhid2[1] if !inlist(relhead,6,7)
    
    应该有用

    您可以遵循以下步骤:

    bysort hhid (pid): replace hhid2 = hhid2[_n-1] + 1 if hhid2 != hhid2[_n-1] & _n > 1
    
    但因为它们是ID,所以实际上没有必要

    最后,使用:

    gen hhid3 = string(hhid) + "_" + string(hhid2)
    
    50_1
    50_2
    50_3
    等形式创建ID


    就像我之前说过的,如果你的数据更复杂,你应该给出一个相关的例子。

    你怎么知道在HH 50中,这对夫妇不是3和5?这个问题与你以前的问题有什么根本性的不同:?为什么不编辑而不是发布一个新的?无论你的编程背景如何,你都会发现STATA中的CIT循环可能是许多(但不是全部)病例中最好的方法。Stata命令已经循环了所有观察结果,因此尝试再次执行可能不正确。如果键入
    ,您将看到它是一个内置结构。没有可以检查的.ado文件。学习如何使用它是学习Stata的最重要步骤之一。请参阅为了一个好的介绍。我已经自由地编辑了你的帖子。你可以随时回复到以前的帖子