Publikacje naukowe · Metaanaliza

Metaanaliza sieciowa krok po kroku – przechodniość, niespójność, ranking SUCRA i przykład w R

Chcesz porównać kilka interwencji, choć nie wszystkie badano ze sobą bezpośrednio? Pokazujemy, jak połączyć dowody bezpośrednie i pośrednie w jednym modelu, sprawdzić przechodniość i niespójność, ostrożnie odczytać ranking SUCRA i opisać sieć według PRISMA-NMA.

Strona główna / Blog / Metaanaliza sieciowa
W skrócie: Metaanaliza sieciowa łączy dowody bezpośrednie i pośrednie o kilku interwencjach w jednym modelu, więc daje oszacowania także dla par, których nikt nie porównał. Warunkiem jest przechodniość: badania różnych porównań muszą być podobne pod względem modyfikatorów efektu. Spójność sprawdzaj lokalnie (dowody bezpośrednie a pośrednie) i globalnie (model projekt × leczenie). Ranking SUCRA podawaj tylko razem z efektami i ich przedziałami ufności, bo bywa bardzo niepewny.

Po co metaanaliza sieciowa

Klasyczna metaanaliza łączy badania porównujące te same dwie interwencje. W wielu dziedzinach pytanie brzmi jednak inaczej: która z kilku dostępnych metod działa najlepiej? Badań porównujących każdą parę bezpośrednio zwykle brakuje. Większość nowych interwencji testuje się z listą oczekujących albo z placebo, a tylko część – ze sobą nawzajem. Metaanaliza sieciowa (ang. network meta-analysis, NMA) łączy w jednym modelu wszystkie porównania tworzące sieć. Dowody bezpośrednie (badania A z B) uzupełnia dowodami pośrednimi (A z C i B z C). Dla każdej pary daje spójne oszacowanie, a dla par bez badań – oszacowanie wyłącznie pośrednie (Salanti, 2012).

Najprostszy przypadek opisali Bucher i in. (1997). Jeśli dAC i dBC to zbiorcze efekty A i B wobec wspólnego komparatora C, efekt pośredni A wobec B wynosi:

dABpośr = dAC − dBC, Var(dABpośr) = Var(dAC) + Var(dBC)

Porównuje się więc efekty względne z poszczególnych badań, a nie surowe ramiona. Takie porównanie zachowuje randomizację w obrębie każdego badania. Zestawienie ramienia A z jednego badania z ramieniem B z innego jest w praktyce porównaniem obserwacyjnym i bywa obciążone (Bucher i in., 1997). Wariancje się sumują, więc pojedyncze porównanie pośrednie jest mniej precyzyjne niż bezpośrednie o tej samej liczbie badań.

Ten wpis zakłada, że znasz zwykłą metaanalizę. Wybór miary efektu, model efektów losowych i heterogeniczność omawia poradnik metaanaliza krok po kroku, efekty zależne – metaanaliza wielopoziomowa, a pojedynczą parę porównań policzysz w kalkulatorze metaanalizy. Tu skupiamy się na tym, co nowe w sieci.

Założenia: przechodniość i spójność

Dowody pośrednie są wiarygodne tylko wtedy, gdy spełnione jest założenie przechodniości (ang. transitivity). Badania różnych porównań muszą być na tyle podobne, że każdego uczestnika sieci można by wylosować do dowolnej z interwencji. Salanti (2012) przedstawia to założenie w kilku równoważnych sformułowaniach. Praktycznie sprowadza się ono do pytania o modyfikatory efektu. Jeśli badania iCBT a listy oczekujących obejmują łagodne przypadki, a badania CBT grupowej a listy oczekujących – ciężkie, porównanie pośrednie iCBT z CBT grupową jest zakłócone (Higgins i in., 2012). Komparator wspólny dla obu zbiorów badań musi też oznaczać to samo. Lista oczekujących w jednym zbiorze i „zwykła opieka” w drugim to dwa różne węzły.

Przechodniości nie da się sprawdzić testem. Ocenia się ją merytorycznie: zestawia rozkłady potencjalnych modyfikatorów efektu (wiek, nasilenie objawów, czas trwania interwencji, ryzyko błędu) w poszczególnych porównaniach. Gdy różnice są wyraźne, pomaga metaregresja (zob. metaregresja i analiza moderatorów) albo zawężenie sieci.

Statystycznym odbiciem przechodniości jest spójność (ang. consistency): dowody bezpośrednie i pośrednie o tym samym porównaniu powinny się zgadzać z dokładnością do błędu losowego. Brak zgodności nazywa się niespójnością. Higgins i in. (2012) odróżniają niespójność pętli (A–B–C) od niespójności projektu, czyli różnic między badaniami dwu- i wieloramiennymi o tych samych porównaniach.

Przykład: cztery interwencje na lęk uogólniony

Symulowany przegląd objął 17 badań randomizowanych (N = 2185) z czterema węzłami: listą oczekujących (WL), CBT grupową (CBTg), internetową CBT z przewodnikiem (iCBT) i treningiem uważności (MBI). Wynik to objawy lęku w GAD-7 po interwencji (0–21 pkt, mniej = lepiej). Wszystkie badania używają tej samej skali, więc miarą efektu jest różnica średnich (MD) w punktach. Przy różnych skalach użyłbyś standaryzowanej różnicy średnich. Dane na poziomie ramion (badanie, leczenie, n, średnia, SD; set.seed(2509)) możesz pobrać jako plik CSV.

Sieć porównań czterech interwencji: lista oczekujących (N = 785) połączona z CBT grupową (5 badań), iCBT (5 badań) i treningiem uważności (4 badania); CBT grupowa z iCBT (3 badania), iCBT z treningiem uważności (2 badania); brak badań CBT grupowej z treningiem uważności; trójkąt oznacza badanie trójramienne
Rysunek 1. Sieć 17 badań. Grubość krawędzi odpowiada liczbie badań z porównaniem bezpośrednim, wielkość węzła – liczbie uczestników. Badanie trójramienne S17 (WL, iCBT, MBI) zaznaczono trójkątem i liczy się w trzech krawędziach. Porównanie CBTg–MBI jest wyłącznie pośrednie. Obliczenia: R (dane symulowane).

Rysunek sieci to pierwszy wynik każdej NMA. Pokazuje, które porównania mają dowody bezpośrednie, gdzie są zamknięte pętle (tylko w nich da się badać spójność) i czy jakiś węzeł wisi na jednym badaniu. Higgins i in. (2012) proponują rysunki, na których badania wieloramienne są wyraźnie zaznaczone, bo nie są zbiorem niezależnych par.

Model kontrastów w metafor::rma.mv

Każde badanie wnosi kontrasty wobec swojego pierwszego ramienia: MD i jej wariancję, czyli sumę wariancji średnich w obu ramionach. Badanie trójramienne daje dwa kontrasty (iCBT − WL i MBI − WL) ze wspólnym ramieniem WL, więc nie są one niezależne. Ich kowariancja równa się wariancji średniej w ramieniu wspólnym. W przykładzie wariancje obu kontrastów wynoszą 0.475 i 0.527, a kowariancja 0.215. Pominięcie jej liczyłoby ramię kontrolne dwa razy.

Model zapisuje każdy kontrast jako różnicę dwóch parametrów podstawowych: efektów CBTg, iCBT i MBI wobec WL. Kontrast iCBT − CBTg ma w macierzy schematu −1 przy CBTg i +1 przy iCBT. To właśnie wymusza spójność. Efekty losowe mają wspólne τ² dla wszystkich porównań i korelację 1/2 między kontrastami tego samego badania, co wynika z założenia jednakowej heterogeniczności wszystkich porównań. Taki model spójności dopasowuje się jako wielowymiarową metaregresję (White i in., 2012). W pakiecie metafor robi to funkcja rma.mv() z macierzą kowariancji V, moderatorami bez wyrazu wolnego i random = ~ porownanie | badanie (Viechtbauer, 2010).

Wyniki (REML): τ² = 0.48 (τ = 0.69 pkt), test resztowej heterogeniczności QE(15) = 25.54, p = .043 (zob. I² i τ²). Wszystkie sześć porównań odczytujesz z trzech parametrów:

Wyniki metaanalizy sieciowej: różnice średnich w GAD-7 dla wszystkich par interwencji z 95% przedziałami ufności i źródłem dowodów
PorównanieMD [95% CI]pDowody bezpośrednie
CBTg vs WL−3.11 [−3.94, −2.27]< .0015 badań
iCBT vs WL−2.46 [−3.21, −1.71]< .0015 badań
MBI vs WL−2.70 [−3.65, −1.75]< .0014 badania
iCBT vs CBTg0.65 [−0.25, 1.55].1573 badania
MBI vs CBTg0.41 [−0.80, 1.62].505brak (tylko pośrednie)
MBI vs iCBT−0.24 [−1.30, 0.82].6572 badania

Wszystkie interwencje zmniejszają objawy wobec listy oczekujących o 2.5–3.1 pkt. Różnice między interwencjami aktywnymi są mniejsze niż 1 pkt i niepewne: każdy z trzech przedziałów ufności obejmuje zero. W publikacji takie zestawienie podaje się zwykle jako tabelę ligową albo wykres lasu wobec wspólnego komparatora. Warto dodać przedziały predykcji, bo przy τ = 0.69 pkt efekt w nowym badaniu może się wyraźnie różnić od średniego.

Niespójność: lokalnie i globalnie

Lokalnie sprawdzasz, czy w konkretnym porównaniu dowody bezpośrednie zgadzają się z pośrednimi. Dias i in. (2010) zaproponowali w tym celu node splitting. Dowody o wybranym porównaniu dzieli się na bezpośrednie (badania tej pary) i pośrednie (reszta sieci), szacuje każdą część osobno i testuje różnicę. W wersji częstościowej dla porównania iCBT–CBTg wystarczą dwa modele: zwykła metaanaliza trzech badań CBTg–iCBT i model sieci bez tych badań. Różnicę ocenia się testem z = różnica / √(SEbezp² + SEpośr²), tak jak u Buchera i in. (1997).

Rozdzielenie dowodów dla porównania iCBT minus CBT grupowa: oszacowanie bezpośrednie, pośrednie i z całej sieci
Źródło (iCBT − CBTg)MD (SE)95% CI
Bezpośrednie (3 badania)0.39 (0.86)[−1.30, 2.09]
Pośrednie (14 badań)0.84 (0.64)[−0.42, 2.11]
Sieć (łącznie)0.65 (0.46)[−0.25, 1.55]

Różnica bezpośrednie − pośrednie wynosi −0.45 pkt, SE = 1.08, z = −0.42, p = .678. Zauważ, że oszacowanie z sieci jest precyzyjniejsze niż każde z osobna. To główna korzyść z NMA, ale tylko przy spójnych dowodach.

Globalnie testujesz całą sieć naraz. Higgins i in. (2012) proponują model interakcji projekt × leczenie, w którym każdy projekt (zestaw porównywanych ramion, np. WL–iCBT–MBI) ma własne efekty. W rma.mv() to model z osobnym parametrem dla każdej pary projekt–porównanie (7 zamiast 3). Oba modele dopasowujesz metodą ML i porównujesz testem ilorazu wiarygodności: χ²(4) = 5.42, p = .247.

Brak istotności nie dowodzi spójności. W przykładzie tylko dwie pętle są zamknięte, a test ma 4 stopnie swobody i małą moc. Zwróć też uwagę, że τ² w modelu niespójności spada z 0.27 do 0.02 (ML). Niespójność i heterogeniczność trudno rozdzielić, gdy na porównanie przypada kilka badań. Dlatego niespójność ocenia się łącznie z oceną przechodniości, a nie samym testem. Przy wielu porównaniach lokalnych rośnie też ryzyko fałszywych alarmów.

Ranking i SUCRA – z ostrożnością

NMA często kończy się rankingiem interwencji. Salanti i in. (2011) pokazali, jak przedstawiać prawdopodobieństwa rang i oceniać rangi łącznie. Najpopularniejszą miarą jest SUCRA (ang. surface under the cumulative ranking curve). To pole pod skumulowaną krzywą rang, od 0 (zawsze ostatnie miejsce) do 1 (zawsze pierwsze). Dla a interwencji SUCRA = Σk=1…a−1 P(ranga ≤ k) / (a − 1).

