将每个障碍与其子组的其余部分进行比较

时间:2014-10-25 15:06:44

标签: stata

我的数据结构有以下目标

group; month; year; next_year
1; February; 2014; 0
1; March; 2006; 0
1; November; 2013; 1
2; January; 2014; 0
3; January; 2004; 0

我确实有groupmonthyear,但是需要从前三个生成列next_year:对于每个观察,我想检查一下在同一组中还有另一个观察值,其日期值落入明年的期间。如果是这样,我想将next_year的值设置为1,否则设置为0(参见示例)。

我开始将日期转换为Stata可以解释的格式 - 使用ym(month, year) - 这样我就可以进行比较。但是,我不确定如何迭代组内的所有观察,以确定是否是这种情况。

我知道如何在例如Java,但我不喜欢Stata。我想我不应该从循环开始,因为可能有一些已实现的命令可以解决这些问题。

2 个答案:

答案 0 :(得分:1)

你在避免显式循环方面是正确的。使用by:可以解决这类问题。

我修改了你的例子,在一年内对一组进行了两次观察。

clear 

input group str8 month year
1 February 2014 
1 March 2006 
1 March 2013 
1 November 2013 
2 January 2014 
3 January 2004 
end 

bysort group (year) : gen next_year = year[_n+1] == year + 1 
bysort group year (next_year) : replace next_year = next_year[_N]

list, sepby(group)  

     +------------------------------------+
     | group      month   year   next_y~r |
     |------------------------------------|
  1. |     1      March   2006          0 |
  2. |     1   November   2013          1 |
  3. |     1      March   2013          1 |
  4. |     1   February   2014          0 |
     |------------------------------------|
  5. |     2    January   2014          0 |
     |------------------------------------|
  6. |     3    January   2004          0 |
     +------------------------------------+

获得明确的sort订单至关重要。在group内,我们展望下一个year是否为当前year加1,如果为真则分配1,如果为假则分配为0。对于给定groupyear的最后一次观察,这最多也是如此。如果每组和每年有多个观察值,则必须将所有出现的1发生在所有这些观察中。

有关by:的教程,请参阅Speaking Stata: How to move step by: step

这里假设你的意思是在下一个日历年,而不是在接下来的12个月。大多数其他问题都需要将您的约会日期定为Stata月度日期,但这并不能使这个问题变得更容易。假设month是字符串且year是数字,这是在您的情况下执行此操作的一种方法:

gen mdate = monthly(month + string(year), "MY") 
format mdate %tm     

答案 1 :(得分:1)

如果您想在接下来的12个月内检查是否有以下观察,您可以尝试:

clear
set more off

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

input group str8 month year
1 March 2006 
1 March 2013 
1 November 2013 
1 January 2013
2 January 2014 
3 January 2004 
end 

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

gen dat = monthly(month + string(year), "MY") 
format dat %tm  

bysort group (dat): gen next = dat[_n+1] - dat <= 12

list, sepby(group)

确保您了解Nick代码和我的代码之间的区别。他们在不同的假设下工作。您可以使用我提供的数据检查运行这两段代码的差异(最初是Nick,但删除了一个观察点以获得重点;如果您使用Nick的数据而没有修改,结果将是相同的。)