1 How to use this file

This practical demonstrates a single-arm proportion meta-analysis.

Training question: Among women who received hyaluronidase, what proportion had an episiotomy?

Effect measure: Pooled proportion, shown as a percentage.

Important distinction: A pooled proportion is descriptive. It is not a treatment-effect estimate. To compare hyaluronidase with placebo or no intervention, use the binary risk-ratio practical.

Important modelling note: This file uses metaprop() with sm = "PLOGIT" and method = "Inverse". This keeps the workflow simple and allows REML, DL, and SJ tau2 estimators. If method = "Inverse" is omitted, metaprop() may use a GLMM workflow that requires method.tau = "ML".

2 1. Load packages

packages <- c("readxl", "dplyr", "meta", "knitr")
missing <- packages[!sapply(packages, requireNamespace, quietly = TRUE)]
if (length(missing) > 0) install.packages(missing)

library(readxl)
library(dplyr)
library(meta)
library(knitr)

2.1 Interpretation

  • What this output is: Package installation and loading.
  • How to interpret it: No error means the R environment is ready.
  • Key takeaway: The main function for this practical is metaprop() from the {meta} package.

3 2. Read the Excel file as a data frame

data_file <- "Hyaluronidase_MetaAnalysis_Dataset_statafinal1_1.xlsx"
if (!file.exists(data_file)) stop("Put the Hyaluronidase Excel file in the same folder as this Rmd.")

df <- read_excel(data_file, sheet = 1, range = "A5:P45", col_names = TRUE)

names(df) <- c(
  "Study", "ROBOverall", "aHAaseevents", "n1HAasetotal",
  "cControlevents", "n2Controltotal", "RiskHAase", "RiskControl",
  "RR", "lnRR", "SElnRR", "CILower", "CIUpper",
  "Outcome", "TypeofStudy", "RCT_design"
)

3.1 Interpretation

  • What this output is: Import of the hyaluronidase dataset.
  • How to interpret it: No error means the file path, sheet, and cell range were read successfully.
  • Key takeaway: For this proportion analysis, we use only the HAase arm: aHAaseevents and n1HAasetotal.

4 3. Inspect and clean the dataset

df <- df %>%
  mutate(
    Study = trimws(Study),
    Outcome = trimws(Outcome),
    RCT_design = trimws(RCT_design),
    ROBOverall = trimws(ROBOverall),
    aHAaseevents = as.numeric(aHAaseevents),
    n1HAasetotal = as.numeric(n1HAasetotal)
  )

df %>%
  select(Study, Outcome, RCT_design, aHAaseevents, n1HAasetotal, ROBOverall) %>%
  head(12) %>%
  kable(caption = "First 12 rows relevant to the proportion analysis")
First 12 rows relevant to the proportion analysis
Study Outcome RCT_design aHAaseevents n1HAasetotal ROBOverall
Chatfield 1966* Perineal_Trauma Placebo 58 67 High
Colacioppo 2011* Perineal_Trauma Placebo 86 115 Low
Kwon 2020* Perineal_Trauma Placebo 61 88 Low
Martinez 2019 (sim) Perineal_Trauma Placebo 70 95 Low
Chen 2020 (sim) Perineal_Trauma Placebo 82 110 Some Concerns
Kumar 2021 (sim) Perineal_Trauma Placebo 55 80 High
Johansson 2018 (sim) Perineal_Trauma Placebo 48 70 Some Concerns
Patel 2022 (sim) Perineal_Trauma Placebo 66 92 Low
Nguyen 2021 (sim) Perineal_Trauma Placebo 44 65 High
Osei 2020 (sim) Perineal_Trauma Placebo 35 55 High
Chatfield 1966* Episiotomy Placebo 22 67 High
Colacioppo 2011* Episiotomy Placebo 41 115 Low

4.1 Interpretation

  • What this output is: A first look at the columns needed for the proportion meta-analysis.
  • How to interpret it: Each row contains a study label, outcome name, comparison design, event count, and total sample size.
  • Good data look like: Events and totals are numeric, non-missing, and events do not exceed total sample size.
  • Common pitfall: Assuming a proportion analysis compares groups. It does not; it estimates an event rate in one arm.
df %>%
  summarise(
    rows = n(),
    missing_events = sum(is.na(aHAaseevents)),
    missing_totals = sum(is.na(n1HAasetotal)),
    events_exceed_total = sum(aHAaseevents > n1HAasetotal, na.rm = TRUE),
    zero_or_negative_total = sum(n1HAasetotal <= 0, na.rm = TRUE)
  ) %>%
  kable(caption = "Basic checks for single-arm proportion data")
