Stata-Matching:肾脏交换匹配问题

发布时间:2021-04-14 阅读 740

Stata连享会   主页 || 视频 || 推文 || 知乎

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装命令如下:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

作者: 经菠 (中山大学)
邮箱jingb@mail2.sysu.edu.cn

编者按:本文主要摘译自下文,特此致谢!
Source:Lee C. The matching problem using Stata[C]. 2019 Stata Conference. Stata Users Group, 2019 (43). -PDF-


目录


1. 问题起源

1.1 肾脏移植的供求不匹配

美国每年遗体器官捐赠的数量远远无法满足肾病患者的需要。例如,2018 年仅有 21167 人接受了肾脏移植 (平均每天 58 例肾脏移植),但同一时期等待肾脏移植的人数远超 10 万人。即便是如此,2018 年还新增 38791 位肾病患者 (几乎每十分钟就有一位)。可以看出,肾脏移植的供求存在严重失衡,因此一位肾病患者通常要等待 3-5 年才能找到与自己匹配的捐赠者。那些不能及时接受肾脏移植的患者将面临死亡风险。

图 1 呈现了 1995-2019 年美国各类等待或接受肾脏移植的人数。可以发现,每年等待者的人数远高于捐赠人数,说明长期以来器官捐赠者数量远远无法满足患者需求。

图 1:历年美国的各类肾脏移植人数
图 1:历年美国的各类肾脏移植人数

1.2 一种可能的解决思路

由于肾脏匹配概率较小,即使是与病人有血缘关系的亲人也未必能与之完全匹配。面对上述严重不匹配的供求关系,不少专家提出一种基于肾脏交换 (Kidney Exchange) 的肾脏移植手术。具体而言,每一位需要等待肾脏移植的患者 (该名患者没有在近亲和朋友中找到合适捐赠者),也有机会通过肾脏互换找到适配的活体器官。但前提是,病人需要找到一位身体健康且愿意捐赠肾脏的捐赠者 (捐赠者通常为患者的亲人或朋友),形成一个 “病人&捐赠者组合”,与其他 “病人&捐赠者组合” 完成肾脏交换。

通过此类肾脏交换,患者的等待时间得到大幅缩减。以图 2 中典型的二元匹配为例,涉及肾脏互换的为两组 “病人&捐赠者组合”。其中,

  • 一组是丈夫 A 和妻子 B 的 “病人&捐赠者组合” (A 为健康的捐赠者,B 为病人,两者肾脏不能相互移植),
  • 另一组是妹妹 C 和哥哥 D 的 “病人&捐赠者组合” (C 为健康的捐赠者,D 为病人,两者肾脏不能相互移植)。

但是 A 的肾脏可以捐赠给患者 D,而 C 的肾脏可以捐赠给患者 B,这样的话就称这两个 “病人&捐赠者组合” 配对成功。为避免道德风险,即在其他病人接受捐赠之后退出捐赠,此类肾脏互换手术需同时进行。通过上述方法,肾脏供需不匹配的问题得到部分解决。

图 2:肾脏交换的二元匹配
图 2:肾脏交换的二元匹配

当然有的时候,不能找到两个 “病人&捐赠者组合” 完全配对。这时如果可以找到三个 “病人&捐赠者组合” 形成如下图 3 的配对模式,仍然是可以进行三元配对的,这种结构称为环式结构。与二元匹配类似,此类环式结构要求手术同时进行,而且在医院各方面资源的限制下,环式结构允许的长度较小,通常为二元环或三元环。

图 3:肾脏交换的三元环式结构
图 3:肾脏交换的三元环式结构

当然有时候也会有健康人自愿加入肾脏的交换过程,尝试去救治病人。当有无私捐赠者参与时,链条将会从无私的捐赠者出发,然后依次向下进行传递,最终至在等待名单上的病人 (这个人没有能够找到亲人或者朋友,帮他形成 “病人&捐赠者组合”)。

