You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面板数据中基于二分变量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)

代码解释

  1. 分组排序:按Country分组后,强制按Year升序排列,保证滞后/领先取值的时间逻辑正确。
  2. open1/open2构建:通过lag()获取前一期open值,用逻辑判断精准筛选符合条件的转型,再转换为整数型虚拟变量。
  3. open3构建:
    • 先用lead()获取转型年份之后4期的open值;
    • 同时满足「当期从0→1无NA」和「后续4期全为1且无NA」两个条件时,open3取1,否则为0。

内容的提问来源于stack exchange,提问作者Jens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:35:23