临床数据的区组实验数据分析 - 倾向性评分匹配 (PSM)

1. 背景知识

在医疗领域,研究一款新药是否有效,通常需要做的是大规模分组实验,treatment(实验组) 与 control(对照组)除了服用的药物有所不同外,其他因素,如:身高、体重、病情等,应该是类似的,这样的实验结果才能对新药的药效有客观的评价。

在互联网、电商等公司,也有类似的场景:为了测试一个新优化的页面是否能够提高支付转化率,需要做ABtest。这时一个很重要的环节就是将流量随机的分为A组和B组,A与B的关系是平行宇宙,我们希望的是A与B的区别只是看到的页面有所不同,其他特征如性别、用户生命周期等均一致。

但是在实际工作中,我们可能遇到现实情况不允许做随机实验,那么我们如何去判定一个动作的收益呢?或者说如何科学地将某个指标的变化归因于某个动作呢?这时PSM可能是一个解决方案。

2. 来看一个具体的实例

  • 一个NGO组织在一些村庄建立了健康诊所(实验组),并且选取另外一些村庄不建立健康诊所,设置其为对照组
  • 值得注意的是这些村庄的分组并非随机,他们之间可能存在一些bias
  • 与此同时,这个NGO组织在启动建立健康诊所这个项目前,对所有村庄(包括实验组和对照组村庄)有过调查,手上有一些村庄的特征
  • 通常情况下,我们可以分别对比对照组和实验组项目实施前和项目实施后的新生儿死亡率,进行Difference in Difference 的研究,目前我们假设,并没有历史的新生儿死亡率数据
不考虑其他可能的影响因素的情况下,直接进行比较

在这里插入图片描述
上图中的T=1代表建立诊所,T=0代表没有建立诊所,infant mortality为新生儿死亡率。我们简单看下每个分组的平均新生儿死亡率:
在这里插入图片描述

我们惊讶的发现,建立了健康诊所的实验组新生儿死亡率16.5%,而没有建立健康诊所的对照组新生儿死亡率12.4%,居然健康诊所对新生儿健康的影响是负向的?这非常不符合逻辑!有理由怀疑,在项目启动前,实验组和对照组有明显的差异,进而导致实验结果偏差。

更合理的解决方案

在问题描述里,我们提到这个NGO组织在启动健康诊所项目之前对所有村庄进行过仔细的调研,有一些其他的特征被采集。
在这里插入图片描述
我们在这里添加了两个特征:poverty rate 贫穷率 和per capita doctors 人均医生数。大体来看,实验组VS对照组,有更高的贫穷率和更低的人均医生数。在这样的情况下,我们如何来衡量该项目的效果呢?

  1. 为每一个实验组的村庄创建/找到新的对照组:
    针对每一个实验组的村庄,找到其特征类似的对照组。换句话说,针对每一个实验组的村庄S,在对照组中找到其“映射”S’,在项目启动前,这个S’与S有相似性(类似的贫穷率、类似的人均医生数等)。这个映射S’的集合,我们姑且称之为新对照组。
  2. 计算实验组效果
    计算实验组和新对照组平均新生儿死亡率,进行对比。
  3. 到此为止一些basic idea已经介绍完毕,下面搞一个比较细节的问题:如何找到映射S’?

3. Propensity Score

这时我们就需要用到Propensity Score的计算。

PSM Step1:计算Propensity Score

我们选择使用Logistic Regression作为计算Propensity Score的方法:
在这里插入图片描述
在NGO的健康诊所场景下,自变量:为贫穷率,为人均医生数,因变量为T。这个操作可以解释为,通过背景数据(贫困率、人均医生数)来预测每一个村庄与实验组村庄的相似程度,从而帮助我们找到新的对照组。
可以参考如下python代码搭建逻辑回归模型,并预测对照组和实验组中的每一个村庄的值。

import statsmodels.api as sm
formula = "T ~ poverty_rate + per_capita_doctors"
model = sm.Logit.from_formula(formula, data = data)
re = model.fit()
X = data[['poverty_rate', 'per_capita_doctors']]
data['ps'] = re.predict(X)

