[R-meta] Confidence Intervals for I² values for three-level model
Sarah Roesch
roe@ch @end|ng |rom cb@@mpg@de
Fri Jul 3 16:06:55 CEST 2020
Dear all,
I would like to calculate confidence Intervals for I² in a three-level model.
Here, I closely followed the instructions provided by Wolfgang on this post: https://stat.ethz.ch/pipermail/r-sig-meta-analysis/2017-August/000150.html,
yet with a slightly different code because I prefer the list notation.
Thereby, I perfectly figured out I² on Level-2 and Level-3 and the according confidence intervals as well as overall I² and the corresponding confidence intervals.
In our paper, however, we would like to report I² on Level 1. Figuring out I² on Level 1 is not the problem, but I am currently having difficulties figuring out confidence intervals
for the I², since the confint function of the metafor-package only provides confidence intervals for Level 2 and Level 3.
My code is the following:
### to calculate I² and CIs on Level-2 and Level-3
overall <- rma.mv(yi, vi, random = list(~ 1 | esID, ~ 1 | searchID), tdist= TRUE, method="REML", data=alldata)
W <- diag(1/alldata$vi) # brings sample variance into a diganoal structure
X <- model.matrix(overall)
P <- W - W %*% X %*% solve(t(X) %*% W %*% X) %*% t(X) %*% W
I2 <- 100 * sum(overall$sigma2) / (sum(overall$sigma2) + (overall$k-overall$p)/sum(diag(P))) # total I²
I2 # This value is the Higgins I2 for the three-level model
100 * res$tau2 / (res$tau2 + (res$k-res$p)/sum(diag(P))) ### total I^2
# look at variance on both levels separately
100 * overall$sigma2 / (sum(overall$sigma2) + (overall$k-overall$p)/sum(diag(P)))
100 * confint(overall)[[1]]$random[1,2:3] /(sum(overall$sigma2) + (overall$k-overall$p)/sum(diag(P))) ### CI for es-level I^2
100 * confint(overall)[[2]]$random[1,2:3] /(sum(overall$sigma2) + (overall$k-overall$p)/sum(diag(P))) ### CI for the report-level I^2
### to calculate I² and CI for total variance
overall.innerouter <- rma.mv(yi, vi, random = ~ esID | searchID, data=alldata)
sav <- confint(overall.innerouter)
X <- model.matrix(overall.innerouter)
P <- W - W %*% X %*% solve(t(X) %*% W %*% X) %*% t(X) %*% W
100 * overall.innerouter$tau2 / (overall.innerouter$tau2 + (overall.innerouter$k-overall.innerouter$p)/sum(diag(P))) ### total I^2
100 * sav[[1]]$random[1,2:3] / (sav[[1]]$random[1,2:3] + (overall.innerouter$k-overall.innerouter$p)/sum(diag(P))) ### CI for the total I^2
Could anyone help out with that issue?
Thanks so much!
Sarah
More information about the R-sig-meta-analysis
mailing list