不平衡面板数据集事件前后的二次抽样
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
看来你的活动日期是与event
1的第一次约会。所以,
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。
我正在尝试找出一种简洁的方法,使用 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
看来你的活动日期是与event
1的第一次约会。所以,
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。