将虚拟变量转换为连续变量

时间:2016-03-15 18:11:53

标签: stata

我将组成员资格编码为虚拟变量,如下所示:

     +--------------------------+
     | 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。

2 个答案:

答案 0 :(得分: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 )的基本原理是,其结果取决于sort varlist 之后的排序在您的情况下,首先0 0 10 1 0秒,1 0 0最后,01之前对Stata规则排序,排序首先在第一个变量,第二个变量的第二个,依此类推。 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 |
     +-------------------------------------------+

答案 1 :(得分: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 |
     +-----------------+