[R-meta] multi-level, multiple timepoint model

Viechtbauer, Wolfgang (SP) wo||g@ng@v|echtb@uer @end|ng |rom m@@@tr|chtun|ver@|ty@n|
Sun Feb 21 11:47:05 CET 2021

For some reason, my reply never made it to the mailing list, so I am resending it.


-----Original Message-----
From: Viechtbauer, Wolfgang (SP) 
Sent: Friday, 19 February, 2021 11:48
To: 'Marianne DEBUE'
Cc: r-sig-meta-analysis
Subject: RE: multi-level, multiple timepoint model

Just one comment about the first paragraph: '~ Timepoint | Species' with struct="CAR" is about temporal correlation (assuming that 'Timepoint' really refers to a time variable), not spatial correlation.

Well, actually, struct="CAR" can be shown to be a reparameterization of the exponential spatial correlation structure (struct="SPEXP"), but the latter is more flexible, since it can handle multiple variables definining spatial coordinates (e.g., latitude and longitude), while the (continuous-time) autocorrelation structure just defines (temporal) closeness based on a single time variable. In any case, if 'Timepoint' is really a time variable, then you are accounting for temporal correlation, not spatial one.

As for your question: Convergence problems are hard to diagnose without access to the data. But yes, broadly speaking, they are probably more likely to occur in smaller datasets, although what is 'small' is hard to define in general as this depends on the complexity of the model and the structure of the data. I would say if you can get the same or very similar results from two or three different optimizers, then this should provide some reassurance that the results are somewhat trustworthy even if you run into convergence issues with the default one. That is also one of the reasons why you can choose between a dozen or more different optimizers in rma.mv(). You should also inspect profile likelihood plots (via profile()) to make sure that things look okay (see help(profile.rma.mv) for details).


>-----Original Message-----
>From: Marianne DEBUE [mailto:marianne.debue using mnhn.fr]
>Sent: Friday, 19 February, 2021 10:02
>To: Viechtbauer, Wolfgang (SP)
>Cc: r-sig-meta-analysis
>Subject: Re: multi-level, multiple timepoint model
>Dear Wolfgang,
>Thank you for your answer and ideas.
>I tried some of your propositions and obtained sometimes quite different results
>from my first model so I will have to think about it.
>But something like random = list(~ Timepoint | Species, ~ 1 | ID_study),
>struct="CAR" seems to be a good compromise to take into account the spatial
>correlation and temporal correlation at the species level, instead of taking into
>account the temporal correlation at the study level as I did first.
>Just one last question: when I applied your models, depending on the moderator I
>choose, I sometimes have a convergence problem, which is solved by switching to
>'optim' for the optimizer and using either the 'BFGS' or 'Nelder-Mead' methods as
>you suggested elsewhere. But I was wondering what the cause of this is. Can it be
>due to a lack of data ?
>I indeed don't have many studies (18) but as I have data for different species and
>different time points in each study, I still have more than 300 effect sizes (but
>more effect sizes are related one population level (no convergence problem) than
>to a species level (convergence problem)).
>----- Mail original -----
>De: "Wolfgang Viechtbauer, SP" <wolfgang.viechtbauer using maastrichtuniversity.nl>
>À: "Marianne DEBUE" <marianne.debue using mnhn.fr>, "r-sig-meta-analysis" <r-sig-meta-
>analysis using r-project.org>
>Envoyé: Jeudi 18 Février 2021 10:47:58
>Objet: RE: multi-level, multiple timepoint model
>Dear Marianne,
>Let me just preface my response by saying that with this level of complexity,
>giving advice is very difficult. In cases like this, it could easily take me days
>to decide on an appropriate modeling approach, possibly testing out ideas in
>simulated data after lengthy discussions about the data structure, design of the
>studies, information reported, research hypotheses, etc. etc. with the primary
>investigator. You also write that you don't have a high number of studies, so
>trying to fit whatever model I might propose could be pointless.
>This aside, and without knowing more about the details, I would consider adding
>the autocorrelated random effects at the lowest level where there are actually
>repeated observations (which is the species level). So that would imply:
>random = ~ Timepoint | Species, struct="CAR"
>To account for heterogeneity due to the multilevel structure, I would consider
>adding random effects for studies and population within studies as well:
>random = list(~ Timepoint | Species, ~ 1 | ID_study/Population), struct="CAR"
>Not sure to what extent one can add further random effects at the species and
>effect size. So, one could even consider models such as:
>random = list(~ Timepoint | Species, ~ 1 | ID_study/Population/Species),
>random = list(~ Timepoint | Species, ~ 1 | ID_study/Population/Species/Timepoint),
>But you also have 'mods = ~ Species'. That might preclude adding random effects
>for species.
>One could also consider adding additional autocorrelated random effects at the
>population or study levels. Given that the response of species to the treatment
>might be more similar for species that are phylogenetically more related to each
>other, one could also consider adding phylogenetically correlated random effects
>for species to the model.
>I'll stop here. At least I hope to have given you some ideas.
>>-----Original Message-----
>>From: R-sig-meta-analysis [mailto:r-sig-meta-analysis-bounces using r-project.org] On
>>Behalf Of Marianne DEBUE
>>Sent: Thursday, 18 February, 2021 9:29
>>To: r-sig-meta-analysis
>>Subject: [R-meta] multi-level, multiple timepoint model
>>Hi everyone,
>>I am conducting a meta-analysis in ecology. I am confronted to several
>>dependencies and I am not sure how to write the model.
>>I have several studies, each corresponding to a specific study site.
>>The studies can concern one or several populations (bird, fish, vegetation,
>>In each study, I have measures of abundance of the different species seen in the
>>site at different timepoints.
>>Species, Populations and Timepoints can be common or different between studies.
>>So I have this type of structure :
>>                                       T=0          T=1           T=2
>>Study 1 _ Population 1 _ Species 1.1    x            x             x
>>                         Species 1.2    x            x             x
>>                         Species 1.3    x            x             x
>>          Population 2 _ Species 2.1    x                          x
>>                         Species 2.2    x                          x
>>                         Species 2.3    x                          x
>>Study 2 _ Population 1 _ Species 1.1    x            x
>>                         Species 1.4    x            x
>>                         Species 1.5    x            x
>>          Population 3 _ Species 3.1                 x             x
>>                         Species 3.2                 x             x
>>                         Species 2.3                 x             x
>>The effect size is a standardized mean difference between pre- and post-
>>I don't know the correlation between the different timepoints.
>>1. I first wrote this model :
>>res=rma.mv(ES, V, mods= ~ Species, random = ~Timepoint|ID_study,struct="CAR",
>>But I was wondering if a Species-level is not lacking ?
>>The ID_study allows me to take into account the spatial correlation between all
>>the species of a same site but shouldn't the temporal correlation be linked to
>>each species ?
>>2. Is the following model a better approach ? Am I not losing the advantage of
>>"struct="CAR"" argument ?
>>res=rma.mv(ES, V, mods= ~ Species, random =
>>coef_test(res,vcov="CR2") #I am using the clubSandwich package as I don't have a
>>high number of studies
>>3. And last question: is it better to make a meta-analysis per population or to
>>keep all the population in one meta-analysis ?
>>Thank you for you help

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