Come calcolare gli intervalli di confidenza per i rapporti dispari raggruppati nella meta-analisi?


9

Ho due set di dati provenienti da studi di associazione su tutto il genoma. Le uniche informazioni disponibili sono i rapporti dispari e i loro intervalli di confidenza (95%) per ciascun SNP genotipizzato. Voglio generare un diagramma forestale confrontando questi due rapporti di probabilità, ma non riesco a trovare il modo di calcolare gli intervalli di confidenza combinati per visualizzare gli effetti di riepilogo. Ho usato il programma PLINK per eseguire la meta-analisi usando effetti fissi, ma il programma non ha mostrato questi intervalli di confidenza.

  • Come posso calcolare tali intervalli di confidenza?

I dati disponibili sono:

  • Rapporti dispari per ogni studio,
  • Intervalli di confidenza al 95% e
  • Errori standard.

Risposte:


10

Nella maggior parte delle meta-analisi dei rapporti di probabilità, gli errori standard si basano sul registro dei rapporti di probabilità . Quindi, ti capita di sapere come sono stati stimati i tuoi (e quali metriche riflettono? o )? Dato che i si basano sul , è possibile calcolare facilmente l'errore standard in pool (in un modello a effetti fissi). Innanzitutto, calcoliamo i pesi per ciascuna dimensione di effetto: . In secondo luogo, l'errore standard in pool è . Inoltre, consenti ilseilog(ORi)seiORlog(OR)seilog(ORi)wi=1sei2 log(ORFEM)log(ORFEM)±1.96seFEMseFEM=1wlog(ORFEM)essere l'effetto comune (modello a effetto fisso). Quindi, l'intervallo di confidenza al 95% ("raggruppato") è .log(ORFEM)±1.96seFEM

Aggiornare

Dato che BIBB ha gentilmente fornito i dati, sono in grado di eseguire la metanalisi "completa" in 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

Riferimenti

Vedi, ad esempio, Lipsey / Wilson (2001: 114)


Molte grazie per la tua risposta. Gli errori standard si basano sul log naturale di OR Ln (ORi). Per prima cosa calcolo i pesi per SE1 (0.0937) = 10.67 e per SE2 (0.1029) = 9.71. Quindi la SE calcolata sotto FEM è = 0,2215. L'OR raggruppato per questi SNP è = 0,7645, quindi gli intervalli di confidenza al 95% sono = (0,515-1,228). Sono corretto ??, se lo faccio, sono preoccupato perché quando confronto tutti i risultati in un diagramma di foresta, gli intervalli combinati sono troppo grandi rispetto agli originali in ogni studio = studio 1 = IC al 95% (0,63-0,91) OPPURE = 0,75, studio 2 IC al 95% (0,69-1,04) OPPURE = 0,85. Va tutto bene ?. Grazie
BIBB,

No, sfortunatamente no. Nota che la mia formula per era sbagliata, è non . Come puoi vedere, l'IC del 95% "raggruppato" è [0,693; 0,9092]. Mi chiedo anche perché il tuo pool OR sia diverso (0,7645 vs 0,7938). Scusa, devo andare, ma ci torno domani ...1 / ( s e 2 ) 1 / s ew1/(se2)1/se
Bernd Weiss,

Grazie mille !!!, quel risultato è più coerente del mio. Il pool OR che ti do è stato nell'output PLINK ... ora sono molto preoccupato per tutti i miei risultati di meta-analisi ... Meglio usare R.
BIBB

Ho incluso un link al libro di Lipsey / Wilson "Pratica meta-analisi" (vedi Riferimenti). Sono un po 'preoccupato che PLINK e i miei risultati siano diversi. Sai quale metodologia di meta-analisi usano? Dovresti anche tener conto del fatto che non ho assolutamente idea di "studi di associazione a livello del genoma".
Bernd Weiss,

Grazie per la soluzione, mi chiedo se posso applicare il metodo meta-analisi al mio problema. Quello che faccio è simulare una regressione inducendo un po 'di rumore. Eseguo l'analisi n volte (diciamo che n è 500) e ottengo n OR e CI. Ecco il link alla domanda: stats.stackexchange.com/questions/206042/… . Quindi posso implementare la funzione "metagen" invocando ogni log OR e std errs. Viene introdotto un pregiudizio con valori maggiori din
lukeg l'

3

In realtà, è possibile utilizzare software come METAL che è specificamente progettato per meta-analisi in contesto GWA.

È strano che il plink non dia l'intervallo di confidenza. Tuttavia, è possibile ottenere l' elemento della configurazione perché si dispone dell'OR finale (take ) e del -value (da cui ) per l'effetto fisso.p zlog(OR)pz

Il metodo di Bernd è ancora più preciso.

Fai attenzione che sarei più preoccupato per la direzione dell'effetto in quanto sembra che tu abbia solo statistiche riassuntive per ogni studio, ma nulla di sicuro su quale sia l'allele OR. A meno che tu non sappia che è fatto sullo stesso allele.

cristiano


0

Questo è un commento (non hai abbastanza punti rep.). Se conosci la dimensione del campione (#case e #controls) in ogni studio e il rapporto di probabilità per un SNP, puoi ricostruire la tabella 2x2 di case / control con a / b (dove aeb sono i due alleli) per ciascuno dei due studi. Quindi puoi semplicemente aggiungere quei conteggi per ottenere una tabella per il meta-studio e usarlo per calcolare il rapporto di probabilità combinato e gli intervalli di confidenza.


La ringrazio per la risposta. Sfortunatamente, non ho le frequenze o i conteggi degli alleli, gli autori non hanno mostrato questi dati, hanno semplicemente messo gli ID SNP, OR e gli intervalli di confidenza (95%). Ho appena estratto il valore SE da ogni studio, ma ora non li combino (SE o CI) !!!! Aiuto!!
BIBB,

Oh, hai ragione: qui è necessario un ulteriore grado di libertà. Di solito gli autori danno l'allele freq. (a volte sepolto nelle informazioni supp.). Altrimenti, potresti trovarlo da una fonte esterna come hapmap (supponendo che il GWAS sia stato fatto su una popolazione simile). Un'altra idea: l'intervallo di confidenza stesso può dirti l'allq freq. A parità di altre condizioni (dimensione del campione e OR), SNP con frequenza allele bassa. hanno un numero inferiore di corrieri in entrambi i gruppi, quindi un intervallo di confidenza più ampio. Puoi provare diverse frequenze di allele., Calcolare l'intervallo di confidenza per ognuna e ottenere la frequenza di allele. corrispondente a quanto riportato
O Zuk,

Proverò a farlo, ma nel frattempo sono curioso di sapere come PLINK può calcolare l'OR in pool solo con questi parametri: idenitificatore SNP, OR Odds ratio (o BETA, ecc.) Ed errore SE standard di OR (o utente- campo di peso definito). Puoi capire che PLINK non ha chiesto le frequenze degli alleli ... quindi c'è un modo per farlo ...
BIBB

0

Ecco il codice per ottenere elementi della configurazione per meta-analisi come in PLINK:

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)
}

Chiamata alla funzione R:

getCI(log(plinkORs), plinkSEs)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.