if语句中的Forvalues

时间:2014-02-20 10:52:55

标签: loops if-statement stata

我一直在寻找这个特定问题的答案,但却找不到任何答案。我有两组变量,分别将数据集中的人与他们的母亲和父亲联系起来。我的目标是将人们与他们的兄弟姐妹联系起来。我的数据集看起来像这样:

person_id mom_id father id  child_1_mom child_2_mom child_1_dad child_2_dad

我只对保持拥有相同父亲和母亲的孩子感兴趣,这意味着如果其中一个child_*_mom个人ID与任何child_*_father个ID。我一直在尝试不同的东西,但我最好的猜测就是这个代码,只是为了说明我在做什么。

forvalues i=1(1)17 {;
    replace child_`i'_mom="" if
        (forvalues j=1(1)17 {;
        (child_`i'_mom!=child_`j'_dad) &
        };
        (child_`i'_mom!=child_18_dad));
    };

正如你所看到的,它有点创意,但我想出的最好。母亲有17个子变量,父亲有18个子变量(我的数据集中有一些有18个孩子)。我不想手动执行此操作的原因是我必须总共执行上述操作20年,并且我计划稍后为妈妈和爸爸设置子变量的数量。

我的问题是:在循环中,有forvalues语句在if语句中进行person_id mother_id father_id 循环吗?或者有更聪明的方法来解决这个问题吗?


进一步解释:

好的,所以我会尝试进一步阐述这个问题。

最初数据集看起来像这样

mother_id

然后我按照person_id mother_id mother_n 11 1 1 12 1 2 13 2 1 14 2 2 15 2 3 对数据进行了排序,然后创建了一个变量,这样数据就像这样

mother_id child_1 child_2 child_3
     1       11      12      .
     2       13      14      15

等等。这已经为母亲和父亲做了。然后我重塑两个数据集,例如

   person_id mother_id mother_n child_1_m child_2_m child_3_m child_1_f child_2_f
     11      1         1          11         12      .          ?          ?
     12      1         2          11         12      .          ?          ?
     13      2         1          13         14      15         ?          ?
     14      2         2          13         14      15         ?          ?
     15      2         3          13         14      15         ?          ?

从这个结果数据集(父亲和母亲),我已将这些数据集合并到原始数据集上,这样

child_ID
因此,我有母亲的孩子和父亲的孩子的变量。接下来我想让每个变量观察都丢失,child_*_m变量组和child_*_f变量组中都不存在{{1}}。

所以我的想法是,我想制作一个自动程序,在一个循环内执行此操作,而无需在整个程序中多次“替换if ...”,因为我必须这么做多年,孩子的最大数量不同。

希望这一点得到澄清。

3 个答案:

答案 0 :(得分:2)

我会做这样的事情:

gen byte mark = 1
forvalues i = 1/17 {
    replace mark = mark * inlist(child_`i'_mom, mom_id   , .) * ///
                          inlist(child_`i'_dad, father_id, .)
}  

这将创建一个二进制变量,当所有兄弟姐妹拥有相同的父亲和母亲时为1,否则为0。在随后的分析中,您可以将if mark == 1条件添加到命令中,以确保使用所需的子样本。

这只是初步代码,旨在帮助您入门。你应该考虑的一件事是,我做了错失的价值观,因为不是每个人都有17个兄弟姐妹,但是当其中一个兄弟姐妹的父亲不知道的时候呢?在根据您的情况调整此代码之前,您可能希望查看类似的内容。

答案 1 :(得分:0)

我会尝试(轻轻地)推动您进一步解释您的数据结构和变量定义。

如果每个观察都是一个人(perid),谁已经与他的母亲(momid)和父亲(fathid)相关联,那么对兄弟姐妹进行分组只是{ {1}} ING。下面是一个例子:

sort

我错过了什么或误解了什么?你怎么能改善你的职位?

答案 2 :(得分:0)

所以我现在理解你的问题如下:

当母亲只是从一个父亲生下孩子而父亲只从一个母亲那里成为孩子时,你想留住人。

我会坚持原始形式的数据集。据我所知,现在这是一个有母亲和父亲的儿童名单。如果所有同一个母亲的孩子也有同一个父亲,那么我们就知道第一个条件是真的。这是示例中的第一行。如果所有同一个父亲的孩子也有同一个母亲,我们知道第二个条件是真的。这是示例中的第二行。将这些布尔变量相乘意味着两个条件都必须为真。

bys mother_id (father_id): gen byte one_husband = father_id[1] == father_id[_N]
bys father_id (mother_id): gen byte one_wife    = mother_id[1] == mother_id[_N]
gen byte touse = one_husband * one_wife

这种解决方案假设丹麦登记处出现的母亲或父亲都没有在丹麦境外生孩子......

之后,您可以以任何您喜欢的方式使用touse变量。通常情况下,我更愿意在后续分析中将其用作if条件的一部分,但您可keep touse == 1 touse == 0的观察结果。您似乎希望在{{1}}时通过将某些变量替换为缺失值来强制执行此选择。该解决方案最不具吸引力(即我强烈建议您这样做),因为您将以一种绝不保证选择您的方式更改您的数据希望也适用于未来的分析;它太过于间接,太含蓄而不是好风格。