【问题标题】:Having an issue with stopping a loop in Stata在 Stata 中停止循环时遇到问题
【发布时间】:2015-11-19 18:54:35
【问题描述】:

所以,我的数据集中有一堆变量,它们是二进制的,包含有关个人是否已婚的信息。因此,例如,marr79 是一个人是否在 1979 年结婚。

我试图找出一个人从孩子出生起结婚(第一次)多少年。因此,如果孩子出生于 1980 年,而此人于 1980 年结婚,则它会添加到child_marr,并且在他们接下来的 18 年中也是如此。但是,如果遇到 0,我希望它停止。因此,如果 1980、1981 和 1982 有 1,而 1983 有 0,我希望它在 1983 年停止,即使 1984 年有 1。

我下面的代码(它是我尝试过的许多迭代之一)要么让它运行多年而没有停止,要么根本不运行,留下的值都是 0。

感谢任何帮助。

gen child_marr=0;
forvalues y=79(1)99 {;
gen temp_yr=1900+`y';   
if (ch_yob<=temp_yr & marr`y'==1 & temp_yr<(ch_yob+18))==1 {;
    replace child_marr = child_marr + 1;
    };
else if (marr`y'==0 & ch_yob<=temp_yr) {;
    continue, break;
    };
drop temp_yr;
};

【问题讨论】:

  • 您不清楚您的数据是什么样的。您能否发布一个最小、完整且可验证的示例以及所需的输出?您可以使用来自 SSC 的dataex
  • {警告:意见如下。} 你的 Stata 代码中的所有这些分号到底在做什么? #delimit ; 在允许偶尔出现非常长的命令时非常有用,但是当(a)不需要和(b)它非常不利于常见的编码实践语言?

标签: stata


【解决方案1】:

几个cmets:

  • 您的条件if (test1 &amp; test2 &amp; test3) == 1 不需要== 1 部分——Stata 推断if (condition) 表示if condition == 1(注意:对于逻辑测试为{0,1} 的情况)。
  • 无需生成临时变量,因为您可以直接将变量的值与局部宏进行比较。
  • 对于手头的问题,您的循环正在比较观察级别的标准(例如,变量temp_yr 的值与变量ch_yob 的值)。这看起来是正确的,但通常是有问题的——参见Stata FAQ: if command versus if qualifier

解决方案的第一步是重新编码forvalues 循环以使用if 限定符 而不是if 命令

gen child_marr = 0
forvalues y = 79/99 {
    local yr = 1900 + `y'   
    replace child_marr = child_marr + 1 if (ch_yob <= `yr') & (marr`y' == 1) & (`yr' < (ch_yob + 18))
}

但如前所述,如果有一个可重现的例子,具体的解决方案会更容易。

【讨论】:

  • 布伦丹,感谢您的帮助。我遇到的问题不在于循环。原始循环的形状与您的一样,但我正在创建另一个循环,如果 marr`y'==0
  • Dimitriy 建议发布“一个最小的、完整的和可验证的示例,以及所需的输出[。] 您可以使用来自 SSC 的dataex。”
猜你喜欢
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多