给我一个鲁棒的估计量——并使它为二倍!

Jasmine Nettiksimmons和Molly Davies
——加利福尼亚州旧金山

在Stitch Fix,当我们想要了解一些治疗或暴露的影响时,我们通常会做一个实验。然而,有一些问题我们无法通过实验来回答,因为它在操作上是不可行的,或者因为它感觉不适合客户。例如,我们不会实验性地要求造型师为特定数量的角色写笔记,或让客户接受实验性的库存条件。

在这些情况下,我们依靠观察分析。这种情况下的关键挑战是治疗不是随机分配的,这意味着我们可能会遇到混淆的问题(关于因果结构的更多信息,请参见前面的内容)博客).我们的目标是学习真实的东西,尽可能精确;t-测试在这里不会起作用。

应对混杂挑战的一种常见方法是使用回归模型来估计治疗的效果,包括作为协变量的混杂因素。不幸的是,为了让回归估计器正确地工作,您必须正确地指定模型。如果您没有正确地指定模型(错误地指定),您可能会认为您完全控制了混淆因素,而实际上并非如此[1]
解决这个问题的另一种方法是做逆概率加权治疗,你把你的回归努力集中在学习治疗的概率上。这个建模任务也面临着同样的风险——不规范——而且效率不高。我们很少清楚地了解协变量、治疗/暴露和结果之间潜在的复杂关系,但我们中的许多人每天都进行单边模型说明。

输入:双重鲁棒估计。当涉及到正确指定暴露/治疗、协变量和结果之间的关系时,这类估计者明确承认我们的局限性。幸运的是(errr数学),这些方法给了我们一些回旋余地,可以犯一些错误,但仍然得出一致的估计量。如果你没有模型误用,这些估价器就会很有效[2].这篇文章的目的是展示双重稳健估计器的优势和使用它们的低开销。更多背景信息,请参阅我们的以前的文章什么是一个好的估计员。

博士TL;

  • 一个模型用于估计治疗的条件概率(即倾向评分)
  • 另一个模型用于估计暴露/治疗和其他协变量如何与结果相关
  • 这些模型以特定的方式组合在一起,以产生目标参数的估计值。要了解这方面的细节,就需要了解许多我们不熟悉的影响函数和经验过程理论。我们要站在巨人的肩膀上,让这一切都过去。
  • 意外的是,为了得到一致的估计量,两个模型中只有一个需要正确指定[3]目标参数的。这就是“double robust”中的“double”的由来。注意,并不是所有使用两个这样的模型的估计过程都是双重稳健的。

我们将关注一个被调用的方法目标极大似然估计(TMLE)但还有其他双重稳健方法,包括增广逆概率加权(AIPW)和广义随机森林(平)。

在我们继续之前,先做一些简短的说明:

  • \(Y\):结果

  • \(A\):二元暴露(在非随机暴露的情况下)或二元治疗(在实验的情况下)

  • \(W\):一组协变量,它们是\(Y\)的预测或潜在的混杂因素

  • (E\左(Y\中A, W\右)\):这是结果的条件期望\(Y\)给予\(A\)(治疗/暴露)和协变量\(W\)

  • \(P\left(A = 1 \mid W\ right)\):这是接受治疗/暴露的概率\(W\),也称为倾向评分。对于随机实验,这可能是已知的,并且与\(W\)无关。

  • 目标参数:这是您试图估计的东西。在数据科学中,我们并不总是对这一点正式,但我们通常隐含在平均治疗效果(ATE)之后。术语ATE不是每个人都熟悉的,但是如果您曾经运行过A/B测试,并在假设所有其他条件相等的情况下计算了两个单元格之间的平均结果差异,则您是在估计ATE!ATE可以被认为是数据集中每个人都暴露过的平均结果与平均结果之间的差异如果没有人暴露在外,就来吧,其他一切都是平等的。

模拟例子

我们将做一个模拟研究,使用R比较三种不同的ATE估计值:

  • 用t检验进行的两个样本平均值比较
  • 广义线性模型(GLM)
  • 目标最大似然估计,双鲁棒
奇怪的猫
情节一。在真实ATE=0.25且暴露为协变量函数的模拟数据上比较估计器(即存在混杂)。我们比较了传统估计(均值差、错误指定的glm、正确指定的glm)和双稳健tmle估计在几种错误指定组合下的性能。

