create_dt <- function(x){
DT::datatable(x,
extensions = 'Buttons',
options = list(dom = 'Blfrtip',
buttons = c('copy', 'csv', 'excel', 'pdf', 'print'),
lengthMenu = list(c(10,25,50,-1),
c(10,25,50,"All"))))
}
# Load Data
data <- read_xlsx("New Data Pedicle screw.xlsx") %>%
mutate(trt = fct_recode(trt, CT_Nav = "ct", FFG = "fluoro", RA = "robo")) %>%
filter(auth != "Wang")
create_dt(data)
# Clean and Nest Data by Outcome
dat <- data %>%
mutate(
names = rep(c("1" , "2"), times = 36)) %>%
pivot_wider(
names_from = names,
values_from = c(trt, n, mean, sd, sex, age),
id_cols = c(1:3)) %>%
na.omit() %>%
group_by(outcome) %>%
nest()
create_dt(dat)
# Create Labels
# Treatment Order
long.labels <- c("CT-navigated", "Fluoroscopy-guided", "Robot-assisted")
# Outcome Order
outcome.labels.md <- c("Length of Stay (days)",
"Operation Time (minutes)",
"Blood Loss (mL)")
outcome.labels.smd <- c("Oswestry Disability Index",
"Visual Analog Scale: Back",
"Visual Analog Scale: Leg")
outcome.labels2 <- c("Oswestry Disability Index",
"Visual Analog Scale: Back",
"Visual Analog Scale: Leg",
"Length of Stay",
"Operation Time",
"Blood Loss")
res <- dat %>%
filter(outcome %in% c("ODI", "VAS_Back", "VAS_Leg")) %>%
mutate(
# Calculate Mean Difference & Standard Error Between Treatment and Control groups in Each Study for Each Outcome
pairwise = map(
.x = data,
~pairwise(
treat= list(trt_1, trt_2), n = list(n_1, n_2),
mean= list(mean_1, mean_2), sd= list(sd_1, sd_2),
studlab = auth, data = .x, sm = "SMD", reference.group = "2")),
# Perform a Random-Effects Network Meta-Analysis for each Outcome Using Mean Differences and Standard Errors from Pairwise Comparisons
net = map(
.x = pairwise,
~netmeta(
.x,
random = TRUE,
common = FALSE,
reference.group = "FFG",
sm = "SMD",
details.chkmultiarm = TRUE,
sep.trts = " vs. ")),
# Effect Table
effect.table = map(
.x = net,
~netleague(.x,
bracket = "(", # use round brackets
digits=2)),
# Show Results for Direct and Indirect Evidence
split = map(
.x = net,
~netsplit(.x)),
# Calculate Total Inconsistency based on the full design-by-treatment interaction random-effects model
incon = map(
.x = net,
~decomp.design(.x))
)
res.md <- dat %>%
filter(outcome %in% c("LOS", "OP_Time", "Blood_Loss")) %>%
mutate(
# Calculate Mean Difference & Standard Error Between Treatment and Control groups in Each Study for Each Outcome
pairwise = map(
.x = data,
~pairwise(
treat= list(trt_1, trt_2), n = list(n_1, n_2),
mean= list(mean_1, mean_2), sd= list(sd_1, sd_2),
studlab = auth, data = .x, sm = "MD", reference.group = "2")),
# Perform a Random-Effects Network Meta-Analysis for each Outcome Using Mean Differences and Standard Errors from Pairwise Comparisons
net = map(
.x = pairwise,
~netmeta(
.x,
random = TRUE,
common = FALSE,
reference.group = "FFG",
sm = "MD",
details.chkmultiarm = TRUE,
sep.trts = " vs. ")),
# Show Results for Direct and Indirect Evidence
split = map(
.x = net,
~netsplit(.x)),
# Calculate Total Inconsistency based on the full design-by-treatment interaction random-effects model
incon = map(
.x = net,
~decomp.design(.x))
)
tab.list <- list()
md.list <- list()
for(i in 1:nrow(res)){
res.tab <- res$split[[i]]$random
tab.list[[i]] <- res.tab %>%
mutate(across(where(is.numeric), round, 2)) %>%
mutate("95% CI" = paste(lower, upper, sep = " to "),
Evidence = c("Direct", "Indirect", "Direct"),
SMD = TE,
SE = seTE,
p.value = p) %>%
select(-c(statistic, lower, upper)) %>%
select(comparison, Evidence, SMD, SE, "95% CI", p.value)
}
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `across(where(is.numeric), round, 2)`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
##
## # Previously
## across(a:b, mean, na.rm = TRUE)
##
## # Now
## across(a:b, \(x) mean(x, na.rm = TRUE))
for(i in 1:nrow(res.md)){
md.tab <- res.md$split[[i]]$random
md.list[[i]] <- md.tab %>%
mutate(across(where(is.numeric), round, 2)) %>%
mutate("95% CI" = paste(lower, upper, sep = " to "),
Evidence = c("Direct", "Indirect", "Direct"),
MD = TE,
SE = seTE,
p.value = p) %>%
select(-c(statistic, lower, upper)) %>%
select(comparison, Evidence, MD, SE, "95% CI", p.value)
}
netgraph(res$net[[1]], labels = long.labels)
The numbers on each bar represent the number of studies for each comparison
for(i in 1:nrow(res)){
print(netgraph(res$net[[i]], labels = long.labels, number.of.studies = TRUE), title(main = outcome.labels.smd[i]))
}
## $nodes
## trts labels seq srt xpos ypos xpos.labels
## CT_Nav CT_Nav CT-navigated CT_Nav 0 -0.2886751 0.5 -0.3109031
## FFG FFG Fluoroscopy-guided FFG 0 -0.2886751 -0.5 -0.3109031
## RA RA Robot-assisted RA 0 0.5773503 0.0 0.5995783
## ypos.labels offset.x offset.y cex col pch bg adj.x adj.y
## CT_Nav 0.52222799 0.02222799 0.02222799 1 red 20 red 1 0
## FFG -0.52222799 0.02222799 0.02222799 1 red 20 red 1 1
## RA -0.02222799 0.02222799 0.02222799 1 red 20 red 0 1
##
## $edges
## treat1 treat2 n.stud xpos ypos adj pos.number.of.studies
## CT_Nav vs. FFG CT_Nav FFG 2 -0.2886751 0.00 0.5 0.5
## FFG vs. RA FFG RA 2 0.1443376 -0.25 0.5 0.5
## col
## CT_Nav vs. FFG black
## FFG vs. RA black
## $nodes
## trts labels seq srt xpos ypos xpos.labels
## CT_Nav CT_Nav CT-navigated CT_Nav 0 -0.2886751 0.5 -0.3109031
## FFG FFG Fluoroscopy-guided FFG 0 -0.2886751 -0.5 -0.3109031
## RA RA Robot-assisted RA 0 0.5773503 0.0 0.5995783
## ypos.labels offset.x offset.y cex col pch bg adj.x adj.y
## CT_Nav 0.52222799 0.02222799 0.02222799 1 red 20 red 1 0
## FFG -0.52222799 0.02222799 0.02222799 1 red 20 red 1 1
## RA -0.02222799 0.02222799 0.02222799 1 red 20 red 0 1
##
## $edges
## treat1 treat2 n.stud xpos ypos adj pos.number.of.studies
## CT_Nav vs. FFG CT_Nav FFG 1 -0.2886751 0.00 0.5 0.5
## FFG vs. RA FFG RA 3 0.1443376 -0.25 0.5 0.5
## col
## CT_Nav vs. FFG black
## FFG vs. RA black
## $nodes
## trts labels seq srt xpos ypos xpos.labels
## CT_Nav CT_Nav CT-navigated CT_Nav 0 -0.2886751 0.5 -0.3109031
## FFG FFG Fluoroscopy-guided FFG 0 -0.2886751 -0.5 -0.3109031
## RA RA Robot-assisted RA 0 0.5773503 0.0 0.5995783
## ypos.labels offset.x offset.y cex col pch bg adj.x adj.y
## CT_Nav 0.52222799 0.02222799 0.02222799 1 red 20 red 1 0
## FFG -0.52222799 0.02222799 0.02222799 1 red 20 red 1 1
## RA -0.02222799 0.02222799 0.02222799 1 red 20 red 0 1
##
## $edges
## treat1 treat2 n.stud xpos ypos adj pos.number.of.studies
## CT_Nav vs. FFG CT_Nav FFG 1 -0.2886751 0.00 0.5 0.5
## FFG vs. RA FFG RA 2 0.1443376 -0.25 0.5 0.5
## col
## CT_Nav vs. FFG black
## FFG vs. RA black
for(i in 1:nrow(res.md)){
print(netgraph(res.md$net[[i]], labels = long.labels, number.of.studies = TRUE), title(main = outcome.labels.md[i]))
}
## $nodes
## trts labels seq srt xpos ypos xpos.labels
## CT_Nav CT_Nav CT-navigated CT_Nav 0 -0.2886751 0.5 -0.3109031
## FFG FFG Fluoroscopy-guided FFG 0 -0.2886751 -0.5 -0.3109031
## RA RA Robot-assisted RA 0 0.5773503 0.0 0.5995783
## ypos.labels offset.x offset.y cex col pch bg adj.x adj.y
## CT_Nav 0.52222799 0.02222799 0.02222799 1 red 20 red 1 0
## FFG -0.52222799 0.02222799 0.02222799 1 red 20 red 1 1
## RA -0.02222799 0.02222799 0.02222799 1 red 20 red 0 1
##
## $edges
## treat1 treat2 n.stud xpos ypos adj pos.number.of.studies
## CT_Nav vs. FFG CT_Nav FFG 3 -0.2886751 0.00 0.5 0.5
## FFG vs. RA FFG RA 2 0.1443376 -0.25 0.5 0.5
## col
## CT_Nav vs. FFG black
## FFG vs. RA black
## $nodes
## trts labels seq srt xpos ypos xpos.labels
## CT_Nav CT_Nav CT-navigated CT_Nav 0 -0.2886751 0.5 -0.3109031
## FFG FFG Fluoroscopy-guided FFG 0 -0.2886751 -0.5 -0.3109031
## RA RA Robot-assisted RA 0 0.5773503 0.0 0.5995783
## ypos.labels offset.x offset.y cex col pch bg adj.x adj.y
## CT_Nav 0.52222799 0.02222799 0.02222799 1 red 20 red 1 0
## FFG -0.52222799 0.02222799 0.02222799 1 red 20 red 1 1
## RA -0.02222799 0.02222799 0.02222799 1 red 20 red 0 1
##
## $edges
## treat1 treat2 n.stud xpos ypos adj pos.number.of.studies
## CT_Nav vs. FFG CT_Nav FFG 3 -0.2886751 0.00 0.5 0.5
## FFG vs. RA FFG RA 3 0.1443376 -0.25 0.5 0.5
## col
## CT_Nav vs. FFG black
## FFG vs. RA black
## $nodes
## trts labels seq srt xpos ypos xpos.labels
## CT_Nav CT_Nav CT-navigated CT_Nav 0 -0.2886751 0.5 -0.3109031
## FFG FFG Fluoroscopy-guided FFG 0 -0.2886751 -0.5 -0.3109031
## RA RA Robot-assisted RA 0 0.5773503 0.0 0.5995783
## ypos.labels offset.x offset.y cex col pch bg adj.x adj.y
## CT_Nav 0.52222799 0.02222799 0.02222799 1 red 20 red 1 0
## FFG -0.52222799 0.02222799 0.02222799 1 red 20 red 1 1
## RA -0.02222799 0.02222799 0.02222799 1 red 20 red 0 1
##
## $edges
## treat1 treat2 n.stud xpos ypos adj pos.number.of.studies
## CT_Nav vs. FFG CT_Nav FFG 3 -0.2886751 0.00 0.5 0.5
## FFG vs. RA FFG RA 2 0.1443376 -0.25 0.5 0.5
## col
## CT_Nav vs. FFG black
## FFG vs. RA black
create_dt(tab.list[[1]])
create_dt(tab.list[[2]])
create_dt(tab.list[[3]])
create_dt(md.list[[1]])
create_dt(md.list[[2]])
create_dt(md.list[[3]])
for(i in 1:nrow(res)){
forest(res$net[[i]],
ref= c("RA", "CT_Nav"),
xlim= c(-4, 3),
baseline= FALSE,
drop= TRUE,
pooled = "random",
smlab = outcome.labels.smd[i],
labels = long.labels,
label.left = "Favors Treatment",
label.right = "Favors 'Other'")
}
# Length of Stay
forest(res.md$net[[1]],
ref= c("RA", "CT_Nav"),
xlim= c(-4, 4),
baseline= FALSE,
drop= TRUE,
pooled = "random",
smlab = outcome.labels.md[1],
labels = long.labels,
label.left = "Favors Treatment",
label.right = "Favors 'Other'")
# Operation Time
forest(res.md$net[[2]],
ref= c("RA", "CT_Nav"),
xlim= c(-15, 15),
baseline= FALSE,
drop= TRUE,
pooled = "random",
smlab = outcome.labels.md[2],
labels = long.labels,
label.left = "Favors Treatment",
label.right = "Favors 'Other'")
# Blood Loss
forest(res.md$net[[3]],
ref= c("RA", "CT_Nav"),
xlim= c(-200, 100),
baseline= FALSE,
drop= TRUE,
pooled = "random",
smlab = outcome.labels.md[3],
labels = long.labels,
label.left = "Favors Treatment",
label.right = "Favors 'Other'")
plot(
netrank(res$net[[1]]),
netrank(res$net[[2]]),
netrank(res$net[[3]]),
netrank(res.md$net[[1]]),
netrank(res.md$net[[2]]),
netrank(res.md$net[[3]]),
name = outcome.labels2,
digits = 2)
The numbers on each bar represent the number of studies for each comparison
for(i in 1:nrow(res)){
print(netgraph(res$net[[i]], labels = long.labels, number.of.studies = TRUE), title(main = outcome.labels2[i]))
}
## $nodes
## trts labels seq srt xpos ypos xpos.labels
## CT_Nav CT_Nav CT-navigated CT_Nav 0 -0.2886751 0.5 -0.3109031
## FFG FFG Fluoroscopy-guided FFG 0 -0.2886751 -0.5 -0.3109031
## RA RA Robot-assisted RA 0 0.5773503 0.0 0.5995783
## ypos.labels offset.x offset.y cex col pch bg adj.x adj.y
## CT_Nav 0.52222799 0.02222799 0.02222799 1 red 20 red 1 0
## FFG -0.52222799 0.02222799 0.02222799 1 red 20 red 1 1
## RA -0.02222799 0.02222799 0.02222799 1 red 20 red 0 1
##
## $edges
## treat1 treat2 n.stud xpos ypos adj pos.number.of.studies
## CT_Nav vs. FFG CT_Nav FFG 2 -0.2886751 0.00 0.5 0.5
## FFG vs. RA FFG RA 2 0.1443376 -0.25 0.5 0.5
## col
## CT_Nav vs. FFG black
## FFG vs. RA black
## $nodes
## trts labels seq srt xpos ypos xpos.labels
## CT_Nav CT_Nav CT-navigated CT_Nav 0 -0.2886751 0.5 -0.3109031
## FFG FFG Fluoroscopy-guided FFG 0 -0.2886751 -0.5 -0.3109031
## RA RA Robot-assisted RA 0 0.5773503 0.0 0.5995783
## ypos.labels offset.x offset.y cex col pch bg adj.x adj.y
## CT_Nav 0.52222799 0.02222799 0.02222799 1 red 20 red 1 0
## FFG -0.52222799 0.02222799 0.02222799 1 red 20 red 1 1
## RA -0.02222799 0.02222799 0.02222799 1 red 20 red 0 1
##
## $edges
## treat1 treat2 n.stud xpos ypos adj pos.number.of.studies
## CT_Nav vs. FFG CT_Nav FFG 1 -0.2886751 0.00 0.5 0.5
## FFG vs. RA FFG RA 3 0.1443376 -0.25 0.5 0.5
## col
## CT_Nav vs. FFG black
## FFG vs. RA black
## $nodes
## trts labels seq srt xpos ypos xpos.labels
## CT_Nav CT_Nav CT-navigated CT_Nav 0 -0.2886751 0.5 -0.3109031
## FFG FFG Fluoroscopy-guided FFG 0 -0.2886751 -0.5 -0.3109031
## RA RA Robot-assisted RA 0 0.5773503 0.0 0.5995783
## ypos.labels offset.x offset.y cex col pch bg adj.x adj.y
## CT_Nav 0.52222799 0.02222799 0.02222799 1 red 20 red 1 0
## FFG -0.52222799 0.02222799 0.02222799 1 red 20 red 1 1
## RA -0.02222799 0.02222799 0.02222799 1 red 20 red 0 1
##
## $edges
## treat1 treat2 n.stud xpos ypos adj pos.number.of.studies
## CT_Nav vs. FFG CT_Nav FFG 1 -0.2886751 0.00 0.5 0.5
## FFG vs. RA FFG RA 2 0.1443376 -0.25 0.5 0.5
## col
## CT_Nav vs. FFG black
## FFG vs. RA black
create_dt(md.list[[1]])
create_dt(md.list[[2]])
create_dt(md.list[[3]])
lapply(res$net, summary)
## [[1]]
## Original data:
##
## treat1 treat2 TE seTE
## Chen CT_Nav FFG -0.3411 0.3010
## Cui FFG RA 0.3942 0.2917
## Feng FFG RA 0.0688 0.2237
## Wu CT_Nav FFG 0.0146 0.2918
##
## Number of treatment arms (by study):
## narms
## Chen 2
## Cui 2
## Feng 2
## Wu 2
##
## Results (random effects model):
##
## treat1 treat2 SMD 95%-CI
## Chen CT_Nav FFG -0.1577 [-0.5684; 0.2529]
## Cui FFG RA 0.1892 [-0.1587; 0.5371]
## Feng FFG RA 0.1892 [-0.1587; 0.5371]
## Wu CT_Nav FFG -0.1577 [-0.5684; 0.2529]
##
## Number of studies: k = 4
## Number of pairwise comparisons: m = 4
## Number of observations: o = 220
## Number of treatments: n = 3
## Number of designs: d = 2
##
## Random effects model
##
## Treatment estimate (sm = 'SMD', comparison: other treatments vs 'FFG'):
## SMD 95%-CI z p-value
## CT_Nav -0.1577 [-0.5684; 0.2529] -0.75 0.4515
## FFG . . . .
## RA -0.1892 [-0.5371; 0.1587] -1.07 0.2864
##
## Quantifying heterogeneity / inconsistency:
## tau^2 = 0; tau = 0; I^2 = 0% [0.0%; 89.6%]
##
## Tests of heterogeneity (within designs) and inconsistency (between designs):
## Q d.f. p-value
## Total 1.5 2 0.4715
## Within designs 1.5 2 0.4715
## Between designs 0.0 0 --
##
## [[2]]
## Original data:
##
## treat1 treat2 TE seTE
## Chen CT_Nav FFG -0.4939 0.3033
## Cui FFG RA 0.4617 0.2927
## Feng FFG RA 0.0403 0.2236
## Hyun FFG RA 0.6263 0.2645
##
## Number of treatment arms (by study):
## narms
## Chen 2
## Cui 2
## Feng 2
## Hyun 2
##
## Results (random effects model):
##
## treat1 treat2 SMD 95%-CI
## Chen CT_Nav FFG -0.4939 [-1.2007; 0.2129]
## Cui FFG RA 0.3481 [-0.0178; 0.7139]
## Feng FFG RA 0.3481 [-0.0178; 0.7139]
## Hyun FFG RA 0.3481 [-0.0178; 0.7139]
##
## Number of studies: k = 4
## Number of pairwise comparisons: m = 4
## Number of observations: o = 233
## Number of treatments: n = 3
## Number of designs: d = 2
##
## Random effects model
##
## Treatment estimate (sm = 'SMD', comparison: other treatments vs 'FFG'):
## SMD 95%-CI z p-value
## CT_Nav -0.4939 [-1.2007; 0.2129] -1.37 0.1708
## FFG . . . .
## RA -0.3481 [-0.7139; 0.0178] -1.86 0.0622
##
## Quantifying heterogeneity / inconsistency:
## tau^2 = 0.0380; tau = 0.1950; I^2 = 36.2% [0.0%; 79.6%]
##
## Tests of heterogeneity (within designs) and inconsistency (between designs):
## Q d.f. p-value
## Total 3.14 2 0.2085
## Within designs 3.14 2 0.2085
## Between designs 0.00 0 --
##
## [[3]]
## Original data:
##
## treat1 treat2 TE seTE
## Chen CT_Nav FFG -0.1548 0.2993
## Feng FFG RA -0.0370 0.2236
## Hyun FFG RA 0.2034 0.2589
##
## Number of treatment arms (by study):
## narms
## Chen 2
## Feng 2
## Hyun 2
##
## Results (random effects model):
##
## treat1 treat2 SMD 95%-CI
## Chen CT_Nav FFG -0.1548 [-0.7413; 0.4317]
## Feng FFG RA 0.0657 [-0.2660; 0.3974]
## Hyun FFG RA 0.0657 [-0.2660; 0.3974]
##
## Number of studies: k = 3
## Number of pairwise comparisons: m = 3
## Number of observations: o = 185
## Number of treatments: n = 3
## Number of designs: d = 2
##
## Random effects model
##
## Treatment estimate (sm = 'SMD', comparison: other treatments vs 'FFG'):
## SMD 95%-CI z p-value
## CT_Nav -0.1548 [-0.7413; 0.4317] -0.52 0.6049
## FFG . . . .
## RA -0.0657 [-0.3974; 0.2660] -0.39 0.6978
##
## Quantifying heterogeneity / inconsistency:
## tau^2 = 0; tau = 0; I^2 = 0%
##
## Tests of heterogeneity (within designs) and inconsistency (between designs):
## Q d.f. p-value
## Total 0.49 1 0.4822
## Within designs 0.49 1 0.4822
## Between designs 0.00 0 --
lapply(res.md$net, summary)
## [[1]]
## Original data:
##
## treat1 treat2 TE seTE
## Chen CT_Nav FFG -3.2200 0.9659
## Cui FFG RA 2.7000 0.4932
## Hyun FFG RA 2.6000 1.0578
## Tian CT_Nav FFG -1.0500 0.3084
## Wu CT_Nav FFG -0.2100 0.6738
##
## Number of treatment arms (by study):
## narms
## Chen 2
## Cui 2
## Hyun 2
## Tian 2
## Wu 2
##
## Results (random effects model):
##
## treat1 treat2 MD 95%-CI
## Chen CT_Nav FFG -1.2405 [-2.3181; -0.1628]
## Cui FFG RA 2.6681 [ 1.2476; 4.0886]
## Hyun FFG RA 2.6681 [ 1.2476; 4.0886]
## Tian CT_Nav FFG -1.2405 [-2.3181; -0.1628]
## Wu CT_Nav FFG -1.2405 [-2.3181; -0.1628]
##
## Number of studies: k = 5
## Number of pairwise comparisons: m = 5
## Number of observations: o = 261
## Number of treatments: n = 3
## Number of designs: d = 2
##
## Random effects model
##
## Treatment estimate (sm = 'MD', comparison: other treatments vs 'FFG'):
## MD 95%-CI z p-value
## CT_Nav -1.2405 [-2.3181; -0.1628] -2.26 0.0241
## FFG . . . .
## RA -2.6681 [-4.0886; -1.2476] -3.68 0.0002
##
## Quantifying heterogeneity / inconsistency:
## tau^2 = 0.5280; tau = 0.7266; I^2 = 54.5% [0.0%; 84.9%]
##
## Tests of heterogeneity (within designs) and inconsistency (between designs):
## Q d.f. p-value
## Total 6.59 3 0.0861
## Within designs 6.59 3 0.0861
## Between designs 0.00 0 --
##
## [[2]]
## Original data:
##
## treat1 treat2 TE seTE
## Chen CT_Nav FFG 87.8300 8.0816
## Cui FFG RA -32.9000 2.7332
## Feng FFG RA 34.3800 13.2115
## Hyun FFG RA -0.0000 16.6885
## Tian CT_Nav FFG 46.1400 5.5535
## Wu CT_Nav FFG -47.1300 9.3536
##
## Number of treatment arms (by study):
## narms
## Chen 2
## Cui 2
## Feng 2
## Hyun 2
## Tian 2
## Wu 2
##
## Results (random effects model):
##
## treat1 treat2 MD 95%-CI
## Chen CT_Nav FFG 29.2130 [-31.0678; 89.4937]
## Cui FFG RA -0.1633 [-61.3735; 61.0468]
## Feng FFG RA -0.1633 [-61.3735; 61.0468]
## Hyun FFG RA -0.1633 [-61.3735; 61.0468]
## Tian CT_Nav FFG 29.2130 [-31.0678; 89.4937]
## Wu CT_Nav FFG 29.2130 [-31.0678; 89.4937]
##
## Number of studies: k = 6
## Number of pairwise comparisons: m = 6
## Number of observations: o = 341
## Number of treatments: n = 3
## Number of designs: d = 2
##
## Random effects model
##
## Treatment estimate (sm = 'MD', comparison: other treatments vs 'FFG'):
## MD 95%-CI z p-value
## CT_Nav 29.2130 [-31.0678; 89.4937] 0.95 0.3422
## FFG . . . .
## RA 0.1633 [-61.0468; 61.3735] 0.01 0.9958
##
## Quantifying heterogeneity / inconsistency:
## tau^2 = 2776.7817; tau = 52.6952; I^2 = 97.4% [95.7%; 98.4%]
##
## Tests of heterogeneity (within designs) and inconsistency (between designs):
## Q d.f. p-value
## Total 151 4 < 0.0001
## Within designs 151 4 < 0.0001
## Between designs 0 0 --
##
## [[3]]
## Original data:
##
## treat1 treat2 TE seTE
## Chen CT_Nav FFG -176.9100 11.4643
## Cui FFG RA 158.5000 6.0017
## Feng FFG RA 72.5000 31.0066
## Tian CT_Nav FFG -89.0200 23.7073
## Wu CT_Nav FFG -24.8800 50.2541
##
## Number of treatment arms (by study):
## narms
## Chen 2
## Cui 2
## Feng 2
## Tian 2
## Wu 2
##
## Results (random effects model):
##
## treat1 treat2 MD 95%-CI
## Chen CT_Nav FFG -107.5069 [-187.1567; -27.8570]
## Cui FFG RA 119.8548 [ 26.6597; 213.0498]
## Feng FFG RA 119.8548 [ 26.6597; 213.0498]
## Tian CT_Nav FFG -107.5069 [-187.1567; -27.8570]
## Wu CT_Nav FFG -107.5069 [-187.1567; -27.8570]
##
## Number of studies: k = 5
## Number of pairwise comparisons: m = 5
## Number of observations: o = 281
## Number of treatments: n = 3
## Number of designs: d = 2
##
## Random effects model
##
## Treatment estimate (sm = 'MD', comparison: other treatments vs 'FFG'):
## MD 95%-CI z p-value
## CT_Nav -107.5069 [-187.1567; -27.8570] -2.65 0.0082
## FFG . . . .
## RA -119.8548 [-213.0498; -26.6597] -2.52 0.0117
##
## Quantifying heterogeneity / inconsistency:
## tau^2 = 4070.0301; tau = 63.7968; I^2 = 88.2% [72.4%; 95.0%]
##
## Tests of heterogeneity (within designs) and inconsistency (between designs):
## Q d.f. p-value
## Total 25.52 3 < 0.0001
## Within designs 25.52 3 < 0.0001
## Between designs 0.00 0 --
res.md$incon[[1]]
## Q statistics to assess homogeneity / consistency
##
## Q df p-value
## Total 6.59 3 0.0861
## Within designs 6.59 3 0.0861
## Between designs 0.00 0 --
##
## Design-specific decomposition of within-designs Q statistic
##
## Design Q df p-value
## FFG vs. CT_Nav 6.59 2 0.0372
## FFG vs. RA 0.01 1 0.9317
##
## 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 0.00 0 -- 0.7266 0.5280
res.md$incon[[2]]
## Q statistics to assess homogeneity / consistency
##
## Q df p-value
## Total 151.00 4 < 0.0001
## Within designs 151.00 4 < 0.0001
## Between designs 0.00 0 --
##
## Design-specific decomposition of within-designs Q statistic
##
## Design Q df p-value
## FFG vs. CT_Nav 122.95 2 < 0.0001
## FFG vs. RA 28.05 2 < 0.0001
##
## 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 0.00 0 -- 52.6952 2776.7817
res$incon[[1]]
## Q statistics to assess homogeneity / consistency
##
## Q df p-value
## Total 1.50 2 0.4715
## Within designs 1.50 2 0.4715
## Between designs 0.00 0 --
##
## Design-specific decomposition of within-designs Q statistic
##
## Design Q df p-value
## FFG vs. RA 0.78 1 0.3760
## FFG vs. CT_Nav 0.72 1 0.3962
##
## 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 0.00 0 -- 0 0
res$incon[[2]]
## Q statistics to assess homogeneity / consistency
##
## Q df p-value
## Total 3.14 2 0.2085
## Within designs 3.14 2 0.2085
## Between designs 0.00 0 --
##
## Design-specific decomposition of within-designs Q statistic
##
## Design Q df p-value
## FFG vs. RA 3.14 2 0.2085
##
## 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 0.00 0 -- 0.1950 0.0380
res$incon[[3]]
## Q statistics to assess homogeneity / consistency
##
## Q df p-value
## Total 0.49 1 0.4822
## Within designs 0.49 1 0.4822
## Between designs 0.00 0 --
##
## Design-specific decomposition of within-designs Q statistic
##
## Design Q df p-value
## FFG vs. RA 0.49 1 0.4822
##
## 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 0.00 0 -- 0 0
res.md$incon[[3]]
## Q statistics to assess homogeneity / consistency
##
## Q df p-value
## Total 25.52 3 < 0.0001
## Within designs 25.52 3 < 0.0001
## Between designs 0.00 0 --
##
## Design-specific decomposition of within-designs Q statistic
##
## Design Q df p-value
## FFG vs. CT_Nav 18.10 2 0.0001
## FFG vs. RA 7.42 1 0.0065
##
## 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 0.00 0 -- 63.7968 4070.0301
Since the assessment of transitivity is unachievable given the star network (a network where all treatments have been compared with a common treatment but not between themselves) nature of our NMA, distributions of study characteristics related to each intervention will be assessed graphically.
data %>%
ggplot(aes(x = trt, y = n, fill = trt)) +
geom_boxplot() +
geom_dotplot(binaxis = "y", stackdir = "center", dotsize = 2) +
coord_cartesian(ylim=c(10,50)) +
scale_fill_manual(values = c("#0099f8", "#e74c3c", "#2ecc71"))+
facet_wrap(~outcome)
## Bin width defaults to 1/30 of the range of the data. Pick better value with
## `binwidth`.
data %>%
ggplot(aes(x = trt, y = age, fill = trt)) +
geom_boxplot() +
geom_dotplot(binaxis = "y", stackdir = "center", dotsize = 2) +
coord_cartesian(ylim=c(40,80)) +
scale_fill_manual(values = c("#0099f8", "#e74c3c", "#2ecc71"))+
facet_wrap(~outcome)
## Bin width defaults to 1/30 of the range of the data. Pick better value with
## `binwidth`.
data %>%
filter(outcome %in% c("VAS_Back", "VAS_Leg")) %>%
na.omit() %>%
ggplot(aes(x = trt, y = baseline, fill = trt)) +
geom_boxplot() +
geom_dotplot(binaxis = "y", stackdir = "center", dotsize = 2) +
coord_cartesian(ylim=c(3,10)) +
scale_fill_manual(values = c("#0099f8", "#e74c3c", "#2ecc71"))+
facet_wrap(~outcome)
## Bin width defaults to 1/30 of the range of the data. Pick better value with
## `binwidth`.
data %>%
filter(outcome == "ODI") %>%
na.omit() %>%
ggplot(aes(x = trt, y = baseline, fill = trt)) +
geom_boxplot() +
coord_cartesian(ylim=c(20,80)) +
geom_dotplot(binaxis = "y", stackdir = "center", dotsize = 2) +
scale_fill_manual(values = c("#0099f8", "#e74c3c", "#2ecc71"))
## Bin width defaults to 1/30 of the range of the data. Pick better value with
## `binwidth`.