# load packages
library(tidyverse)
library(meta)
library(metafor)
library(dmetar)
library(ggplot2)
library(robvis)
library(readxl)
library(broom)
library(stargazer)
# 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)
}
# 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)
}
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)
}
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")
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
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