## 36.3 Model-based causal mediation analysis

Other resources:

Fit 2 models

• mediator model: conditional distribution of the mediators $$M_i | T_i, X_i$$

• Outcome model: conditional distribution of $$Y_i | T_i, M_i, X_i$$

mediation can accommodate almost all types of model for both mediator model and outcome model except Censored mediator model.

The update here is that estimation of ACME does not rely on product or difference of coefficients (see 36.2.1 ,

which requires very strict assumption: (1) linear regression models of mediator and outcome, (2) $$T_i$$ and $$M_i$$ effects are additive and no interaction

library(mediation)
set.seed(2014)
data("framing", package = "mediation")

med.fit <-
lm(emo ~ treat + age + educ + gender + income, data = framing)
out.fit <-
glm(
cong_mesg ~ emo + treat + age + educ + gender + income,
data = framing,
family = binomial("probit")
)

# Quasi-Bayesian Monte Carlo
med.out <-
mediate(
med.fit,
out.fit,
treat = "treat",
mediator = "emo",
robustSE = TRUE,
sims = 100 # should be 10000 in practice
)
summary(med.out)
#>
#> Causal Mediation Analysis
#>
#> Quasi-Bayesian Confidence Intervals
#>
#>                          Estimate 95% CI Lower 95% CI Upper p-value
#> ACME (control)             0.0791       0.0351         0.15  <2e-16 ***
#> ACME (treated)             0.0804       0.0367         0.16  <2e-16 ***
#> ADE (control)              0.0206      -0.0976         0.12    0.70
#> ADE (treated)              0.0218      -0.1053         0.12    0.70
#> Total Effect               0.1009      -0.0497         0.23    0.14
#> Prop. Mediated (control)   0.6946      -6.3109         3.68    0.14
#> Prop. Mediated (treated)   0.7118      -5.7936         3.50    0.14
#> ACME (average)             0.0798       0.0359         0.15  <2e-16 ***
#> ADE (average)              0.0212      -0.1014         0.12    0.70
#> Prop. Mediated (average)   0.7032      -6.0523         3.59    0.14
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Sample Size Used: 265
#>
#>
#> Simulations: 100

Nonparametric bootstrap version

med.out <-
mediate(
med.fit,
out.fit,
boot = TRUE,
treat = "treat",
mediator = "emo",
sims = 100, # should be 10000 in practice
boot.ci.type = "bca" # bias-corrected and accelerated intervals
)
summary(med.out)
#>
#> Causal Mediation Analysis
#>
#> Nonparametric Bootstrap Confidence Intervals with the BCa Method
#>
#>                          Estimate 95% CI Lower 95% CI Upper p-value
#> ACME (control)             0.0848       0.0424         0.14  <2e-16 ***
#> ACME (treated)             0.0858       0.0410         0.14  <2e-16 ***
#> ADE (control)              0.0117      -0.0726         0.13    0.58
#> ADE (treated)              0.0127      -0.0784         0.14    0.58
#> Total Effect               0.0975       0.0122         0.25    0.06 .
#> Prop. Mediated (control)   0.8698       1.7460       151.20    0.06 .
#> Prop. Mediated (treated)   0.8804       1.6879       138.91    0.06 .
#> ACME (average)             0.0853       0.0434         0.14  <2e-16 ***
#> ADE (average)              0.0122      -0.0756         0.14    0.58
#> Prop. Mediated (average)   0.8751       1.7170       145.05    0.06 .
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Sample Size Used: 265
#>
#>
#> Simulations: 100

If theoretically understanding suggests that there is treatment and mediator interaction

med.fit <-
lm(emo ~ treat + age + educ + gender + income, data = framing)
out.fit <-
glm(
cong_mesg ~ emo * treat + age + educ + gender + income,
data = framing,
family = binomial("probit")
)
med.out <-
mediate(
med.fit,
out.fit,
treat = "treat",
mediator = "emo",
robustSE = TRUE,
sims = 100
)
summary(med.out)
#>
#> Causal Mediation Analysis
#>
#> Quasi-Bayesian Confidence Intervals
#>
#>                           Estimate 95% CI Lower 95% CI Upper p-value
#> ACME (control)             0.07417      0.02401         0.14  <2e-16 ***
#> ACME (treated)             0.09496      0.02702         0.16  <2e-16 ***
#> ADE (control)             -0.01353     -0.11855         0.11    0.76
#> ADE (treated)              0.00726     -0.11007         0.11    0.90
#> Total Effect               0.08143     -0.05646         0.19    0.26
#> Prop. Mediated (control)   0.64510    -14.31243         3.13    0.26
#> Prop. Mediated (treated)   0.98006    -17.83202         4.01    0.26
#> ACME (average)             0.08457      0.02738         0.15  <2e-16 ***
#> ADE (average)             -0.00314     -0.11457         0.12    1.00
#> Prop. Mediated (average)   0.81258    -16.07223         3.55    0.26
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Sample Size Used: 265
#>
#>
#> Simulations: 100

test.TMint(med.out, conf.level = .95) # test treatment-mediator interaction effect
#>
#>  Test of ACME(1) - ACME(0) = 0
#>
#> data:  estimates from med.out
#> ACME(1) - ACME(0) = 0.020796, p-value = 0.3
#> alternative hypothesis: true ACME(1) - ACME(0) is not equal to 0
#> 95 percent confidence interval:
#>  -0.01757310  0.07110837
plot(med.out)

mediation can be used in conjunction with any of your imputation packages.

And it can also handle mediated moderation or non-binary treatment variables, or multi-level data

Sensitivity Analysis for sequential ignorability

• test for unobserved pre-treatment covariates

• $$\rho$$ = correlation between the residuals of the mediator and outcome regressions.

• If $$\rho$$ is significant, we have evidence for violation of sequential ignorability (i.e., there is unobserved pre-treatment confounders).

med.fit <-
lm(emo ~ treat + age + educ + gender + income, data = framing)
out.fit <-
glm(
cong_mesg ~ emo + treat + age + educ + gender + income,
data = framing,
family = binomial("probit")
)
med.out <-
mediate(
med.fit,
out.fit,
treat = "treat",
mediator = "emo",
robustSE = TRUE,
sims = 100
)
sens.out <-
medsens(med.out,
rho.by = 0.1, # \rho varies from -0.9 to 0.9 by 0.1
effect.type = "indirect", # sensitivity on ACME
# effect.type = "direct", # sensitivity on ADE
# effect.type = "both", # sensitivity on ACME and ADE
sims = 100)
summary(sens.out)
#>
#> Mediation Sensitivity Analysis: Average Mediation Effect
#>
#> Sensitivity Region: ACME for Control Group
#>
#>      Rho ACME(control) 95% CI Lower 95% CI Upper R^2_M*R^2_Y* R^2_M~R^2_Y~
#> [1,] 0.3        0.0062      -0.0073       0.0188         0.09       0.0493
#> [2,] 0.4       -0.0084      -0.0238       0.0017         0.16       0.0877
#>
#> Rho at which ACME for Control Group = 0: 0.3
#> R^2_M*R^2_Y* at which ACME for Control Group = 0: 0.09
#> R^2_M~R^2_Y~ at which ACME for Control Group = 0: 0.0493
#>
#>
#> Sensitivity Region: ACME for Treatment Group
#>
#>      Rho ACME(treated) 95% CI Lower 95% CI Upper R^2_M*R^2_Y* R^2_M~R^2_Y~
#> [1,] 0.3        0.0071      -0.0092       0.0213         0.09       0.0493
#> [2,] 0.4       -0.0101      -0.0295       0.0023         0.16       0.0877
#>
#> Rho at which ACME for Treatment Group = 0: 0.3
#> R^2_M*R^2_Y* at which ACME for Treatment Group = 0: 0.09
#> R^2_M~R^2_Y~ at which ACME for Treatment Group = 0: 0.0493
plot(sens.out, sens.par = "rho", main = "Anxiety", ylim = c(-0.2, 0.2))

ACME confidence intervals contains 0 when $$\rho \in (0.3,0.4)$$

Alternatively, using $$R^2$$ interpretation, we need to specify the direction of confounder that affects the mediator and outcome variables in plot using sign.prod = "positive" (i.e., same direction) or sign.prod = "negative" (i.e., opposite direction).

plot(sens.out, sens.par = "R2", r.type = "total", sign.prod = "positive")