[R-sig-ME] metafor: estimate correlation between response variables (meta-analysis)

Gustaf Granath gustaf.granath at gmail.com
Tue Dec 13 11:42:23 CET 2016

Im trying the estimate the correlation between two response variable in 
a meta-analysis. Basically, are effects on y1 associated with effects on 
y2 across studies. Unfortunately, I dont have information on y1-y2 
correlations within each study. In addition, each study contain multiple 
treatments, adding within-study dependence for each response variable.

Because I dont have the y1-y2 covariance in each study, my idea is to 
run analyses with different covariance/correlation values to explore how 
this covariance affect the result. Reading the rma.mv() documentation, 
this seems possible through the R= argument, but I cant figure out how. 
Alternatively, I can add covariances in the matrix describing the known 
var-covariance matrix of the within-study dependence, but it seemed like 
the R argument is a easier solution (I may be wrong though). Below 
follow code illustrating my problem using the dat.berkey1998 example.



# Estimate correlation between two response variables
# with within-study dependence

# Make up an example based on the berkey1998 data.
# Multiple outcomes (multiple treatments)
# within each study, for each response variable, are created.
# Covariances between response variables (within studies) are unknown.
dat <- get(data(dat.berkey1998))
st.vcov <- dat[, c("v1i", "v2i")] # save vcov matrices to add later
dat <- rbind(dat, dat)
dat <- dat[order(dat$trial, dat$outcome),] # fix order
dat[,c("v1i", "v2i")] <- rbind(st.vcov,st.vcov) # put back matrices
dat$trial.treat <-paste(rep(1:2, nrow(dat)/2), dat$trial, sep="_") # id 
for treatments within trials

# Covariances within studies, for each response variable, is known. 
Hence, a
# varcov-matrix for each study and response, can be made and added as blocks
# in a large varcov-matrix for the data set.
# First a within-study dependence dummy must be added
dat$stud.unit <-  interaction(dat$trial, dat$outcome) # within-trial 
dependence dummy
# Put together known varcov matrix
V <- bldiag(lapply(split(dat[,c("v1i", "v2i")], dat$stud.unit), as.matrix))

# plot relationship between response variables
dat.wide <- reshape(dat, direction="wide",  v.names = "yi", timevar = 
"outcome", idvar = "trial.treat")
plot(yi.AL ~yi.PD, dat.wide)
cor(dat.wide$yi.AL, dat.wide$yi.PD)
# r = 0.39, if using the study outcomes ignoring all dependence/uncertainty.

# Run analysis
res <- rma.mv(yi, V, mods = ~ outcome - 1,
               random = ~ outcome | trial,
               struct="UN", data=dat, method="REML")
print(res, digits=3)
# correlation = 0.51, when accounting for dependence etc. But, y1 and y2 
are assumed to be independent
# within each study. How to perform sensitivity analyses by adding 
different values
# on this within-study correlation between the two response variables?

Gustaf Granath (PhD)
Post doc
Swedish University of Agricultural Sciences
Department of Ecology

More information about the R-sig-mixed-models mailing list