这是我正在努力解决的问题
我的数据看起来像
id time pcode
1 1 1
1 2 1
1 3 1
1 4 2
1 5 4
1 6 1
(我实际上有多个id;面板不是很平衡,实际上可能存在间隙,但这是我以后会保存的复杂功能)
pcode
是一个分类变量(认为是产品代码),可能有很多(在50到500之间)。
我正在尝试使用时间窗口内pcode
的唯一级别数生成变量。例如,对于两个和三个周期的窗口,我想分别生成两个变量ncode2
和ncode3
,看起来像
id time pcode ncode2 ncode3
1 1 1 1 2
1 2 1 2 3
1 3 1 2 3
1 4 2 2 2
1 5 4 1 1
1 6 1 . .
确定:time=1
时,ncode2
查看时间2和3;有时只有pcode
有一级{2}和3(即1),所以ncode2=1
。当time=2
,ncode2
查看时间3和4时,会找到唯一值1和2,并记录ncode2=2
。等等。
我不太关心当你开始到达小组结尾时会发生什么;在这里,我将值分配给ncode2
和ncode3
,只要有一个时间段可以查看,如果没有,则会丢失。
答案 0 :(得分:0)
我创建的变量包含面板中的下一个值,之后的那个,依此类推。
然后在egen
包中应用rownvals()
函数egenmore
,该ssc
函数必须使用. clear
. input id time pcode
id time pcode
1. 1 1 1
2. 1 2 1
3. 1 3 1
4. 1 4 2
5. 1 5 4
6. 1 6 1
7. 2 4 3
8. 2 5 4
9. 2 6 1
10. end
. tsset id time
panel variable: id (unbalanced)
time variable: time, 1 to 6
delta: 1 unit
. gen pcode1 = F.pcode
(2 missing values generated)
. gen pcode2 = F2.pcode
(4 missing values generated)
. gen pcode3 = F3.pcode
(6 missing values generated)
. egen distinct2 = rownvals(pcode1 pcode2)
. egen distinct3 = rownvals(pcode1 pcode2 pcode3)
. list, sepby(id)
+--------------------------------------------------------------------+
| id time pcode pcode1 pcode2 pcode3 distin~2 distin~3 |
|--------------------------------------------------------------------|
1. | 1 1 1 1 1 2 1 2 |
2. | 1 2 1 1 2 4 2 3 |
3. | 1 3 1 2 4 1 2 3 |
4. | 1 4 2 4 1 . 2 2 |
5. | 1 5 4 1 . . 1 1 |
6. | 1 6 1 . . . 0 0 |
|--------------------------------------------------------------------|
7. | 2 4 3 4 1 . 2 2 |
8. | 2 5 4 1 . . 1 1 |
9. | 2 6 1 . . . 0 0 |
+--------------------------------------------------------------------+
进行安装。
egen
对于原则,相关技术在Distinct observations中有一定篇幅的讨论(它促使使用术语“不同”,而不是“唯一”)和Rowwise。
此处使用的uniqrows()
函数使用Mata函数{{1}}将向量缩减为一组不同的值,每个值只出现一次。