数据扩展以创建两个协变量的所有可能组合

Data expansion so to create all possible combinations of two covariates

我的数据集如下所示:

clear all

input id year x
      1  1992 1
      1  1995 5
      1  1996 7
      2  1992 2
      2  1993 4
end

我需要根据 id 特定的观察数量扩展数据集,并创建以下数据结构,然后用于进一步计算(基本上,对于每个 id-year 值的组合我必须重复初始的 year 值集):

     id  year  y2   x 
      1  1992  1992 1
      1  1992  1995 1
      1  1992  1996 1
      1  1995  1992 5
      1  1995  1995 5
      1  1995  1996 5
      1  1996  1992 7
      1  1996  1995 7
      1  1996  1996 7
      2  1992  1992 2
      2  1992  1993 2
      2  1993  1992 4
      2  1993  1993 4

扩展很容易获得:

bysort id: gen N = _N
expand n_obs, gen(expanded)

然而,也许问题是微不足道的,但我找不到合适的策略来获得y2。感谢您的任何建议。

这是一些技巧; joinby 是关键。由于您随后编辑了您的问题以包含变量 x,因此我编辑了此回复以在要连接到原始文件的文件中仅保留 id 和 y2。

// setup test data
clear all
input id year x
      1  1992 1
      1  1995 5
      1  1996 7
      2  1992 2
      2  1993 4
end
tempfile t1
save `t1'
clear

// do the job
use `t1'
rename year y2
keep id y2
joinby id using `t1'
order id year y2
sort id year y2
list, sepby(id)

这给了我们

     +----------------------+
     | id   year     y2   x |
     |----------------------|
  1. |  1   1992   1992   1 |
  2. |  1   1992   1995   1 |
  3. |  1   1992   1996   1 |
  4. |  1   1995   1992   5 |
  5. |  1   1995   1995   5 |
  6. |  1   1995   1996   5 |
  7. |  1   1996   1992   7 |
  8. |  1   1996   1995   7 |
  9. |  1   1996   1996   7 |
     |----------------------|
 10. |  2   1992   1992   2 |
 11. |  2   1992   1993   2 |
 12. |  2   1993   1992   4 |
 13. |  2   1993   1993   4 |
     +----------------------+

@William 已经指出了直截了当的方法。

作为示例,您可以通过适当的排序和辅助变量到达那里:

clear
set more off

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

input ///
id year
1 1992
1 1995
1 1996
2 1992
2 1993
end

list, sepby(id)

*----- what you want -----

bysort id : gen N = _N
expand N

bysort id (year) : gen n = mod(_n-1, N) + 1
bysort id n (year) : gen year2 = year[n]

rename (year2 year) (year year2)

// pretty print
order id year year2
list, sepby(id)

当 "direct" 命令(例如 joinby 不可用时,以这种方式思考会有所帮助。