W modelu częstościowym rozkład rang uzyskasz przez losowanie. Pobierasz 10 000 wektorów parametrów z wielowymiarowego rozkładu normalnego z oszacowaniami i macierzą kowariancji modelu, w każdym losowaniu porządkujesz interwencje, a potem zliczasz rangi. Rücker i Schwarzer (2015) pokazali, że ten sam ranking daje bez losowania P-score, czyli średnia jednostronnych p. W przykładzie obie miary zgadzają się do drugiego miejsca po przecinku.

Prawdopodobieństwa rang z 10 000 losowań: CBT grupowa ranga 1 z prawdopodobieństwem .72, SUCRA .89; trening uważności ranga 1 .24, ranga 2 .44, SUCRA .64; iCBT ranga 1 .04, ranga 3 .63, SUCRA .47
Rysunek 2. Prawdopodobieństwa rang dla trzech interwencji aktywnych (lista oczekujących zajmuje miejsce 4. we wszystkich losowaniach). Obliczenia: R (dane symulowane, 10 000 losowań z rozkładu oszacowań modelu).
Ranking interwencji: różnica średnich wobec listy oczekujących, prawdopodobieństwo pierwszego miejsca, średnia ranga, SUCRA, P-score i 95% przedział rang
InterwencjaMD vs WLP(najlepsza)Średnia rangaSUCRAP-score95% przedział rang
CBTg−3.11.721.33.89.891–3
MBI−2.70.242.08.64.641–3
iCBT−2.46.042.59.47.471–3
WL0.004.00.00.004–4

SUCRA CBTg = .89 wygląda jak mocny wynik, ale różnica CBTg a iCBT nie jest istotna, a CBTg a MBI wynosi 0.41 pkt z przedziałem od −0.80 do 1.62. Przedział rang każdej interwencji aktywnej obejmuje miejsca 1–3. Zwróć też uwagę na MBI: ma prawie sześć razy większą szansę na pierwsze miejsce niż iCBT, choć ich średnie różnią się o 0.24 pkt. Wynika to głównie z mniejszej precyzji: interwencja z mniejszą liczbą danych ma szerszy rozkład, więc częściej trafia na skrajne miejsca. Trinquart i in. (2016) ponownie przeanalizowali 58 sieci. W 28% z nich prawdopodobieństwo, że lider rankingu nie jest najlepszy, wynosiło co najmniej 50%. Rücker i Schwarzer (2015) dodają, że ani SUCRA, ani P-score nie mówią więcej niż przedziały ufności. Ranking podawaj zawsze razem z efektami i ich niepewnością, nigdy zamiast nich. Nie wybieraj też „zwycięzcy” wyłącznie na podstawie SUCRA. Ranking pokazuje porządek oszacowań, a nie wielkość różnic ani pewność danych.

PRISMA-NMA i opis wyników

Przegląd z metaanalizą sieciową raportuje się według rozszerzenia PRISMA-NMA. To lista 32 punktów z przykładami i objaśnieniami (Hutton i in., 2015). Ogólne zasady PRISMA 2020 znajdziesz w haśle przegląd systematyczny i PRISMA i we wpisie wytyczne raportowania. Elementy specyficzne dla sieci to:

  • rysunek sieci z liczbą badań i uczestników, z zaznaczonymi badaniami wieloramiennymi;
  • sposób oceny przechodniości (tabela modyfikatorów efektu według porównań);
  • model (miara efektu, efekty losowe, wspólne τ², obsługa badań wieloramiennych) i oprogramowanie;
  • metody oceny niespójności lokalnej i globalnej oraz ich wyniki;
  • wszystkie porównania parami z CI (tabela ligowa), a ranking tylko jako dodatek, z opisem niepewności;
  • ocena ryzyka błędu, małych badań i pewności dowodów (RoB 2, błąd publikacji, GRADE).

Plan sieci, czyli węzły, sposób ich łączenia i analizy niespójności, wpisz do protokołu i zarejestruj przed analizą. Decyzja, czy „zwykła opieka” i „lista oczekujących” to jeden węzeł, zmienia wyniki.

Przeprowadzono metaanalizę sieciową z efektami losowymi (model kontrastów, REML; pakiet metafor) 17 badań randomizowanych (N = 2185) porównujących CBT grupową, internetową CBT z przewodnikiem i trening uważności z listą oczekujących. Kowariancję kontrastów w badaniu trójramiennym uwzględniono w macierzy wariancji, a dla efektów losowych przyjęto wspólne τ² i korelację 1/2 między kontrastami. Wszystkie interwencje zmniejszały objawy GAD-7 w porównaniu z listą oczekujących: CBT grupowa MD = −3.11 pkt, 95% CI [−3.94, −2.27], iCBT MD = −2.46, 95% CI [−3.21, −1.71], trening uważności MD = −2.70, 95% CI [−3.65, −1.75]. Różnice między interwencjami aktywnymi były małe i nieistotne (np. iCBT vs CBT grupowa MD = 0.65, 95% CI [−0.25, 1.55]). Heterogeniczność między badaniami: τ² = 0.48, Q(15) = 25.54, p = .043. Nie stwierdzono niespójności globalnej (model interakcji projekt × leczenie, χ²(4) = 5.42, p = .247) ani lokalnej dla porównania iCBT–CBT grupowa (z = −0.42, p = .678). Ranking jest niepewny: SUCRA wyniosła .89 dla CBT grupowej, .64 dla treningu uważności i .47 dla iCBT, a 95% przedziały rang każdej interwencji aktywnej obejmowały miejsca 1–3.

Jeśli przygotowujesz przegląd z metaanalizą sieciową do publikacji albo grantu, możemy wspólnie sprawdzić strukturę sieci, model i raport w ramach wsparcia statystycznego dla badaczy.

Przykład reprodukowalny

Przykład w R

Cztery przepisy uruchamiane po kolei w jednej sesji. Pierwszy tworzy dane, zapisuje plik metaanaliza-sieciowa-dane.csv (możesz go pobrać tutaj) i dopasowuje model sieci w pakiecie metafor. Drugi bada niespójność, trzeci liczy ranking. Czwarty powtarza analizę w pakiecie netmeta jako kontrolę.

1. Dane, kontrasty z kowariancją i model sieci

Dane wejściowe: 17 badań, 35 ramion: n, średnia i SD wyniku GAD-7 (dane symulowane, set.seed(2509)).

Co odczytać: liczbę badań w każdym projekcie i uczestników w węzłach, kontrasty z macierzą schematu, kowariancję w badaniu trójramiennym S17, τ², QE, efekty CBTg, iCBT i MBI wobec WL oraz tabelę wszystkich sześciu porównań.

