面板数据中基于二分变量open构建变化类虚拟变量的技术问询
面板数据中构建转型虚拟变量的R实现
需求说明
给定截面时间序列面板数据,变量open取值为1、0、NA,需构建三个虚拟变量:
open1:仅当open从0变为1时取1(忽略涉及NA的变化)open2:仅当open从1变为0时取1(忽略涉及NA的变化)open3:仅当open从0变为1,且后续至少连续5年保持为1时,在转变当年取1
示例数据
以下是示例数据及读取代码:
# 读取示例数据 df <- read.table( text = "Country, Year, open, open1, open2, open3 US, 1, 1, 0, 0, 0 US, 2, 0, 0, 1, 0 US, 3, 1, 1, 0, 0 US, 4, NA, 0, 0, 0 US, 5, 0, 0, 0, 0 US, 6, 0, 0, 0, 0 UK, 1, NA, 0, 0, 0 UK, 2, 0, 0, 0, 0 UK, 3, 1, 1, 0, 1 UK, 4, 1, 0, 0, 0 UK, 5, 1, 0, 0, 0 UK, 6, 1, 0, 0, 0 UK, 7, 1, 0, 0, 0", sep = ",", header = TRUE)
解决方案代码
使用dplyr包按国家分组处理,实现三个虚拟变量的构建:
library(dplyr) df_processed <- df %>% group_by(Country) %>% arrange(Year) %>% # 确保数据按年份升序排列 # 构建open1:筛选从0→1且无NA的转型 mutate(open1 = as.integer(lag(open) == 0 & open == 1 & !is.na(lag(open)) & !is.na(open))) %>% # 构建open2:筛选从1→0且无NA的转型 mutate(open2 = as.integer(lag(open) == 1 & open == 0 & !is.na(lag(open)) & !is.na(open))) %>% # 生成后续4期的open值,用于验证连续5年为1的条件 mutate( lead_1 = lead(open, 1), lead_2 = lead(open, 2), lead_3 = lead(open, 3), lead_4 = lead(open, 4) ) %>% # 构建open3:0→1且后续4期全为1无NA mutate(open3 = as.integer( lag(open) == 0 & open == 1 & !is.na(lag(open)) & !is.na(open) & lead_1 == 1 & lead_2 == 1 & lead_3 == 1 & lead_4 == 1 & !is.na(lead_1) & !is.na(lead_2) & !is.na(lead_3) & !is.na(lead_4) )) %>% # 清理临时变量 select(-c(lead_1, lead_2, lead_3, lead_4)) %>% ungroup() # 查看处理结果 print(df_processed)
代码解释
- 分组排序:按
Country分组后,强制按Year升序排列,保证滞后/领先取值的时间逻辑正确。 - open1/open2构建:通过
lag()获取前一期open值,用逻辑判断精准筛选符合条件的转型,再转换为整数型虚拟变量。 - open3构建:
- 先用
lead()获取转型年份之后4期的open值; - 同时满足「当期从0→1无NA」和「后续4期全为1且无NA」两个条件时,
open3取1,否则为0。
- 先用
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

