0%

post-exposure covariate????(未完)

说明
1. 译自Keith Goldfeld的文章:Be careful not to control for a post-exposure covariate

一位研究人员正在分析不同类型的童年创伤可能对成年时药物滥用产生的影响。显然,这是一个非常有趣且具有挑战性的研究问题。显然,这是一个非常有趣且具有挑战性的研究问题。

统计模型包含了对若干因素的调整。这些因素是童年创伤和药物滥用之间关系可能的混淆因素,如儿童时家境贫穷。然而,该模型还包括对成年时家境贫穷的测量(a measurement for poverty in adulthood) ,认为它在某种程度上混淆了童年创伤和药物滥用之间的关系。

混淆是暴露/治疗(exposure/treatment)与结果(outcome)之间的常见原因(cause)。很难将成年时家境贫穷视为童年时事件(childhood events)的原因(cause),尽管它可能与成年时药物滥用有关(或许无关)。

最多,成年时家境贫穷这个因素被调整控制(control)后,对研究结论没有影响;然而,不太好的是,它可能导致童年创伤的影响小于实际的结果。

使用模拟的数据和潜在结果的抽象概念,我希望能够阐明这种分析引起的一些问题。

潜在的结果与因果效应/Potential outcomes and causal effects

我的目标是提出潜在结果的概念,以便我们能够至少清楚地阐明一种可以定义因果效应的明确方法。

在这个框架下,我们生成模拟数据,从而可以找到因果效应的“真实”测量(“true” measure of causal effect)。然后我们可以使用简单的回归模型来看看他们是否很够很好地重新获得这些“已知”的因果效应。

如果某一个体 \(i\),在儿童期经历了创伤(traumatic effect),我们可以说该个体 \(i\)的暴露(exposure)为 \(X_i=1\),反之,没有经历创伤,则为 \(X_i=0\)。可以认为,每一个个体,都有潜在的结果(possible outcomes) \(Y_{1i}\)\(Y_{0i}\)\(Y_{1i}\) 是指如果个体经历过创伤,我们会观察到的结果。\(Y_{0i}\) 则相反,是指如果个体没有经历过创伤,我们会观察到的结果。

我们定义\(Y\)为结果,\(X\)为原因,则潜在结果的差异为 \(CE_i= Y_{1i} - Y_{0i}\)。如果\(Y_{1i} = Y_{0i}\),即两者的潜在结果相同,那么我们可以说,对于个体 \(i\)而言,\(X\)并不会导致\(Y\)

在现实世界中,我们只观察到一个潜在的结果:与实际暴露相关的结果。

在因果推理领域,对于我们使用观测数据估计平均因果效应所需的假设和条件有很多限制。许多人会说,除非我们使用随机对照研究,否则这些假设不合理。但在使用模拟数据时,我们可以产生潜在结果(potential outcomes)和观测结果(observed outcomes)。因此,我们知道个体水平和平均人口水平的因果效应。同时,我们还可以看到我们的模型拟合得有多好。

Simple confounding/简单的混淆