R
# Dane symulowane: 17 badań randomizowanych porównujących interwencje na lęk uogólniony u dorosłych.
# Wynik: GAD-7 po interwencji (0–21, niższy = mniej objawów). Leczenia: WL – lista oczekujących,
# CBTg – CBT grupowa, iCBT – internetowa CBT z przewodnikiem, MBI – trening uważności.
suppressPackageStartupMessages(library(metafor))
set.seed(2509)
leki <- c("WL", "CBTg", "iCBT", "MBI")
d_prawda <- c(WL = 0, CBTg = -3.5, iCBT = -3.0, MBI = -2.2)   # prawdziwe różnice średnich wobec WL
tau <- 0.8                                                     # heterogeniczność między badaniami (pkt)
projekty <- c(rep("WL-CBTg", 5), rep("WL-iCBT", 4), rep("WL-MBI", 3), rep("CBTg-iCBT", 3), "iCBT-MBI", "WL-iCBT-MBI")
ramiona <- do.call(rbind, lapply(seq_along(projekty), function(i) {
  tr <- strsplit(projekty[i], "-")[[1]]; k <- length(tr)
  S <- matrix(tau^2 / 2, k - 1, k - 1); diag(S) <- tau^2      # efekty losowe ramion, korelacja 1/2
  delta <- c(0, d_prawda[tr[-1]] - d_prawda[tr[1]] + MASS::mvrnorm(1, rep(0, k - 1), S))
  n <- sample(30:90, k, replace = TRUE); sd_r <- 4.5
  data.frame(badanie = sprintf("S%02d", i), leczenie = tr, n = n,
             srednia = round(rnorm(1, 11, 1.5) + delta + rnorm(k, 0, sd_r / sqrt(n)), 2),
             sd = round(sd_r * sqrt(rchisq(k, n - 1) / (n - 1)), 2))
}))
rownames(ramiona) <- NULL
write.csv(ramiona, "metaanaliza-sieciowa-dane.csv", row.names = FALSE)
head(ramiona, 5)

# Liczba badań i uczestników w każdym porównaniu bezpośrednim (krawędzie sieci) i w każdym węźle
table(projekt = projekty)
aggregate(n ~ leczenie, data = ramiona, FUN = sum)

# Kontrasty: każde ramię wobec pierwszego ramienia badania (MD i jej wariancja)
kontrasty <- do.call(rbind, lapply(split(ramiona, ramiona$badanie), function(b) {
  data.frame(badanie = b$badanie[1], projekt = paste(b$leczenie, collapse = "-"), od = b$leczenie[1], do = b$leczenie[-1],
             yi = b$srednia[-1] - b$srednia[1], vi = b$sd[-1]^2 / b$n[-1] + b$sd[1]^2 / b$n[1],
             v_wspolna = b$sd[1]^2 / b$n[1])
}))
rownames(kontrasty) <- NULL
kontrasty$porownanie <- paste(kontrasty$od, kontrasty$do, sep = "-")
# Macierz kowariancji: w badaniu wieloramiennym dwa kontrasty dzielą ramię odniesienia
V <- matrix(0, nrow(kontrasty), nrow(kontrasty))
for (b in unique(kontrasty$badanie)) {
  w <- which(kontrasty$badanie == b)
  V[w, w] <- kontrasty$v_wspolna[w[1]]
  diag(V)[w] <- kontrasty$vi[w]
}
# Macierz schematu: +1 dla leczenia „do”, −1 dla leczenia „od” (WL = odniesienie, bez kolumny)
X <- sapply(leki[-1], function(t) (kontrasty$do == t) - (kontrasty$od == t))
kontrasty <- cbind(kontrasty, X)
print(transform(kontrasty[13:18, c("badanie", "porownanie", "yi", "vi", "CBTg", "iCBT", "MBI")], yi = round(yi, 2), vi = round(vi, 3)), row.names = FALSE)
round(V[17:18, 17:18], 3)   # badanie trójramienne S17: kowariancja = wariancja średniej w ramieniu WL

# Model spójności: efekty losowe z jednym τ² i korelacją 1/2 między kontrastami tego samego badania
nma <- rma.mv(yi, V, mods = ~ 0 + CBTg + iCBT + MBI, random = ~ porownanie | badanie, rho = 1/2, data = kontrasty)
nma

# Wszystkie 6 porównań parami z sieci (wiersz minus kolumna)
pary <- t(combn(leki, 2))
L <- t(apply(pary, 1, function(p) (leki[-1] == p[2]) - (leki[-1] == p[1])))
wsz <- predict(nma, newmods = L)
data.frame(porownanie = paste(pary[, 2], "vs", pary[, 1]), MD = round(wsz$pred, 2),
           dolny = round(wsz$ci.lb, 2), gorny = round(wsz$ci.ub, 2),
           p = round(2 * pnorm(-abs(wsz$pred / wsz$se)), 4))
Wynik w R
  badanie leczenie  n srednia   sd
1     S01       WL 33   10.19 4.90
2     S01     CBTg 60    6.66 4.66
3     S02       WL 35   11.18 4.61
4     S02     CBTg 43    8.84 3.96
5     S03       WL 74   10.23 4.52
projekt
  CBTg-iCBT    iCBT-MBI     WL-CBTg     WL-iCBT WL-iCBT-MBI      WL-MBI 
          3           1           5           4           1           3 
  leczenie   n
1     CBTg 454
2     iCBT 608
3      MBI 338
4       WL 785
 badanie porownanie    yi    vi CBTg iCBT MBI
     S13  CBTg-iCBT -0.78 0.904   -1    1   0
     S14  CBTg-iCBT -0.24 0.828   -1    1   0
     S15  CBTg-iCBT  1.93 0.518   -1    1   0
     S16   iCBT-MBI  1.39 0.803    0   -1   1
     S17    WL-iCBT -2.21 0.475    0    1   0
     S17     WL-MBI -3.67 0.527    0    0   1
      [,1]  [,2]
[1,] 0.475 0.215
[2,] 0.215 0.527

Multivariate Meta-Analysis Model (k = 18; method: REML)

Variance Components:

outer factor: badanie    (nlvls = 17)
inner factor: porownanie (nlvls = 5)

            estim    sqrt  fixed 
