双重差分(Difference in Differences)处理虚拟变量R生成方法咨询
基于tidyverse的处理变量生成方案
前置准备
首先加载tidyverse套件:
library(tidyverse)
你提供的测试数据集可以直接用如下代码加载:
df <- structure(list(id = c(1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 5, 5, 6, 7, 8, 9, 9, 9, 9), year = c(2002, 2003, 2004, 2005, 2002, 2006, 2009, 2010, 2006, 2009, 2010, 2011, 2012, 2006, 2007, 2006, 2010, 2011, 2012), network = c(200, 250, 250, 250, 100, 400, 400, 220, 105, 70, 135, 200, 102, 0, 0, 0, 50, 150, 150), treat = c(0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0)), class = "data.frame", row.names = c(NA, -19L))
核心实现代码
df <- df %>% # 按个体ID分组,仅比较同一个体的不同年份数据 group_by(id) %>% # 强制同组内按年份升序排序,避免原始数据年份乱序导致计算错误 arrange(year, .by_group = TRUE) %>% # 生成处理虚拟变量 mutate( treat_new = as.integer(network > lag(network, default = Inf)) ) %>% # 取消分组 ungroup()
代码逻辑说明
- 用
lag(network)取同一个体上一观测年份的network值,分组内的第一个观测没有上一期,我们把默认值设为无穷大Inf,保证第一个观测的判断结果为0 - 直接比较当前年份network是否大于上一期值,逻辑值转整数后正好符合你要求的1/0规则
- 生成的
treat_new列和你示例中给出的treat列完全一致,可直接用于后续双重差分分析
内容的提问来源于stack exchange,提问作者z_11122
相关产品推荐
相关产品推荐

