[R-meta] Non-independence caused by repeated measurements over time and shared control

Viechtbauer, Wolfgang (SP) wo||g@ng@v|echtb@uer @end|ng |rom m@@@tr|chtun|ver@|ty@n|
Tue Apr 6 11:46:10 CEST 2021


Dear Gabriele,

See my responses below.

Best,
Wolfgang

>-----Original Message-----
>From: R-sig-meta-analysis [mailto:r-sig-meta-analysis-bounces using r-project.org] On
>Behalf Of Gabriele Midolo
>Sent: Monday, 29 March, 2021 18:32
>To: R meta
>Subject: [R-meta] Non-independence caused by repeated measurements over time and
>shared control
>
>Dear all,
>
>My research group is carrying out an ecological meta-analysis where primary
>studies have multiple treatment (doses) compared to a single control group.
>For this reason, we are fitting the model (res1), as follow:
>
>calc.v <- function(x) {   v <- matrix((x$control_sd[1]^2 / (x$control_n[1]
>* x$control_m[1]^2)) , nrow=nrow(x), ncol=nrow(x))
> diag(v) <- x$vi
> v }
>get_V <- function(x) {   return(bldiag (lapply (split(x,
>x$common_control_id), calc.v))) }
>res1 <- rma.mv(yi, get_V(dat), random = ~ 1 | study/experiment/id,
>data=dat)
>
>where *common_control_id *is the variable identifying shared control group;
>random object (~ 1 | *study/experiment/id*) reflects the nested structure
>of our data where multiple experiments can be nested within each primary
>study.
>
>Our dataset nevertheless encompasses also multiple effect sizes as repeated
>measurements over time (i.e. dat$time_hours) so that different treatment
>doses can be compared to a single control at different time points within
>each experiment. I can imagine that obtaining a variance-covariance matrix
>dealing with non-independence caused by both shared control and time
>measurements is going to be quite a challenge (is that even possible?).

It is possible, but a bit difficult to implement. For multiple effect sizes obtained over time, it usually makes sense to assume some kind of autoregressive structure (for the sampling errors and the underlying true effects). See for example:

https://wviechtb.github.io/metafor/reference/dat.ishak2007.html

So, for the sampling errors, one would have to combine such an AR structure with the covariance that arises due to the use of shared control groups. The appropriate equations could be derived with some effort.

>Therefore, I was wondering to which extent it is appropriate to use inner
>outer structure setting struct="AR" to deal with repeated measurements in
>time, as follow (this does not account for the "study" and "id" level – I
>learned that neglecting the latter is a mistake in multi-level modelling
>though):
>
>res2 <- rma.mv(yi, get_V(dat), random = ~ time_hours | experiment,
>struct="AR", data=dat)

Although this does not capture the AR structure in the sampling errors, you can indeed at least model this structure in the underlying true effects as a 'working model'. However, I would recommend to combine this with the multilevel structure you outlined in model res1. That would be:

res2b <- rma.mv(yi, get_V(dat), random = list(~ 1 | study/experiment/id, ~ time_hours | experiment), struct="AR", data=dat)

Using '~ time_hours | experiment' assumes that you have coded 'experiment' so that it never takes on the same value for different studies. Also, struct="AR" assumes equally spaced time points. If you have the exact time in hours, then struct="CAR" might make more sense.

I don't know if this model is overparameterized. Check profile(res2b) to see if all profile plots have a clearly defined peak.

You might want to use cluster-robust inference methods after having fitted res2b (since res2b ignores the AR structure in the sampling errors and hence could be considered your working model), either using robust() from metafor or, even better, using the clubSandwich package. See here for an example (for the syntax; the context is different):

https://wviechtb.github.io/metafor/reference/robust.html

>Alternatively, does it make sense using *time_hours *as a nested component
>within the experiment as follow:
>res3 <- rma.mv(yi, get_V(dat), random = ~ 1 |
>study/experiment/time_hours/id, data=dat)

That would not give you an AR structure, so probably not as sensible. As shown above, you can combine the AR structure with the multilevel structure.

>Thanks and best wishes,
>Gabriele.


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