tau^2      0.4797  0.6926     no 
rho        0.5000            yes 

Test for Residual Heterogeneity:
QE(df = 15) = 25.5416, p-val = 0.0431

Test of Moderators (coefficients 1:3):
QM(df = 3) = 87.1632, p-val < .0001

Model Results:

      estimate      se     zval    pval    ci.lb    ci.ub      
CBTg   -3.1083  0.4255  -7.3043  <.0001  -3.9423  -2.2742  *** 
iCBT   -2.4567  0.3828  -6.4182  <.0001  -3.2070  -1.7065  *** 
MBI    -2.6965  0.4851  -5.5581  <.0001  -3.6474  -1.7456  *** 

---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

    porownanie    MD dolny gorny      p
1   CBTg vs WL -3.11 -3.94 -2.27 0.0000
2   iCBT vs WL -2.46 -3.21 -1.71 0.0000
3    MBI vs WL -2.70 -3.65 -1.75 0.0000
4 iCBT vs CBTg  0.65 -0.25  1.55 0.1572
5  MBI vs CBTg  0.41 -0.80  1.62 0.5048
6  MBI vs iCBT -0.24 -1.30  0.82 0.6573

2. Niespójność: rozdzielenie dowodów i test globalny

Dane wejściowe: obiekty kontrasty, V i nma z przepisu 1.

Co odczytać: oszacowanie iCBT − CBTg bezpośrednie, pośrednie i z sieci, test ich różnicy, a dalej porównanie modelu spójności z modelem interakcji projekt × leczenie (kolumny LRT i pval) i τ² w obu modelach.

R
# Wymaga obiektów z przepisu 1 (kontrasty, V, nma)
# 1. Rozdzielenie dowodów dla porównania CBTg–iCBT: bezpośrednie (3 badania CBTg-iCBT) a pośrednie (reszta sieci)
bezp_id <- kontrasty$projekt == "CBTg-iCBT"
bezp <- rma(yi, vi, data = kontrasty[bezp_id, ])                       # iCBT − CBTg tylko z badań bezpośrednich
posr_fit <- rma.mv(yi, V[!bezp_id, !bezp_id], mods = ~ 0 + CBTg + iCBT + MBI,
                   random = ~ porownanie | badanie, rho = 1/2, data = kontrasty[!bezp_id, ])
posr <- predict(posr_fit, newmods = c(-1, 1, 0))                       # iCBT − CBTg tylko drogą przez WL i MBI
siec <- predict(nma, newmods = c(-1, 1, 0))
roznica <- c(bezp$beta) - posr$pred
se_r <- sqrt(bezp$se^2 + posr$se^2)
data.frame(zrodlo = c("bezpośrednie", "pośrednie", "sieć (łącznie)"),
           MD = round(c(bezp$beta, posr$pred, siec$pred), 2), SE = round(c(bezp$se, posr$se, siec$se), 2),
           dolny = round(c(bezp$ci.lb, posr$ci.lb, siec$ci.lb), 2), gorny = round(c(bezp$ci.ub, posr$ci.ub, siec$ci.ub), 2))
round(c(roznica = roznica, SE = se_r, z = roznica / se_r, p = 2 * pnorm(-abs(roznica / se_r))), 3)

# 2. Globalny test: model spójności a model interakcji projekt × leczenie (każdy projekt ma własne efekty)
kontrasty$proj_por <- paste(kontrasty$projekt, kontrasty$porownanie)
spojny_ml <- rma.mv(yi, V, mods = ~ 0 + CBTg + iCBT + MBI, random = ~ porownanie | badanie, rho = 1/2,
                    data = kontrasty, method = "ML")
niespojny_ml <- rma.mv(yi, V, mods = ~ 0 + proj_por, random = ~ porownanie | badanie, rho = 1/2,
                       data = kontrasty, method = "ML")
anova(spojny_ml, niespojny_ml)
round(c(tau2_spojny = spojny_ml$tau2, tau2_niespojny = niespojny_ml$tau2), 3)
Wynik w R
          zrodlo   MD   SE dolny gorny
1   bezpośrednie 0.39 0.86 -1.30  2.09
2      pośrednie 0.84 0.64 -0.42  2.11
3 sieć (łącznie) 0.65 0.46 -0.25  1.55
roznica      SE       z       p 
 -0.448   1.078  -0.416   0.678 

        df     AIC     BIC    AICc   logLik    LRT   pval      QE 
Full     8 61.6873 68.8102 77.6873 -22.8436               19.0681 
Reduced  4 59.1060 62.6675 62.1830 -25.5530 5.4188 0.2470 25.5416 

   tau2_spojny tau2_niespojny 
         0.272          0.024 

3. Ranking: SUCRA z losowania i P-score

Dane wejściowe: obiekt nma z przepisu 1; 10 000 losowań z wielowymiarowego rozkładu normalnego oszacowań (set.seed(2462)).

Co odczytać: macierz prawdopodobieństw rang (wiersze: ranga 1–4), tabelę z P(najlepsza), średnią rangą, SUCRA i P-score oraz 95% przedziały rang.

R
# Wymaga obiektu nma z przepisu 1. Ranking: niższy GAD-7 = lepiej, więc najlepsze jest najbardziej ujemne MD wobec WL
set.seed(2462)
los <- MASS::mvrnorm(10000, mu = coef(nma), Sigma = vcov(nma))     # losowania z rozkładu oszacowań
los <- cbind(WL = 0, los)
rangi <- t(apply(los, 1, rank))                                     # ranga 1 = najniższy wynik GAD-7
p_rang <- sapply(colnames(los), function(t) table(factor(rangi[, t], levels = 1:4)) / nrow(rangi))
round(p_rang, 3)                                                    # wiersze: ranga 1–4, kolumny: leczenia
sucra <- apply(p_rang, 2, function(p) sum(cumsum(p)[1:3]) / 3)
srednia_ranga <- colSums(p_rang * 1:4)

# P-score (Rücker i Schwarzer, 2015): średnia z P(leczenie lepsze od każdego innego) – bez losowania
b <- c(WL = 0, coef(nma)); S <- rbind(0, cbind(0, vcov(nma))); dimnames(S) <- list(names(b), names(b))
p_score <- sapply(names(b), function(i) mean(sapply(setdiff(names(b), i), function(j)
  pnorm((b[j] - b[i]) / sqrt(S[i, i] + S[j, j] - 2 * S[i, j])))))
