metami {metavcov} | R Documentation |
Multiple Imputation for Missing Data in Meta-Analysis
Description
Multiple imputation allows for the uncertainty about the missing data by generating several different plausible imputed data sets and appropriately combining results obtained from each of them. Let \hat{\theta}_{*m}
be the estimated coefficient from the m
th imputed dataset for one of the p
dimensions in the multivariate outcome, where m=1,\dots,M
. The coefficient from MI \bar{\theta}
is simply just an arithmetic mean of the individual coefficients estimated from each of the M
meta-analysis. We have
\bar{\theta}=\frac{\sum_{m=1}^{M}\hat{\theta}_{*m}}{M}.
Estimation of the standard error for each variable is little more complicated. Let V_W
be the within imputation variance, which is the average of the variance of the estimated coefficient from each imputed dateset:
V_W=\frac{\sum_{m=1}^{M}V ({\hat{\theta}_{*m}})}{M},
where V ({\hat{\theta}_{*m}})
is the variance of the estimator calculated from generalized least squares methods using the imputed dataset. Let V_B
be the between imputation variance, which is calculated as
V_B=\frac{\sum_{m=1}^{M}({\hat{\theta}_{*m}}-\bar{\theta})^2}{M-1}.
From V_W
and V_B
, the variance of the pooled coefficients is calculated as
V(\bar{\theta})=V_W+V_B+\frac{V_B}{M}
The above variance is statistically principled since V_W
reflects the sampling variance and V_B
reflects the extra variance due to the missing data.
Usage
metami(data, M = 20, vcov = "r.vcov",
r.n.name, ef.name, x.name = NULL,
rvcov.method = "average", rvcov.zscore = TRUE,
type = NULL,
d = NULL, sdt = NULL, sdc = NULL,
nt = NULL, nc = NULL,
st = NULL, sc = NULL,
n_rt = NA, n_rc = NA,
r = NULL,
func = "mixmeta",
formula = NULL,
method = "fixed",
pool.seq = NULL,
return.mi = FALSE,
ci.level = 0.95)
Arguments
data |
A |
M |
Number of imputed data sets. |
vcov |
Method for computing effect sizes; options including |
r.n.name |
A string defining the column name for sample sizes in |
ef.name |
A |
x.name |
A vector that stores the column names in |
rvcov.method |
Method used for |
rvcov.zscore |
Whether the correlation coefficients in |
type |
A |
d |
A |
sdt |
A |
sdc |
A vector defined in a similar way as |
nt |
A |
nc |
A vector defined in a similar way as |
st |
A |
sc |
A vector defined in a similar way as |
n_rt |
A |
n_rc |
A list defined in a similar way as |
r |
A |
func |
A string defining the function to be used for fitting the meta-analysis. Options include |
formula |
Formula used for the function |
method |
Method used for the function |
pool.seq |
A numeric vector indicating if the results are pooled from subsets of the |
return.mi |
Should the |
ci.level |
Significant level for the pooled confidence intervals. The default is 0.05. |
Details
For the imputation phase, this function imports the mice
package that imputes incomplete multivariate data by chained equations. The pooling phase is performed via the Rubin's rules.
Value
coefficients |
A data.frame that contains the pooled results from the |
results.mi |
A |
data.mi |
A |
result.seq |
A list of results from the pooled results from the subsets of the |
Author(s)
Min Lu
References
Lu, M. (2023). Computing within-study covariances, data visualization, and missing data solutions for multivariate meta-analysis with metavcov. Frontiers in Psychology, 14:1185012.
Van Buuren, S. and Groothuis-Oudshoorn, K., 2011. mice: Multivariate imputation by chained equations in R. Journal of statistical software, 45(1), pp.1-67.
Examples
#####################################################################################
# Example: Craft2003 data
# Preparing input arguments for meta.mi() and fixed-effect model
#####################################################################################
# prepare a dataset with missing values and input arguments for meta.mi
Craft2003.mnar <- Craft2003[, c(2, 4:10)]
Craft2003.mnar[sample(which(Craft2003$C4 < 0), 6), "C4"] <- NA
dat <- Craft2003.mnar
n.name <- "N"
ef.name <- c("C1", "C2", "C3", "C4", "C5", "C6")
# fixed-effect model
obj <- metami(dat, M = 2, vcov = "r.vcov",
n.name, ef.name,
func = "metafixed")
########################
# Plotting the result
########################
computvcov <- r.vcov(n = Craft2003$N,
corflat = subset(Craft2003.mnar, select = C1:C6),
method = "average")
plotCI(y = computvcov$ef, v = computvcov$list.vcov,
name.y = NULL, name.study = Craft2003$ID,
y.all = obj$coefficients[,1],
y.all.se = obj$coefficients[,2])
########################
# Pooling from subsets
########################
# o1 <- metami(dat, M = 10, vcov = "r.vcov",
# n.name, ef.name,
# func = "metafixed",
# pool.seq = c(5, 10))
# pooled results from M = 5 imputed data sets
# o1$result.seq$M5$coefficients
# pooled results from M = 10 imputed data sets
# o1$result.seq$M10$coefficients
#########################################################################################
# Running random-effects and meta-regression model using packages "mixmeta" or "metaSEM"
#########################################################################################
# Restricted maximum likelihood (REML) estimator from the mixmeta package
# library(mixmeta)
# o2 <- metami(dat, M = 10, vcov = "r.vcov",
# n.name, ef.name,
# formula = as.formula(cbind(C1, C2, C3, C4, C5, C6) ~ 1),
# func = "mixmeta",
# method = "reml")
# maximum likelihood estimators from the metaSEM package
# library(metaSEM)
# o3 <- metami(dat, M = 10, vcov = "r.vcov",
# n.name, ef.name,
# func = "meta")
# meta-regression
# library(metaSEM)
# o4 <- metami(dat, M = 10, vcov = "r.vcov",
# n.name, ef.name, x.name = "p_male",
# func = "meta")
# library(mixmeta)
# o5 <- metami(dat, M = 20, vcov = "r.vcov",
# n.name, ef.name, x.name = "p_male",
# formula = as.formula(cbind(C1, C2, C3, C4, C5, C6) ~ p_male ),
# func = "mixmeta",
# method = "reml")
#####################################################################################
# Example: Geeganage2010 data
# Preparing input arguments for meta.mi() and fixed-effect model
#####################################################################################
# Geeganage2010.mnar <- Geeganage2010
# Geeganage2010.mnar$MD_SBP[sample(1:nrow(Geeganage2010),7)] <- NA
# r12 <- 0.71
# r13 <- 0.5
# r14 <- 0.25
# r23 <- 0.6
# r24 <- 0.16
# r34 <- 0.16
# r <- vecTosm(c(r12, r13, r14, r23, r24, r34))
# diag(r) <- 1
# mix.r <- lapply(1:nrow(Geeganage2010), function(i){r})
# o <- metami(data = Geeganage2010.mnar, M = 10, vcov = "mix.vcov",
# ef.name = c("MD_SBP", "MD_DBP", "RD_DD", "lgOR_D"),
# type = c("MD", "MD", "RD", "lgOR"),
# d = c("MD_SBP", "MD_DBP", NA, NA),
# sdt = c("sdt_SBP", "sdt_DBP", NA, NA),
# sdc = c("sdc_SBP", "sdc_DBP", NA, NA),
# nt = c("nt_SBP", "nt_DBP", "nt_DD", "nt_D"),
# nc = c("nc_SBP", "nc_DBP", "nc_DD", "nc_D"),
# st = c(NA, NA, "st_DD", "st_D"),
# sc = c(NA, NA, "sc_DD", "sc_D"),
# r = mix.r,
# func = "metafixed")