Basic checks for single-arm proportion data
rows missing_events missing_totals events_exceed_total zero_or_negative_total
40 0 0 0 0

4.2 Interpretation

  • What this output is: A basic data-quality check.
  • How to interpret it: Ideally, all problem counts are zero.
  • Key takeaway: A valid proportion requires a non-missing event count, a positive denominator, and events less than or equal to the denominator.
  • Recommended next step: Filter the dataset to the episiotomy outcome.

5 4. Select the episiotomy outcome

episiotomy_raw <- df %>%
  filter(Outcome == "Episiotomy")

episiotomy_raw %>%
  select(Study, RCT_design, aHAaseevents, n1HAasetotal, ROBOverall) %>%
  kable(caption = "Episiotomy rows before duplicate-arm checking")
Episiotomy rows before duplicate-arm checking
Study RCT_design aHAaseevents n1HAasetotal ROBOverall
Chatfield 1966* Placebo 22 67 High
Colacioppo 2011* Placebo 41 115 Low
Kwon 2020* Placebo 27 88 Low
Martinez 2019 (sim) Placebo 32 95 Low
Chen 2020 (sim) Placebo 38 110 Some Concerns
Kumar 2021 (sim) Placebo 24 80 High
Johansson 2018 (sim) Placebo 20 70 Some Concerns
Patel 2022 (sim) Placebo 29 92 Low
Nguyen 2021 (sim) Placebo 18 65 High
Osei 2020 (sim) Placebo 14 55 High
Chatfield 1966* No Intervention 22 67 High
O’Leary 1965* No Intervention 14 50 High
Scarabotto 2008* No Intervention 18 69 Some Concerns
Fernando 2017 (sim) No Intervention 11 60 Some Concerns
Diallo 2019 (sim) No Intervention 10 52 High
Park 2018 (sim) No Intervention 15 70 Some Concerns
Ahmed 2020 (sim) No Intervention 12 58 High
Rossi 2021 (sim) No Intervention 16 72 Some Concerns
Williams 2022 (sim) No Intervention 13 65 High
Tanaka 2016 (sim) No Intervention 9 48 High

5.1 Interpretation

  • What this output is: All rows for the episiotomy outcome.
  • How to interpret it: Some rows may represent the same HAase arm appearing in more than one comparison context.
  • Key takeaway: Before pooling single-arm proportions, we must check whether the same study arm is repeated.

6 5. Check for duplicated HAase arms

episiotomy_raw %>%
  count(Study, aHAaseevents, n1HAasetotal) %>%
  filter(n > 1) %>%
  kable(caption = "Duplicated HAase arms in the episiotomy dataset")
Duplicated HAase arms in the episiotomy dataset
Study aHAaseevents n1HAasetotal n
Chatfield 1966* 22 67 2

6.1 Interpretation

  • What this output is: A check for duplicated study arms.
  • How to interpret it: If a study has the same HAase event count and denominator more than once, it is probably the same intervention arm reused across comparison rows.
  • Key takeaway: For a single-arm pooled proportion, duplicated arms should not be counted twice in the main analysis.
  • Common pitfall: Using every comparison row in a single-arm analysis. This can double-count participants and may also create duplicate study labels in leave-one-out analysis.

7 6. Create the final analysis dataset

episiotomy_df <- episiotomy_raw %>%
  distinct(Study, aHAaseevents, n1HAasetotal, .keep_all = TRUE) %>%
  mutate(StudyLabel = make.unique(Study))

episiotomy_df %>%
  select(StudyLabel, Study, aHAaseevents, n1HAasetotal, ROBOverall) %>%
  kable(caption = "Final episiotomy dataset: one row per unique HAase arm")
Final episiotomy dataset: one row per unique HAase arm
StudyLabel Study aHAaseevents n1HAasetotal ROBOverall
Chatfield 1966* Chatfield 1966* 22 67 High
Colacioppo 2011* Colacioppo 2011* 41 115 Low
Kwon 2020* Kwon 2020* 27 88 Low
Martinez 2019 (sim) Martinez 2019 (sim) 32 95 Low
Chen 2020 (sim) Chen 2020 (sim) 38 110 Some Concerns
Kumar 2021 (sim) Kumar 2021 (sim) 24 80 High
Johansson 2018 (sim) Johansson 2018 (sim) 20 70 Some Concerns
Patel 2022 (sim) Patel 2022 (sim) 29 92 Low
Nguyen 2021 (sim) Nguyen 2021 (sim) 18 65 High
Osei 2020 (sim) Osei 2020 (sim) 14 55 High
O’Leary 1965* O’Leary 1965* 14 50 High
Scarabotto 2008* Scarabotto 2008* 18 69 Some Concerns
Fernando 2017 (sim) Fernando 2017 (sim) 11 60 Some Concerns
Diallo 2019 (sim) Diallo 2019 (sim) 10 52 High
Park 2018 (sim) Park 2018 (sim) 15 70 Some Concerns
Ahmed 2020 (sim) Ahmed 2020 (sim) 12 58 High
Rossi 2021 (sim) Rossi 2021 (sim) 16 72 Some Concerns
Williams 2022 (sim) Williams 2022 (sim) 13 65 High
Tanaka 2016 (sim) Tanaka 2016 (sim) 9 48 High

