2015-11-19 340 views
0

因此,我在數據集中有一堆變量,它們是二進制的,並且包含個人是否已婚的信息。因此,例如,marr79,是一個人是否在1979年結婚。在停止Stata循環時遇到問題

我試圖找出一個人結婚(第一次)從孩子出生多少年。所以,如果孩子出生於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; 
}; 
+1

從您的問題中不清楚您的數據是什麼樣子。你能發佈一個最小的,完整的和可驗證的例子,以及期望的輸出嗎?你可以使用來自SSC的'dataex'。 –

+2

{警告:意見如下。}在你的Stata代碼中,所有這些分號究竟是幹什麼的? '#delimit;'在允許偶爾使用換行符的命令時非常有用,但是爲什麼當(a)不需要和(b)它非常反對通用編碼時,你會主動尋求用無關字符來混淆你的代碼在語言中練習? –

回答

1

幾點意見:

  • 你的條件if (test1 & test2 & test3) == 1不需要== 1部分 - 塔塔推斷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)) 
} 

但是如前所述,一個具體的解決方案將是用一個可重複的例子更容易。

+0

布倫丹,感謝您的協助。我遇到的問題不在循環中。原始循環的形狀是你有它的方式,但我創建了另一個循環,我希望循環停止,如果marr'y'== 0 –

+0

進一步的幫助將受益於Dimitriy的建議張貼「一個最小的,完整的和可驗證的例如,以及所需的輸出[。]您可以使用來自SSC的'dataex'。「 –