2016-03-15 135 views
0

我已組成員編碼爲虛變量如下:轉換虛擬變量來連續變量

 +--------------------------+ 
    | group1 group2 group3 | 
    |--------------------------| 
    1. |  0  1  0 | 
    2. |  0  0  1 | 
    3. |  0  0  1 | 
    4. |  0  1  0 | 
    5. |  1  0  0 | 
    6. |  1  0  0 | 
    7. |  1  0  0 | 
    8. |  1  0  0 | 
    +--------------------------+ 

我想三個groupX變量轉換成一個單一的變量,如下所示:

group 
2 
3 
3 
2 
1 
1 
1 
1 

這是做xi i.group的「相反」,從虛擬變量創建一個分類變量。

我想egen foo = group(group*)但它似乎產生的變量奇怪的代碼:

 +--------------------------------+ 
    | group1 group2 group3 foo | 
    |--------------------------------| 
    1. |  0  1  0  2 | 
    2. |  0  0  1  1 | 
    3. |  0  0  1  1 | 
    4. |  0  1  0  2 | 
    5. |  1  0  0  3 | 
    |--------------------------------| 
    6. |  1  0  0  3 | 
    7. |  1  0  0  3 | 
    8. |  1  0  0  3 | 
    +--------------------------------+ 

注意egen已編碼組3爲1,第1組爲3

回答

1

你的問題似乎預設了變量已經後綴1起來,該指標變量是不相交強的假設。

既如此,這是你的代碼的替代:

input group1 group2 group3 
0 1 0 
0 0 1 
0 0 1 
0 1 0 
1 0 0 
1 0 0 
1 0 0 
1 0 0 
end 
gen group = group1 
forval j = 2/3 { 
    replace group = `j' if group`j' 
} 

egen, group(varlist中)的順序的理由是,其結果取決於訂貨後sortvarlist中這在你的情況下把0 0 1第一,0 1 0秒和1 0 0最後,作爲0各種1之前,塔塔的規則和順序是先對第一個變量,第二對第二變量,以及等等。 egen的這個功能是爲分組的任何變量組合而設計的。數字(指示符或其他)或字符串。

編輯:這個技術是更普遍。一個關鍵的假設是,對於一組變量,每次觀察1只發生一次。但是沒有關於變量數量的假設,變量名稱不需要有一些前綴:你只需要用給出實際變量名稱的東西來代替group*

. egen sgroup = concat(group*) 

. gen group = strpos(sgroup, "1") 

. l 

    +-------------------------------------------+ 
    | group1 group2 group3 sgroup group | 
    |-------------------------------------------| 
    1. |  0  1  0  010  2 | 
    2. |  0  0  1  001  3 | 
    3. |  0  0  1  001  3 | 
    4. |  0  1  0  010  2 | 
    5. |  1  0  0  100  1 | 
    |-------------------------------------------| 
    6. |  1  0  0  100  1 | 
    7. |  1  0  0  100  1 | 
    8. |  1  0  0  100  1 | 
    +-------------------------------------------+ 
+0

該方案具有易於理解的優勢。另外,感謝解釋爲什麼'egen,group'正在做它正在做的事情。一個極小的缺點,這是你必須事先知道你有多少組有(即'2/3'有點[幻數(https://en.wikipedia.org/wiki/Magic_number_(編程)# Unnamed_numerical_constants)-esque。) – LondonRob

+0

你尋求什麼概括?你的例子是高度結構化的,但你想放鬆哪些假設?如果你想要'group1'的通用代碼,那麼你可以編程計算這些變量的數量。沒有任何假設,你最終會重新創建'egen,group()'。 –

+0

同意。我想我可能被'egen,group()'的編碼過分困擾了,實際上在許多用例中,結果變量的編碼方式並沒有什麼不同。加入 – LondonRob

0

這裏是一個非常笨拙的方法這樣做,但我敢肯定有雨衣方式:

gen id = _n 
reshape long group, i(id) 
drop if group == 0 
drop group id 
rename _j group 

導致:

 +-----------------+ 
    | group country | 
    |-----------------| 
    1. |  2  FOO | 
    2. |  3  FOO | 
    3. |  3  FOO | 
    4. |  2  BAR | 
    5. |  1  BAR | 
    6. |  1  BAR | 
    7. |  1  BAR | 
    8. |  1  BAR | 
    +-----------------+