如何计算荟萃分析中合并奇数比的置信区间?

机器算法验证 置信区间 荟萃分析 遗传学 优势比
2022-03-16 10:08:24

我有两个来自全基因组关联研究的数据集。唯一可用的信息是每个基因分型 SNP 的奇数比及其置信区间 (95%)。我想生成一个比较这两个优势比的森林图,但我找不到计算组合置信区间以可视化汇总效果的方法。我使用程序PLINK使用固定效应执行荟萃分析,但程序没有显示这些置信区间。

  • 如何计算这样的置信区间?

可用的数据是:

  • 每项研究的奇数比,
  • 95% 置信区间和
  • 标准错误。
4个回答

在优势比的大多数荟萃分析中,标准误差基于对数优势比那么,您是否碰巧知道您的是如何估算的(以及它们反映的指标是什么?)?鉴于基于,则可以轻松计算合并标准误差(在固定效应模型下)。首先,让我们计算每个效应大小的权重:其次,合并标准误差是此外,让seilog(ORi)seiORlog(OR)seilog(ORi)wi=1sei2seFEM=1wlog(ORFEM)是共同效应(固定效应模型)。然后,("pooled") 95% 置信区间为log(ORFEM)±1.96seFEM

更新

由于 BIBB 友好地提供了数据,我能够在 R 中运行“完整”元分析。

library(meta)
or <- c(0.75, 0.85)
se <- c(0.0937, 0.1029)
logor <- log(or)
(or.fem <- metagen(logor, se, sm = "OR"))

> (or.fem <- metagen(logor, se, sm = "OR"))
    OR            95%-CI %W(fixed) %W(random)
1 0.75  [0.6242; 0.9012]     54.67      54.67
2 0.85  [0.6948; 1.0399]     45.33      45.33

Number of trials combined: 2 

                         OR           95%-CI       z  p.value
Fixed effect model   0.7938  [0.693; 0.9092] -3.3335   0.0009
Random effects model 0.7938  [0.693; 0.9092] -3.3335   0.0009

Quantifying heterogeneity:
tau^2 < 0.0001; H = 1; I^2 = 0%

Test of heterogeneity:
    Q d.f.  p.value
 0.81    1   0.3685

Method: Inverse variance method

参考

参见例如Lipsey/Wilson (2001: 114)

实际上,您可以使用专门为 GWA 环境中的元分析设计的METAL等软件。

plink 没有给出置信区间很尴尬。但是,您可以获得 CI,因为您有最终的 OR(取)和值(因此是)以获得固定效果。log(OR)pz

Bernd 的方法更加精确。

请注意,我会更担心效果方向,因为看起来您只有每项研究的摘要统计数据,但无法确定哪个是 OR 等位基因。除非你知道它是在同一个等位基因上完成的。

基督教

这是一条评论(没有足够的代表点数)。如果您知道每项研究中的样本量(#cases 和 #controls)以及 SNP 的优势比,您可以通过 a/b(其中 a 和 b 是两个等位基因)重建 2x2 病例/对照表两项研究中的每一项。然后,您可以将这些计数相加以获得元研究表,并使用它来计算组合的优势比和置信区间。

以下是在 PLINK 中获取用于元分析的 CI 的代码:

getCI = function(mn1, se1, method){
    remov = c(0, NA)
    mn    = mn1[! mn1 %in% remov]
    se    = se1[! mn1 %in% remov]
    vars  <- se^2
    vwts  <- 1/vars

    fixedsumm <- sum(vwts * mn)/sum(vwts)
    Q         <- sum(((mn - fixedsumm)^2)/vars)
    df        <- length(mn) - 1
    tau2      <- max(0, (Q - df)/(sum(vwts) - sum(vwts^2)/sum(vwts)) )

    if (method == "fixed"){ wt <- 1/vars } else { wt <- 1/(vars + tau2) }

    summ <- sum(wt * mn)/sum(wt)
    if (method == "fixed") 
         varsum <- sum(wt * wt * vars)/(sum(wt)^2)
    else varsum <- sum(wt * wt * (vars + tau2))/(sum(wt)^2)

    summtest   <- summ/sqrt(varsum)
    df         <- length(vars) - 1
    se.summary <- sqrt(varsum)
    pval       = 1 - pchisq(summtest^2,1)
    pvalhet    = 1 - pchisq(Q, df)
    L95        = summ - 1.96*se.summary
    U95        = summ + 1.96*se.summary
    # out = c(round(c(summ,L95,U95),2), format(pval,scientific=TRUE), pvalhet)   
    # c("OR","L95","U95","p","ph")
    # return(out)

    out = c(paste(round(summ,3), ' [', round(L95,3), ', ', round(U95,3), ']', sep=""),
            format(pval, scientific=TRUE), round(pvalhet,3))
    # c("OR","L95","U95","p","ph")
    return(out)
}

调用 R 函数:

getCI(log(plinkORs), plinkSEs)