7.1 Interpretation

  • What this output is: The final dataset for the main single-arm proportion meta-analysis.
  • How to interpret it: Each row should represent one unique HAase study arm.
  • Key takeaway: This step fixes the duplicate-label problem that can cause metainf() to fail with duplicate row names.
  • Recommended next step: Calculate observed study proportions before pooling.

8 7. Calculate observed study proportions

episiotomy_df %>%
  mutate(Proportion = aHAaseevents / n1HAasetotal) %>%
  select(StudyLabel, aHAaseevents, n1HAasetotal, Proportion) %>%
  mutate(Proportion = fmt_pct(Proportion)) %>%
  kable(caption = "Observed episiotomy proportion in each HAase arm")
Observed episiotomy proportion in each HAase arm
StudyLabel aHAaseevents n1HAasetotal Proportion
Chatfield 1966* 22 67 32.8%
Colacioppo 2011* 41 115 35.7%
Kwon 2020* 27 88 30.7%
Martinez 2019 (sim) 32 95 33.7%
Chen 2020 (sim) 38 110 34.5%
Kumar 2021 (sim) 24 80 30.0%
Johansson 2018 (sim) 20 70 28.6%
Patel 2022 (sim) 29 92 31.5%
Nguyen 2021 (sim) 18 65 27.7%
Osei 2020 (sim) 14 55 25.5%
O’Leary 1965* 14 50 28.0%
Scarabotto 2008* 18 69 26.1%
Fernando 2017 (sim) 11 60 18.3%
Diallo 2019 (sim) 10 52 19.2%
Park 2018 (sim) 15 70 21.4%
Ahmed 2020 (sim) 12 58 20.7%
Rossi 2021 (sim) 16 72 22.2%
Williams 2022 (sim) 13 65 20.0%
Tanaka 2016 (sim) 9 48 18.8%

8.1 Interpretation

  • What this output is: The raw episiotomy proportion in each HAase arm.
  • How to interpret it: Higher percentages mean more episiotomy events among participants who received HAase.
  • Key takeaway: These are study-level descriptive proportions. Meta-analysis combines them while accounting for precision and heterogeneity.

9 8. Fit the pooled proportion model

m_prop_epi <- metaprop(
  event = aHAaseevents,
  n = n1HAasetotal,
  studlab = StudyLabel,
  data = episiotomy_df,
  sm = "PLOGIT",
  method = "Inverse",
  common = FALSE,
  random = TRUE,
  method.tau = "REML",
  method.random.ci = "HK",
  backtransf = TRUE
)

