2016-03-15 132 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 | 
    +-----------------+