Load packages

# load packages
library(tidyverse)
library(meta)
library(metafor)
library(dmetar)
library(ggplot2)
library(robvis)
library(readxl)
library(broom)
library(stargazer)

Functions

# function for logit-transformation of proportions to log odds
d.logit <- function(x, y) { # x = events, y = sample size
  prop <- x/y
  log(prop/(1-prop))
}
# function for inverse logit-(back)transformation to proportions
d.ilogit <- function(x) { # x = logit-transformed proportion (i.e., log odds)
  exp(x)/(exp(x)+1)
}

Effect size calculation

# function for effect size estimation using escalc
mean.ies <- function(x) {
    x.ies <- escalc(data = x, measure = "MN", ni = x$n, mi = x$mean, sdi = x$sd)
    summary(x.ies)
  } 

Meta-analysis

First make sure the data has columns named yi and vi.

# function for meta-analysis using metafor
d.meta <- function(x) { # x = data
    x.res <- rma(yi, vi, data = x)
    summary(x.res)
}

Import datasets into R

setwd("/Users/dongwkim")
ikdc_subjective <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/ikdc_subjective.xlsx")
## New names:
## • `` -> `...8`
ikdc_objective <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/ikdc_objective.xlsx")
lysholm <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/lysholm.xlsx")
lysholm <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/lysholm.xlsx")
tegner <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/tegner.xlsx")
q_lsi_isometric <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/q_lsi_isometric.xlsx")
q_lsi_isokinetic_60 <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/q_lsi_isokinetic_60.xlsx")
q_lsi_isokinetic_180 <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/q_lsi_isokinetic_180.xlsx")
h_lsi_isometric <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/h_lsi_isometric.xlsx")
h_lsi_isokinetic_60 <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/h_lsi_isokinetic_60.xlsx")
h_lsi_isokinetic_180 <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/h_lsi_isokinetic_180.xlsx")
marx <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/marx.xlsx")
koos_adl <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/koos_adl.xlsx")
koos_pain <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/koos_pain.xlsx")
koos_qol <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/koos_qol.xlsx")
koos_sport <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/koos_sport.xlsx")
koos_symptoms <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/koos_symptoms.xlsx")
instrumental_laxity <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/instrumental_laxity.xlsx")
vas <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/vas.xlsx")
slht <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/slht.xlsx")
lachman <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/lachman.xlsx")
pivot_shift <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/pivot_shift.xlsx")
graft_rupture <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/graft_rupture.xlsx")
donor_site_morbidity <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/donor_site_morbidity.xlsx")
arthrofibrosis <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/arthrofibrosis.xlsx")
patellar_fracture <- read_excel("Google Drive/My Drive/B–QT vs. S–QT/7. Meta-Analysis (Started 31.10.2023)/Data exported from MS Access/patellar_fracture.xlsx")

Analysis

m.mean.ikdc_subjective <- metamean(n = ikdc_subjective_n,
mean = ikdc_subjective_mean,
sd = ikdc_subjective_sd,
studlab = study,
data = ikdc_subjective,
sm = "MRAW",
fixed = FALSE,
random = TRUE,
method.tau = "REML",
hakn = TRUE,
title = "ikdc_subjective",
subgroup = graft_type,
tau.common = FALSE)

m.mean.koos_adl <- metamean(n = koos_adl_n,
mean = koos_adl_mean,
sd = koos_adl_sd,
studlab = study,
data = koos_adl,
sm = "MRAW",
fixed = FALSE,
random = TRUE,
method.tau = "REML",
hakn = TRUE,
title = "koos_adl",
subgroup = graft_type,
tau.common = TRUE)

