vignettes/measurement_error.Rmd
measurement_error.Rmd
This example demonstrates how to conduct sensitivity analysis for
measurement error by using cmsens
. For this purpose, we
simulate some data containing a continuous baseline confounder \(C_1\), a binary baseline confounder \(C_2\), a binary exposure \(A\), a binary mediator \(M\) and a binary outcome \(Y\). The true regression models for \(A\), \(M\)
and \(Y\) are: \[logit(E(A|C_1,C_2))=0.2+0.5C_1+0.1C_2\]
\[logit(E(M|A,C_1,C_2))=1+2A+1.5C_1+0.8C_2\]
\[logit(E(Y|A,M,C_1,C_2)))=-3-0.4A-1.2M+0.5AM+0.3C_1-0.6C_2\]
Then, we generate some measurement errors for \(C_1\) and \(A\).
set.seed(1)
expit <- function(x) exp(x)/(1+exp(x))
n <- 10000
C1 <- rnorm(n, mean = 1, sd = 0.5)
C1_error <- C1 + rnorm(n, 0, 0.05)
C2 <- rbinom(n, 1, 0.6)
A <- rbinom(n, 1, expit(0.2 + 0.5*C1 + 0.1*C2))
mc <- matrix(c(0.9,0.1,0.1,0.9), nrow = 2)
A_error <- A
for (j in 1:2) {
A_error[which(A_error == c(0,1)[j])] <-
sample(x = c(0,1), size = length(which(A_error == c(0,1)[j])),
prob = mc[, j], replace = TRUE)
}
M <- rbinom(n, 1, expit(1 + 2*A + 1.5*C1 + 0.8*C2))
Y <- rbinom(n, 1, expit(-3 - 0.4*A - 1.2*M + 0.5*A*M + 0.3*C1 - 0.6*C2))
data <- data.frame(A, A_error, M, Y, C1, C1_error, C2)
The DAG for this scientific setting is:
## Registered S3 methods overwritten by 'lme4':
## method from
## cooks.distance.influence.merMod car
## influence.merMod car
## dfbeta.influence.merMod car
## dfbetas.influence.merMod car
cmdag(outcome = "Y", exposure = "A", mediator = "M",
basec = c("C1", "C2"), postc = NULL, node = TRUE, text_col = "white")
Firstly, we assume \(C1\) was measured with error. \(C_1\) is continuous, so the measurement error can be corrected by regression calibration or SIMEX. We use the regression-based approach for illustration. The naive results obtained by fitting data with measurement error:
res_naive_cont <- cmest(data = data, model = "rb", outcome = "Y", exposure = "A",
mediator = "M", basec = c("C1_error", "C2"), EMint = TRUE,
mreg = list("logistic"), yreg = "logistic",
astar = 0, a = 1, mval = list(1),
estimation = "paramfunc", inference = "delta")
summary(res_naive_cont)
## Causal Mediation Analysis
##
## # Outcome regression:
##
## Call:
## glm(formula = Y ~ A + M + A * M + C1_error + C2, family = binomial(),
## data = getCall(x$reg.output$yreg)$data, weights = getCall(x$reg.output$yreg)$weights)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.5658 -0.2097 -0.1763 -0.1527 3.1992
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.5688 0.2608 -9.852 < 2e-16 ***
## A -0.8882 0.7581 -1.172 0.24139
## M -1.8387 0.2858 -6.434 1.24e-10 ***
## C1_error 0.4856 0.1481 3.280 0.00104 **
## C2 -0.6142 0.1500 -4.094 4.24e-05 ***
## A:M 1.1063 0.7790 1.420 0.15555
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1858.7 on 9999 degrees of freedom
## Residual deviance: 1799.6 on 9994 degrees of freedom
## AIC: 1811.6
##
## Number of Fisher Scoring iterations: 7
##
##
## # Mediator regressions:
##
## Call:
## glm(formula = M ~ A + C1_error + C2, family = binomial(), data = getCall(x$reg.output$mreg[[1L]])$data,
## weights = getCall(x$reg.output$mreg[[1L]])$weights)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -3.4202 0.0948 0.1395 0.2539 1.0725
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.9916 0.1160 8.552 < 2e-16 ***
## A 2.1481 0.1473 14.586 < 2e-16 ***
## C1_error 1.4448 0.1193 12.109 < 2e-16 ***
## C2 0.6769 0.1193 5.673 1.4e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2825.7 on 9999 degrees of freedom
## Residual deviance: 2306.7 on 9996 degrees of freedom
## AIC: 2314.7
##
## Number of Fisher Scoring iterations: 7
##
##
## # Effect decomposition on the odds ratio scale via the regression-based approach
##
## Closed-form parameter function estimation with
## delta method standard errors, confidence intervals and p-values
##
## Estimate Std.error 95% CIL 95% CIU P.val
## Rcde 1.24383 0.22304 0.87524 1.768 0.223674
## Rpnde 1.01905 0.17645 0.72578 1.431 0.913235
## Rtnde 1.20938 0.21034 0.86004 1.701 0.274370
## Rpnie 0.80077 0.05414 0.70138 0.914 0.001017 **
## Rtnie 0.95034 0.06599 0.82942 1.089 0.463197
## Rte 0.96844 0.15560 0.70683 1.327 0.841789
## ERcde 0.18846 0.16640 -0.13769 0.515 0.257410
## ERintref -0.16941 0.09996 -0.36533 0.027 0.090128 .
## ERintmed 0.14862 0.08786 -0.02358 0.321 0.090726 .
## ERpnie -0.19923 0.05414 -0.30535 -0.093 0.000234 ***
## ERcde(prop) -5.97114 34.38901 -73.37236 61.430 0.862152
## ERintref(prop) 5.36768 26.42572 -46.42577 57.161 0.839039
## ERintmed(prop) -4.70891 23.17884 -50.13861 40.721 0.839013
## ERpnie(prop) 6.31237 31.15632 -54.75290 67.378 0.839445
## pm 1.60346 8.40147 -14.86311 18.070 0.848639
## int 0.65876 3.24847 -5.70811 7.026 0.839298
## pe 6.97114 34.38901 -60.43008 74.372 0.839359
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Rcde: controlled direct effect odds ratio; Rpnde: pure natural direct effect odds ratio; Rtnde: total natural direct effect odds ratio; Rpnie: pure natural indirect effect odds ratio; Rtnie: total natural indirect effect odds ratio; Rte: total effect odds ratio; ERcde: excess relative risk due to controlled direct effect; ERintref: excess relative risk due to reference interaction; ERintmed: excess relative risk due to mediated interaction; ERpnie: excess relative risk due to pure natural indirect effect; ERcde(prop): proportion ERcde; ERintref(prop): proportion ERintref; ERintmed(prop): proportion ERintmed; ERpnie(prop): proportion ERpnie; pm: overall proportion mediated; int: overall proportion attributable to interaction; pe: overall proportion eliminated)
##
## Relevant variable values:
## $a
## [1] 1
##
## $astar
## [1] 0
##
## $yval
## [1] "1"
##
## $mval
## $mval[[1]]
## [1] 1
##
##
## $basecval
## $basecval[[1]]
## [1] 0.996522
##
## $basecval[[2]]
## [1] 0.5936
The results corrected by regression calibration:
res_rc_cont <- cmsens(object = res_naive_cont, sens = "me", MEmethod = "rc",
MEvariable = "C1_error", MEvartype = "con", MEerror = 0.05)
summary(res_rc_cont)
## Sensitivity Analysis For Measurement Error
##
## The variable measured with error: C1_error
## Type of the variable measured with error: continuous
##
## # Measurement error 1:
## [1] 0.05
##
## ## Error-corrected regressions for measurement error 1:
##
## ### Outcome regression:
## Call:
## rcreg(reg = getCall(x$sens[[1L]]$reg.output$yreg)$reg, formula = Y ~
## A + M + A * M + C1_error + C2, data = getCall(x$sens[[1L]]$reg.output$yreg)$data,
## MEvariable = "C1_error", MEerror = 0.05, variance = TRUE,
## nboot = 400, weights = getCall(x$sens[[1L]]$reg.output$yreg)$weights)
##
## Naive coefficient estimates:
## (Intercept) A M C1_error C2 A:M
## -2.5688363 -0.8881518 -1.8387439 0.4856104 -0.6142071 1.1063464
##
## Naive var-cov estimates:
## (Intercept) A M C1_error C2
## (Intercept) 0.067990581 -0.0545603114 -0.048204212 -0.0154891419 -0.0071194416
## A -0.054560311 0.5747507824 0.054868704 -0.0004875592 0.0004879114
## M -0.048204212 0.0548687045 0.081668670 -0.0080216586 -0.0027107101
## C1_error -0.015489142 -0.0004875592 -0.008021659 0.0219233192 -0.0001013951
## C2 -0.007119442 0.0004879114 -0.002710710 -0.0001013951 0.0225065272
## A:M 0.055848645 -0.5747208888 -0.077864595 -0.0011835634 -0.0008171310
## A:M
## (Intercept) 0.055848645
## A -0.574720889
## M -0.077864595
## C1_error -0.001183563
## C2 -0.000817131
## A:M 0.606845225
##
## Variable measured with error:
## C1_error
## Measurement error:
## 0.05
## Error-corrected results:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.5717 0.2542 -10.116 < 2e-16 ***
## A -0.8886 4.4880 -0.198 0.84306
## M -1.8405 0.2816 -6.535 6.65e-11 ***
## C1_error 0.4905 0.1456 3.368 0.00076 ***
## C2 -0.6142 0.1495 -4.108 4.03e-05 ***
## A:M 1.1063 4.5006 0.246 0.80583
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## ### Mediator regressions:
## Call:
## rcreg(reg = getCall(x$sens[[1L]]$reg.output$mreg[[1L]])$reg,
## formula = M ~ A + C1_error + C2, data = getCall(x$sens[[1L]]$reg.output$mreg[[1L]])$data,
## MEvariable = "C1_error", MEerror = 0.05, variance = TRUE,
## nboot = 400, weights = getCall(x$sens[[1L]]$reg.output$mreg[[1L]])$weights)
##
## Naive coefficient estimates:
## (Intercept) A C1_error C2
## 0.9915629 2.1481051 1.4448263 0.6769050
##
## Naive var-cov estimates:
## (Intercept) A C1_error C2
## (Intercept) 0.013444822 -0.0040002083 -0.0092978270 -0.0070380421
## A -0.004000208 0.0216896845 -0.0008364503 0.0002395075
## C1_error -0.009297827 -0.0008364503 0.0142375505 0.0008566472
## C2 -0.007038042 0.0002395075 0.0008566472 0.0142371683
##
## Variable measured with error:
## C1_error
## Measurement error:
## 0.05
## Error-corrected results:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.9784 0.1208 8.101 6.10e-16 ***
## A 2.1465 0.1509 14.229 < 2e-16 ***
## C1_error 1.4591 0.1274 11.454 < 2e-16 ***
## C2 0.6769 0.1208 5.602 2.18e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## ## Error-corrected causal effects on the risk ratio scale for measurement error 1:
## Estimate Std.error 95% CIL 95% CIU P.val
## Rcde 1.24332 0.21790 0.88187 1.753 0.214000
## Rpnde 1.01851 0.51560 0.37762 2.747 0.971104
## Rtnde 1.20880 0.21487 0.85320 1.713 0.286051
## Rpnie 0.80064 0.05377 0.70189 0.913 0.000931 ***
## Rtnie 0.95024 0.40376 0.41320 2.185 0.904375
## Rte 0.96782 0.15935 0.70088 1.336 0.842532
## ERcde 0.18801 0.16191 -0.12932 0.505 0.245553
## ERintref -0.16951 0.50414 -1.15760 0.819 0.736699
## ERintmed 0.14867 0.44221 -0.71805 1.015 0.736722
## ERpnie -0.19936 0.05377 -0.30475 -0.094 0.000209 ***
## ERcde(prop) -5.84268 33.30469 -71.11868 59.433 0.860741
## ERintref(prop) 5.26756 25.15247 -44.03038 54.566 0.834116
## ERintmed(prop) -4.62011 22.05610 -47.84926 38.609 0.834081
## ERpnie(prop) 6.19523 30.72226 -54.01929 66.410 0.840188
## pm 1.57512 17.92074 -33.54889 36.699 0.929961
## int 0.64746 3.09806 -5.42463 6.720 0.834458
## pe 6.84268 33.30469 -58.43331 72.119 0.837215
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## ----------------------------------------------------------------
##
## (Rcde: controlled direct effect risk ratio; Rpnde: pure natural direct effect risk ratio; Rtnde: total natural direct effect risk ratio; Rpnie: pure natural indirect effect risk ratio; Rtnie: total natural indirect effect risk ratio; Rte: total effect risk ratio; ERcde: excess relative risk due to controlled direct effect; ERintref: excess relative risk due to reference interaction; ERintmed: excess relative risk due to mediated interaction; ERpnie: excess relative risk due to pure natural indirect effect; ERcde(prop): proportion ERcde; ERintref(prop): proportion ERintref; ERintmed(prop): proportion ERintmed; ERpnie(prop): proportion ERpnie; pm: overall proportion mediated; int: overall proportion attributable to interaction; pe: overall proportion eliminated)
##
## Relevant variable values:
## $a
## [1] 1
##
## $astar
## [1] 0
##
## $yval
## [1] "1"
##
## $mval
## $mval[[1]]
## [1] 1
##
##
## $basecval
## $basecval[[1]]
## [1] 0.996522
##
## $basecval[[2]]
## [1] 0.5936
The results corrected by SIMEX:
res_simex_cont <- cmsens(object = res_naive_cont, sens = "me", MEmethod = "simex",
MEvariable = "C1_error", MEvartype = "con", MEerror = 0.05)
summary(res_simex_cont)
## Sensitivity Analysis For Measurement Error
##
## The variable measured with error: C1_error
## Type of the variable measured with error: continuous
##
## # Measurement error 1:
## [1] 0.05
##
## ## Error-corrected regressions for measurement error 1:
##
## ### Outcome regression:
## Call:
## simexreg(reg = getCall(x$sens[[1L]]$reg.output$yreg)$reg, formula = Y ~
## A + M + A * M + C1_error + C2, data = getCall(x$sens[[1L]]$reg.output$yreg)$data,
## MEvariable = "C1_error", MEvartype = "continuous", MEerror = 0.05,
## variance = TRUE, lambda = c(0.5, 1, 1.5, 2), B = 200, weights = getCall(x$sens[[1L]]$reg.output$yreg)$weights)
##
## Naive coefficient estimates:
## (Intercept) A M C1_error C2 A:M
## -2.5688363 -0.8881518 -1.8387439 0.4856104 -0.6142071 1.1063464
##
## Naive var-cov estimates:
## (Intercept) A M C1_error C2
## (Intercept) 0.067990581 -0.0545603114 -0.048204212 -0.0154891419 -0.0071194416
## A -0.054560311 0.5747507824 0.054868704 -0.0004875592 0.0004879114
## M -0.048204212 0.0548687045 0.081668670 -0.0080216586 -0.0027107101
## C1_error -0.015489142 -0.0004875592 -0.008021659 0.0219233192 -0.0001013951
## C2 -0.007119442 0.0004879114 -0.002710710 -0.0001013951 0.0225065272
## A:M 0.055848645 -0.5747208888 -0.077864595 -0.0011835634 -0.0008171310
## A:M
## (Intercept) 0.055848645
## A -0.574720889
## M -0.077864595
## C1_error -0.001183563
## C2 -0.000817131
## A:M 0.606845225
##
## Variable measured with error:
## C1_error
## Measurement error:
## [1] 0.05
##
## Error-corrected results:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.5697 0.2612 -9.839 < 2e-16 ***
## A -0.8885 0.7581 -1.172 0.24125
## M -1.8396 0.2859 -6.435 1.30e-10 ***
## C1_error 0.4875 0.1497 3.255 0.00114 **
## C2 -0.6141 0.1500 -4.093 4.29e-05 ***
## A:M 1.1065 0.7790 1.420 0.15554
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## ### Mediator regressions:
## Call:
## simexreg(reg = getCall(x$sens[[1L]]$reg.output$mreg[[1L]])$reg,
## formula = M ~ A + C1_error + C2, data = getCall(x$sens[[1L]]$reg.output$mreg[[1L]])$data,
## MEvariable = "C1_error", MEvartype = "continuous", MEerror = 0.05,
## variance = TRUE, lambda = c(0.5, 1, 1.5, 2), B = 200, weights = getCall(x$sens[[1L]]$reg.output$mreg[[1L]])$weights)
##
## Naive coefficient estimates:
## (Intercept) A C1_error C2
## 0.9915629 2.1481051 1.4448263 0.6769050
##
## Naive var-cov estimates:
## (Intercept) A C1_error C2
## (Intercept) 0.013444822 -0.0040002083 -0.0092978270 -0.0070380421
## A -0.004000208 0.0216896845 -0.0008364503 0.0002395075
## C1_error -0.009297827 -0.0008364503 0.0142375505 0.0008566472
## C2 -0.007038042 0.0002395075 0.0008566472 0.0142371683
##
## Variable measured with error:
## C1_error
## Measurement error:
## [1] 0.05
##
## Error-corrected results:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.9816 0.1165 8.426 < 2e-16 ***
## A 2.1466 0.1473 14.572 < 2e-16 ***
## C1_error 1.4580 0.1205 12.102 < 2e-16 ***
## C2 0.6768 0.1194 5.670 1.47e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## ## Error-corrected causal effects on the risk ratio scale for measurement error 1:
## Estimate Std.error 95% CIL 95% CIU P.val
## Rcde 1.24357 0.22301 0.87503 1.767 0.224154
## Rpnde 1.01920 0.17645 0.72592 1.431 0.912545
## Rtnde 1.20915 0.21032 0.85985 1.700 0.274902
## Rpnie 0.80111 0.05410 0.70180 0.914 0.001024 **
## Rtnie 0.95042 0.06585 0.82975 1.089 0.462970
## Rte 0.96867 0.15569 0.70691 1.327 0.842992
## ERcde 0.18834 0.16647 -0.13794 0.515 0.257913
## ERintref -0.16914 0.09979 -0.36473 0.026 0.090093 .
## ERintmed 0.14836 0.08769 -0.02352 0.320 0.090694 .
## ERpnie -0.19889 0.05410 -0.30492 -0.093 0.000237 ***
## ERcde(prop) -6.01072 34.85624 -74.32769 62.306 0.863089
## ERintref(prop) 5.39808 26.78430 -47.09817 57.894 0.840277
## ERintmed(prop) -4.73472 23.48910 -50.77251 41.303 0.840252
## ERpnie(prop) 6.34736 31.57520 -55.53889 68.234 0.840680
## pm 1.61264 8.50887 -15.06443 18.290 0.849682
## int 0.66336 3.29679 -5.79824 7.125 0.840532
## pe 7.01072 34.85624 -61.30625 75.328 0.840595
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## ----------------------------------------------------------------
##
## (Rcde: controlled direct effect risk ratio; Rpnde: pure natural direct effect risk ratio; Rtnde: total natural direct effect risk ratio; Rpnie: pure natural indirect effect risk ratio; Rtnie: total natural indirect effect risk ratio; Rte: total effect risk ratio; ERcde: excess relative risk due to controlled direct effect; ERintref: excess relative risk due to reference interaction; ERintmed: excess relative risk due to mediated interaction; ERpnie: excess relative risk due to pure natural indirect effect; ERcde(prop): proportion ERcde; ERintref(prop): proportion ERintref; ERintmed(prop): proportion ERintmed; ERpnie(prop): proportion ERpnie; pm: overall proportion mediated; int: overall proportion attributable to interaction; pe: overall proportion eliminated)
##
## Relevant variable values:
## $a
## [1] 1
##
## $astar
## [1] 0
##
## $yval
## [1] "1"
##
## $mval
## $mval[[1]]
## [1] 1
##
##
## $basecval
## $basecval[[1]]
## [1] 0.996522
##
## $basecval[[2]]
## [1] 0.5936
Then, we assume \(A\) was measured with error. \(A\) is categorical, so only SIMEX can be used. The naive results obtained by fitting data with measurement error:
res_naive_cat <- cmest(data = data, model = "rb", outcome = "Y", exposure = "A_error",
mediator = "M", basec = c("C1", "C2"), EMint = TRUE,
mreg = list("logistic"), yreg = "logistic",
astar = 0, a = 1, mval = list(1),
estimation = "paramfunc", inference = "delta")
summary(res_naive_cat)
## Causal Mediation Analysis
##
## # Outcome regression:
##
## Call:
## glm(formula = Y ~ A_error + M + A_error * M + C1 + C2, family = binomial(),
## data = getCall(x$reg.output$yreg)$data, weights = getCall(x$reg.output$yreg)$weights)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.5652 -0.2098 -0.1765 -0.1529 3.1640
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.5907 0.2727 -9.500 < 2e-16 ***
## A_error -0.5077 0.5703 -0.890 0.373318
## M -1.7375 0.2882 -6.029 1.65e-09 ***
## C1 0.5037 0.1487 3.386 0.000709 ***
## C2 -0.6133 0.1500 -4.089 4.34e-05 ***
## A_error:M 0.5931 0.5945 0.998 0.318446
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1858.7 on 9999 degrees of freedom
## Residual deviance: 1801.3 on 9994 degrees of freedom
## AIC: 1813.3
##
## Number of Fisher Scoring iterations: 7
##
##
## # Mediator regressions:
##
## Call:
## glm(formula = M ~ A_error + C1 + C2, family = binomial(), data = getCall(x$reg.output$mreg[[1L]])$data,
## weights = getCall(x$reg.output$mreg[[1L]])$weights)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -3.3245 0.1157 0.1712 0.2666 1.0700
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.1369 0.1164 9.769 < 2e-16 ***
## A_error 1.5434 0.1310 11.783 < 2e-16 ***
## C1 1.5322 0.1190 12.879 < 2e-16 ***
## C2 0.6753 0.1181 5.718 1.08e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2825.7 on 9999 degrees of freedom
## Residual deviance: 2428.4 on 9996 degrees of freedom
## AIC: 2436.4
##
## Number of Fisher Scoring iterations: 7
##
##
## # Effect decomposition on the odds ratio scale via the regression-based approach
##
## Closed-form parameter function estimation with
## delta method standard errors, confidence intervals and p-values
##
## Estimate Std.error 95% CIL 95% CIU P.val
## Rcde 1.08912 0.18279 0.78381 1.513 0.611003
## Rpnde 0.98700 0.15917 0.71952 1.354 0.935309
## Rtnde 1.06299 0.17173 0.77449 1.459 0.705322
## Rpnie 0.86553 0.04070 0.78932 0.949 0.002133 **
## Rtnie 0.93218 0.04836 0.84205 1.032 0.175816
## Rte 0.92005 0.14238 0.67934 1.246 0.590294
## ERcde 0.07373 0.14960 -0.21949 0.367 0.622139
## ERintref -0.08673 0.08188 -0.24722 0.074 0.289503
## ERintmed 0.06753 0.06388 -0.05767 0.193 0.290433
## ERpnie -0.13447 0.04070 -0.21424 -0.055 0.000954 ***
## ERcde(prop) -0.92222 3.45691 -7.69764 5.853 0.789642
## ERintref(prop) 1.08489 2.06437 -2.96120 5.131 0.599215
## ERintmed(prop) -0.84468 1.60658 -3.99352 2.304 0.599050
## ERpnie(prop) 1.68201 3.03652 -4.26946 7.633 0.579628
## pm 0.83733 1.71924 -2.53231 4.207 0.626232
## int 0.24020 0.45912 -0.65966 1.140 0.600849
## pe 1.92222 3.45691 -4.85321 8.698 0.578176
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Rcde: controlled direct effect odds ratio; Rpnde: pure natural direct effect odds ratio; Rtnde: total natural direct effect odds ratio; Rpnie: pure natural indirect effect odds ratio; Rtnie: total natural indirect effect odds ratio; Rte: total effect odds ratio; ERcde: excess relative risk due to controlled direct effect; ERintref: excess relative risk due to reference interaction; ERintmed: excess relative risk due to mediated interaction; ERpnie: excess relative risk due to pure natural indirect effect; ERcde(prop): proportion ERcde; ERintref(prop): proportion ERintref; ERintmed(prop): proportion ERintmed; ERpnie(prop): proportion ERpnie; pm: overall proportion mediated; int: overall proportion attributable to interaction; pe: overall proportion eliminated)
##
## Relevant variable values:
## $a
## [1] 1
##
## $astar
## [1] 0
##
## $yval
## [1] "1"
##
## $mval
## $mval[[1]]
## [1] 1
##
##
## $basecval
## $basecval[[1]]
## [1] 0.9967315
##
## $basecval[[2]]
## [1] 0.5936
The results corrected by SIMEX:
res_simex_cat <- cmsens(object = res_naive_cat, sens = "me", MEmethod = "simex",
MEvariable = "A_error", MEvartype = "cat", MEerror = list(mc))
summary(res_simex_cat)
## Sensitivity Analysis For Measurement Error
##
## The variable measured with error: A_error
## Type of the variable measured with error: categorical
##
## # Measurement error 1:
## [,1] [,2]
## [1,] 0.9 0.1
## [2,] 0.1 0.9
##
## ## Error-corrected regressions for measurement error 1:
##
## ### Outcome regression:
## Call:
## simexreg(reg = getCall(x$sens[[1L]]$reg.output$yreg)$reg, formula = Y ~
## A_error + M + A_error * M + C1 + C2, data = getCall(x$sens[[1L]]$reg.output$yreg)$data,
## MEvariable = "A_error", MEvartype = "categorical", MEerror = c(0.9,
## 0.1, 0.1, 0.9), variance = TRUE, lambda = c(0.5, 1, 1.5,
## 2), B = 200, weights = getCall(x$sens[[1L]]$reg.output$yreg)$weights)
##
## Naive coefficient estimates:
## (Intercept) A_error M C1 C2 A_error:M
## -2.5906738 -0.5077290 -1.7374904 0.5036807 -0.6133152 0.5930976
##
## Naive var-cov estimates:
## (Intercept) A_error M C1 C2
## (Intercept) 0.074373396 -0.0608915941 -0.054071017 -1.576936e-02 -7.164751e-03
## A_error -0.060891594 0.3252487905 0.060788376 -1.130950e-04 5.120972e-04
## M -0.054071017 0.0607883762 0.083061875 -8.233291e-03 -2.664520e-03
## C1 -0.015769362 -0.0001130950 -0.008233291 2.212526e-02 -9.887795e-05
## C2 -0.007164751 0.0005120972 -0.002664520 -9.887795e-05 2.250262e-02
## A_error:M 0.062066763 -0.3252496367 -0.079058624 -1.368648e-03 -8.758372e-04
## A_error:M
## (Intercept) 0.0620667626
## A_error -0.3252496367
## M -0.0790586237
## C1 -0.0013686479
## C2 -0.0008758372
## A_error:M 0.3534194114
##
## Variable measured with error:
## A_error
## Measurement error:
## 0 1
## 0 0.9 0.1
## 1 0.1 0.9
##
## Error-corrected results:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.5706 0.2726 -9.429 < 2e-16 ***
## A_error1 -0.6697 0.7186 -0.932 0.351439
## M -1.7728 0.2976 -5.957 2.66e-09 ***
## C1 0.5014 0.1490 3.366 0.000764 ***
## C2 -0.6139 0.1500 -4.092 4.31e-05 ***
## A_error1:M 0.7803 0.7398 1.055 0.291608
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## ### Mediator regressions:
## Call:
## simexreg(reg = getCall(x$sens[[1L]]$reg.output$mreg[[1L]])$reg,
## formula = M ~ A_error + C1 + C2, data = getCall(x$sens[[1L]]$reg.output$mreg[[1L]])$data,
## MEvariable = "A_error", MEvartype = "categorical", MEerror = c(0.9,
## 0.1, 0.1, 0.9), variance = TRUE, lambda = c(0.5, 1, 1.5,
## 2), B = 200, weights = getCall(x$sens[[1L]]$reg.output$mreg[[1L]])$weights)
##
## Naive coefficient estimates:
## (Intercept) A_error C1 C2
## 1.1368565 1.5434255 1.5321997 0.6752983
##
## Naive var-cov estimates:
## (Intercept) A_error C1 C2
## (Intercept) 0.013541986 -0.0044464941 -0.0091359634 -0.0068278415
## A_error -0.004446494 0.0171570798 -0.0006625250 0.0001919242
## C1 -0.009135963 -0.0006625250 0.0141546164 0.0007819793
## C2 -0.006827841 0.0001919242 0.0007819793 0.0139496499
##
## Variable measured with error:
## A_error
## Measurement error:
## 0 1
## 0 0.9 0.1
## 1 0.1 0.9
##
## Error-corrected results:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.0152 0.1193 8.512 < 2e-16 ***
## A_error1 1.9701 0.1676 11.757 < 2e-16 ***
## C1 1.4739 0.1203 12.255 < 2e-16 ***
## C2 0.6761 0.1197 5.649 1.66e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## ## Error-corrected causal effects on the risk ratio scale for measurement error 1:
## Estimate Std.error 95% CIL 95% CIU P.val
## Rcde 1.11696 0.23958 0.73360 1.701 0.606087
## Rpnde 0.96730 0.20112 0.64354 1.454 0.872960
## Rtnde 1.09045 0.22744 0.72455 1.641 0.678042
## Rpnie 0.82467 0.05202 0.72876 0.933 0.002245 **
## Rtnie 0.92966 0.06727 0.80674 1.071 0.313472
## Rte 0.89926 0.17449 0.61478 1.315 0.584228
## ERcde 0.09294 0.18747 -0.27449 0.460 0.620044
## ERintref -0.12564 0.10510 -0.33164 0.080 0.231910
## ERintmed 0.10729 0.08991 -0.06894 0.284 0.232769
## ERpnie -0.17533 0.05202 -0.27729 -0.073 0.000751 ***
## ERcde(prop) -0.92262 3.41032 -7.60672 5.761 0.786746
## ERintref(prop) 1.24722 2.29278 -3.24654 5.741 0.586456
## ERintmed(prop) -1.06501 1.95713 -4.90092 2.771 0.586326
## ERpnie(prop) 1.74041 3.09718 -4.32996 7.811 0.574162
## pm 0.67540 1.48233 -2.22991 3.581 0.648653
## int 0.18221 0.33721 -0.47870 0.843 0.588946
## pe 1.92262 3.41032 -4.76148 8.607 0.572913
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## ----------------------------------------------------------------
##
## (Rcde: controlled direct effect risk ratio; Rpnde: pure natural direct effect risk ratio; Rtnde: total natural direct effect risk ratio; Rpnie: pure natural indirect effect risk ratio; Rtnie: total natural indirect effect risk ratio; Rte: total effect risk ratio; ERcde: excess relative risk due to controlled direct effect; ERintref: excess relative risk due to reference interaction; ERintmed: excess relative risk due to mediated interaction; ERpnie: excess relative risk due to pure natural indirect effect; ERcde(prop): proportion ERcde; ERintref(prop): proportion ERintref; ERintmed(prop): proportion ERintmed; ERpnie(prop): proportion ERpnie; pm: overall proportion mediated; int: overall proportion attributable to interaction; pe: overall proportion eliminated)
##
## Relevant variable values:
## $a
## [1] 1
##
## $astar
## [1] 0
##
## $yval
## [1] "1"
##
## $mval
## $mval[[1]]
## [1] 1
##
##
## $basecval
## $basecval[[1]]
## [1] 0.9967315
##
## $basecval[[2]]
## [1] 0.5936
Compare the error-corrected results with the true results:
res_true <- cmest(data = data, model = "rb", outcome = "Y", exposure = "A",
mediator = "M", basec = c("C1", "C2"), EMint = TRUE,
mreg = list("logistic"), yreg = "logistic",
astar = 0, a = 1, mval = list(1),
estimation = "paramfunc", inference = "delta")
summary(res_true)
## Causal Mediation Analysis
##
## # Outcome regression:
##
## Call:
## glm(formula = Y ~ A + M + A * M + C1 + C2, family = binomial(),
## data = getCall(x$reg.output$yreg)$data, weights = getCall(x$reg.output$yreg)$weights)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.5659 -0.2096 -0.1762 -0.1524 3.1928
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.5768 0.2611 -9.869 < 2e-16 ***
## A -0.8888 0.7581 -1.172 0.241026
## M -1.8429 0.2859 -6.447 1.14e-10 ***
## C1 0.4970 0.1489 3.337 0.000845 ***
## C2 -0.6144 0.1500 -4.095 4.22e-05 ***
## A:M 1.1064 0.7790 1.420 0.155512
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1858.7 on 9999 degrees of freedom
## Residual deviance: 1799.2 on 9994 degrees of freedom
## AIC: 1811.2
##
## Number of Fisher Scoring iterations: 7
##
##
## # Mediator regressions:
##
## Call:
## glm(formula = M ~ A + C1 + C2, family = binomial(), data = getCall(x$reg.output$mreg[[1L]])$data,
## weights = getCall(x$reg.output$mreg[[1L]])$weights)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -3.4257 0.0947 0.1396 0.2558 1.0542
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.9817 0.1163 8.442 < 2e-16 ***
## A 2.1466 0.1473 14.574 < 2e-16 ***
## C1 1.4572 0.1200 12.145 < 2e-16 ***
## C2 0.6764 0.1193 5.668 1.44e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2825.7 on 9999 degrees of freedom
## Residual deviance: 2305.6 on 9996 degrees of freedom
## AIC: 2313.6
##
## Number of Fisher Scoring iterations: 7
##
##
## # Effect decomposition on the odds ratio scale via the regression-based approach
##
## Closed-form parameter function estimation with
## delta method standard errors, confidence intervals and p-values
##
## Estimate Std.error 95% CIL 95% CIU P.val
## Rcde 1.24309 0.22291 0.87472 1.767 0.224946
## Rpnde 1.01814 0.17635 0.72506 1.430 0.917328
## Rtnde 1.20855 0.21018 0.85947 1.699 0.276073
## Rpnie 0.80040 0.05419 0.70093 0.914 0.001009 **
## Rtnie 0.95009 0.06605 0.82906 1.089 0.461459
## Rte 0.96733 0.15543 0.70599 1.325 0.836210
## ERcde 0.18777 0.16621 -0.13800 0.514 0.258600
## ERintref -0.16963 0.10003 -0.36569 0.026 0.089947 .
## ERintmed 0.14878 0.08790 -0.02351 0.321 0.090547 .
## ERpnie -0.19960 0.05419 -0.30582 -0.093 0.000231 ***
## ERcde(prop) -5.74662 32.11420 -68.68930 57.196 0.857982
## ERintref(prop) 5.19141 24.66335 -43.14787 53.531 0.833285
## ERintmed(prop) -4.55337 21.62860 -46.94465 37.838 0.833257
## ERpnie(prop) 6.10859 29.09367 -50.91396 63.131 0.833697
## pm 1.55521 7.88784 -13.90468 17.015 0.843698
## int 0.63803 3.03635 -5.31311 6.589 0.833565
## pe 6.74662 32.11420 -56.19606 69.689 0.833604
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Rcde: controlled direct effect odds ratio; Rpnde: pure natural direct effect odds ratio; Rtnde: total natural direct effect odds ratio; Rpnie: pure natural indirect effect odds ratio; Rtnie: total natural indirect effect odds ratio; Rte: total effect odds ratio; ERcde: excess relative risk due to controlled direct effect; ERintref: excess relative risk due to reference interaction; ERintmed: excess relative risk due to mediated interaction; ERpnie: excess relative risk due to pure natural indirect effect; ERcde(prop): proportion ERcde; ERintref(prop): proportion ERintref; ERintmed(prop): proportion ERintmed; ERpnie(prop): proportion ERpnie; pm: overall proportion mediated; int: overall proportion attributable to interaction; pe: overall proportion eliminated)
##
## Relevant variable values:
## $a
## [1] 1
##
## $astar
## [1] 0
##
## $yval
## [1] "1"
##
## $mval
## $mval[[1]]
## [1] 1
##
##
## $basecval
## $basecval[[1]]
## [1] 0.9967315
##
## $basecval[[2]]
## [1] 0.5936