生成变量以计算连续年份

时间:2017-09-30 21:38:59

标签: r dataframe stata counting

我有一系列国家的失业率随时间变化的面板数据集。如果失业率高于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。

3 个答案:

答案 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))