summary(m.mean.koos_adl)
## Review:     koos_adl
## 
##                           mean              95%-CI %W(random) graft_type
## Runer et al., 2023     99.4000 [98.8074;  99.9926]       12.4       B-QT
## Lund et al., 2014      95.0000 [92.4338;  97.5662]        9.3       B-QT
## Lind et al., 2020b     95.0000 [92.7129;  97.2871]        9.8       B-QT
## Karpinski et al., 2021 96.2400 [94.5819;  97.8981]       11.0       B-QT
## Jacquet et al., 2021   91.9000 [89.7016;  94.0984]       10.0       B-QT
## Irrgang et al., 2021   98.4600 [96.7255; 100.1945]       10.8       B-QT
## Cavaignac et al., 2017 95.0000 [93.4340;  96.5660]       11.1       B-QT
## Zhou et al., 2023      93.8800 [93.6545;  94.1055]       12.6       S-QT
## Hunnicutt et al., 2019 94.0500 [90.6290;  97.4710]        7.7       S-QT
## Hogan et al., 2022     94.9000 [90.0334;  99.7666]        5.5       S-QT
## 
## Number of studies: k = 10
## Number of observations: o = 459
## 
##                         mean             95%-CI
## Random effects model 95.5270 [93.8805; 97.1736]
## 
## Quantifying heterogeneity:
##  tau^2 = 4.7120 [1.6756; 15.2721]; tau = 2.1707 [1.2944; 3.9079]
##  I^2 = 97.2% [96.1%; 98.0%]; H = 5.96 [5.06; 7.04]
## 
## Quantifying residual heterogeneity:
##  tau^2 = 4.4446; tau = 2.1082; I^2 = 90.2% [83.7%; 94.1%]; H = 3.20 [2.48; 4.13]
## 
## Test of heterogeneity:
##       Q d.f.  p-value
##  320.13    9 < 0.0001
## 
## Results for subgroups (random effects model):
##                     k    mean             95%-CI  tau^2    tau     Q   I^2
## graft_type = B-QT   7 96.0125 [93.6731; 98.3518] 4.4446 2.1082 81.57 92.6%
## graft_type = S-QT   3 94.1429 [92.9398; 95.3459] 4.4446 2.1082  0.18  0.0%
## 
## Test for subgroup differences (random effects model):
##                    Q d.f.  p-value
## Between groups  3.52    1   0.0605
## Within groups  81.75    8 < 0.0001
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
##   (assuming common tau^2 in subgroups)
## - Q-Profile method for confidence interval of tau^2 and tau
## - Hartung-Knapp adjustment for random effects model (df = 9)
## - Untransformed (raw) means
m.mean.koos_pain <- metamean(n = koos_pain_n,
mean = koos_pain_mean,
sd = koos_pain_sd,
studlab = study,
data = koos_pain,
sm = "MRAW",
fixed = FALSE,
random = TRUE,
method.tau = "REML",
hakn = TRUE,
title = "koos_pain",
subgroup = graft_type,
tau.common = TRUE)

summary(m.mean.koos_pain)
## Review:     koos_pain
## 
##                           mean             95%-CI %W(random) graft_type
## Runer et al., 2023     97.4000 [95.3998; 99.4002]       11.6       B-QT
## Lund et al., 2014      90.0000 [85.7230; 94.2770]        8.4       B-QT
## Lind et al., 2020b     92.0000 [88.8552; 95.1448]       10.0       B-QT
## Karpinski et al., 2021 91.5600 [87.9184; 95.2016]        9.3       B-QT
## Jacquet et al., 2021   87.8000 [84.9441; 90.6559]       10.4       B-QT
## Irrgang et al., 2021   94.2900 [91.6416; 96.9384]       10.7       B-QT
## Cavaignac et al., 2017 90.0000 [87.9908; 92.0092]       11.6       B-QT
## Zhou et al., 2023      88.5100 [88.2068; 88.8132]       13.0       S-QT
## Hunnicutt et al., 2019 87.9400 [83.8966; 91.9834]        8.7       S-QT
## Hogan et al., 2022     89.7000 [83.8672; 95.5328]        6.4       S-QT
## 
## Number of studies: k = 10
## Number of observations: o = 459
## 
##                         mean             95%-CI
## Random effects model 91.0418 [88.7760; 93.3075]
## 
## Quantifying heterogeneity:
##  tau^2 = 8.5787 [2.8718; 28.8524]; tau = 2.9289 [1.6946; 5.3714]
##  I^2 = 91.0% [85.5%; 94.4%]; H = 3.33 [2.63; 4.21]
## 
## Quantifying residual heterogeneity:
##  tau^2 = 6.9879; tau = 2.6435; I^2 = 81.4% [65.8%; 89.9%]; H = 2.32 [1.71; 3.15]
## 
## Test of heterogeneity:
##      Q d.f.  p-value
##  99.54    9 < 0.0001
## 
## Results for subgroups (random effects model):
##                     k    mean             95%-CI  tau^2    tau     Q   I^2
## graft_type = B-QT   7 92.0135 [88.9729; 95.0541] 6.9879 2.6435 42.82 86.0%
## graft_type = S-QT   3 88.5928 [86.6819; 90.5038] 6.9879 2.6435  0.24  0.0%
## 
## Test for subgroup differences (random effects model):
##                    Q d.f.  p-value
## Between groups  6.72    1   0.0095
## Within groups  43.06    8 < 0.0001
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
##   (assuming common tau^2 in subgroups)
## - Q-Profile method for confidence interval of tau^2 and tau
## - Hartung-Knapp adjustment for random effects model (df = 9)
## - Untransformed (raw) means
m.mean.koos_sport <- metamean(n = koos_sport_n,
mean = koos_sport_mean,
sd = koos_sport_sd,
studlab = study,
data = koos_sport,
sm = "MRAW",
fixed = FALSE,
random = TRUE,
method.tau = "REML",
hakn = TRUE,
title = "koos_sport",
subgroup = graft_type,
tau.common = TRUE)