data.frame(leczenie = names(b), MD_vs_WL = round(b, 2), p_najlepsze = round(p_rang[1, ], 3),
           srednia_ranga = round(srednia_ranga, 2), SUCRA = round(sucra, 3), P_score = round(p_score, 3), row.names = NULL)

# Niepewność rangi: 95% przedział rang z losowań
t(apply(rangi, 2, quantile, probs = c(.025, .975)))
Wynik w R
  WL  CBTg  iCBT   MBI
1  0 0.716 0.043 0.240
2  0 0.234 0.323 0.443
3  0 0.050 0.633 0.317
4  1 0.000 0.000 0.000
  leczenie MD_vs_WL p_najlepsze srednia_ranga SUCRA P_score
1       WL     0.00       0.000          4.00 0.000   0.000
2     CBTg    -3.11       0.716          1.33 0.889   0.890
3     iCBT    -2.46       0.043          2.59 0.470   0.469
4      MBI    -2.70       0.240          2.08 0.641   0.641
     2.5% 97.5%
WL      4     4
CBTg    1     3
iCBT    1     3
MBI     1     3

4. Ta sama analiza w pakiecie netmeta

Dane wejściowe: plik metaanaliza-sieciowa-dane.csv z przepisu 1; pakiety netmeta 3.7-0 i meta 8.5-0.

Co odczytać: oszacowania wobec WL (−3.11, −2.46, −2.70), τ² = 0.48 i Q(15) = 25.54 są takie same jak w metafor, a P-score (.89, .64, .47) pokrywa się z SUCRA. Testy niespójności liczone są inaczej: netmeta oddziela dowody bezpośrednie metodą odejmowania (back-calculation) przy wspólnym τ² dla sieci, dlatego dla porównania CBTg–iCBT daje różnicę 0.37 (p = .688) zamiast 0.45 (p = .678), a globalny test projekt × leczenie oparty na Q daje Q(4) = 3.78, p = .436, zamiast testu ilorazu wiarygodności χ²(4) = 5.42, p = .247. Wniosek jest ten sam: brak oznak niespójności.

R
# Ta sama analiza w pakiecie netmeta – kontrola wyników z metafor
library(netmeta)
ramiona <- read.csv("../metaanaliza-sieciowa-dane.csv")   # plik z przepisu 1: jeden wiersz = jedno ramię badania
# Z danych ramion pakiet sam tworzy kontrasty i uwzględnia badania wieloramienne
pary <- pairwise(treat = leczenie, n = n, mean = srednia, sd = sd, studlab = badanie, data = ramiona, sm = "MD")
nm <- netmeta(pary, reference.group = "WL", common = FALSE, random = TRUE, method.tau = "REML")
# Oszacowania wobec listy oczekujących (WL) i heterogeniczność
round(cbind(MD = nm$TE.random[, "WL"], dolny = nm$lower.random[, "WL"], gorny = nm$upper.random[, "WL"]), 2)
round(c(tau2 = nm$tau2, Q = nm$Q, df = nm$df.Q, p = nm$pval.Q), 3)
netsplit(nm, legend = FALSE)                  # dowody bezpośrednie a pośrednie dla każdego porównania
decomp.design(nm)                             # Q: heterogeniczność a niespójność (projekt × leczenie)
netrank(nm, small.values = "desirable")       # P-score; niższy GAD-7 = lepiej
Wynik w R
        MD dolny gorny
CBTg -3.11 -3.94 -2.27
iCBT -2.46 -3.21 -1.71
MBI  -2.70 -3.65 -1.75
WL    0.00  0.00  0.00
  tau2      Q     df      p 
 0.480 25.542 15.000  0.043 
Separate indirect from direct evidence (SIDE) using back-calculation method

Random effects model: 

 comparison k prop     nma  direct  indir.    Diff     z p-value
  CBTg:iCBT 3 0.53 -0.6515 -0.4768 -0.8471  0.3703  0.40  0.6881
    CBTg:WL 5 0.69 -3.1083 -3.2220 -2.8517 -0.3703 -0.40  0.6881
   iCBT:MBI 2 0.51  0.2398  0.1766  0.3044 -0.1278 -0.12  0.9059
    iCBT:WL 5 0.68 -2.4567 -2.2328 -2.9433  0.7105  0.86  0.3884
     MBI:WL 4 0.81 -2.6965 -2.9438 -1.6113 -1.3325 -1.07  0.2856

Legend:
 comparison - Treatment comparison
 k          - Number of studies providing direct evidence
 prop       - Direct evidence proportion
 nma        - Estimated treatment effect (MD) in network meta-analysis
 direct     - Estimated treatment effect (MD) derived from direct evidence
 indir.     - Estimated treatment effect (MD) derived from indirect evidence
 Diff       - Difference between direct and indirect treatment estimates
 z          - z-value of test for disagreement (direct versus indirect)
 p-value    - p-value of test for disagreement (direct versus indirect)
Q statistics to assess homogeneity / consistency

                    Q df p-value
Total           25.54 15  0.0431
Within designs  19.07 11  0.0599
Between designs  6.47  4  0.1665

Design-specific decomposition of within-designs Q statistic

    Design    Q df p-value
 CBTg:iCBT 6.37  2  0.0413
    WL:MBI 4.78  2  0.0914
   WL:CBTg 6.14  4  0.1892
   WL:iCBT 1.77  3  0.6209

Between-designs Q statistic after detaching of single designs
(influential designs have p-value markedly different from 0.1665)

 Detached design    Q df p-value
        iCBT:MBI 2.13  3  0.5450
     WL:iCBT:MBI 2.39  2  0.3023
         WL:iCBT 6.20  3  0.1021
          WL:MBI 6.36  3  0.0954
       CBTg:iCBT 6.39  3  0.0940
         WL:CBTg 6.39  3  0.0940

Q statistic to assess consistency under the assumption of
a full design-by-treatment interaction random effects model

                   Q df p-value tau.within tau2.within
Between designs 3.78  4  0.4362     0.7303      0.5333
     P-score
CBTg  0.8897
MBI   0.6412
iCBT  0.4691
WL    0.0000

Bibliografia oprogramowania

