メタアナリシスで、サンプルサイズが最も大きいわけではないのに、weightが最大になるのはおかしくないですか?

という質問を受けた。
結論から言うとおかしくない。メタアナリシスのweight w_iは各研究内の分散v_i と研究間の分散\tauにより
w_i=\frac{1}{v_i}(fixed model の場合)もしくはw_i=\frac{1}{v_i+\tau}(random effect model の場合)
で決まるから、分散が小さい、すなわち推定精度の高い研究はweight が大きくなる。サンプルサイズが大きいと推定精度が増すので、サンプルサイズが大きいことがweight を大きくする要因だが、分散がそもそも小さいことも重要である。

とあるメタアナリシスで、サンプルサイズが114+115のKienast という研究(29%)より、サンプルサイズが33+23のBaudoという研究(57%)のほうがweight が大きい。
f:id:MikuHatsune:20210318132522p:plain

Baudo の研究だけ取り出してみると、分割表は
\begin{matrix}23&10\\20&3\end{matrix}
であるが、周辺度数を固定したときに、この分割表の取りうる運命は、\Delta を変動させて
\begin{matrix}23+\Delta&10-\Delta\\20-\Delta&3+\Delta\end{matrix}
となる。
\Deltaを変動させて、そのときの分割表のMH検定を行い、信頼区間の幅を見てみると、\Delta=-2のときに信頼区間の幅が最小になる。すなわち、推定の精度がよいことになる。
f:id:MikuHatsune:20210318132535p:plain

すべての\Delta の取りうる範囲が、各々メタアナリシスに組み入れられた研究だと仮定して、それら全体をメタアナリシスしてみる。確かに、信頼区間の幅の狭い\Delta=2などの研究が、weight が大きい、ということになっている。
f:id:MikuHatsune:20210318132730p:plain

library(meta)
library(epiR)
library(latex2exp)
# 元のデータ
dat <- cbind.data.frame(
   author=c("Baudo", "Fourrier", "Gando", "Inthom", "Kienast"),
   year=c(1998, 1993, 2013, 1997, 2006),
   ev.exp=c(23, 4, 3, 3, 29),
   n.exp=c(33, 17, 30, 7, 114),
   ev.cont=c(20, 9, 4, 7, 46),
   n.cont=c(23, 18, 30 ,7, 115)
   )

cols <- replace(rep("black", nrow(dat)), dat$author=="Baudo", "blue")

m <- metabin(ev.exp, n.exp, ev.cont, n.cont,
             method="Inverse",
             data=dat, studlab = paste(author, year),
             label.e="Antithrombin", label.c="Control",
             label.right="Favours Control", col.label.right="red",
             label.left = "Favours Antithrombin", col.label.left="blue")

forest(m, col.study=cols, layout="RevMan5", comb.fixed=FALSE)

# Gando に着目する
i <- 1
b <- rbind(c(dat[i, "ev.exp"], dat[i, "n.exp"]-dat[i, "ev.exp"]),
           c(dat[i, "ev.cont"], dat[i, "n.cont"]-dat[i, "ev.cont"]))

# MH test
A <- matrix(c(1, -1, -1, 1), 2)
r <- epi.2by2(b, method="cohort.count")
r$massoc$RR.strata.taylor

# Delta をすべて動かして検定する
x <- (-sort(b)[1]):(sort(b)[2])
bs <- mapply(function(z) b + A*z, x, SIMPLIFY=F)
r <- mapply(function(z) try(unlist(epi.2by2(z)$massoc$RR.strata.taylor)), bs, SIMPLIFY=FALSE)
g <- t(mapply(function(z) switch(any((is(z)%in%"try-error"))+1, z, rep(NA, 3)), r))
g <- matrix(unlist(g), nrow(g))
colnames(g) <- c("RR", "CI lower", "CI upper")

cols <- c("black", "blue", "red")
txt <- mapply(function(z, w) substitute(x~y~Delta, list(x=z, y=w)), c(b), c("+", "-", "-", "+"))
matplot(x, g, type="o", pch=15, lty=1, xlab=expression(Delta), ylab="RR", col=cols, lwd=3, log="y")
legend("topleft", legend=colnames(g), col=cols, lty=1, lwd=3)
legend("bottomright", legend=sapply(txt, as.expression), ncol=2)

# すべてのDelta に対応する分割表が各研究だとみなしてメタアナリシスする
bs1 <- sapply(bs, c)
bs0 <- cbind(bs1[1,], bs1[1,]+bs1[3,], bs1[2,], bs1[2,]+bs1[4,])
colnames(bs0) <- tail(colnames(dat), 4)
bs0 <- cbind.data.frame(year=x, bs0)
m <- metabin(ev.exp, n.exp, ev.cont, n.cont,
             method="Inverse",
             data=bs0, studlab=year,
             label.e="Antithrombin", label.c="Control",
             label.right="Favours Control", col.label.right="red",
             label.left = "Favours Antithrombin", col.label.left="blue",
             )

forest(m, layout="RevMan5", comb.fixed=FALSE)