summary(m.mean.koos_sport)
## Review:     koos_sport
## 
##                           mean             95%-CI %W(random) graft_type
## Runer et al., 2023     95.0000 [92.0368; 97.9632]       11.7       B-QT
## Lund et al., 2014      80.0000 [71.8737; 88.1263]        8.2       B-QT
## Lind et al., 2020b     82.0000 [73.7092; 90.2908]        8.1       B-QT
## Karpinski et al., 2021 80.8000 [72.7210; 88.8790]        8.3       B-QT
## Jacquet et al., 2021   77.3000 [73.0264; 81.5736]       10.9       B-QT
## Irrgang et al., 2021   89.7100 [86.0763; 93.3437]       11.3       B-QT
## Cavaignac et al., 2017 82.0000 [78.6611; 85.3389]       11.5       B-QT
## Zhou et al., 2023      79.2200 [78.6970; 79.7430]       12.5       S-QT
## Hunnicutt et al., 2019 75.8600 [69.3116; 82.4084]        9.4       S-QT
## Hogan et al., 2022     82.2000 [73.7550; 90.6450]        8.0       S-QT
## 
## Number of studies: k = 10
## Number of observations: o = 459
## 
##                         mean             95%-CI
## Random effects model 82.7106 [78.3548; 87.0664]
## 
## Quantifying heterogeneity:
##  tau^2 = 33.2940 [11.9142; 106.7623]; tau = 5.7701 [3.4517; 10.3326]
##  I^2 = 93.5% [90.1%; 95.8%]; H = 3.93 [3.18; 4.87]
## 
## Quantifying residual heterogeneity:
##  tau^2 = 30.0215; tau = 5.4792; I^2 = 87.9% [79.3%; 93.0%]; H = 2.88 [2.20; 3.78]
## 
## Test of heterogeneity:
##       Q d.f.  p-value
##  139.23    9 < 0.0001
## 
## Results for subgroups (random effects model):
##                     k    mean             95%-CI   tau^2    tau     Q   I^2
## graft_type = B-QT   7 84.3448 [78.2825; 90.4071] 30.0215 5.4792 64.86 90.7%
## graft_type = S-QT   3 78.9607 [71.6440; 86.2773] 30.0215 5.4792  1.49  0.0%
## 
## Test for subgroup differences (random effects model):
##                    Q d.f.  p-value
## Between groups  3.21    1   0.0732
## Within groups  66.35    8 < 0.0001
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
##   (assuming common tau^2 in subgroups)
## - Q-Profile method for confidence interval of tau^2 and tau
## - Hartung-Knapp adjustment for random effects model (df = 9)
## - Untransformed (raw) means
m.mean.koos_symptoms <- metamean(n = koos_symptoms_n,
mean = koos_symptoms_mean,
sd = koos_symptoms_sd,
studlab = study,
data = koos_symptoms,
sm = "MRAW",
fixed = FALSE,
random = TRUE,
method.tau = "REML",
hakn = TRUE,
title = "koos_symptoms",
subgroup = graft_type,
tau.common = TRUE)

