[R-meta] Vairance-Covariance Matrix with Shared Control Group

Viechtbauer, Wolfgang (SP) wo||g@ng@v|echtb@uer @end|ng |rom m@@@tr|chtun|ver@|ty@n|
Thu Mar 3 09:43:23 CET 2022


Hi Arthur,

1) Yes, when you specify w1 and w2, then these will be used to compute a more accurate value of the correlation that is induced by the shared control group/condition.

2) Yes, using the size of the two groups/conditions is pretty good. The most accurate thing to do is to use the weights corresponding to the arm-based outcomes. Let me illustrate this.

############################################################

# say you have these data; this is the same data as used here: 
# https://www.metafor-project.org/doku.php/analyses:gleser2009#dichotomous_response_variable

dat <- data.frame(study=c(1,1,2,3,3,3), trt=c(1,2,1,1,2,3), ctrl=0,
                  ai=c( 40, 40, 10,150,150,150), n1i=c(1000,1000,200,2000,2000,2000),
                  ci=c(100,150, 15, 40, 80, 50), n2i=c(4000,4000,400,1000,1000,1000))
dat$pti <- with(dat, ci / n2i)
dat$pci <- with(dat, ai / n1i)

dat <- escalc(measure="RR", ai=ai, ci=ci, n1i=n1i, n2i=n2i, data=dat)
dat

# note: ai and n1i are the data for the control group, ci and n2i for the treatment groups

# as discussed by Gleser & Olkin (2009), we can construct the var-cov matrix of the log
# risk ratios as follows

calc.v <- function(x) {
   v <- matrix((1-x$pci[1])/(x$n1i[1]*x$pci[1]), nrow=nrow(x), ncol=nrow(x))
   diag(v) <- x$vi
   v
}
 
V <- bldiag(lapply(split(dat, dat$study), calc.v))
cov2cor(V) # examing the correlation matrix

# now let's use vcalc() for this

V <- vcalc(vi, cluster=study, grp1=ctrl, grp2=trt, data=dat)
cov2cor(V)

# not quite right since we get 0.5 for the correlations

# now let's use the group sizes as weights

V <- vcalc(vi, cluster=study, grp1=ctrl, grp2=trt, w1=n1i, w2=n2i, data=dat)
cov2cor(V)

# closer (and good enough I would say)

# compute the log proportions for the control and treatment groups

dat <- escalc(measure="PLN", xi=ai, ni=n1i, data=dat, var.names=c("yc","vc"))
dat <- escalc(measure="PLN", xi=ci, ni=n2i, data=dat, var.names=c("yt","vt"))
dat

# use the weights (inverse sampling variances) of these arm-based outcomes

V <- vcalc(vi, cluster=study, grp1=ctrl, grp2=trt, w1=1/vc, w2=1/vt, data=dat)
cov2cor(V)

# exactly the same as what we with calc.v() above

############################################################

Using the group sizes is probably good enough in most cases, I would say.

As for 'rho' - this has nothing to do with the shared groups. The rho in that last example (dat.knapp2017) is specified for studies where the same groups were examined under varying conditions.

I hope this answers your questions.

Best,
Wolfgang

>-----Original Message-----
>From: R-sig-meta-analysis [mailto:r-sig-meta-analysis-bounces using r-project.org] On
>Behalf Of Arthur Albuquerque
>Sent: Thursday, 03 March, 2022 4:14
>To: r-sig-meta-analysis using r-project.org
>Subject: [R-meta] Vairance-Covariance Matrix with Shared Control Group
>
>Hi all,
>
>I have a couple of questions about using metafor::vcalc() to create a variance-
>covariance matrix when many effect sizes reflect the difference between two
>conditions and there is a shared control group.
>
> According to its documentation
>(https://wviechtb.github.io/metafor/reference/vcalc.html), in "Details", topic 5,
>"The degree of correlation between two contrast-type effect sizes that is induced
>by the use of a shared condition is a function of the size of the groups involved
>in the computation of the two effect sizes... By default, the group sizes
>(weights) are assumed to be identical across conditions, which implies a
>correlation of 0.5. If the group sizes (weights) are known, they can be specified
>via arguments w1 and w2.".
>
> I would like to confirm:
>
> 1 - Is the actual correlation automatically calculated when arguments 'w1' and
>'w2' are specified?
>
> 2 - Can one use the number of subjects in each condition for 'w1' and 'w2'?
>
>While looking for these answers, I saw the last example in the documentation with
>metadat::dat.knapp2017. If I understood correctly, the correlation is pre-
>specified through 'rho' and, at the same time, 'w1' and 'w2' are also specified:
>
> V <- vcalc(vi, cluster=study, grp1=group1, grp2=group2, w1=n_sz, w2=n_hc,
> obs=task.diff, rho=R, data=dat)
>
>'n_sz' and 'n_hc' correspond to the numbers of patients in each group, which
>means that the answer to my second question above would be a "Yes". Is that it?
>
>About my first question, if the answer is also "Yes", why were 'w1', 'w2', and
>'rho’ specified at the same time? Instead, if the answer is "No", what am I
>missing here?
>
>Thank you in advance!
>
>Arthur M. Albuquerque
>
>Medical student
>Universidade Federal do Rio de Janeiro, Brazil


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