【问题标题】:Create event (dummy) one year before/ after of a dummy variable (or close to)在虚拟变量(或接近)之前/之后一年创建事件(虚拟)
【发布时间】:2021-03-07 00:48:56
【问题描述】:

我正在对不平衡的面板数据集进行事件研究。基本结构是,在大约 15 年的时间里,我对每家公司在不同时间点有不同数量的观察(交付)。我对一个事件(价格上涨)感兴趣,如果它发生,它被编码为一个虚拟变量,并且一些虚拟的领先和滞后来检查价格上涨对我的因变量的影响是否在该事件周围变得明显。例如,对于某些公司来说,价格上涨发生在 5 次交货时,例如15 岁以上 50 人。

但是,现在我还想在一年前后“模拟”相同的事件研究以改进推理。因此,我希望 R 在最接近前后一年的交付时为每个公司复制事件虚拟对象。交货日期不是每天,而是平均每 25 天。

所以,作为代码,数据看起来像这样:

df <- data.frame(firm_id = c(1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,4,4,4,4),
                   delivery_id = c(1,2,6,9,15,3,5,18,4,7,8,10,11,13,17,19,22,12,14,16,20,21),
                   date=c("2004-06-16", "2004-08-12", "2004-11-22", "2005-07-03", "2007-01-04",
                          "2004-09-07", "2005-02-01", "2006-01-17", 
                          "2004-10-11", "2005-02-01", "2005-04-27", "2005-06-01", "2005-07-01",
                          "2006-01-03", "2007-01-06", "2007-03-24", "2007-05-03", 
                          "2005-08-03", "2006-02-19", "2006-06-13", "2007-02-04", "2007-04-26"),
                   price_increase = c(0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0),
                   price_increase_year_before = c(1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0),
                   price_increase_year_afer = c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0))

创作

     firm_id delivery_id  date     price_increase  price_increase_year_before   price_increase_year_after
1        1           1 2004-06-16              0                          1                        0
2        1           2 2004-08-12              0                          0                        0
3        1           6 2004-11-22              0                          0                        0
4        1           9 2005-07-03              1                          0                        0
5        1          15 2007-01-04              0                          0                        0
6        2           3 2004-09-07              0                          0                        0
7        2           5 2005-02-01              0                          0                        0
8        2          18 2006-01-17              0                          0                        0
9        3           4 2004-10-11              0                          0                        0
10       3           7 2005-02-01              0                          1                        0
11       3           8 2005-04-27              0                          0                        0
12       3          10 2005-06-01              0                          0                        0
13       3          11 2005-07-01              0                          0                        0
14       3          13 2006-01-03              1                          0                        0
15       3          17 2007-01-06              0                          0                        1
16       3          19 2007-03-24              0                          0                        0
17       3          22 2007-05-03              0                          0                        0
18       3          12 2005-08-03              0                          0                        0
19       4          14 2006-02-19              0                          0                        0
20       4          16 2006-06-13              0                          0                        0
21       4          20 2007-02-04              0                          0                        0
22       4          21 2007-04-26              0                          0                        0

我想根据 price_increase 和日期为每个公司创建右侧的两个虚拟列。虽然我会从 dyplr 的 group_bymutate 方法和 if_else 函数开始,但我不知道如何创建一个变为 TRUE 的条件,当一年的交货时间接近 +1/-1 个月时上一年或下一年的日期以及如何选择相应的交货。你们有什么想法吗?

【问题讨论】:

  • 为什么price_increase_year_after中只有一个1?此外,您共享的数据似乎不完整。你能纠正一下吗?
  • 您好 Ronak,感谢您的评论。原因是firm_id = 1涨价一年后,下一次发货(delivery_id = 15)是两年后,超出了一年+1/-1个月的范围。

标签: r date dummy-variable panel-data


【解决方案1】:

这是使用dplyr 的一种可能方法。

group_by(firm_id)filter 之后并包括价格上涨的组。

然后,如果日期在 price_increase 等于 1 的日期之前或之后一年(+/- 30 天),则创建两个虚拟变量。然后,filter 将满足这些条件的行.

使用distinct,您可以防止您的虚拟变量在组/公司中出现多重或重复。否则,如果您的交货间隔 25 天,这似乎是理论上的可能性。

之后剩下的就是加入原始数据,将NA 替换为零作为虚拟列,然后进行排序。

library(dplyr)

df$date <- as.Date(df$date)

df %>%
  group_by(firm_id) %>%
  filter(any(price_increase == 1)) %>%
  mutate(
    price_increase_year_before = ifelse(
      between(date[price_increase == 1] - date, 335, 395), 1, 0),
    price_increase_year_after = ifelse(
      between(date - date[price_increase == 1], 335, 395), 1, 0),
    ) %>%
  filter(price_increase_year_before == 1 | price_increase_year_after == 1) %>%
  distinct(firm_id, price_increase_year_before, price_increase_year_after, .keep_all = TRUE) %>%
  right_join(df) %>%
  replace_na(list(price_increase_year_before = 0, price_increase_year_after = 0)) %>%
  arrange(firm_id, date)

输出

   firm_id delivery_id date       price_increase price_increase_year_before price_increase_year_after
     <dbl>       <dbl> <date>              <dbl>                      <dbl>                     <dbl>
 1       1           1 2004-06-16              0                          1                         0
 2       1           2 2004-08-12              0                          0                         0
 3       1           6 2004-11-22              0                          0                         0
 4       1           9 2005-07-03              1                          0                         0
 5       1          15 2007-01-04              0                          0                         0
 6       2           3 2004-09-07              0                          0                         0
 7       2           5 2005-02-01              0                          0                         0
 8       2          18 2006-01-17              0                          0                         0
 9       3           4 2004-10-11              0                          0                         0
10       3           7 2005-02-01              0                          1                         0
11       3           8 2005-04-27              0                          0                         0
12       3          10 2005-06-01              0                          0                         0
13       3          11 2005-07-01              0                          0                         0
14       3          12 2005-08-03              0                          0                         0
15       3          13 2006-01-03              1                          0                         0
16       3          17 2007-01-06              0                          0                         1
17       3          19 2007-03-24              0                          0                         0
18       3          22 2007-05-03              0                          0                         0
19       4          14 2006-02-19              0                          0                         0
20       4          16 2006-06-13              0                          0                         0
21       4          20 2007-02-04              0                          0                         0
22       4          21 2007-04-26              0                          0                         0

【讨论】:

  • 感谢您的解决方案。它完全按照我的计划进行(你对 distinct 部分完全正确。我找到了一种不太优雅的方法,因为我不知道你可以在 as.Date 类中简单地计算这个。非常感谢!跨度>
猜你喜欢
  • 2015-01-29
  • 2023-03-27
  • 2020-01-31
  • 1970-01-01
  • 2015-01-24
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多