2014-02-20 101 views
0

我一直在尋找這個問題的答案,但無法找到任何。我有兩組變量分別將數據集中的人與他們的母親和父親連接起來。我的目標是將人與他們的兄弟姐妹聯繫起來。我的數據集看起來是這樣的:在if語句中的價值

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年以上的工作,而且我打算在以後爲宏觀和母親宏觀化子變量的數量。

我的問題是:有沒有辦法在if語句內在循環中執行forvalues循環?還是有更聰明的方法來解決這個問題?


進一步解釋:

好了,所以我會盡力闡述遠一點的問題。

最初的數據集看起來像這樣

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變量組中。

這樣的想法是,我想打一個自動的過程,纔會這樣一個循環中,而無需手動不必`通過了該計劃時予以更換......」無數次,因爲我有做多年,不同的兒童最大數量。

希望這個清晰。

+2

'if' *循環內'if'限定符:無法完成。我迷失在爲什麼這些數據是以這種形式出現的。我可以想象人物標識符,母親標識符,父親標識符,並可以看到父標識符可能會丟失。爲什麼有這麼多變數? –

+0

這來自丹麥的數據,包括某一年在該國的每個人。最初,原始數據包括丹麥的每個人,併爲他們的母親和他們的父親標識。我們需要將人們的教育水平與兄弟姐妹(同父母)進行比較。因此,我正在製作一個數據集,通過他們的母親和父親標識符,將每個特定人員(母親或父親)的每個孩子與丹麥的每個人合併,所以是。現在看起來有點奇怪,但我只是在製作數據 - 並沒有對它進行分析。 – amri

回答

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個兄弟姐妹,但是當其中一個兄弟姐妹的父親未知時,該怎麼辦?在將此代碼適用於您的情況之前,您可能希望查看類似的內容。

+0

非常感謝您的建議,我會研究它,儘管我想避免一般的標記。並感謝您的提醒:)。 – amri

+0

我傾向於選擇標記,因爲它會使數據保持原樣,但在開始分析之前,您始終可以鍵入'keep if mark == 1'。只記得_not_不保存你的數據... –

0

我會試着(輕輕地)推動你進一步解釋你的數據結構和變量定義。

如果每個觀察是一個人(perid),誰是已經與他的母親(momid)和父親(fathid),然後分組兄弟姐妹只是sort ING的問題。下面是一個例子:

clear all 
set more off 

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

set obs 20 

scalar a = 1 
scalar b = 5 

set seed 395 

gen perid = _n 
gen momid = floor((b-a+1)*runiform() + a) 
gen fathid = floor((b-a+1)*runiform() + a) 

list 

*---------- group siblings ------------- 

isid momid fathid perid, sort 

list, sepby(momid fathid) 

我在想什麼?你如何改進你的帖子?

+0

忽略這一點,沒有足夠的字符:) – amri

+0

我在原帖中添加了進一步的解釋。 – amri

+0

好吧,我試過你的代碼,非常感謝你解決我的問題的嘗試。但是,這不完全是我想要的。我已經得到了關於數據集的描述,並且已經決定了它必須看起來像我添加到我的原始文章中的那個。 – amri

0

所以我現在明白你的問題如下:

你要保持人的時候,媽媽只能從一個父親成爲孩子和父親不僅成爲孩子們從一個母親。

我會堅持原始形式的數據集。據我現在瞭解,這是一個有母親ID和父親ID的孩子名單。如果所有有着同樣母親的孩子也有同一個父親,那麼我們知道第一個條件是真的。這是示例中的第一行。如果所有有同一個父親的孩子也有同一個母親,我們知道第二個條件是真的。這是示例中的第二行。乘以這些布爾變量意味着兩個條件必須爲真。

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 

該解決方案ofcourse假定沒有顯示在丹麥註冊了父親或母親的孩子有丹麥以外...

之後,你可以使用任何你喜歡的方式touse變量。通常我寧願在隨後的分析中將它用作if條件的一部分,但您可以使用keep的觀察結果,其中touse == 1。您似乎想要通過在touse == 0時將某些變量替換爲缺失值來施加此選擇。這種解決方案的吸引力最小(即我強烈建議您做而不是做到這一點),因爲您會以某種方式更改您的數據,這絕不保證您所需的選擇也可用於將來的分析;它太過於間接,太好意味着風格不錯。