summary(m_prop_epi)
##                      proportion           95%-CI %W(random)
## Chatfield 1966*          0.3284 [0.2185; 0.4540]        5.5
## Colacioppo 2011*         0.3565 [0.2694; 0.4512]        8.5
## Kwon 2020*               0.3068 [0.2129; 0.4142]        6.6
## Martinez 2019 (sim)      0.3368 [0.2431; 0.4411]        7.3
## Chen 2020 (sim)          0.3455 [0.2574; 0.4421]        8.1
## Kumar 2021 (sim)         0.3000 [0.2026; 0.4128]        6.1
## Johansson 2018 (sim)     0.2857 [0.1840; 0.4062]        5.4
## Patel 2022 (sim)         0.3152 [0.2223; 0.4204]        6.9
## Nguyen 2021 (sim)        0.2769 [0.1731; 0.4019]        5.0
## Osei 2020 (sim)          0.2545 [0.1467; 0.3900]        4.1
## O'Leary 1965*            0.2800 [0.1623; 0.4249]        4.0
## Scarabotto 2008*         0.2609 [0.1625; 0.3806]        5.1
## Fernando 2017 (sim)      0.1833 [0.0952; 0.3044]        3.6
## Diallo 2019 (sim)        0.1923 [0.0963; 0.3253]        3.3
## Park 2018 (sim)          0.2143 [0.1252; 0.3287]        4.6
## Ahmed 2020 (sim)         0.2069 [0.1117; 0.3335]        3.8
## Rossi 2021 (sim)         0.2222 [0.1327; 0.3356]        4.8
## Williams 2022 (sim)      0.2000 [0.1110; 0.3177]        4.1
## Tanaka 2016 (sim)        0.1875 [0.0895; 0.3263]        3.0
## 
## Number of studies: k = 19
## Number of observations: o = 1381
## Number of events: e = 383
## 
##                      proportion           95%-CI
## Random effects model     0.2773 [0.2497; 0.3068]
## 
## Quantifying heterogeneity (with 95%-CIs):
##  tau^2 = 0.0175 [0.0000; 0.1215]; tau = 0.1323 [0.0000; 0.3486]
##  I^2 = 18.6% [0.0%; 53.0%]; H = 1.11 [1.00; 1.46]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  22.12   18  0.2269
## 
## Details of meta-analysis methods:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau
## - Calculation of I^2 based on Q
## - Hartung-Knapp adjustment for random effects model (df = 18)
## - Logit transformation
## - Clopper-Pearson confidence interval for individual studies

9.1 Interpretation

  • What this output is: A random-effects meta-analysis of the episiotomy proportion in the HAase arm.
  • How to interpret it: The pooled proportion is 27.7% (95% CI 25.0% to 30.7%).
  • Heterogeneity: I2 = 18.6%, tau2 = 0.0175, Q-test p = 0.227.
  • Key takeaway: This estimates the average episiotomy proportion among HAase participants in the teaching dataset.
  • What cannot be concluded: This result does not show whether HAase reduces episiotomy compared with placebo or no intervention.
  • Assumptions and limitations: The model assumes each included HAase arm contributes one independent estimate. Clinical and methodological differences can cause heterogeneity.

10 9. Summary table

summary_prop(m_prop_epi, "Episiotomy proportion in HAase arm") %>%
  mutate(
    Pooled_proportion = fmt_pct(Pooled_proportion),
    Lower_95_CI = fmt_pct(Lower_95_CI),
    Upper_95_CI = fmt_pct(Upper_95_CI),
    Tau2 = fmt_num(Tau2, 4),
    I2_percent = fmt_num(I2_percent, 1),
    Q_p_value = fmt_p(Q_p_value)
  ) %>%
  kable(caption = "Pooled episiotomy proportion using random-effects REML and Hartung-Knapp CI")
Pooled episiotomy proportion using random-effects REML and Hartung-Knapp CI
Analysis Studies Pooled_proportion Lower_95_CI Upper_95_CI Tau2 I2_percent Q_p_value
Episiotomy proportion in HAase arm 19 27.7% 25.0% 30.7% 0.0175 18.6 0.227

10.1 Interpretation

  • What this output is: A compact table containing the pooled proportion and heterogeneity statistics.
  • How to interpret it: The pooled proportion is the estimated average event proportion across included HAase arms.
  • Good vs. concerning: A narrow CI suggests precision; high I2 suggests important variation between studies.
  • Recommended next step: Inspect the forest plot to see individual study estimates and the pooled estimate.

11 10. Forest plot

forest(
  m_prop_epi,
  prediction = TRUE,
  print.tau2 = TRUE,
  print.I2 = TRUE,
  leftcols = c("studlab", "event", "n"),
  leftlabs = c("Study", "Events", "Total"),
  xlab = "Proportion with episiotomy in the HAase arm",
  backtransf = TRUE
)

11.1 Interpretation

  • What this output is: A forest plot of single-arm episiotomy proportions.
  • How to interpret it: Each study shows its estimated proportion and CI; the diamond shows the pooled proportion.
  • Key takeaway: The plot shows how much episiotomy proportions vary across HAase arms.
  • Common pitfall: Looking for a “favours treatment” side. A single-arm proportion plot has no comparator.

12 11. Sensitivity to tau2 estimator

This section checks whether the pooled proportion changes when the between-study variance estimator changes.

fit_prop <- function(data, tau_method = "REML") {
  metaprop(
    event = aHAaseevents,
    n = n1HAasetotal,
    studlab = StudyLabel,
    data = data,
    sm = "PLOGIT",
    method = "Inverse",
    common = FALSE,
    random = TRUE,
    method.tau = tau_method,
    method.random.ci = "HK",
    backtransf = TRUE
  )
}
prop_tau <- bind_rows(
  summary_prop(fit_prop(episiotomy_df, "REML"), "REML"),
  summary_prop(fit_prop(episiotomy_df, "DL"),   "DL"),
  summary_prop(fit_prop(episiotomy_df, "SJ"),   "SJ")
)