这是一个相对简单的例子。\(Y\)为结果,\(X\)为原因。还有一个共同的影响因素\(C\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
library(broom) 
#用于将统计模型的结果整理成数据框形式

library(data.table)
#快速处理大数据集

library(simstudy)

def <- defData(varname = "C", formula = 0.4, dist = "binary")
def <- defData(def, "X", formula = "0.3 + 0.4 * C", dist = "binary")
def <- defData(def, "e", formula = 0, variance = 2, dist = "normal")
def <- defData(def, "Y0", formula = "2 * C + e", dist="nonrandom")
def <- defData(def, "Y1", formula = "0.5 + 2 * C + e", dist="nonrandom")
def <- defData(def, "Y_obs", formula = "Y0 + (Y1 - Y0) * X", dist = "nonrandom")

def
1
2
3
4
5
6
7
##        varname        formula   variance  dist     link
## 1: C 0.4 0 binary identity
## 2: X 0.3 + 0.4 * C 0 binary identity
## 3: e 0 2 normal identity
## 4: Y0 2 * C + e 0 nonrandom identity
## 5: Y1 0.5 + 2 * C + e 0 nonrandom identity
## 6: Y_obs Y0 + (Y1 - Y0) * X 0 nonrandom identity

在上述的例子里,\(X\)\(C\)均对\(Y\)产生了一定的影响。如果我们在评估\(X\)\(Y\)的效应大小时,忽略了因素\(C\),我们会高估这种效应大小(即0.5)。

我们可以生成数据并看到这种情况:

1
2
set.seed(5)
dt <- genData(1000, def)
1
2
3
4
5
6
7
8
9
10
11
12
        id C X       e            Y0          Y1         Y_obs
1: 1 0 0 -2.057757922 -2.057757922 -1.5577579 -2.057757922
2: 2 1 1 1.760077725 3.760077725 4.2600777 4.260077725
3: 3 1 1 -0.610865399 1.389134601 1.8891346 1.889134601
4: 4 0 0 0.009714623 0.009714623 0.5097146 0.009714623
5: 5 0 1 0.176141782 0.176141782 0.6761418 0.676141782
---
996: 996 1 1 -0.147379631 1.852620369 2.3526204 2.352620369
997: 997 0 0 1.336474722 1.336474722 1.8364747 1.336474722
998: 998 0 0 -0.127816908 -0.127816908 0.3721831 -0.127816908
999: 999 0 1 0.022055022 0.022055022 0.5220550 0.522055022
1000: 1000 0 0 -0.292353254 -0.292353254 0.2076467 -0.292353254

我们看到,如果我们能够获得潜在的结果\(Y_{1}\)\(Y_{0}\),那么就很容易获得真正的因果效应,但显然,我们无法获得潜在的结果\(Y_{1}\)\(Y_{0}\)

1
2
3
dt[, mean(Y1 - Y0)] # True causal effect

## [1] 0.5

如果我们比较每个暴露组的平均观察结果而忽略混杂因素(confounder),我们会高估暴露的影响:

1
2
3
dt[X == 1, mean(Y_obs)] - dt[X == 0, mean(Y_obs)]

## [1] 1.285009

我们可以使用简单的线性回归估计相同的效果:

1
2
lm1 <- lm(Y_obs ~ X, data = dt)
tidy(lm1)
1
2
3
##          term  estimate  std.error statistic      p.value
## 1 (Intercept) 0.5515963 0.07325865 7.529436 1.137854e-13
## 2 X 1.2850091 0.10674523 12.038094 2.916261e-31

如果我们调整混淆因素\(C\),我们可以获得\(X\)\(Y\)的真正(或接近)因果效应。

1
2
lm2 <- lm(Y_obs ~ X + C, data = dt)
tidy(lm2)
1
2
3
4
##          term   estimate  std.error statistic      p.value
## 1 (Intercept) 0.08491216 0.06502545 1.305830 1.919117e-01
## 2 X 0.48935880 0.09678110 5.056347 5.083959e-07
## 3 C 2.05729945 0.09825925 20.937464 5.767575e-81

调整暴露后的协变量

在这种情况下,混淆因素\(C\)在两个阶段被测量,同时,暴露在period 1的效应与period 2有关(例如,如果童年时贫穷,成年后就更容易贫穷)。我们关心的是,是否\(X\)(童年创伤)会导致\(Y\)(药物滥用)。困难在于\(C_2\)\(X\)\(Y\)均有关系。

为了充分了解\(X\)对于\(Y\)的效果,我们不能控制\(C_2\)。直觉在于\(X\)对于\(Y\)的部分效应,来源于\(X\)\(C_2\)的作用。如果我们控制了\(C_2\),则移除了因果机制中关键部分。下面是数据生成过程:

  1. 基于暴露因素\(X\)\(C_2\)有潜在的结果。
  2. 我们限制了潜在的结果\(C_{21}\)为1,如果\(C_{20}\)是1的话。例如,如果有人在没有受到童年创伤的情况下,成年后也很穷。我们则会认为,如果他们在童年遭受创伤,他们成年后也会很穷。
  3. \(Y\)的潜在结果,依赖于\(C_2\)的相关潜在结果。\(Y_0\)依赖于\(C_{20}\),而\(Y_1\)则依赖于\(C_{21}\)
1
2
3
4
5
6
7
8
9
10
11
##     varname                  formula variance      dist     link
## 1: C1 0.25 0 binary identity
## 2: X -2 + 0.8 * C1 0 binary logit
## 3: C2.0 -2.0 + 1 * C1 0 binary logit
## 4: C2.1x -1.5 + 1 * C1 0 binary logit
## 5: C2.1 pmax(C2.0, C2.1x) 0 nonrandom identity
## 6: e 0 4 normal identity
## 7: Y0 -3 + 5*C2.0 + e 0 nonrandom identity
## 8: Y1 0 + 5*C2.1 + e 0 nonrandom identity
## 9: C2_obs C2.0 + (C2.1 - C2.0) * X 0 nonrandom identity
## 10: Y_obs Y0 + (Y1 - Y0) * X 0 nonrandom identity
1
2
set.seed(25)
dt <- genData(5000, def2)