Wyniki na tej stronie pochodzą z uruchomienia przepisów 1–3 w R 4.5.3 (pakiet metafor, funkcje rma.mv() i rma(), oraz MASS::mvrnorm()); przepis 4 – kontrola w pakiecie netmeta; rysunki przygotowano w pakiecie ggplot2.

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
  2. metafor (wersja 5.0.1): Viechtbauer, W. (2010). Conducting meta-analyses in R with the metafor package. Journal of Statistical Software, 36(3), 1–48. https://doi.org/10.18637/jss.v036.i03
  3. MASS (wersja 7.3.65): Venables, W. N., & Ripley, B. D. (2002). Modern applied statistics with S (4th ed.). Springer. https://doi.org/10.1007/978-0-387-21706-2
  4. netmeta (wersja 3.7-0): Balduzzi, S., Rücker, G., Nikolakopoulou, A., Papakonstantinou, T., Salanti, G., Efthimiou, O., & Schwarzer, G. (2023). netmeta: An R package for network meta-analysis using frequentist methods. Journal of Statistical Software, 106(2). https://doi.org/10.18637/jss.v106.i02
  5. ggplot2 (wersja 4.0.2): Wickham, H. (2016). ggplot2: Elegant graphics for data analysis. Springer. https://ggplot2.tidyverse.org

Najczęstsze błędy

  • Porównywanie ramion z różnych badań. Łącz kontrasty z badań, a nie surowe średnie ramion.
  • Badanie wieloramienne jako kilka niezależnych par. Bez kowariancji ramię wspólne liczy się wielokrotnie, a przedziały są za wąskie.
  • Brak oceny przechodniości. Nieistotny test niespójności przy kilku pętlach jej nie zastąpi.
  • Węzły zdefiniowane po obejrzeniu wyników albo łączenie różnych komparatorów (lista oczekujących, zwykła opieka, placebo) w jeden węzeł bez uzasadnienia.
  • Ranking zamiast efektów. SUCRA bez przedziałów ufności i bez przedziałów rang sugeruje pewność, której nie ma.
  • Pominięcie oceny pewności dowodów. Porównanie wyłącznie pośrednie (tu CBTg–MBI) wymaga ostrożniejszego wniosku niż bezpośrednie.

Najczęstsze pytania

Ile badań potrzeba do metaanalizy sieciowej?

Nie ma jednej granicy. Sieć musi być połączona, czyli każda interwencja musi być powiązana z resztą choć jednym porównaniem. Badanie spójności wymaga zamkniętych pętli. Przy kilku badaniach na porównanie oszacowanie τ² jest niepewne, a testy niespójności mają małą moc (w przykładzie z 17 badaniami test globalny miał 4 stopnie swobody). Węzeł oparty na jednym badaniu traktuj jako słabe ogniwo i oceń pewność jego dowodów.

Czym różni się przechodniość od spójności w metaanalizie sieciowej?

Przechodniość to założenie merytoryczne: badania różnych porównań są podobne pod względem modyfikatorów efektu, więc porównanie pośrednie ma sens (Salanti, 2012). Spójność to jej statystyczny ślad: dowody bezpośrednie i pośrednie o tym samym porównaniu zgadzają się z dokładnością do błędu losowego. Przechodniość oceniasz, zestawiając charakterystyki badań, a spójność – testami lokalnymi i globalnymi.

Jak uwzględnić badanie trójramienne w metaanalizie sieciowej?

Wprowadź z niego dwa kontrasty wobec wspólnego ramienia i dodaj ich kowariancję, równą wariancji średniej w ramieniu wspólnym. Przy wspólnym τ² dla wszystkich porównań korelacja efektów losowych dwóch kontrastów z tego samego badania wynosi 1/2. Traktowanie trzech par jako niezależnych badań liczy wspólne ramię wielokrotnie i zawęża przedziały ufności.

Czy wysoka wartość SUCRA oznacza, że interwencja jest najlepsza?

Nie. SUCRA porządkuje oszacowania z uwzględnieniem ich precyzji, ale nie mówi, o ile jedna interwencja jest lepsza od innej, ani czy różnica jest pewna. W przykładzie CBT grupowa miała SUCRA .89, choć jej przewaga nad iCBT była nieistotna, a 95% przedział rang obejmował miejsca 1–3. Trinquart i in. (2016) pokazali, że rankingi z metaanaliz sieciowych są zwykle bardzo nieprecyzyjne.

Czy metaanalizę sieciową można zrobić bez pakietu netmeta?

Tak. Model kontrastów z efektami losowymi to wielowymiarowa metaregresja (White i in., 2012), którą dopasujesz funkcją rma.mv() z pakietu metafor: z macierzą kowariancji kontrastów, moderatorami dla interwencji wobec węzła odniesienia i efektem losowym porównania w badaniu. Ranking policzysz z losowań z rozkładu oszacowań albo jako P-score. Pakiet netmeta upraszcza rysunki i tabele, ale nie jest konieczny.

Powiązane hasła

Przeczytaj też

Przygotowujesz metaanalizę sieciową do publikacji?

Pomożemy zdefiniować węzły, ocenić przechodniość, dopasować model z badaniami wieloramiennymi, sprawdzić niespójność i opisać wyniki według PRISMA-NMA, tak żebyś mógł(a) samodzielnie obronić każdą decyzję przed recenzentami.