prop_tau %>%
  mutate(
    Pooled_proportion = fmt_pct(Pooled_proportion),
    Lower_95_CI = fmt_pct(Lower_95_CI),
    Upper_95_CI = fmt_pct(Upper_95_CI),
    Tau2 = fmt_num(Tau2, 4),
    I2_percent = fmt_num(I2_percent, 1),
    Q_p_value = fmt_p(Q_p_value)
  ) %>%
  kable(caption = "Sensitivity of pooled proportion to tau2 estimator")
Sensitivity of pooled proportion to tau2 estimator
Analysis Studies Pooled_proportion Lower_95_CI Upper_95_CI Tau2 I2_percent Q_p_value
REML 19 27.7% 25.0% 30.7% 0.0175 18.6 0.227
DL 19 27.8% 25.0% 30.7% 0.0161 18.6 0.227
SJ 19 27.3% 24.6% 30.3% 0.0483 18.6 0.227

12.1 Interpretation

  • What this output is: A comparison of pooled proportions under REML, DL, and SJ tau2 estimators.
  • How to interpret it: Similar estimates across methods are reassuring; large differences mean conclusions depend on modelling choices.
  • Key takeaway: Sensitivity analysis helps assess robustness.
  • Common pitfall: Forgetting method = "Inverse" when using REML, DL, or SJ with metaprop() and sm = "PLOGIT".

13 12. Leave-one-out analysis

loo_prop <- metainf(m_prop_epi, pooled = "random")
summary(loo_prop)
## Leave-one-out meta-analysis
## 
##                               proportion           95%-CI  tau^2    tau   I^2
## Omitting Chatfield 1966*          0.2738 [0.2453; 0.3043] 0.0211 0.1452 20.4%
## Omitting Colacioppo 2011*         0.2720 [0.2449; 0.3009] 0.0088 0.0936  8.6%
## Omitting Kwon 2020*               0.2743 [0.2452; 0.3054] 0.0232 0.1523 22.1%
## Omitting Martinez 2019 (sim)      0.2727 [0.2445; 0.3029] 0.0187 0.1368 17.3%
## Omitting Chen 2020 (sim)          0.2722 [0.2444; 0.3018] 0.0147 0.1214 13.6%
## Omitting Kumar 2021 (sim)         0.2749 [0.2457; 0.3061] 0.0233 0.1525 22.6%
## Omitting Johansson 2018 (sim)     0.2759 [0.2467; 0.3072] 0.0228 0.1509 23.1%
## Omitting Patel 2022 (sim)         0.2737 [0.2449; 0.3047] 0.0225 0.1499 21.1%
## Omitting Nguyen 2021 (sim)        0.2765 [0.2473; 0.3078] 0.0222 0.1489 23.1%
## Omitting Osei 2020 (sim)          0.2779 [0.2488; 0.3089] 0.0201 0.1419 22.4%
## Omitting O'Leary 1965*            0.2765 [0.2474; 0.3076] 0.0214 0.1462 23.1%
## Omitting Scarabotto 2008*         0.2775 [0.2483; 0.3088] 0.0212 0.1456 22.6%
## Omitting Fernando 2017 (sim)      0.2827 [0.2554; 0.3118] 0.0103 0.1013 11.7%
## Omitting Diallo 2019 (sim)        0.2814 [0.2536; 0.3110] 0.0131 0.1145 15.2%
## Omitting Park 2018 (sim)          0.2813 [0.2529; 0.3115] 0.0140 0.1184 17.1%
## Omitting Ahmed 2020 (sim)         0.2810 [0.2528; 0.3111] 0.0142 0.1193 17.0%
## Omitting Rossi 2021 (sim)         0.2807 [0.2521; 0.3112] 0.0154 0.1240 18.4%
## Omitting Williams 2022 (sim)      0.2821 [0.2541; 0.3118] 0.0120 0.1097 14.7%
## Omitting Tanaka 2016 (sim)        0.2813 [0.2535; 0.3108] 0.0132 0.1150 15.1%
##                                                                              
## Random effects model              0.2773 [0.2497; 0.3068] 0.0175 0.1323 18.6%
## 
## Details of meta-analysis methods:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Calculation of I^2 based on Q
## - Hartung-Knapp adjustment for random effects model (df = {17, 18})
## - Logit transformation
forest(loo_prop, xlab = "Proportion with episiotomy", backtransf = TRUE)

