2

Does this code look right for a multilevel meta-analysis in R using the metafor package?

I have effect sizes ("id") nested within articles ("citation") nested within data sets ("data"). To clarify, multiple effect sizes are often reported within the same published work; and different published works often use the same data.

inf <- rma.mv(infcoef, infvar, random = ~ 1 | data/citation/id, data=dat)

I've looked at Konstantopoulos, 2011, but I think I have an extra level of clustering so I want to make sure I've specified the model correctly.

Thanks!

iehrlich
  • 3,572
  • 4
  • 34
  • 43
Owen
  • 21
  • 2
  • Are your effect sizes based on the same participants? That is, do effect sizes within the same article share the same participants? (Does one participant provide multiple effect sizes)? – Mark White Jun 28 '17 at 20:22
  • Yes, multiple effect sizes within the same article are often based on the same set of participants. Thanks! – Owen Jun 28 '17 at 20:31

1 Answers1

1

I am currently working on a meta-analysis for my comprehensive exams and fit pretty much the same model you are talking about: I can have multiple effect sizes drawn from the same study. I would not fit a multilevel meta-analytic model using metafor, as it does not appropriately capture the correlated error terms. I wrote out my thinking in my paper (still working on it), so here is a rough explanation from my comps on how to address this situation:

I gathered $k = 240$ effect sizes across $m = 90$ studies. Table 2 describes the distribution across studies: Half of the studies reported more than one effect size, with three studies reporting as many as 15 effect sizes. Traditional meta-analytic methodologies assume that all effect sizes are independent of one another; this assumption is severely violated in the present analysis, as effect sizes drawn from the same participants are dependent on one another.

One would ideally use a multivariate meta-analysis to model these dependencies; however, this requires the meta-analyst to have access to the full covariance matrix of all measures in all studies. This is not realistic in many settings [@jackson2011multivariate], particularly in the present meta-analysis of a literature where (a) researchers hardly publish this information and (b) the research has been published over the course of 70 years, making acquiring this information from the authors of many of theses studies impossible.
Multilevel meta-analysis has been proposed as a way to deal with unknown dependencies between effect sizes [@cheung2014modeling; @konstantopoulos2011fixed; @van2013three]. While some argue that individuals could be modeled at Level 1, effect sizes at Level 2, and study at Level 3 [e.g., @cheung2014modeling], three-level meta-analyses still assume that residual errors are orthogonal within clusters [@tanner2016handling]. This assumption is violated when multiple effect sizes are drawn from the same participants.

The current “state-of-the-art” [@polanin2017review] way to model these dependencies and avoid underestimating standard errors is to use robust variance estimates [RVE; @hedges2010robust; @tanner2016handling]. I performed my meta-analysis using RVE for correlated effects in the robumeta R package [@fisher2015robumeta].

As mentioned above, I am able to calculate the variances of effect sizes directly from sample size, but I am not able to calculate the covariance between effect sizes. RVE solves this problem by using the cross products of the residuals for each study to estimate the variance-covariance matrix of effect sizes within a study. While the estimate of the covariance matrix in each study is not very good, the combined variance estimate converges to the true variance as the number of studies approaches infinity [@hedges2010robust].

Traditional meta-analyses weight effect sizes by using the inverse of the variance. RVE weights each effect size using (a) the inverse of the average variance across all effect sizes in a study (assuming a constant correlation across effect sizes) (b) divided by the number of effect sizes in the study. This ensures that a study does not get "extra" weight simply by having more effect sizes.

This method is used primarily for the purposes of this meta-analysis: interpreting meta-regression coefficients. The variance estimates found in other meta-analyses (e.g., $Q, I^2, \tau^2$) are not precise when using RVE. Given this shortcoming of RVE—and my main focus in interpreting meta-regression coefficients—I will not focus on these estimates.

References (from my .bib file, sorry if the format is annoying):

@article{jackson2011multivariate,
  title={Multivariate meta-analysis: Potential and promise},
  author={Jackson, Dan and Riley, Richard and White, Ian R},
  journal={Statistics in Medicine},
  volume={30},
  number={20},
  pages={2481--2498},
  year={2011},
  publisher={Wiley Online Library}
}
@article{cheung2014modeling,
  title={Modeling dependent effect sizes with three-level meta-analyses: A structural equation modeling approach},
  author={Cheung, Mike W L},
  journal={Psychological Methods},
  volume={19},
  number={2},
  pages={211--229},
  year={2014}
}
@article{konstantopoulos2011fixed,
  title={Fixed effects and variance components estimation in three-level meta-analysis},
  author={Konstantopoulos, Spyros},
  journal={Research Synthesis Methods},
  volume={2},
  number={1},
  pages={61--76},
  year={2011},
  publisher={Wiley Online Library}
}
@article{van2013three,
  title={Three-level meta-analysis of dependent effect sizes},
  author={Van den Noortgate, Wim and L{\'o}pez-L{\'o}pez, Jos{\'e} Antonio and Mar{\'\i}n-Mart{\'\i}nez, Fulgencio and S{\'a}nchez-Meca, Julio},
  journal={Behavior Research Methods},
  volume={45},
  number={2},
  pages={576--594},
  year={2013},
  publisher={Springer}
}
@article{tanner2016handling,
  title={Handling complex meta-analytic data structures using robust variance estimates: A tutorial in {R}},
  author={Tanner-Smith, Emily E and Tipton, Elizabeth and Polanin, Joshua R},
  journal={Journal of Developmental and Life-Course Criminology},
  volume={2},
  number={1},
  pages={85--112},
  year={2016},
  publisher={Springer}
}
@article{polanin2017review,
  title={A Review of Meta-Analysis Packages in {R}},
  author={Polanin, Joshua R and Hennessy, Emily A and Tanner-Smith, Emily E},
  journal={Journal of Educational and Behavioral Statistics},
  volume={42},
  number={2},
  pages={206--242},
  year={2017},
  publisher={SAGE Publications Sage CA: Los Angeles, CA}
}
@article{hedges2010robust,
  title={Robust variance estimation in meta-regression with dependent effect size estimates},
  author={Hedges, Leon V and Tipton, Elizabeth and Johnson, Matthew C},
  journal={Research synthesis methods},
  volume={1},
  number={1},
  pages={39--65},
  year={2010}
}
@article{fisher2015robumeta,
  title={robumeta: An {R}-package for robust variance estimation in meta-analysis},
  author={Fisher, Zachary and Tipton, Elizabeth},
  journal={arXiv preprint arXiv:1503.02220},
  year={2015}
}
Mark White
  • 1,228
  • 2
  • 10
  • 25
  • That's very helpful! Thank you, Mark. This would be appropriate if the different effects within an article use the same participants but for different outcomes, right? I’m trying to get my head around the different ways to handle different types of dependencies. So, say the different effects within an article related to **_different_** participants. Would the code I suggested in the initial post work for that situation? (So, effect sizes for different participants nested within articles nested within data sets.) – Owen Jun 29 '17 at 13:01
  • "This would be appropriate if the different effects within an article use the same participants but for different outcomes, right?" Correct. "So, say the different effects within an article related to different participants. Would the code I suggested in the initial post work for that situation? (So, effect sizes for different participants nested within articles nested within data sets.)" Maybe: I'm not following the logic of how the nesting you described works... But a multilevel meta-analysis would be appropriate in that situation (such as nesting within research labs). – Mark White Jun 29 '17 at 13:14
  • I’ll clarify. Articles report separate effects for different schools. Also, multiple articles use the same data (articles nested within data sets). So, effects (“id”) are nested within published articles (“citation”) which are nested within data sets (“data”). Given this, does the code below capture that nesting structure? `inf <- rma.mv(infcoef, infvar, random = ~ 1 | data/citation/id, data=dat` A more generic example would be effects (id) nested within labs (lab) nested within countries (country). `inf <- rma.mv(eff, variance_of_eff, random = ~ 1 | country/lab/id, data=dat)` – Owen Jun 29 '17 at 15:08
  • 2
    If "multiple articles use the same data", then this sounds to me like you will have correlated sampling errors. In principle, you would then need to incorporate that dependency into the $V$ matrix (i.e., the var-cov matrix of the sampling errors, the second argument to `rma.mv()`). As Mark notes, this is often not possible. So, after fitting the model, you may want to use `robust()` to obtain cluster-robust standard errors for the fixed effects. – Wolfgang Jun 29 '17 at 17:41
  • @Wolfgang The `metafor::robust()` function talks about the method used in the `robumeta::robu()` function, the Hedges, Tipton, & Johnson (2010) paper. Are the SEs returned by `metafor::robust()` using the same equation as HT&J (2010)? Details for the function just says it's a "sandwich-type estimator." – Mark White Jun 29 '17 at 17:50
  • @Wolfgang Thanks! In this case, would it be appropriate to estimate a two-level model (effect sizes for separate schools [“id”] within articles [“citation”]) and then account for the fact that different articles use the same data [“data”] by specifying robust SEs? So, this: `inf <- rma.mv(infcoef, infvar, random = ~ 1 | citation/id, data=dat)` `robust(inf, cluster=dat$data, adjust=TRUE)` – Owen Jun 29 '17 at 19:25
  • @Owen I am not sure I clearly understand the details of your analysis, so I will refrain from giving a specific recommendation. In general, I would recommend to use a multilevel model that reflects as closely as possible the nesting structure. That gives you a decent working var-cov structure based on the model. Then use `robust()` with the outermost nesting variable as the clustering variable. – Wolfgang Jun 29 '17 at 20:06
  • 2
    @MarkWhite `metafor::robust()` is in essence like eq. (6) from HT&J (2010). The idea is this: Start with a multilevel model, which might not be 100% correct (since it ignores the covariances of the sampling errors), but this will give you a decent working (marginal) var-cov matrix. Then you can use `robust()` to improve on that. You could even start with a multivariate model, using some reasonable 'guestimates' of the covariances of the sampling errors. And then again follow this up with `robust()`. – Wolfgang Jun 29 '17 at 20:14
  • @Wolfgang I think an example might clarify. Frank 2016 used the Add Health data and reported effects for 2 schools. Jones 2014 also used Add Health and reported effects for 2 schools. Karlson 2006 used the RYDS data and reported effects for 3 schools; Chu 2009 also used RYDS and reported effects for 2 schools. So, 9 effects (“id”) within 4 articles (“citation”) within 2 data sets (“data”). Based on your comment, it sounds like a 3 level model with robust SEs would work? `inf <- rma.mv(infcoef, infvar, random = ~ 1 | data/citation/id, data=dat)` `robust(inf, cluster=dat$data, adjust=TRUE)` – Owen Jun 29 '17 at 20:35
  • Again, I hesitate to give any kind of endorsement based on so little information, but yes, something along those lines might be reasonable. – Wolfgang Jun 29 '17 at 21:04
  • That's very helpful. Thank you kindly for your input @Wolfgang and @MarkWhite! – Owen Jun 30 '17 at 12:50
  • @rnorouzian Not sure on the specifics of your data, but yes it looks like robumeta could work there, since I assume you don't have the covariance matrix between effect sizes – Mark White Nov 04 '19 at 01:51
  • Thanks! I can provide any specifics you might need, but can't we use any function in metafor package to achieve the same result as given by robumeta? – rnorouzian Nov 04 '19 at 01:54