summary(m.mean.koos_symptoms)
## Review:     koos_symptoms
## 
##                           mean             95%-CI %W(random) graft_type
## Runer et al., 2023     94.6000 [92.1924; 97.0076]       11.9       B-QT
## Lund et al., 2014      84.0000 [78.4399; 89.5601]        8.9       B-QT
## Lind et al., 2020b     87.0000 [82.1399; 91.8601]        9.6       B-QT
## Karpinski et al., 2021 82.5200 [75.4837; 89.5563]        7.6       B-QT
## Jacquet et al., 2021   85.4000 [82.3592; 88.4408]       11.4       B-QT
## Irrgang et al., 2021   87.5300 [84.8425; 90.2175]       11.6       B-QT
## Cavaignac et al., 2017 90.0000 [86.6907; 93.3093]       11.1       B-QT
## Zhou et al., 2023      81.2600 [80.7048; 81.8152]       12.8       S-QT
## Hunnicutt et al., 2019 77.0100 [68.5436; 85.4764]        6.4       S-QT
## Hogan et al., 2022     83.7000 [77.8672; 89.5328]        8.7       S-QT
## 
## Number of studies: k = 10
## Number of observations: o = 456
## 
##                         mean             95%-CI
## Random effects model 85.8489 [82.4169; 89.2809]
## 
## Quantifying heterogeneity:
##  tau^2 = 18.5567 [6.5811; 71.9606]; tau = 4.3077 [2.5654; 8.4830]
##  I^2 = 94.3% [91.4%; 96.2%]; H = 4.19 [3.41; 5.15]
## 
## Quantifying residual heterogeneity:
##  tau^2 = 10.5019; tau = 3.2407; I^2 = 77.9% [58.3%; 88.3%]; H = 2.13 [1.55; 2.93]
## 
## Test of heterogeneity:
##       Q d.f.  p-value
##  158.22    9 < 0.0001
## 
## Results for subgroups (random effects model):
##                     k    mean             95%-CI   tau^2    tau     Q   I^2
## graft_type = B-QT   7 87.8942 [84.1436; 91.6448] 10.5019 3.2407 34.63 82.7%
## graft_type = S-QT   3 81.1509 [74.2633; 88.0384] 10.5019 3.2407  1.64  0.0%
## 
## Test for subgroup differences (random effects model):
##                    Q d.f.  p-value
## Between groups  9.26    1   0.0023
## Within groups  36.27    8 < 0.0001
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
##   (assuming common tau^2 in subgroups)
## - Q-Profile method for confidence interval of tau^2 and tau
## - Hartung-Knapp adjustment for random effects model (df = 9)
## - Untransformed (raw) means

Regression

m.mean.koos_symptoms.reg <- metareg(m.mean.koos_symptoms,
~follow_up + graft_type)

summary(m.mean.koos_symptoms.reg)
## 
## Mixed-Effects Model (k = 10; tau^2 estimator: REML)
## 
##   logLik  deviance       AIC       BIC      AICc   
## -15.8229   31.6458   39.6458   39.4295   59.6458   
## 
## tau^2 (estimated amount of residual heterogeneity):     1.0593 (SE = 2.7074)
## tau (square root of estimated tau^2 value):             1.0292
## I^2 (residual heterogeneity / unaccounted variability): 19.85%
## H^2 (unaccounted variability / sampling variability):   1.25
## R^2 (amount of heterogeneity accounted for):            94.29%
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 7.5253, p-val = 0.3763
## 
## Test of Moderators (coefficients 2:3):
## F(df1 = 2, df2 = 7) = 33.1094, p-val = 0.0003
## 
## Model Results:
## 
##                 estimate      se     tval  df    pval    ci.lb    ci.ub      
## intrcpt          82.0330  1.5632  52.4788   7  <.0001  78.3367  85.7293  *** 
## follow_up         0.1581  0.0327   4.8327   7  0.0019   0.0807   0.2354   ** 
## graft_typeS-QT   -4.4051  1.3039  -3.3785   7  0.0118  -7.4882  -1.3220    * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1