13.1 Interpretation

  • What this output is: The pooled proportion recalculated after omitting one study at a time.
  • How to interpret it: Compare each omit-one result with the original pooled proportion: 27.7% (95% CI 25.0% to 30.7%).
  • Observed range: Leave-one-out proportions range from 27.2% to 28.3%.
  • Key takeaway: A narrow range suggests that no single study dominates the result.
  • Assumptions and limitations: Leave-one-out analysis detects influence, not bias. A stable result can still be biased if all studies share the same limitation.
  • Common pitfall: Removing a study only because it changes the estimate. Exclusion should be justified by design, risk of bias, protocol criteria, or data error.

14 13. Galbraith/radial plot

galbraith_plot(m_prop_epi, main = "Galbraith plot: episiotomy proportion")

14.1 Interpretation

  • What this output is: A radial diagnostic plot using transformed proportions.
  • How to interpret it: The solid line is the pooled-effect line. The two dashed lines are approximate +/-1.96 reference limits.
  • Key takeaway: Points outside the dashed lines may be statistical outliers or contributors to heterogeneity.
  • Important caution: These dashed lines are not the pooled estimate 95% CI. They are approximate reference limits for study-level diagnostics.
  • Recommended next step: Investigate unusual points by checking the study population, setting, intervention, outcome definition, and extracted data.

15 14. Funnel plot and Egger test

funnel(m_prop_epi, xlab = "Logit proportion", main = "Funnel plot: episiotomy proportion")

egger_prop <- metabias(m_prop_epi, method.bias = "linreg", k.min = 3)
egger_prop
## Linear regression test of funnel plot asymmetry
## 
## Test result: t = -9.62, df = 17, p-value < 0.0001
## Bias estimate: -5.4187 (SE = 0.5634)
## 
## Details:
## - multiplicative residual heterogeneity variance (tau^2 = 0.2020)
## - predictor: standard error
## - weight:    inverse variance
## - reference: Egger et al. (1997), BMJ

15.1 Interpretation

  • What this output is: A funnel plot and Egger regression test for small-study effects/asymmetry.
  • How to interpret it: Funnel asymmetry or a small Egger p-value may indicate small-study effects, heterogeneity, selective reporting, or chance.
  • Observed result: Egger test p = <0.001.
  • Key takeaway: This is exploratory and should not be treated as definitive proof of publication bias.
  • Common pitfall: Using strong publication-bias language in a single-arm proportion meta-analysis without considering heterogeneity and study design differences.

16 15. Trim-and-fill sensitivity analysis

tf_prop <- trimfill(m_prop_epi)
summary(tf_prop)
##                             proportion           95%-CI %W(random)
## Chatfield 1966*                 0.3284 [0.2270; 0.4487]        4.4
## Colacioppo 2011*                0.3565 [0.2745; 0.4480]        5.7
## Kwon 2020*                      0.3068 [0.2196; 0.4105]        5.0
## Martinez 2019 (sim)             0.3368 [0.2492; 0.4373]        5.2
## Chen 2020 (sim)                 0.3455 [0.2627; 0.4388]        5.6
## Kumar 2021 (sim)                0.3000 [0.2099; 0.4088]        4.7
## Johansson 2018 (sim)            0.2857 [0.1923; 0.4019]        4.3
## Patel 2022 (sim)                0.3152 [0.2287; 0.4168]        5.1
## Nguyen 2021 (sim)               0.2769 [0.1820; 0.3974]        4.1
## Osei 2020 (sim)                 0.2545 [0.1569; 0.3851]        3.6
## O'Leary 1965*                   0.2800 [0.1734; 0.4189]        3.6
## Scarabotto 2008*                0.2609 [0.1710; 0.3766]        4.2
## Fernando 2017 (sim)             0.1833 [0.1045; 0.3015]        3.3
## Diallo 2019 (sim)               0.1923 [0.1067; 0.3218]        3.1
## Park 2018 (sim)                 0.2143 [0.1335; 0.3256]        3.9
## Ahmed 2020 (sim)                0.2069 [0.1214; 0.3299]        3.4
## Rossi 2021 (sim)                0.2222 [0.1408; 0.3324]        4.0
## Williams 2022 (sim)             0.2000 [0.1198; 0.3146]        3.6
## Tanaka 2016 (sim)               0.1875 [0.1005; 0.3227]        2.9
## Filled: Park 2018 (sim)         0.4161 [0.2870; 0.5577]        3.9
## Filled: Ahmed 2020 (sim)        0.4269 [0.2830; 0.5844]        3.4
## Filled: Williams 2022 (sim)     0.4374 [0.2974; 0.5880]        3.6
## Filled: Diallo 2019 (sim)       0.4494 [0.2905; 0.6193]        3.1
## Filled: Tanaka 2016 (sim)       0.4571 [0.2897; 0.6348]        2.9
## Filled: Fernando 2017 (sim)     0.4640 [0.3104; 0.6247]        3.3
## 
## Number of studies: k = 25 (with 6 added studies)
## 
##                      proportion           95%-CI
## Random effects model     0.3029 [0.2688; 0.3394]
## 
## Quantifying heterogeneity (with 95%-CIs):
##  tau^2 = 0.0628 [0.0134; 0.2649]; tau = 0.2506 [0.1160; 0.5147]
##  I^2 = 46.5% [14.5%; 66.5%]; H = 1.37 [1.08; 1.73]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  44.85   24  0.0061
## 
## Details of meta-analysis methods:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau
## - Calculation of I^2 based on Q
## - Hartung-Knapp adjustment for random effects model (df = 24)
## - Trim-and-fill method to adjust for funnel plot asymmetry (L-estimator)
## - Logit transformation
funnel(tf_prop, xlab = "Logit proportion", main = "Trim-and-fill: episiotomy proportion")

