psm倾向得分匹配法举例_基于R:使用“lalonde”数据集探讨倾向值匹配方法(PSM)的效果...

本文介绍了倾向得分匹配法(PSM)在处理因果效应问题上的应用,通过R语言对lalonde数据集进行分析。对比了多元OLS方法与PSM的优势,并详细阐述了PSM的步骤,包括倾向得分的估算、匹配、平衡性检验和基于匹配样本的估计。实验结果表明,PSM能有效控制混淆变量,提高估计的准确性。
摘要由CSDN通过智能技术生成

1. 导言

PSM,即倾向值匹配法,是处理社会研究反事实问题,以得到因果效应的重要技术之一(胡安宁,2020)。

概而言之,即先将多维的混淆变量降维成单维的倾向值,然后让接受实验处理的个体与未接受实验处理的个体基于倾向值进行匹配。当倾向值相同时,如果是否接受实验处理与混淆变量无关,且与潜在结果也无关,那么因变量的组间差异就是处理效应的无偏估计值。

对 PSM 方法,一个广泛的疑问是,同样是为了考虑控制变量,为何要进行繁琐的 PSM 而不是直接用回归模型呢?哈丁(转引自胡安宁,2020:96)指出,PSM相较传统回归有四点优势:

  1. 作为非参数模型,不受传统线性模型设定方式的限制;
  2. 保证了实验组和对照组的可比性
  3. 估计的系数更少,更加有统计效率。
  4. 由于只需要关心倾向值的匹配从而在实验组和控制组之间达成平衡,因此不需要考虑例如多重共线之类的问题。

结合本学期所学,本文使用R的tidyverseMatchIt两个程序包,对 lalonde 数据集进行分析:

library(haven)
library(tidyverse)
library(MatchIt)

通过与下面几种方式的估计值相比较,我将对 PSM 方法所发挥的作用进行简要分析

  • 求均值差
  • OLS回归分析
  • 随机实验
本文对Yisi Li的博客 有所参考,在此说明。

2. 数据集

2.1 数据来源

Nationl Supported Work Demonstration (NSW)是20世纪70年代在美国进行的一个项目。该项目会对缺少工作技能的弱势劳动者进行为期9-18个月的训练,从而帮助他们提升工作能力,改善他们在劳动市场中的不利地位。

与一般项目不同,它并未对所有符合条件的个体(e.g. 前“瘾君子”、前服刑人员和高中辍学者)都进行训练,而是随机将它们分成了两组,一组进行训练,另一组则不进行任何干预和帮助。我们可以分别称两组人为实验组对照组。研究者搜集了它们的人口学特征,并且记录了它们在1974,1975,以及培训后的1978年的收入情况。

此数据集被 Lalonde(1986) 和其他培训调查的数据进行了合并,共构造了两份数据。

  • 一份为NSW的原始数据,在R中,我们将其命名为Exp_data(下载地址):
  • 实验组
  • 对照组
Exp_data <- read_dta("nsw_dw.dta")[,-1] %>% as_tibble() # 读入数据
  • 一份为MatchIt包自带数据,包含了Exp_data内的实验组和通过其他渠道获得的伪对照组,这里的“伪”指非随机指派选定,但确实未接受过培训。在R中,我们将其命名为Obs_data,换句话说,Obs_data类似我们在抽样调查中得到的情况:
  • 实验组
  • 伪对照组
Obs_data <- lalonde %>% as_tibble()

我们对这两部分数据进行的处理,从而使其变量形式和命名一致,便于后续分析:

# 让变量名统一
Obs_data <- Obs_data[-4]
colnames(Exp_data) <- c("treat", "age", "educ", "black", "hispanic", "married", "nodegree", "
PSM倾向得分匹配(Propensity Score Matching, PSM)是一种常用的统计分析方法,目的是通过匹配处理组和对照组中的个体,从而减少处理组和对照组之间的选择偏差。 Python是一种常用的编程语言,可以利用Python进行PSM倾向得分匹配的实现。 在Python中,可以使用多种库和工具来实现PSM倾向得分匹配,如statsmodels、scikit-learn等。以下是一个基本的PSM倾向得分匹配的Python代码示例: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.neighbors import NearestNeighbors from scipy.spatial.distance import pdist # 读取数据 data = pd.read_csv('data.csv') # 划分处理组和对照组 treatment_group = data[data['treatment'] == 1] control_group = data[data['treatment'] == 0] # 提取特征和目标变量 features = ['feature1', 'feature2', 'feature3'] target = 'outcome' # 拟合Logistic回归模型估计倾向得分 logreg = LogisticRegression() logreg.fit(treatment_group[features], treatment_group['treatment_score']) treatment_scores = logreg.predict_proba(control_group[features])[:, 1] # 使用最近邻算找到匹配样本 nn = NearestNeighbors(n_neighbors=1) nn.fit(treatment_group[features]) distances, indices = nn.kneighbors(control_group[features]) matched_treatment_group = treatment_group.iloc[indices.flatten()] # 对匹配样本进行比较 matched_control_group = control_group.copy() matched_control_group['matched_treatment_score'] = matched_treatment_group['treatment_score'].values # 计算倾向得分匹配后的效果 matched_control_group['difference'] = matched_control_group['outcome'] - matched_control_group['matched_treatment_score'] # 打印结果 print(matched_control_group['difference'].mean()) ``` 上述示例代码中,首先读取数据,并将数据划分为处理组和对照组。然后,使用Logistic回归模型拟合处理组数据,以估计倾向得分。接下来,使用最近邻算找到对照组中与处理组中每个个体最相似的个体。最后,计算匹配后对照组的结果差异。 通过上述Python代码,我们可以实现PSM倾向得分匹配的分析。当然,根据具体情况,可能需要对代码进行一定的修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值