真实世界研究(Real-World Study, RWS) 是一种在真实医疗或生活环境中收集数据、评估医疗干预措施(如药物、器械、治疗方案)效果和安全性的研究方法。它与传统的*、随机对照试验(RCT)形成互补,更注重在非理想化、多样化的现实场景中观察医疗实践的结果。

在这里插入图片描述
咱们都知道,RCT的证据力度很强,那为什么强呢?主要是人群经过筛选后,人群的特征相似(年龄、性别等),而且观察变量X是随机分配的,这样有很强的可比性。真实世界研究也有叫仿RCT研究,就是把人群进行筛选匹配,达到类似RCT的目的。目前很多顶刊都发表了关于仿RCT的研究,说明现阶段这个是能冲高分的。

在真实世界研究中,重叠加权(Overlap Weighting ,OW)是个非常重要的内容,重叠加权是一种模仿随机临床试验属性的倾向评分方法,比如刚开放的seer数据库,很多粉丝咨询我说想做模拟RCT研究。

在这里插入图片描述
目前咱们匹配数据通常有倾向评分匹配和逆概率加权,

1.倾向评分匹配 PSM的是通过匹配具有相似倾向性评分的个体,来平衡处两组之间的协变量分布。缺点:评分差距大,容易丢失数据过多

  1. 逆概率加权 传统 IPTW 为治疗患者分配 1/PS 的权重,为未治疗的患者分配 1/(1 − PS)的权重。因果推理中流行的逆概率加权方法经常受到极端倾向得分的阻碍,导致估计有偏差和过度方差。一种常见的补救措施是修剪评分极高的患者(即,将其从加权分析中删除)。然而,这种方法通常对临界点的选择很敏感,并丢弃了很大一部分样品。

  2. 重叠加权是一种PS方法,试图模仿随机临床试验的重要属性:具有临床相关性的目标人群、协变量平衡和精确度。目标人群是得出结论的患者群体。 平衡指的是治疗过程中患者特征的相似性,这是避免偏差的重要条件。精确度表示对治疗与感兴趣的结果之间关联估计的确定性;更精确的估计具有更窄的置信区间和更大的统计功效

为什么使用重叠加权?
优势:
1.模拟RCT:重叠加权能够模拟RCT的三个重要属性:临床相关的目标人群:得出结论的患者群体;协变量均衡:在治疗过程中患者特征的相似性,这是避免偏倚的重要条件;精确度:对治疗和相关结果之间关联的估计的确定性,更精确的估计有更窄的置信区间(CIs)和更强的统计效能。
2.避免极端权重:与逆概率加权(IPTW)相比,重叠加权避免了极端权重值的问题,因为其权重值在0到1之间。这使得重叠加权在处理数据时更加稳定,减少了由于极端权重导致的估计偏差。
3.样本量保留:与倾向性评分匹配(PSM)不同,重叠加权不会舍弃任何样本。因此在样本量较少的研究中,重叠加权仍然可以有效地使用所有可用数据,从而提高研究的统计效能。

下面我用一个具体数据演示一下,

library(tableone)
library(survey)
library(reshape2)
library(ggplot2)
library(Matching)
library(scitable)
data(lindner, package = "twang")

在这里插入图片描述
数据来自twang包,我们研究的abcix是两种治疗方式,其他的可以看作协变量,咱们先定义协变量

cov1<-c('stent' , 'height' , 'female' , 'diabetic' , 'acutemi' , 'ejecfrac' , 'ves1proc')

使用我写的sciiptw函数可以秒生成重叠加权权重和逆概率加权权重,支持二分类变量和多分类变量加权,生成原始权重和标准化权重,供不同的需求。使用的是一种非常权威的算法,绝对放心可靠。

###可以两组或多组加权
dt<-sciiptw(data = lindner,x="abcix",cov =cov1,normalize = F)

在这里插入图片描述
接下来咱们进行4种方法比较变量间的组间差异,分别是没有调整前,倾向评分匹配,逆概率加权,重叠加权

先来个没调整前的,plot0里面记录各个变量的smd

unWeighted <- CreateTableOne(vars = cov1, strata = "abcix", data = dt, test = FALSE)
plot0<-scismd(unWeighted)

在这里插入图片描述
接下来是重叠加权

#####overlap
olp <- svydesign(ids = ~ 1, data = dt, weights = ~ overlap)
olpWeighted <- svyCreateTableOne(vars = cov1, strata = "abcix", data = olp, test = FALSE)
plot1<-scismd(olpWeighted)

在这里插入图片描述
逆概率加权

###ipw
ipw <- svydesign(ids = ~ 1, data = dt, weights = ~ IPW)
ipwWeighted <- svyCreateTableOne(vars = cov1, strata = "abcix", data = ipw, test = FALSE)
plot2<-scismd(ipwWeighted)

倾向评分匹配

###ps
listMatch <- Match(Tr = (dt$abcix == 1),      # Need to be in 0,1
                   ## logit of PS,i.e., log(PS/(1-PS)) as matching scale
                   X        = log(dt$abcix.1/ dt$abcix.0),
                   ## 1:1 matching
                   M        = 1,
                   ## caliper = 0.2 * SD(logit(PS))
                   caliper  = 0.2,
                   replace  = FALSE,
                   ties     = TRUE,
                   version  = "fast")
rhcMatched <- dt[unlist(listMatch[c("index.treated","index.control")]), ]
tabMatched <- CreateTableOne(vars = cov1, strata = "abcix", data = rhcMatched, test = FALSE)
plot3<-scismd(tabMatched)

咱们把4个数据合并在一起看下,明显重叠加权的smd非常小

在这里插入图片描述
咱们把宽数据转长数据,再整理一下

dataPlotMelt <- melt(data          = dataPlot,
                     id.vars       = c("variable"),
                     variable.name = "Method",
                     value.name    = "SMD")

varNames <- as.character(dataPlot$variable)[order(dataPlot$Unmatched)]

dataPlotMelt$variable <- factor(dataPlotMelt$variable,
                                levels = varNames)

绘图

ggplot(data = dataPlotMelt,
       mapping = aes(x = variable, y = SMD, group = Method, color = Method)) +
  geom_line() +
  geom_point() +
  geom_hline(yintercept = 0.1, color = "black", linewidth = 0.1) +
  coord_flip() +
  theme_bw() +
  theme(legend.key = element_blank())

在这里插入图片描述
上图可以看到没调整前红色线组间差异很大,倾向评分匹配后的紫色线smd明显变小,逆概率加权的绿色线smd进一步变小,最牛的就是重叠加权的蓝色线,smd几乎为0了,匹配效果非常好。

这个结论和这篇jama文章的结论也是一致的

在这里插入图片描述
在这里插入图片描述

下面还有视频介绍,更加详细

重叠加权(Overlap Weighting OW)在真实世界研究的应用

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