在这里插入图片描述

PSM Step2: Matching
  • 计算出Propensity Score后,在对照组中需要寻找到与实验组行为(贫穷率、人均医生数)相似的村庄,此过程被称为Matching。
  • 在这里我们采取最简单的最邻近匹配法(Nearest Neighbor Matching, NNM),对每一个实验组村庄进行遍历,找到ps值最接近的对照组村庄作为新对照组集合中的元素,即为new_control_index。
    在这里插入图片描述
    以index=0的实验组村庄为例(ps=0.416571),在健康诊所项目启动前,与其贫穷率、人均医生数最为接近的对照组成员为index=5村庄(ps=0.395162)。到此为止,每个实验组村庄都找到了其新的对照组。
PSM Step3:实验组 VS 新对照组 评估建立健康诊所对新生儿死亡率的影响

在这里插入图片描述

  • 结论:新对照组村庄(未建立健康诊所)新生儿死亡率比实验组村庄(建立健康诊所)足足高出7%,从而证明这个NGO组织的健康诊所项目对新生儿死亡率的降低有显著作用。
### R语言中进行倾向性评分匹配 在R语言环境中执行倾向性评分匹配(Propensity Score Matching, PSM),通常依赖`MatchIt`包来完成主要工作。该过程涉及几个重要步骤,首先是加载必要的软件库并准备数据集。 #### 加载所需R包 为了顺利开展PSM分析,在开始之前需确保已安装并加载了`MatchIt`以及其他可能需要用到的数据处理和可视化工具,比如`dplyr`, `ggplot2`等: ```r install.packages("MatchIt") # 如果尚未安装,则先安装MatchIt包 library(MatchIt) # 调用MatchIt包 library(dplyr) # 数据操作辅助包 library(ggplot2) # 可视化图形绘制包 ``` #### 导入数据 对于实际应用而言,可以从多种途径获取数据,如CSV文件、数据库连接或是其他格式的外部资源。这里以读取本地存储的一个CSV文件为例说明如何导入数据到R环境内: ```r data <- read.csv(file.choose()) # 打开对话框让用户选择要打开的csv文件 head(data) # 查看前几行确认数据结构是否正确 str(data) # 显示对象内部结构详情 summary(data) # 获取数值型变量摘要统计量 ``` 上述代码片段展示了怎样利用交互方式选取目标文件路径,并将其内容转换成适合后续分析的形式。当然也可以直接指定确切位置字符串作为参数传递给函数调用,例如`read.csv('C:/path/to/file.csv')`。 #### 构建倾向性得分模型 一旦完成了前期准备工作之后就可以着手构建预测个体接受特定干预概率即倾向性的逻辑回归或其他适当类型的分类器了。假定存在一个名为`treatment`列标记着哪些观测属于实验组而其余则视为控制组;另外还有若干个协变量用来解释差异所在之处。 ```r ps_model <- glm(treatment ~ covariate1 + covariate2 + ..., data=data, family="binomial") summary(ps_model) # 展示拟合结果概览 ``` 此处采用广义线性模型框架下的二项分布族成员——logistic regression来进行估计。注意替换掉公式右侧部分为真实的自变量列表名称。 #### 实施倾向性评分匹配 有了前面得到的概率值后便可以借助`matchit()`函数实施具体的配对策略。下面给出了一种基于最近邻算法寻找最接近每名参与者预期响应水平的对象实例: ```r matched_data <- matchit(formula=treatment~covariate1+covariate2+..., method='nearest', ratio=1, data=data) print(matched_data) # 输出匹配信息概述 plot(matched_data) # 制作诊断图表查看效果好坏 ``` 此段脚本里指定了使用一对一近似法(`method='nearest'`)找到尽可能相似的一对样本点组合起来形成新的子集合供下一步骤考察之用。同时设置比例因子等于单位长度意味着只挑选单个最佳候选者而非多对情形。 最后一步则是提取经过调整后的最终版资料表以便继续深入探究因果关系等问题。这可通过访问`get_matches()`或直接查询`.subset$weights`属性获得加权版本记录条目。 [^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值