Meta-Analysen und Netzwerk-Meta-Analysen in WinBUGS
Sibylle Sturtz
Institut für Qualität und Wirtschaftlichkeit im Gesundheitswesen (IQWiG)
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 2
WinBUGS
BUGS (Bayesian inference Using Gibbs Sampling) Flexible Software für Bayesianische Analysen komplexer statistischerModelle unter Verwendung von MCMC MethodenProjekt wurde 1989 begonnen, aktuelle Version WinBUGS 1.4.3Erhältlich unter
http://www.mrc-bsu.cam.ac.uk/bugs
Lunn et al. (2000)
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 3
WinBUGS Examples Vol. I: Blocker: random effects meta-analysis of clinical trials
22 trials of beta-blockers to prevent mortality after myocardialinfarction
Carlin(1992)
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 4
riC ~ Binomial(pi
C, niC)
riT ~ Binomial(pi
T, niT)
logit(piC) = mui
logit(piT) = mui + di
di ~ Normal(d, σ2)
ri outcomeni number of patientsT treatmentC control
Random effects modelfor study i with control C and treatment T
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 5
riC ~ Binomial(pi
C, niC)
riT ~ Binomial(pi
T, niT)
logit(piC) = mui
logit(piT) = mui + di
di ~ Normal(d, σ2)
ri outcomeni number of patientsT treatmentC control
model{for(i in 1:Num)
{rc[i] ~ dbin(pc[i], nc[i])rt[i] ~ dbin(pt[i], nt[i])logit(pc[i]) <- mu[i]logit(pt[i]) <- mu[i] + delta[i]delta[i] ~ dnorm(d,tau)mu[i] ~ dnorm(0, 0.00001)
}d ~ dnorm(0, 0.000001)tau ~ 1/(sigma*sigma)sigma ~ dunif(0,10)delta.new ~ dnorm(d,tau)
}
Random effects modelfor study i with control C and treatment T
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 6
riC ~ Binomial(pi
C, niC)
riT ~ Binomial(pi
T, niT)
logit(piC) = mui
logit(piT) = mui + di
di ~ Normal(d, σ2)
ri outcomeni number of patientsT treatmentC control
model{for(i in 1:Num)
{rc[i] ~ dbin(pc[i], nc[i])rt[i] ~ dbin(pt[i], nt[i])logit(pc[i]) <- mu[i]logit(pt[i]) <- mu[i] + delta[i]delta[i] ~ dnorm(d,tau)mu[i] ~ dnorm(0, 0.00001)
}d ~ dnorm(0, 0.000001)tau ~ 1/(sigma*sigma)sigma ~ dunif(0,10)delta.new ~ dnorm(d,tau)
}predictive distr for effect dnew in new trial
Random effects modelfor study i with control C and treatment T
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 7
model{for(i in 1:Num){
rc[i]~dbin(pc[i], nc[i])rt[i]~dbin(pt[i], nt[i])logit(pc[i])<-mu[i]logit(pt[i])<-mu[i]+delta[i]delta[i] ~ dnorm(d,tau)mu[i] ~ dnorm(0, 0.00001)
}d ~ dnorm(0, 0.000001)tau <- 1/(sigma*sigma)sigma ~ dunif(0,10)delta.new ~ dnorm(d,tau)
}
Random effects model
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 8
Daten in WinBUGS
Alle Variablen werden in einer Liste list(…) angegeben mitZahlen name = zahlVektoren vector = c(…)Matrizen matrix = structure(.Data=c(…), .Dim=c(i,j))Arrays array = structure(.Data=c(…), .Dim=c(i,j,k))
Alternativ im rectangular formatrc[] nc[] rt[] nc[]3 38 3 39.....22 680 39 674END
Alle Variablen müssen spezifiziert werden, auch wenn sie im Model nicht verwendet werdenFehlende Werte: NA
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 9
Daten in WinBUGS
list(rt = c(3,7,5,102,28,4,98,60,25,138,64,45,9,57,25,33,28,8,6,32, 27,22),
nt = c(38,114,69,1533,355,59,945,632,278,1916,873,263,291,858,154,207,251,151,174,209,391,680),
rc = c(3,14,11,127,27,6,152,48,37,188, 52,47,16,45,31,38,12,6,3,40, 43,39),
nc = c(39,116,93,1520,365,52,939,471,282,1921, 583,266,293,883,147,213,122,154,134,218, 364,674),
Num = 22)
model{for(i in 1:Num){
rc[i]~dbin(pc[i], nc[i])rt[i]~dbin(pt[i], nt[i])logit(pc[i])<-mu[i]logit(pt[i])<-mu[i]+delta[i]delta[i] ~ dnorm(d,tau)mu[i] ~ dnorm(0, 0.00001)
}d ~ dnorm(0, 0.000001)tau <- 1/(sigma*sigma)sigma ~ dunif(0,10)delta.new ~ dnorm(d,tau)
}
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 10
Startwerte für die Markovketten
Inits 1list(delta = c(0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0),
mu = c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
d = 0,sigma = 1,delta.new = 0)
Inits 2list(delta = c(1,1,1,...,1,1),
mu = c(1,1,1,...,1,1), d = 1, sigma = 5, delta.new = -1)
model{for(i in 1:Num){
rc[i]~dbin(pc[i], nc[i])rt[i]~dbin(pt[i], nt[i])logit(pc[i])<-mu[i]logit(pt[i])<-mu[i]+delta[i]delta[i] ~ dnorm(d,tau)mu[i] ~ dnorm(0, 0.00001)
}d ~ dnorm(0, 0.000001)tau <- 1/(sigma*sigma)sigma ~ dunif(0,10)delta.new ~ dnorm(d,tau)
}
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 11
Model Daten
Inits
Anzahl der Ketten
Kompilieren
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 12
update for burn-in
set monitor tools
update for posterior distr.
check convergence/ summarystats
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 13
obtain results("*" für alle Knoten gleichzeitig)
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 14
WinBUGS 1.4.3:Ständiges Klicken notwendig
R2WinBUGS:Verwendet die Script Sprache von WinBUGS
check('C:/Programme/R/MAmodel.odc')data('C:/Programme/R/data.txt')compile(2)inits(1, 'C:/Programme/R/inits1.txt')inits(2, 'C:/Programme/R/inits2.txt')gen.inits()thin.updater(1)update(1000)set(d)set(sigma)set(delta.new)update(10000)stats(*)
Sturtz et al.(2005)
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 15
Installation und Laden des Paketes:R> install.packages("R2WinBUGS")R> library(R2WinBUGS)
Daten in R:either a named list or a vector or list of the names of the data objects, e.g.:R> rt <- c(3,7,5,102,28,...,27,22),R> nt <- c(38,114,69,1533,...,391,680),R> rc <- c(3,14,11,127,...,43,39),R> nc <- c(39,116,93,1520,...,364,674),R> Num <- 22R> data <- list("rt", "nt", "rc", "nc", "Num")
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 16
Initial Values:a list with 'n.chains' elements; each element of the list is itself a list of starting values, or a function creating initial values, e.g.:
R> inits1 <- list(delta = rep(0, Num), mu = rep(0, Num),+ d = 0, sigma = 1, delta.new = 0) R> inits2 <- list(...)R> inits <- list(inits1, inits2)
R> initfoo <- function() {+ list(+ delta = rnorm(Num, mean = 0, sd = 1),+ mu = rnorm(Num, mean = 0, sd = 1),+ d = rnorm(1, mean=0, sd = 1), + sigma = dunif(1, min = 0, max = 10),+ delta.new = rnorm(1, mean = 0, sd = 5))+ }
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 17
Parameters to be monitored:character vector of the names
R> parameters <- c("d", "delta.new", "sigma")
Calling WinBUGS (default):R> bugs(data, inits, parameters.to.save,
model.file = "model.bug", n.chains = 3, n.iter = 2000, # includes burn-in!n.burnin = floor(n.iter/2), n.thin = max(1, floor(n.chains*(n.iter-n.burnin)/1000)), bin = (n.iter - n.burnin) / n.thin, # saving in betweendebug = FALSE, # close WinBUGS automatically?DIC = TRUE, digits = 5, codaPkg = FALSE, # read output automatically?bugs.directory = "c:/Program Files/WinBUGS14/",program=c("WinBUGS", "OpenBUGS", "winbugs", "openbugs"),working.directory = NULL, clearWD = FALSE) # deleting files when WinBUGS
# has finished
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 18
Output Analysis (1):
read in automatically (codaPkg = FALSE)
• produces estimates for each sample (mean, sd, quantiles)
• plots a quick summary of inference and convergence & shows inferences for each set of parameters
• iterations are available
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 19
Output Analysis (2):
use the coda package (codaPkg = TRUE)
• much more flexible
• trace plots, prob. density functions, summary statistics,…
• see Plummer et al. (2006)
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 20
WinBUGS 1.4.3: Ständiges Klicken notwendig
R2WinBUGSVerwendet die Scriptsprache von WinBUGS
Basiert auf dem Austausch von TextdateienEin automatisierter interaktiver Prozess ist nicht möglich
BRugs Thomas et al.(2006)
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 21
BRugs enthält:• OpenBUGS• Funktionen die die Funktionalität von OpenBUGS innerhalb von R reproduzieren
• Funktionen zur Datenaufbereitung und schreiben von Dateien aus R2WinBUGS
• Model, Daten & Inits müssen als Dateien verfügbar sein, BRugs stellt aber Funktionen dafür bereit: writeModel(), bugsData(), bugsInits()
Installation und Laden des Paketes:R> install.packages("BRugs")R> library(BRugs)
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 22
Vorgehen analog zu WinBUGScheck the model file
R> modelCheck("model_MA.txt") # Datei liegt im getwd()
load data:R> modelData("data_MA.txt")ORR> modelData(bugsData(data)) # bugsData writes a file
# "data.txt"
compile the modelR> modelCompile(numChains=2)
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 23
load initsby file
R> modelInits("inits1.txt") # seperat für jede Kette
by a function
R> initfoo <- function() {+ list(+ delta = rnorm(Num, mean = 0, sd = 1),+ mu = rnorm(Num, mean = 0, sd = 1),+ d = rnorm(1, mean=0, sd = 1), + sigma = dunif(1, min = 0, max = 10),+ delta.new = rnorm(1, mean = 0, sd = 5))+ }R> modelInits(bugsInits(initfoo))
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 24
update the modelR> modelUpdate(1000, thin=1)
set sample monitor toolR> samplesSet(c("d", "delta.new", "sigma"))
some more updatesR> modelUpdate(10000)
output analysisR> samplesStats("*")
mean sd MC_error val2.5pc median val97.5pc start sampled -0.2398 0.06886 0.003059 -0.37500 -0.2376 -0.1092 1001 20000delta.new -0.2391 0.18180 0.003220 -0.62180 -0.2330 0.1351 1001 20000sigma 0.1485 0.07917 0.004118 0.01709 0.1406 0.3201 1001 20000
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 25
einige weitere Funktionen:• dicSet()/ dicStats() # DIC
• samplesHistory() # plots trace of a variable
• samplesDensity() # plots density/histogram
• samplesBgr() # BGR convergence diagnostic
• samplesAutoC() # plots autocorrelation fnct.
• samplesSample() # stored samples
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 26
Netzwerk Meta-AnalysenIndirect comparison: IC Effect of intervention C relative to B: dBC = dAC − dAB
Mixed treatment comparison (MTC) meta-analysis(also: multiple treatment meta-analysis, network meta-analysis)
Caldwell et al. 2005, Lu & Ades 2006
A
CB
A
CB
IC MTC
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 27
Models for MTC: Basic & Functional Parameters
Take A as reference treatmentTreatment effects of B,C,D relative to A:
basic parameters mit priors
remaining contrasts: functional parameters
A
CB
DAkd ~ N(0,10000) k = B,C,D
BC AC AB
BD AD AB
CD AD AC
d = d - dd = d - dd = d - d
Lu & Ades 2006
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 28
MTC: Random Effects Model
jk jk jkr ~ Bin(p ,n )
Ak
jb
d ~ N(0,10000) k = B,C,Dμ ~ N(0,10000) A
CB
D
functional p.basic p.
jbjk
jb jbk
μ b = A,B,C für k = b logit(p ) =
μ +δ für k 'nach' b ⎧⎪⎨⎪⎩
2 2jbk bk Ak Abδ ~ N(d ,σ ) ~ N(d - d , σ )
For intervention k in study j:
μjb: study specific effects of b
Lu & Ades 2006
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 29
Daten für MTC-Analyse
r[,1] n[,1] r[,2] n[,2] r[,3] n[,3] t[,1] t[,2] t[,3] na[]Studie1 74 132 69 136 NA 1 trt1 trt2 NA 2Studie2 86 156 56 159 NA 1 trt1 trt2 NA 2Studie3 62 123 48 136 NA 1 trt1 trt2 trt3 3Studie4 75 121 33 115 70 120 trt1 trt2 trt3 3...Studie j 33 68 24 66 36 67 trt1 trt2 trt4 3Studie j+1 44 86 27 88 30 87 trt1 trt3 trt4 3
r[j,k] outcomen[j,k] number of patientst[j,k] treatmentna[j] number of arms
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 30
model{for(i in 1:NS){w[i,1] <- 0delta[i,t[i,1]] <- 0mu[i] ~ dnorm(0,.001) for (k in 1:na[i]){r[i,k] ~ dbin(p[i,t[i,k]],n[i,k]) logit(p[i,t[i,k]])<-mu[i] + delta[i,t[i,k]]}
for (k in 2:na[i]){delta[i,t[i,k]] ~ dnorm(md[i,t[i,k]],taud[i,t[i,k]]) md[i,t[i,k]] <- d[t[i,k]] - d[t[i,1]] + sw[i,k] taud[i,t[i,k]] <- tau *2*(k-1)/k w[i,k] <- (delta[i,t[i,k]] - d[t[i,k]] + d[t[i,1]]) # adjustment, multi-arm RCTssw[i,k] <- sum(w[i,1:k-1])/(k-1) }
}d[1] <- 0for (k in 2:NT) {d[k] ~ dnorm(0,.001) }
sigma ~ dunif(0.00001,2) tau <- 1/(sigma*sigma)
}}
model{for(i in 1:Num){rc[i]~dbin(pc[i], nc[i])rt[i]~dbin(pt[i], nt[i])logit(pc[i])<-mu[i]logit(pt[i])<-mu[i]+delta[i]delta[i] ~ dnorm(d,tau)mu[i] ~ dnorm(0, 0.00001)
}d ~ dnorm(0, 0.000001)tau <- 1/(sigma*sigma)sigma ~ dunif(0,10)
}
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 31
Vorgehen analog zur Meta-Analyse
library(BRugs)modelCheck("model_MTC.txt") # check model filemodelData("data_MTC.txt") # read data filemodelCompile(numChains = 2) # compile model with 2 chainsmodelInits("inits1.txt") # read init data filemodelInits("inits2.txt")modelGenInits()modelUpdate(100000) # burn insamplesSet(c("d", "tau", "sigma")) # variables to be monitoreddicSet()modelUpdate(50000) # more iterations ....dicStats()
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 32
Zusammenfassung
WinBUGS flexible Software zur Modellierung komplexer Modelle unter Verwendung von MCMC MethodenErstes Aufstellen des Modelles in WinBUGS sinnvoll, automatisiertes Arbeiten wird durch die Einbindung in R erleichtertArbeit mit MCMC Methoden erfordert Kenntnis der Methoden und Überprüfung der Modelannahmen bgzl priors, Startwerten, Länge der Markovketten
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 33
LiteraturCarlin JB (1992): Meta-analysis for 2 x 2 tables: a Bayesian approach. Stat Med. 1992 141-158.Lu G, Ades AE (2006): Assessing evidence inconsistency in mixed treatmentcomparisons. Journal of the American Statistical Association 101, 447-459.Lunn DJ, Thomas A, Best N, Spiegelhalter D. (2000) WinBUGS - a Bayesian modellingframework: concepts, structure, and extensibility. Statistics and Computing, 325-337.Plummer M, Best N, Cowles K, Vines K (2006): Convergence diagnostics and output analysis for MCMC, R-News 1/6, 7-11. Sturtz S, Ligges U, Gelman A (2005): R2WinBUGS: A package for running WinBUGSfrom R. Journal of Statistical Software 12/3,1-16.Thomas A, O’Hara B, Ligges U, Sturtz S (2006): Making BUGS Open, R-News 6/1, 12-17.
Sturtz: Meta-Analysen und Netzwerk- Meta-Analysen in WinBUGS 34
Institut für Qualität und Wirtschaftlichkeit im Gesundheitswesen (IQWiG)
Dillenburger Straße 27D-51105 Köln
Telefon +49-221/3 56 85-0Telefax +49-221/3 56 85-1