我有一系列国家的失业率随时间变化的面板数据集。如果失业率高于20%,我已经生成了一个等于1的变量,我想计算失业率高于该速率的连续年份。一些国家退出数据多年,因为当年没有事件,但我希望计数包括缺失的一年,如果可能我包括一个这样的例子。我已经能够为每个国家创建一个highunemp变量的直接总和,而不是我需要的连续年份。以下是我的数据示例:
Country|Year |Unemprat| highunemp
-------|-----|--------|-------
1| 2001| 15 |0
2| 2001| 25 |1
3| 2001| 40 |1
1| 2002| 20 |1
2| 2002| 25 |1
3| 2002| 32 |1
4| 2002| 8 |0
1| 2003| 14 |0
3| 2003| 22 |1
4| 2003| 26 |1
1| 2004| 23 |1
2| 2004| 25 |1
3| 2004| 10 |0
4| 2004| 14 |0
我正在寻找一个这样的数据集,连续几年添加了变量
Country|Year |Unemprat| highunemp | conshigh
-------|-----|--------|-----------|---------
1| 2001| 15 |0 |0
2| 2001| 25 |1 |1
3| 2001| 40 |1 |1
1| 2002| 20 |1 |1
2| 2002| 25 |1 |2
3| 2002| 32 |1 |2
4| 2002| 8 |0 |0
1| 2003| 14 |0 |0
3| 2003| 22 |1 |3
4| 2003| 26 |1 |1
1| 2004| 23 |1 |1
2| 2004| 25 |1 |4
3| 2004| 10 |0 |0
4| 2004| 14 |0 |0
理想情况下,我希望在Stata中这样做,因为这是我目前使用我的数据的地方,但我也可以使用R。
答案 0 :(得分:1)
这个怎么样?
input country year unemp
1 2001 15
2 2001 25
3 2001 40
1 2002 20
2 2002 25
3 2002 32
4 2002 8
1 2003 14
3 2003 22
4 2003 26
1 2004 23
2 2004 25
3 2004 10
4 2004 14
end
gen high = unem >= 20
fillin country year
xtset country year
gen cons = high==1 & l.high==1
by country: gen cumc = sum(cons)
by country: replace cons = -l.cumc if high!=1
by country: replace cumc = sum(cons)
gen conshigh = high+cumc
l, sep(4)
* clean up
drop if _fillin
drop _fillin cons cumc
sort year country
以下是l, sep(4)
之前*cleanup
的输出:
+------------------------------------------------------------------+
| country year unemp high _fillin cons cumc conshigh |
|------------------------------------------------------------------|
1. | 1 2001 15 0 0 . 0 0 |
2. | 1 2002 20 1 0 0 0 1 |
3. | 1 2003 14 0 0 0 0 0 |
4. | 1 2004 23 1 0 0 0 1 |
|------------------------------------------------------------------|
5. | 2 2001 25 1 0 0 0 1 |
6. | 2 2002 25 1 0 1 1 2 |
7. | 2 2003 . . 1 -1 0 . |
8. | 2 2004 25 1 0 0 0 1 |
|------------------------------------------------------------------|
9. | 3 2001 40 1 0 0 0 1 |
10. | 3 2002 32 1 0 1 1 2 |
11. | 3 2003 22 1 0 1 2 3 |
12. | 3 2004 10 0 0 -2 0 0 |
|------------------------------------------------------------------|
13. | 4 2001 . . 1 . 0 . |
14. | 4 2002 8 0 0 0 0 0 |
15. | 4 2003 26 1 0 0 0 1 |
16. | 4 2004 14 0 0 0 0 0 |
+------------------------------------------------------------------+
顺便说一下,您的国家2,2004年是奇怪的,因为国家2有2001 = 1
,2002 = 1
,2003 = .
,2004 = 1
所以2004年conshigh
的值应为1,而不是4.如果您希望它为4,您可以先填写high
表示缺失的年份,然后再填写其他人。我认为这是一个与当前技术问题正交的问题。
此外,如果您按照Country
然后Year
对数据进行排序,而不是其他方式,则会更容易阅读。
答案 1 :(得分:1)
我将建议一个解决方案,而不是您的初始帖子中的问题,而是针对您在评论中描述的问题 - 数据中的差距,这会使您找到高级法术的努力复杂化失业。您应该对每个国家/地区组合进行观察,如果没有事件,则事件计数为零。下面的代码以您拥有的国家/地区组合开头,并使用fillin
命令填写缺少的组合,然后在新添加的观察中将计数设置为零。当您实际知道值应该是什么时,在您的数据集中留下缺失的观察结果是一个错误,会使您的分析变得复杂(因为它似乎已经完成了)。如果您回到过程并更正此问题,然后添加失业数据,您的分析将会更好。如果您只获得了有事件的国家/年度观察的失业数据,您应该找到这些费率的来源,并再次merge
到您的事件数据。
. list, clean
Country Year events
1. 1 2001 4
2. 2 2001 5
3. 3 2001 1
4. 1 2002 5
5. 2 2002 2
6. 3 2002 5
7. 4 2002 5
8. 1 2003 2
9. 3 2003 3
10. 4 2003 4
11. 1 2004 2
12. 2 2004 3
13. 3 2004 4
14. 4 2004 5
. fillin Country Year
. replace events = 0 if _fillin
(2 real changes made)
. drop _fillin
. list, clean
Country Year events
1. 1 2001 4
2. 1 2002 5
3. 1 2003 2
4. 1 2004 2
5. 2 2001 5
6. 2 2002 2
7. 2 2003 0
8. 2 2004 3
9. 3 2001 1
10. 3 2002 5
11. 3 2003 3
12. 3 2004 4
13. 4 2001 0
14. 4 2002 5
15. 4 2003 4
16. 4 2004 5
答案 2 :(得分:1)
我实际上似乎在Stata找到了答案。
by country (year), sort: gen spell = sum(highunemp != highunemp[_n-1])
by country spell (year), sort: gen conshigh = (cond(highunemp, _n, 0))