Oferta dla badaczyPorozmawiaj o projekcie

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Bucher, H. C., Guyatt, G. H., Griffith, L. E., & Walter, S. D. (1997). The results of direct and indirect treatment comparisons in meta-analysis of randomized controlled trials. Journal of Clinical Epidemiology, 50(6), 683–691. https://doi.org/10.1016/s0895-4356(97)00049-8
  2. Dias, S., Welton, N. J., Caldwell, D. M., & Ades, A. E. (2010). Checking consistency in mixed treatment comparison meta-analysis. Statistics in Medicine, 29(7–8), 932–944. https://doi.org/10.1002/sim.3767
  3. Higgins, J. P. T., Jackson, D., Barrett, J. K., Lu, G., Ades, A. E., & White, I. R. (2012). Consistency and inconsistency in network meta-analysis: Concepts and models for multi-arm studies. Research Synthesis Methods, 3(2), 98–110. https://doi.org/10.1002/jrsm.1044 ● Otwarty dostęp
  4. Hutton, B., Salanti, G., Caldwell, D. M., Chaimani, A., Schmid, C. H., Cameron, C., Ioannidis, J. P. A., Straus, S., Thorlund, K., Jansen, J. P., Mulrow, C., Catalá-López, F., Gøtzsche, P. C., Dickersin, K., Boutron, I., Altman, D. G., & Moher, D. (2015). The PRISMA extension statement for reporting of systematic reviews incorporating network meta-analyses of health care interventions: Checklist and explanations. Annals of Internal Medicine, 162(11), 777–784. https://doi.org/10.7326/m14-2385
  5. Rücker, G., & Schwarzer, G. (2015). Ranking treatments in frequentist network meta-analysis works without resampling methods. BMC Medical Research Methodology, 15(1), Article 58. https://doi.org/10.1186/s12874-015-0060-8 ● Otwarty dostęp
  6. Salanti, G. (2012). Indirect and mixed-treatment comparison, network, or multiple-treatments meta-analysis: Many names, many benefits, many concerns for the next generation evidence synthesis tool. Research Synthesis Methods, 3(2), 80–97. https://doi.org/10.1002/jrsm.1037
  7. Salanti, G., Ades, A. E., & Ioannidis, J. P. A. (2011). Graphical methods and numerical summaries for presenting results from multiple-treatment meta-analysis: An overview and tutorial. Journal of Clinical Epidemiology, 64(2), 163–171. https://doi.org/10.1016/j.jclinepi.2010.03.016
  8. Trinquart, L., Attiche, N., Bafeta, A., Porcher, R., & Ravaud, P. (2016). Uncertainty in treatment rankings: Reanalysis of network meta-analyses of randomized trials. Annals of Internal Medicine, 164(10), 666–673. https://doi.org/10.7326/m15-2521
  9. Viechtbauer, W. (2010). Conducting meta-analyses in R with the metafor package. Journal of Statistical Software, 36(3), 1–48. https://doi.org/10.18637/jss.v036.i03 ● Otwarty dostęp
  10. White, I. R., Barrett, J. K., Jackson, D., & Higgins, J. P. T. (2012). Consistency and inconsistency in network meta-analysis: Model estimation using multivariate meta-regression. Research Synthesis Methods, 3(2), 111–125. https://doi.org/10.1002/jrsm.1045 ● Otwarty dostęp

Cytowania BibTeX

@article{bucher1997results, author={Bucher, Heiner C. and Guyatt, Gordon H. and Griffith, Lauren E. and Walter, Stephen D.}, title={{The results of direct and indirect treatment comparisons in meta-analysis of randomized controlled trials}}, journal={Journal of Clinical Epidemiology}, year={1997}, volume={50}, number={6}, pages={683--691}, doi={10.1016/s0895-4356(97)00049-8}}
@article{dias2010checking, author={Dias, S. and Welton, N. J. and Caldwell, D. M. and Ades, A. E.}, title={{Checking consistency in mixed treatment comparison meta-analysis}}, journal={Statistics in Medicine}, year={2010}, volume={29}, number={7–8}, pages={932--944}, doi={10.1002/sim.3767}}
@article{higgins2012consistency, author={Higgins, J. P. T. and Jackson, D. and Barrett, J. K. and Lu, G. and Ades, A. E. and White, I. R.}, title={{Consistency and inconsistency in network meta-analysis: Concepts and models for multi-arm studies}}, journal={Research Synthesis Methods}, year={2012}, volume={3}, number={2}, pages={98--110}, doi={10.1002/jrsm.1044}}
@article{hutton2015prisma, author={Hutton, Brian and Salanti, Georgia and Caldwell, Deborah M. and Chaimani, Anna and Schmid, Christopher H. and Cameron, Chris and Ioannidis, John P. A. and Straus, Sharon and Thorlund, Kristian and Jansen, Jeroen P. and Mulrow, Cynthia and Catalá-López, Ferrán and Gøtzsche, Peter C. and Dickersin, Kay and Boutron, Isabelle and Altman, Douglas G. and Moher, David}, title={{The PRISMA extension statement for reporting of systematic reviews incorporating network meta-analyses of health care interventions: Checklist and explanations}}, journal={Annals of Internal Medicine}, year={2015}, volume={162}, number={11}, pages={777--784}, doi={10.7326/m14-2385}}
@article{rucker2015ranking, author={Rücker, Gerta and Schwarzer, Guido}, title={{Ranking treatments in frequentist network meta-analysis works without resampling methods}}, journal={BMC Medical Research Methodology}, year={2015}, volume={15}, number={1}, eid={58}, doi={10.1186/s12874-015-0060-8}}
@article{salanti2012indirect, author={Salanti, Georgia}, title={{Indirect and mixed-treatment comparison, network, or multiple-treatments meta-analysis: Many names, many benefits, many concerns for the next generation evidence synthesis tool}}, journal={Research Synthesis Methods}, year={2012}, volume={3}, number={2}, pages={80--97}, doi={10.1002/jrsm.1037}}
@article{salanti2011graphical, author={Salanti, Georgia and Ades, A. E. and Ioannidis, John P. A.}, title={{Graphical methods and numerical summaries for presenting results from multiple-treatment meta-analysis: An overview and tutorial}}, journal={Journal of Clinical Epidemiology}, year={2011}, volume={64}, number={2}, pages={163--171}, doi={10.1016/j.jclinepi.2010.03.016}}
@article{trinquart2016uncertainty, author={Trinquart, Ludovic and Attiche, Nassima and Bafeta, Aïida and Porcher, Raphaël and Ravaud, Philippe}, title={{Uncertainty in treatment rankings: Reanalysis of network meta-analyses of randomized trials}}, journal={Annals of Internal Medicine}, year={2016}, volume={164}, number={10}, pages={666--673}, doi={10.7326/m15-2521}}
@article{viechtbauer2010conducting, author={Viechtbauer, Wolfgang}, title={{Conducting meta-analyses in R with the metafor package}}, journal={Journal of Statistical Software}, year={2010}, volume={36}, number={3}, pages={1--48}, doi={10.18637/jss.v036.i03}}
@article{white2012consistency, author={White, Ian R. and Barrett, Jessica K. and Jackson, Dan and Higgins, Julian P. T.}, title={{Consistency and inconsistency in network meta-analysis: Model estimation using multivariate meta-regression}}, journal={Research Synthesis Methods}, year={2012}, volume={3}, number={2}, pages={111--125}, doi={10.1002/jrsm.1045}}
R