首页 文章

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

提问于
浏览
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 的"reverse",从假人创建一个分类变量 .

我想 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 回答

  • 1

    这是一种非常笨拙的方式,但我确信有一些方法:

    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 |
         +-----------------+
    
  • 0

    你的问题似乎预先假定强有力的假设,即变量已经有后缀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 |
         +-------------------------------------------+
    

相关问题