[R-meta] Confidence intervals for I^2 levels with rma.mv

Viechtbauer, Wolfgang (NP) wo||g@ng@v|echtb@uer @end|ng |rom m@@@tr|chtun|ver@|ty@n|
Mon May 6 15:33:24 CEST 2024


Dear Andreas,

Please see below.

Best,
Wolfgang

> -----Original Message-----
> From: R-sig-meta-analysis <r-sig-meta-analysis-bounces using r-project.org> On Behalf
> Of Andreas Voldstad via R-sig-meta-analysis
> Sent: Monday, May 6, 2024 14:00
> To: Andreas Voldstad via R-sig-meta-analysis <r-sig-meta-analysis using r-project.org>
> Cc: Andreas Voldstad <andreas.voldstad using kellogg.ox.ac.uk>
> Subject: [R-meta] Confidence intervals for I^2 levels with rma.mv
>
> Hi all,
>
> I would like to follow up an older thread on getting confidence intervals for
> the I^2:
> https://stat.ethz.ch/pipermail/r-sig-meta-analysis/2017-September/000195.html
>
> I am conducting a meta-analysis of SMD on a dataset with many sources of
> dependency (romantic couples, timepoints, multiple groups, multiple outcome
> measures). I'd like to report the 95% CI for the I^2.
>
> I have tried applying the method outlined in the previous thread. It works with
> the konstantopoulos2011 example data. However, when applying it to my own data,
> the result is that the confidence intervals are equal to the point estimate.
>
> I am wondering if the bootstrapped confidence interval method does not work in
> the same way when inputting a V-matrix in rma.mv?
>
> To obtain CIs for the total I^2, I have used confint() on a reparametrised
> model, as suggested in the thread. This seems to work out fine. But I am still
> missing the CIs for the separate levels.
>
> Unfortunately, I am not skilled in simulating data to create a reproducible
> example. I am enclosing the code I used for model fitting below in case my error
> is in any way apparent from that:
>
> library(metafor)
>
> # mod_allES <- read.csv("EffectSizeData/mod_allES.csv")
> rhoall7 <- .7
>
> V_7 <- with(mod_allES,
>             clubSandwich::impute_covariance_matrix(vi = v,
>                                                    cluster = StudyID,
>                                                    r = rhoall7,
>                                                    return_list = T))
>
> res <- rma.mv(yi = delta,
>               V = V_7,
>               slab = StudyID,
>               data = mod_allES,
>               random = ~ 1 | StudyID/esID,
>               test = "t",
>               method = "REML") #
>
> W <- diag(1/res$vi)
> X <- model.matrix(res)
> P <- W - W %*% X %*% solve(t(X) %*% W %*% X) %*% t(X) %*% W
>
> sim <- simulate(res, nsim=10000)
>
> sav <- lapply(sim, function(x) {
>   tmp <- try(
>     rma.mv(yi = delta,

Here lies the issue. You keep fitting the model to the original data, not the simulated data. This should be:

rma.mv(x,

>            V = V_7,
>            slab = StudyID,
>            data = mod_allES,
>            random = ~ 1 | StudyID/esID,
>            test = "t",
>            method = "REML"),
>     silent=TRUE)
>
>   if (inherits(tmp, "try-error")) {
>     next
>   } else {
>     tmp
>   }})
>
> I2s1 <- sapply(sav, function(x) 100 * x$sigma2[1] / (sum(x$sigma2) + (res$k-
> res$p)/sum(diag(P))))
> I2s2 <- sapply(sav, function(x) 100 * x$sigma2[2] / (sum(x$sigma2) + (res$k-
> res$p)/sum(diag(P))))
>
> quantile(I2s1, c(.025, .975))
>
> # With the result:
> #   2.5%    97.5%
> #   82.73102 82.73102
>
> quantile(I2s2, c(.025, .975))
> #   2.5%    97.5%
> #   14.90151 14.90151
>
> Best wishes,
>
> Andreas Voldstad (he/him)
> PhD student in Psychiatry
> University of Oxford


More information about the R-sig-meta-analysis mailing list