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)

Frequentist NMA

# 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")

Standardized Mean Differences for Outcomes

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

Mean Differences for Outcomes

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))
    
   )  
Table of Comparisons
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)

}

Network Graphs

Network Graph for Paper

netgraph(res$net[[1]], labels = long.labels)

Network Graphs for Supplemental

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

Standardized Mean Difference

Oswestry Disability Index

create_dt(tab.list[[1]])

Visual Analog Scale: Back

Operation Time

create_dt(tab.list[[2]])

Visual Analog Scale: Leg

create_dt(tab.list[[3]])

Mean Difference

Length of Stay

create_dt(md.list[[1]])

Operation Time

create_dt(md.list[[2]])

Blood Loss

create_dt(md.list[[3]])

Forest Plots for SMD’s

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'")

P.Scores

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)

Network Graphs

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
Table of Comparisons for Length of Stay (MD)
create_dt(md.list[[1]])
Table of Comparisons for Operation Time (MD)
create_dt(md.list[[2]])
Table of Comparisons for Blood Loss (MD)
create_dt(md.list[[3]])

Summary Outputs for Outcomes with SMD’s

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

Summary Outputs for Outcomes with MD’s

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

Inconsistency and Heterogeneity

LOS

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

OP

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

ODI

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

VAS: Back

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

Vas: Leg

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

Blood Loss

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

Comparison of Study Characteristics by Treatments

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.

Boxplots of Sample Size

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`.

Age

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`.

Baseline VAS: Back and Leg

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`.

Baseline ODI

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`.