基于2019年样本特征从2020年面板数据匹配生成新数据集
从2020年数据集中抽取与2019年特征匹配的样本
要从2020年数据集中筛选出特征(男女比例、母亲年龄、母亲受教育程度、家庭收入)与2019年数据集一致的小样本,可采用倾向得分匹配或分层加权抽样两种方法,具体实现如下:
方法一:倾向得分匹配(基于matchit包)
倾向得分匹配通过计算样本特征的匹配概率,从2020年数据集中挑选与2019年样本特征最接近的个体,能有效保证两组特征分布一致。
1. 安装并加载依赖包
# 首次使用需安装 install.packages(c("matchit", "cobalt")) # 加载包 library(matchit) library(cobalt)
2. 构造匹配用数据集
为两个数据集添加分组标识后合并,方便后续匹配计算:
# 标记分组:1=2019年样本,0=2020年样本 df_2019$group <- 1 df_2020$group <- 0 # 合并数据集 combined_df <- rbind(df_2019, df_2020)
3. 执行倾向得分匹配
以分组为因变量,指定需要匹配的特征字段:
# 最近邻匹配,每个2019年样本匹配1个2020年样本 match_obj <- matchit(group ~ sex_male + momage + momed + income, data = combined_df, method = "nearest", ratio = 1, replace = FALSE)
4. 提取匹配后的2020年样本
# 获取匹配结果数据集 matched_df <- match.data(match_obj) # 筛选出2020年的匹配样本 df_2020_matched <- subset(matched_df, group == 0, select = -group)
5. 验证匹配效果
通过平衡性检查确认两组特征分布是否一致:
# 输出平衡性统计摘要 bal.tab(match_obj, un = TRUE) # 可视化平衡性差异 love.plot(match_obj, binary = "std")
方法二:分层加权抽样
若需严格遵循2019年的特征分布比例抽样,可先计算2019年各特征的分布占比,再按该比例从2020年数据集中抽取对应样本。
1. 计算2019年特征分布
# 计算各特征的分布比例 sex_dist <- prop.table(table(df_2019$sex_male)) momed_dist <- prop.table(table(df_2019$momed)) income_dist <- prop.table(table(df_2019$income)) # 对母亲年龄进行分箱(示例分为5个区间) df_2019$momage_bin <- cut(df_2019$momage, breaks = 5) momage_dist <- prop.table(table(df_2019$momage_bin))
2. 按分布从2020年抽样
# 为2020年数据添加相同的年龄分箱 df_2020$momage_bin <- cut(df_2020$momage, breaks = levels(df_2019$momage_bin)) # 分层抽样 library(sampling) strata_sample <- strata(df_2020, stratanames = c("sex_male", "momage_bin", "momed", "income"), size = round(nrow(df_2019) * prop.table(table(df_2019[, c("sex_male", "momage_bin", "momed", "income")]))), method = "srswor") # 提取抽样结果 df_2020_stratified <- getdata(df_2020, strata_sample) # 移除临时分箱变量 df_2020_stratified$momage_bin <- NULL
注意事项
- 若2020年数据中部分特征组合的样本量不足,需适当调整匹配比例或放宽分箱区间。
- 匹配/抽样完成后必须验证特征平衡性,确保两组样本的核心特征分布一致。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