上述交换的过程,如图 4 所示。这种链式交换可以不在同时进行,可以分时间进行,只要保证移植手术的源头从自愿捐赠肾脏的健康人开始。如果出现与之配对的病人接受完其他人的肾脏移植后,这个捐赠者可以选择不捐赠自己的肾脏,退出肾脏交换。虽然这并不合理,但是合法的,因为美国没有法律规定,捐赠者必须捐赠自己的肾脏。

图 4:肾脏交换的链式结构
图 4:肾脏交换的链式结构

2. 一个典型的例子

考虑一个最简单的情形,即没有自愿捐赠肾脏的健康人参与,那么就意味着是所有手术需要同时进行。以图 5 为例,其中 Vi 表示一个 “病人&捐赠者组合”。Xi,j 为虚拟变量,取 1 时表明 Vi 组合的肾脏可以捐赠给 Vj,否则为 0。图中的单向箭头表示肾脏只能由箭头的起点组合捐赠给终点组合。

图 5:肾脏交换配对的典型案例
图 5:肾脏交换配对的典型案例

为了能够最大化匹配病人捐赠者组合,我们需要将上述肾脏交换问题抽象成一个线性规划的最优化问题。具体来看,我们需要最大化 xi.j 的和,以使尽可能多的患者得到救治,约束条件如下所示:

其中,k 为医院最多同时支持的手术台数,jNxi,j1i,jN 表示每个 “病人&捐赠者组合” 最多能够捐赠肾脏给另外一个 “病人&捐赠者组合”。jNxi,j=jNxj,iiN 表示每个 “病人&捐赠者组合” 要么不会得到捐赠肾脏也不会去捐赠肾脏,要么就是得到捐赠肾脏同时也去捐赠肾脏,也就是说有付出也要有回报。 xi1i2+xi2i3++xikik+1k 表示环式结构的大小不能超过医院同时支持的手术台数。

上述的最优化方程应用在图 5 中的话,便可以写成如下式子:

[1]
 z=x12+x21+x23+x32+x31

[2]
 x121
 x21+x231
 x32+x311

[3]
 x21+x31=x12
 x12+x32=x21+x23
 x32=x32+x31

[4]
 x12+x23+x313
 x12+x213
 x23+x323

3. 利用 Stata 命令求解

3.1 输入数据

在该部分,我们将使用作者写的 lp 命令对上述问题求解。首先在 Stata 中输入数据,要求是将所有 xij 移到等式左边,常数项移到等式右边。每一行数据代表一个不等式,并且每一个数据表示不等式中对应变量的系数。

图 6:在 Stata 中输入数据
图 6:在 Stata 中输入数据

3.2 Stata 命令

lp varlists [if] [in] [using/] [,rel(varname) rhs(varname) min max intvars(varlist) tol1(real) tol2(real) saving(filename)]
  • rel(varname):用变量表示每个等式的符号;
  • rhs(varname):用变量来表示每个等式右边的常数项;
  • min/max:对最优化函数取最小值或者最大值;
  • intvars(varlist):指定哪些变量为整数取值;
  • tol1(real):输出结果的误差范围,默认值为 1014
  • tol2(real):输出逆矩阵结果的误差范围,默认值为 2.22×1012
  • saving(filename):定义输出文件的名称。

接着,在 Stata 中输入以下命令:

lp x12 x21 x23 x32 x31,max intvars( x12 x21 x23 x32 x31 ) rel(rel) rhs( rhs)

输出的最优化结果 x12x23x31 都等于 1。

4. 小结

值得注意的是,在进行上述匹配问题之前需要先明确几个问题:

  • 哪些是自愿捐赠的健康自愿者;
  • 哪些是 “病人&捐赠者组合”;
  • 病人和捐赠者的匹配信息;
  • 是否存在优先的病人;
  • 环式结构的最大范围 (也就是医院最多同时支持的手术台数)。

本文仅是针对肾脏捐赠问题的最简单形式进行介绍,更为丰富的例子和详细算法,可以参考王泫钡 (2019)。

5. 参考资料

  • Lee C. The matching problem using Stata[C]. 2019 Stata Conference. Stata Users Group, 2019 (43). -PDF-
  • 王泫钡. 肾脏交换问题的参数算法和复杂度研究[D]. 电子科技大学, 2019. -Link-

6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 匹配, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh