如何在非平衡面板数据中创建失业与非劳动力状态事件变量
非平衡面板数据中状态转换变量的创建
需求说明
- 核心目标:基于非平衡面板数据,创建
unemployed和inactive两个变量,精准标记特定状态转换事件 - 状态编码定义:
0= 就业(employed)1= 失业(unemployed)2= 非劳动力(inactive)
- 变量规则:
unemployed:仅当个体**从就业(0)转为失业(1)**时赋值为1,其余情况为0inactive:仅当个体**从就业(0)转为非劳动力(2)**时赋值为1,其余情况为0- 排除规则:若个体首次观测的状态为1或2,该情况不视为转换事件
- 缺失波次不影响:即使个体中间缺失若干观测波次,只要前后有效观测满足转换规则,仍标记为事件(如id=1缺失wave3、4,wave5从0转1,仍标记
unemployed=1)
预期输出
id wave status unemployed inactive 1 1 1 0 0 0 2 1 2 0 0 0 3 1 5 1 1 0 4 2 1 0 0 0 5 2 2 0 0 0 6 3 1 0 0 0 7 3 2 2 0 1 8 3 3 1 0 0 9 4 1 0 0 0 10 4 2 2 0 1 11 4 4 0 0 0 12 5 1 2 0 0 13 5 3 0 0 0 14 5 5 1 1 0 15 5 6 1 0 0 16 6 1 1 0 0 17 6 3 2 0 1 18 6 5 2 0 0
原始数据结构
df=structure(list(id = c(1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6), wave = c(1, 2, 5, 1, 2, 1, 2, 3, 1, 2, 4, 1, 3, 5, 6, 1, 3, 5), status = c(0, 0, 1, 0, 0, 0, 2, 1, 0, 2, 0, 2, 0, 1, 1, 1, 2, 2)), row.names = c(NA, -18L), class = c("tbl_df", "tbl", "data.frame"))
解决方案(R语言)
使用dplyr包按个体分组,通过lag()函数获取上一次观测的状态,再根据转换规则生成目标变量:
library(dplyr) df_processed <- df %>% group_by(id) %>% mutate( # 标记从0到1的转换 unemployed = ifelse(status == 1 & lag(status) == 0, 1, 0), # 标记从0到2的转换 inactive = ifelse(status == 2 & lag(status) == 0, 1, 0) ) %>% # 处理首次观测为1/2的情况:将对应变量设为0(lag返回NA时自动转为0) mutate( unemployed = replace(unemployed, is.na(unemployed), 0), inactive = replace(inactive, is.na(inactive), 0) ) %>% ungroup() # 查看处理后的数据 print(df_processed, n = 18)
代码说明
group_by(id):确保按个体独立判断状态转换lag(status):获取同个体上一次观测的状态值,自动跳过缺失的波次ifelse():根据转换规则赋值1或0replace():处理首次观测的NA值,确保首次状态非0时变量值为0
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