16.1 Interpretation

  • What this output is: An exploratory trim-and-fill sensitivity analysis.
  • How to interpret it: Compare the adjusted estimate with the original pooled proportion.
  • Key takeaway: A large change after trim-and-fill suggests the result may be sensitive to funnel asymmetry.
  • Limitation: Trim-and-fill is not a definitive correction. It can be misleading when asymmetry is due to heterogeneity rather than missing studies.

17 16. Optional teaching-only subgroup analysis by comparison design

The main analysis above uses one row per unique HAase arm to avoid double-counting. The following subgroup analysis uses the original comparison rows, with unique labels, only to demonstrate subgroup syntax.

episiotomy_design_df <- episiotomy_raw %>%
  mutate(StudyLabel = make.unique(paste(Study, RCT_design, sep = " | ")))
m_prop_design <- metaprop(
  event = aHAaseevents,
  n = n1HAasetotal,
  studlab = StudyLabel,
  data = episiotomy_design_df,
  sm = "PLOGIT",
  method = "Inverse",
  common = FALSE,
  random = TRUE,
  method.tau = "REML",
  method.random.ci = "HK",
  subgroup = RCT_design,
  backtransf = TRUE
)

summary(m_prop_design)
##                                       proportion           95%-CI %W(random)
## Chatfield 1966* | Placebo                 0.3284 [0.2185; 0.4540]        5.2
## Colacioppo 2011* | Placebo                0.3565 [0.2694; 0.4512]        8.2
## Kwon 2020* | Placebo                      0.3068 [0.2129; 0.4142]        6.3
## Martinez 2019 (sim) | Placebo             0.3368 [0.2431; 0.4411]        7.0
## Chen 2020 (sim) | Placebo                 0.3455 [0.2574; 0.4421]        7.9
## Kumar 2021 (sim) | Placebo                0.3000 [0.2026; 0.4128]        5.8
## Johansson 2018 (sim) | Placebo            0.2857 [0.1840; 0.4062]        5.1
## Patel 2022 (sim) | Placebo                0.3152 [0.2223; 0.4204]        6.6
## Nguyen 2021 (sim) | Placebo               0.2769 [0.1731; 0.4019]        4.7
## Osei 2020 (sim) | Placebo                 0.2545 [0.1467; 0.3900]        3.9
## Chatfield 1966* | No Intervention         0.3284 [0.2185; 0.4540]        5.2
## O'Leary 1965* | No Intervention           0.2800 [0.1623; 0.4249]        3.8
## Scarabotto 2008* | No Intervention        0.2609 [0.1625; 0.3806]        4.8
## Fernando 2017 (sim) | No Intervention     0.1833 [0.0952; 0.3044]        3.4
## Diallo 2019 (sim) | No Intervention       0.1923 [0.0963; 0.3253]        3.1
## Park 2018 (sim) | No Intervention         0.2143 [0.1252; 0.3287]        4.3
## Ahmed 2020 (sim) | No Intervention        0.2069 [0.1117; 0.3335]        3.6
## Rossi 2021 (sim) | No Intervention        0.2222 [0.1327; 0.3356]        4.5
## Williams 2022 (sim) | No Intervention     0.2000 [0.1110; 0.3177]        3.9
## Tanaka 2016 (sim) | No Intervention       0.1875 [0.0895; 0.3263]        2.8
##                                            RCT_design
## Chatfield 1966* | Placebo                     Placebo
## Colacioppo 2011* | Placebo                    Placebo
## Kwon 2020* | Placebo                          Placebo
## Martinez 2019 (sim) | Placebo                 Placebo
## Chen 2020 (sim) | Placebo                     Placebo
## Kumar 2021 (sim) | Placebo                    Placebo
## Johansson 2018 (sim) | Placebo                Placebo
## Patel 2022 (sim) | Placebo                    Placebo
## Nguyen 2021 (sim) | Placebo                   Placebo
## Osei 2020 (sim) | Placebo                     Placebo
## Chatfield 1966* | No Intervention     No Intervention
## O'Leary 1965* | No Intervention       No Intervention
## Scarabotto 2008* | No Intervention    No Intervention
## Fernando 2017 (sim) | No Intervention No Intervention
## Diallo 2019 (sim) | No Intervention   No Intervention
## Park 2018 (sim) | No Intervention     No Intervention
## Ahmed 2020 (sim) | No Intervention    No Intervention
## Rossi 2021 (sim) | No Intervention    No Intervention
## Williams 2022 (sim) | No Intervention No Intervention
## Tanaka 2016 (sim) | No Intervention   No Intervention
## 
## Number of studies: k = 20
## Number of observations: o = 1448
## Number of events: e = 405
## 
##                      proportion           95%-CI
## Random effects model     0.2805 [0.2537; 0.3089]
## 
## Quantifying heterogeneity (with 95%-CIs):
##  tau^2 = 0.0140 [0.0000; 0.1154]; tau = 0.1182 [0.0000; 0.3397]
##  I^2 = 16.7% [0.0%; 51.1%]; H = 1.10 [1.00; 1.43]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  22.81   19  0.2459
## 
## Results for subgroups (random effects model):
##                                k proportion           95%-CI tau^2 tau    Q
## RCT_design = Placebo          10     0.3174 [0.2955; 0.3402]     0   0 3.38
## RCT_design = No Intervention  10     0.2318 [0.1994; 0.2678]     0   0 6.91
##                               I^2
## RCT_design = Placebo         0.0%
## RCT_design = No Intervention 0.0%
## 
## Test for subgroup differences (random effects model):
##                    Q d.f.  p-value
## Between groups 20.13    1 < 0.0001
## 
## Details of meta-analysis methods:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau
## - Calculation of I^2 based on Q
## - Hartung-Knapp adjustment for random effects model (df = 19)
## - Logit transformation
## - Clopper-Pearson confidence interval for individual studies
forest(
  m_prop_design,
  xlab = "Proportion with episiotomy",
  prediction = TRUE,
  print.tau2 = TRUE,
  backtransf = TRUE
)