我们将模拟一个数据生成过程,通过曝光,我们知道真实的ATE,并看看每个方法如何估计目标参数。在这个模拟中,真实的ATE = 0.25和治疗的概率是一些协变量的函数。结果是治疗和相同协变量的函数,这意味着存在混淆:

$ $ \{对齐}开始W_1 & \ sim N \离开(0,1 \)\ \ W_2 & \ sim N \离开(0,1 \)\ \ & \ sim \文本{伯努利}\离开θ(\ \)\文本{哪里}\θ= f \离开(W_1 + W_2 + W_1 * W_2 \右)在(0.05,0.95)\ \ \ \ε& \ sim N \离开(0,- 0.2 \)\ \ Y & = 0.25 * - W_1 W_2 W_1 * W_2 + \ε\ \ \{对齐}$ $

上面的函数f(.)是一个简单的缩放函数,将连续值映射到单位间隔(参见下面的模拟代码)[4]

如果我们以最简单的方式进行分析,我们可能只是对暴露组\(\left(a=1\right)\)和未暴露组\(\left(a=0\right)\)之间的均值差异进行t检验。

mean_diff < -意味着(dat $ Y (dat = = 1美元))——意味着(dat $ Y (dat美元= = 0))ttest_out < - t.test (x = dat $ Y (dat = = 1美元),Y = dat $ Y (dat美元= = 0))

结果:-0.60(-0.74,-0.46)

呵!回想一下,真实的\(ATE = 0.25\)。我们对一个甚至没有正确符号的估计非常有信心!这是一个很好的例子,当混淆偏见的天真的估计。

好的,下一个,广义线性模型(GLM)。我们知道\(W_1\)和\(W_2\)是混杂因子。在主项回归模型\(Y\ sim a + W_1 + W_2)中,我们将\(a \)上的系数解释为\(a =1\)相对于\(a =0\)对\(Y\)的影响,并保持\(W_1\)和\(W_2\)不变。换句话说,它是ATE估计值。当我们缺乏关于\(Y\)和\(A\),\(W\)之间关系的功能形式的具体知识时,我们中的许多人都被训练以这种主术语模型开始。

glm_coef <- summary(glm_out)$coefficients glm_ci <- confint(glm_out)

结果:-0.23 (-0.34,-0.12)

我们刚才所做的并不是一种不常见的估计方法,但是我们仍然得到了错误的符号(-0.23而不是0.25!!),并且我们对我们的结果非常有信心(p < 0.001)。这是模型不规范的结果。一个正确指定的GLM包含\(W_1*W_2\)相互作用将会给我们一个无偏估计。问题是,我们多久会知道\(W_1*W_2)是一个重要的相互作用?如果我们有更多的协变量,我们是否可以放心地指定一个包含它们所有交互作用的模型?可能不会。在这个问题上,GLM甚至能描述我们离开玩具数据世界时所面临的真实关系吗?我们中的许多人都被训练成在模型规范中保持节俭,但是这里有一个例子,它在哪里起了反作用。

好了,是时候引入双重稳健方法(TMLE)了。当我们使用R包时tmle,我们有机会更灵活地使用机器学习通过SuperLearner包中。超级学习者使用广义叠加来创建不同子模型的最优加权组合。权重是交叉验证风险的函数。这些子模型可以包括不同的glm规范、样条和其他机器学习预测算法,如广义相加模型(GAMs)、弹性网回归等。大大减少了我们遭受模型错误说明的机会。

关于我们在TMLE函数中指定的内容,请注意:

  • \(Y\):结果

  • \ \():接触/治疗

  • \(W\):我们计划使用的协变量矩阵

  • 图书馆超级学习者将使用子模型(又名“学习者”)来估计结果模型,即\(E(Y \mid A, W) \)

  • g.SL.library超级学习者将使用子模型(又名“学习者”)来估计倾向得分,即\(P(A \mid W) \)

  • Qform:指定结果模型功能形式的机会(可选)。如果指定了此项,则不会使用SuperLearner,并且此规范将在GLM中使用。

  • gform:指定曝光模型功能形式的机会(可选)。如果指定了此项,则不会使用SuperLearner,并且此规范将在GLM中使用。

  • \(V\):超级学习者可以使用的交叉验证折叠的数量

首先,假设我们使用SuperLearner估计结果模型\(左(Y~A,W\右)\),但是我们故意错误地指定暴露模型的函数形式,通过省略\(W_1\)和\(W_2\)之间的相互作用来检验双重鲁棒性。回想一下,为了得到一致的估计量,这些模型中只有一个需要正确指定:

