不平衡面板数据集事件前后的二次抽样

Subsampling years before and after an event of an unbalanced panel dataset

我正在尝试找出一种简洁的方法,使用 Stata 中的每日面板数据仅保留事件发生年份前后的两年。面板不平衡。最终,我试图进行一项事件研究,但我遇到了问题,因为独特的群体报告的年份不一致。

数据看起来像这样:

ID   year   month    day    event
1    1999     1       1       0
1    1999     1       2       0
1    1999     1       3       0
1    1999     1       4       0
1    1999     1       5       0
1    1999     1       6       0
1    1999     1       7       0
1    1999     1       8       0
1    1999     1       9       0
1    1999     1       10      0
1    1999     1       11      0
1    1999     1       12      0
1    1999     1       13      0
1    1999     1       14      0
1    1999     1       15      0
1    1999     1       16      0
1    1999     1       17      0
1    1999     1       18      0
1    1999     1       19      0
1    1999     1       20      0
1    1999     1       21      0
1    1999     1       22      0
1    1999     1       23      0
1    1999     1       24      0
1    1999     1       25      0
1    1999     1       26      0
1    1999     1       27      0
1    1999     1       28      0
1    1999     1       29      0
1    1999     1       30      0
1    1999     1       31      0
1    1999     2       1       1
1    1999     2       2       1

在本例中,事件发生在 1999 年 2 月。该事件是每月一次,但我需要每日数据以供后面的分析部分使用。我想以某种方式标记 1999 年 2 月之前的 24 个月和 1999 年 2 月之后的 24 个月。但是,如果第 1 组报告 2000 年没有数据,我需要以一种不会在 2002 年编纂任何月份的方式来做这件事。

我得到了以下方法来处理一组类似的月度数据,但我想不出一种方法来处理每日数据。此外,如果有人对不那么笨拙的解决方案提出建议,我将不胜感激。

bys ID year (month) : egen year_change = max(event) 
bys ID (year month) : replace year_change = 2 if /// 
    (year_change[_n+24] == 1 & year[_n] == year[_n+24] - 2) | /// 
    (year_change[_n+12] == 1 & year[_n] == year[_n+12] - 1) | ///
    (year_change[_n-12] == 1 & year[_n] == year[_n-12] + 1) |  ///
    (year_change[_n-24] == 1 & year[_n] == year[_n-24] + 2)
keep if year_change >= 1

对于你的任务,我建议你使用实际的 Stata 日期,而不是依赖年 + 月 + 日变量 - 这样,在不依赖数据排序的情况下 add/subtract 24 个月会更容易(您代码中的“_n+24”部分)和编纂不会受到您在问题中概述的数据丢失问题的影响。

我看到一个简单的解决方案,它依赖于我对您的设置所做的假设(您没有指定,但这是事件研究的一般形式):事件日期对于所有 ID 都是唯一的,因此有没有针对特定群体的“治疗”日期。

g stata_date = mdy(month, day, year) // generate variable with Stata date
/* Unique event on Feb 1, 1999 */
bys ID: egen treat_group = max(event) // indicator for an ID to ever be "treated"
g event_window = (stata_date >= td(01Feb1997) & stata_date < td(01Feb2001)) // indicator for event window - 2 years before and after Feb 1, 1999
g event_treatment = treat_group * event_window // indicator for a treated ID during the event window

看来你的活动日期是与event1的第一次约会。所以,

gen dailydate = mdy(month, day, year) 
bysort id : egen key = min(cond(event == 1, dailydate, .)) 
gen wanted = inrange(dailydate, key - 730, key + 730) 

检查 wanted 是否给出了您想要的日期,然后相应地修改规则或 keep

此代码不假定每个面板的事件日期都相同,但这不是问题。

有关相关技术的评论,请参阅 this paper