17.1 Interpretation

  • What this output is: A teaching-only subgroup analysis by comparison design.
  • How to interpret it: It shows how pooled HAase-arm proportions differ across placebo and no-intervention comparison contexts.
  • Key takeaway: Subgroup syntax is useful, but this specific example should be interpreted cautiously because the same HAase arm may appear in more than one comparison row.
  • Common pitfall: Treating subgroup differences as causal or definitive.
  • Recommended next step: For a real single-arm proportion meta-analysis, pre-specify subgroup variables and avoid double-counting study arms.

18 17. Report-ready wording

Using a random-effects single-arm proportion meta-analysis with logit transformation, inverse-variance pooling, REML estimation of between-study variance, and Hartung-Knapp confidence intervals, the pooled proportion of episiotomy in the HAase arm was 27.7% (95% CI 25.0% to 30.7%). Heterogeneity was I2 = 18.6%, tau2 = 0.0175, Q-test p = 0.227. This estimate describes the event proportion among HAase participants and should not be interpreted as a comparative treatment effect.

19 18. Key learning points

  • Use metaprop() for single-arm proportions.
  • Use one row per unique study arm in the main single-arm analysis.
  • Use method = "Inverse" when using PLOGIT with REML, DL, or SJ in this teaching workflow.
  • A pooled proportion is descriptive unless directly compared with a control group.
  • High heterogeneity may reflect differences in population, setting, outcome definition, clinical practice, or study methods.
  • Leave-one-out analysis can fail if study labels are duplicated; create unique labels and avoid double-counting.
  • Galbraith/radial plot dashed lines are approximate +/-1.96 reference limits, not the pooled-effect 95% CI.
  • Funnel plots and Egger tests are exploratory diagnostics, not proof of publication bias.