tmle_incorrect_exposure_model < - tmle (Y = dat $ Y = dat美元,W = dat [c (W1, W2)], Q.SL.library = c(“SL。全球语言监测机构”、“SL.glm.interaction”、“SL.gam”、“SL.polymars”),gform = " ~ W1 + W2”#注:这是不正确的,也是一个函数W1 * W2, V = 10) tmle_incorrect_exposure_model_ATE = tml_incorrect_exposure_model估计吃psi tmle_incorrect_exposure_model_CI美元美元= tml_incorrect_exposure_model估计吃CI美元美元

Boom. 0.25 (0.24, 0.26)

Daaaaaaaang !首先,我们要注意的是,这个估计几乎完全等于0.25的真实值。第二,你看到置信区间了吗?与GLM置信区间相比(暂时忽略它完全缺乏有效性)。回想一下,尽管我们故意错误地指定了曝光模型,我们还是得到了这个很好的估计。

我们试试别的吧。在最后一个例子中,我们错误地指定了暴露模型,但使用了超级学习者(可能)正确地指定了结果模型。让我们试着反过来,让我们用超级学习者来正确地指定暴露模型我们会故意错误地指定结果模型,再次忽略了互动。

tml_incorrect_outcome_model <- tml_incorrect_outcome_model (Y=dat$Y,A=dat$A,W=dat[, c("W1", "W2")] #注意:回忆正确的形式包含W1和W2的交互,g.SL.library=c("SL. library ", "SL. library ", "SL. library ")tml_incorrect_outcome_model_ate = tml_incorrect_outcome_model$estimate $ATE$CI . tml_incorrect_outcome_model$estimate $ATE$CI . tml_incorrect_outcome_model$estimate $ATE$CI . tml_incorrect_outcome_model$estimate $ATE$CI . tml_incorrect_outcome_model$estimate $ATE$CI

结果:0.26 (0.12,0.39)

这次的置信区间要大得多,但估计值非常接近0.25的真实ATE。

让我们看看当我们让超级学习者来处理所有的建模决策时会发生什么,这样我们就有了两个正确的(差不多)指定的模型:

tmle_learn_both_models < - tmle (Y = dat $ Y = dat美元,W = dat [c (W1, W2)], Q.SL.library = c(“SL。全球语言监测机构”、“SL.glm.interaction”、“SL.gam”、“SL.polymars”),g.SL.library = c(“SL。/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

结果:0.25(0.24,0.26)

真是一件美好的事情。

在一个我们仍然手工指定glms结构的世界里,tle提供了一个很好的安全网。但真正让这个方法更强大的是,当建模\(E\左(Y\中A,W\右)\)和\(P\左(A=1\中W\右)\)时,它能够利用各种奇特的预测器(非参数模型,机器学习方法,等等…)这些方法本身甚至可能无法解释,这使得使用它们进行推理具有挑战性。但幸运的是,TMLE不需要它们的可解释性,它只需要它们的预测。因此,这些更细微的预测可以被输入到tml中,并从局部效率中得到一个潜在的目标参数更好的估计。

我们已经证明,当我们担心混淆时,TMLE真的很方便。但如果我们没有呢?如果我们正在进行随机治疗呢?事实证明,我们仍然可以从这种方法中受益,因为它除了具有双重鲁棒性外,还具有局部有效性,这意味着对您实际关心的对象,即目标参数,进行最佳偏差-方差权衡,而不是对整个条件期望进行最佳偏差-方差权衡。

让我们对随机暴露(通常称为治疗)进行同样的方法学比较。在这种情况下,考虑到数据生成过程,所有方法都是一致的估计器,但是使用tmle和SuperLearner的组合来有效地估计并避免错误指定会导致更小的置信区间(图2)。同样,如果我们在glm中正确地指定了函数形式,我们实际上做得和tmle一样好,但并不比tmle好。所以使用TMLE不会有伤害,而且可能会有帮助!

奇怪的猫
情节2。根据随机治疗的模拟数据进行ATE估计,其中真实ATE=0.25。

签了我!

希望我们已经说服您,使用双重稳健估计技术在一致性和效率方面有主要优势。我们还演示了执行这些更高级方法的开销是最小的。

R和R中都有现有的包(tmle)及Python (乏味的)。如果您想更好地了解TMLE的机制,我们强烈建议纸很容易理解在不依赖软件包基础设施的情况下,“手工”完成计算。

以下是我们在Stitch Fix中使用这种方法的一些场景:

  • 在我们担心混淆和潜在复杂的相互作用的观测数据中估计某些暴露的ATE(这是我们讨论的第一个案例)。我们看到,当现实很简单并且我们确定了模型规范时,使用glm同样可以做得很好。但为什么要冒险呢?
  • 估计治疗的ATE是随机分配的,但不是一致随机分配,P(A =1)不是恒定的所有观察。我们可以指定已知的倾向分数,甚至学习它们!我们要做一些奇特的事情,为什么不做双倍健壮呢?
  • 估计均匀随机分配的治疗的ATE(简单的a /B测试)。即使在这种情况下不需要做任何特殊的处理概率,我们仍然可以从我们在随机例子中看到的局部效率中受益。这给了我们更好的力量免费!

零碎

还有一些东西可能会派上用场!

假设你碰巧知道确切的倾向分数(P\左(A\中W\右)\),因为你在实验中控制了治疗的概率(不管它是固定的还是依赖于W\)。你可以用论证来提供这个信息g1W而不是为倾向评分提供模型规范或SuperLearner库列表。

tmle_known_propensity_scores < - tmle (Y = dat $ Y = dat美元,W = dat [c (W1, W2)], Q.SL.library = c(“SL。glm", "SL.glm.interaction", "SL.gam", "SL.polymars"),g1W = dat$pA,,V=10)

假设你的观察不是独立的,而是以某种方式聚集在主题中。你可以指定subject_id为了纠正这个依赖关系,让你的标准错误不会过于乐观:

tmle_dependent_obs < - tmle (Y = dat $ Y = dat美元,W = dat [c (W1, W2)], Q.SL.library = c(“SL。全球语言监测机构”、“SL.glm.interaction”、“SL.gam”、“SL.polymars”),g.SL.library = c(“SL。),id = dat$subject_id,V=10)

资源:

密码

库(tmle)库(SuperLearner)图书馆(gam)图书馆(polspline)库(ggplot2 ) # --------------------------- # 模拟功能  #---------------------------- # 函数约束概率boundx < -函数(x, new_minnew_max) {old_min < - min (x) old_max < - max (x) stretch_me < - (new_max-new_min) / (old_max-old_min) stretch_me * (x-old_min) + new_min} #观测数据生成过程simple_simdat < -函数(证交所,n, true_ate) {set.seed(交易所)W1 < - rnorm (n) W2 < - rnorm (n) pA < - boundx (W1 + W2 + W1 * W2, new_min = 0.05, new_max = 0.95) < - rbinom (n, 1,pA)ε< - rnorm (n, 0。2)Y < - true_ate * - W1 - W2 - 2 * W1 * W2 +εdata.frame (W1 = W1 W2 = W2, pA = pA = A, Y = Y)} #随机数据生成过程simple_random_simdat < -函数(证交所,n, true_ate) {set.seed(交易所)W1 < - rnorm (n) W2 < - rnorm (n) pA < -样本(c(0, 1),大小= n,取代= TRUE) <——rbinom (n, 1, pA)ε< rnorm (n, 0,2) Y <- true *A - W1 - W2 - 2*W1*W2 + epsilon data.frame(W1=W1, W2=W2, pA=pA, A=A, Y=Y)}

完整的代码可在github

Bryan Bischof、Timothy Brathwaite、Eric Colson、Sven Schmit和Dave Spiegel对本文进行了评论。

[1]↩你甚至可以通过包含治疗的下游特征来诱发偏见。这就是为什么理解因果结构很重要。如果你包含了错误的东西,双倍稳健的估计值也不能帮你解决这个问题。
[2]↩即使在错误的说明下,这些方法仍然可能比普通的回归模型更有效
[3]↩回想一下,一致性估计量是随着n无限增大而越来越接近目标参数的估计量
[4]↩注意,我们明确地将P(A = 1)与0和1分隔开(参见模拟代码)。在现实世界中,这是一个你必须愿意做的假设;治疗分配是不确定的。
发这个帖子! 文章在LinkedIn
188滚球注册平台

来和我们一起工作吧!

我们是一个多元化的团队,致力于打造伟大的产品,我们希望您的帮助。你想和优秀的同行一起开发优秀的产品吗?加入我们吧!

Baidu