Load datasets

dat_main = read.delim("share-SIMBA-main.txt")
dat_truncated = read.delim("share-SIMBA-truncated-mob.txt")
dat_baseline = read.delim("share-SIMBA-rae-baseline.txt")
dat_dichotomized = read.delim("share-SIMBA-dichotomized-mob.txt")
dat_map = read.delim("share-SIMBA-map.txt")

dat_main = dat_main[order(as.numeric(as.character(dat_main$study_ID))), ]
dat_off = subset(dat_main, Cut_off_date=="Official")
dat_prim = subset(dat_off, Analysis=="Primary")
dat_mod = subset(dat_main, Analysis == "Primary")

S8. Descriptive analyses

Location of studies

ES distribution

Description

dat_map$continent = c("Oceania", "Asia", "America", "America", "Asia", "Europe", "Africa", "Europe", "Europe", "Europe", "Europe", "Europe", "Oceania", "Europe", "Europe", "Europe", "Africa", "Europe", "America")
continent = dat_map %>%
  group_by(continent) %>%
  summarise(n_studies = sum(n_studies)) 

paste0(
  # number raw data
  "Among them, we were able to access the data of ",
  length(unique(dat_mod[dat_mod$raw_data == "YES", ]$study_ID)),
  # number of unique studies
  " unique studies. Out of the ",
  length(unique(dat_mod$study_ID)),
   # number of participants
 " studies (n=",
  sum(dat_mod$N),
   # countries
  " participants), ",
  continent[continent$continent=="America", ]$n_studies,
  " were conducted in America (",
  "among which ",
  dat_map[dat_map$COUNTRY=="USA",]$n_studies,
  " were conducted in the USA), ",
  continent[continent$continent=="Europe", ]$n_studies,
  " in Europe, ",
  continent[continent$continent=="Oceania", ]$n_studies,
  " in Africa, ",
  continent[continent$continent=="Asia", ]$n_studies,
  " in Asia, and ",
  continent[continent$continent=="Africa", ]$n_studies,
  # variability participants
  " in Oceania. The number of participants per study ranged from ",
  min(as.numeric(dat_mod$N)),
  " to ",
  max(as.numeric(dat_mod$N)),
  ". The median length of follow up ranged from ",
  min(as.numeric(dat_mod$followupduration)),
  " years to ",
  round(max(as.numeric(dat_mod$followupduration))),
  " years (median=",
    round(median(as.numeric(dat_mod$followupduration))),
  " years, IQR=",
    round(IQR(as.numeric(dat_mod$followupduration))),
  " years). Among the ", 
    sum(dat_prim[!duplicated(dat_prim$study_ID),]$Cut_off_date=="Official"),
  " studies included in our main analyses, ",
  sum(dat_prim[!duplicated(dat_prim$study_ID),]$diag.procedure=="Diagnosis"),
  " studies categorized ADHD using a formal diagnostic procedure, ",
  sum(dat_prim[!duplicated(dat_prim$study_ID),]$diag.procedure=="Symptoms"),
" based on symptoms count, and ",
  sum(dat_prim[!duplicated(dat_prim$study_ID),]$diag.procedure=="Broad-based-scale"),
  " based on the results of broad-based scales (such as the CBCL or SDQ)."
)
## [1] "Among them, we were able to access the data of 33 unique studies. Out of the 57 studies (n=6504 participants), 25 were conducted in America (among which 22 were conducted in the USA), 22 in Europe, 5 in Africa, 3 in Asia, and 2 in Oceania. The number of participants per study ranged from 10 to 813. The median length of follow up ranged from 4 years to 33 years (median=7 years, IQR=4 years). Among the 41 studies included in our main analyses, 20 studies categorized ADHD using a formal diagnostic procedure, 13 based on symptoms count, and 8 based on the results of broad-based scales (such as the CBCL or SDQ)."
paste0("Among studies included in the main analyses (n=", 
length(unique(dat_prim$Country_only)), " countries, n=", 
sum(dat_prim$N), " participants), the median length of follow up ranged from ",
        min(as.numeric(dat_prim$followupduration)),
       " to ",
       max(as.numeric(dat_prim$followupduration)),
      " years (",
      round(quantile(dat_prim$followupduration, .25)),
      "-",
      round(quantile(dat_prim$followupduration, .75)),")")
## [1] "Among studies included in the main analyses (n=15 countries, n=4708 participants), the median length of follow up ranged from 4 to 33.035446 years (6-9)"



S9. RAE baseline

Relative age effect at baseline

colnames(dat_baseline)[1:4] = paste0(colnames(dat_baseline)[1:4], "_base")
dat_baseline[,1:4] <- lapply(dat_baseline[,1:4], function(x) as.numeric(as.character(x)))

# dat_baseline = dplyr::left_join(dat_baseline, unique(dat_main[, c("Study", "study_ID", "Cohort_num", "Cut_off_date")])) 

res_mob_baseline <- meta::metagen(TE = logOR_base,
                        seTE = seOR_base,
                        method.tau = "REML",
                        n.e = as.numeric(dat_baseline$N_base),
                        sm = "OR",
                        studlab = paste(dat_baseline$Cohort_num),
                        data = dat_baseline)
res_mob_baseline
## Number of studies: k = 9
## Number of observations: o = 88753
## 
##                          OR           95%-CI    z  p-value
## Common effect model  1.0357 [1.0268; 1.0446] 7.99 < 0.0001
## Random effects model 1.0401 [1.0224; 1.0582] 4.48 < 0.0001
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0003 [0.0000; 0.0032]; tau = 0.0184 [0.0000; 0.0566]
##  I^2 = 49.8% [0.0%; 76.6%]; H = 1.41 [1.00; 2.07]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  15.95    8  0.0431
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_mob_baseline,
           title = "Association of relative age with \n childhood ADHD",
           het=FALSE)



S10. Primary analysis

Main model

res_prim <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Cohort_num),
                        data = dat_prim)
res_prim
## Number of studies: n = 41
## Number of estimates: k = 43
## Number of observations: o = 4708
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0241 [0.9887; 1.0608] 1.33  0.1850
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0045 [0.0000; 0.0126]; tau.1 = 0.0671 [0.0000; 0.1121] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0080]; tau.2 < 0.0001 [0.0000; 0.0897] (within cluster)
##  I^2 = 44.6% [20.5%; 61.4%]; H = 1.34 [1.12; 1.61]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  75.82   42  0.0011
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_prim,
           title = "Association of relative age with \n persistence of ADHD")

Equivalence tests

tost = metafor::rma.mv(logOR ~ 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim, level = 90)
## [1] "Even if one considers OR=0.99 to be a practically significant value, post-hoc equivalence tests would show that even if relative age leads to a decrease in the persistence of ADHD, this effect is extremely small OR=0.994"



S11. Sensitivity analyses

1. Truncated MoB

Main model

dat_truncated$Analysis = "Truncated MoB"

df_trunc = rbind(
  dat_truncated,
  dat_prim[,c(colnames(dat_truncated))]) %>%
    group_by(Study) %>%
    mutate(n=n()) %>%
    filter(n>1)

df_trunc[1:4] <- apply(df_trunc[1:4], 2, as.numeric)

V.SCE  <- with(df_trunc,
  clubSandwich::impute_covariance_matrix(
    vi = seOR^2, 
    cluster = Study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = Analysis))
## Registered S3 method overwritten by 'clubSandwich':
##   method    from    
##   bread.mlm sandwich
res_trunc <- metafor::rma.mv(yi= logOR, V = V.SCE,
                       data = df_trunc, 
                       mods = ~ Analysis - 1,
                       random = ~ Analysis | Study,
                       struct = "DIAG",
                       sparse = TRUE)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
dat_S1 = dat_truncated
dat_S1$study_ID = gsub(" *_.", "", dat_S1$Study)
  
res_S1 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S1$N),
                        sm = "OR",
                        studlab = paste(dat_S1$Cohort_num),
                        data = dat_S1)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
res_S1
## Number of studies: n = 21
## Number of estimates: k = 22
## Number of observations: o = 1318
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0074 [0.9533; 1.0645] 0.26  0.7945
## 
## Quantifying heterogeneity:
##  tau^2.1 < 0.0001 [0.0000; 0.0142]; tau.1 < 0.0001 [0.0000; 0.1191] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0101]; tau.2 < 0.0001 [0.0000; 0.1003] (within cluster)
##  I^2 = 0.0% [0.0%; 46.2%]; H = 1.00 [1.00; 1.36]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  17.99   21  0.6498
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S1,
           title = "Association of relative age with \n persistence of ADHD",
           het = FALSE)

2. Follow-up > 10yo & meta-reg

Main model

dat_S2 <- data.frame(subset(dat_off, grepl("S1:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID)

res_S2 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S2$N),
                        sm = "OR",
                        studlab = paste(dat_S2$Cohort_num),
                        data = dat_S2)
res_S2
## Number of studies: k = 10
## Number of observations: o = 477
## 
##                          OR           95%-CI    z p-value
## Common effect model  1.0056 [0.9494; 1.0652] 0.19  0.8491
## Random effects model 1.0037 [0.9212; 1.0936] 0.08  0.9333
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0092 [0.0000; 0.0490]; tau = 0.0960 [0.0000; 0.2215]
##  I^2 = 50.5% [0.0%; 76.0%]; H = 1.42 [1.00; 2.04]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  18.18    9  0.0332
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S2,
           title = "Association of relative age with \n persistence of ADHD", het = FALSE)

Post hoc analyses

meta::metareg(res_prim, formula = follow_cat, intercept = FALSE)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
## 
## Multivariate Meta-Analysis Model (k = 43; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0049  0.0697     41     no       .id 
## sigma^2.2  0.0000  0.0000     43     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 40) = 71.9021, p-val = 0.0015
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 2.1652, p-val = 0.5388
## 
## Model Results:
## 
##                  estimate      se    zval    pval    ci.lb   ci.ub    
## follow_cat4-6      0.0352  0.0307  1.1465  0.2516  -0.0250  0.0954    
## follow_cat6-8.5    0.0274  0.0299  0.9170  0.3591  -0.0312  0.0861    
## follow_cat8.5+     0.0098  0.0272  0.3601  0.7188  -0.0435  0.0630    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
meta::metareg(res_prim, formula = followupduration)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
## 
## Multivariate Meta-Analysis Model (k = 43; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0037  0.0612     41     no       .id 
## sigma^2.2  0.0000  0.0000     43     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 68.9340, p-val = 0.0041
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 4.3457, p-val = 0.0371
## 
## Model Results:
## 
##                   estimate      se     zval    pval    ci.lb    ci.ub    
## intrcpt             0.0725  0.0289   2.5079  0.0121   0.0158   0.1292  * 
## followupduration   -0.0053  0.0025  -2.0846  0.0371  -0.0103  -0.0003  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_fo <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = dat_prim$follow_cat,
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Cohort_num),
                        data = dat_prim)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
meta::forest(res_fo,
             smlab = "Association of relative age with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

3. Age <=8 baseline & >=16 follow up

Main model

dat_S3 <- data.frame(subset(dat_off, grepl("S2:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID)

res_S3 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S3$N),
                        sm = "OR",
                        studlab = paste(dat_S3$Cohort_num),
                        data = dat_S3)
res_S3
## Number of studies: k = 9
## Number of observations: o = 317
## 
##                          OR           95%-CI     z p-value
## Common effect model  0.9747 [0.9064; 1.0481] -0.69  0.4892
## Random effects model 0.9557 [0.8398; 1.0876] -0.69  0.4924
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0234 [0.0037; 0.1631]; tau = 0.1530 [0.0612; 0.4038]
##  I^2 = 65.5% [29.8%; 83.0%]; H = 1.70 [1.19; 2.43]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  23.19    8  0.0031
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S3,
           title = "Association of relative age with \n persistence of ADHD", het = FALSE)

4. Same ADHD tool baseline & follow up

Main model

dat_S4 <- data.frame(subset(dat_off, grepl("S3:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID)

res_S4 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S4$N),
                        sm = "OR",
                        studlab = paste(dat_S4$Cohort_num),
                        data = dat_S4)
res_S4
## Number of studies: n = 17
## Number of estimates: k = 19
## Number of observations: o = 2853
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0592 [1.0069; 1.1143] 2.22  0.0261
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0047 [0.0000; 0.0176]; tau.1 = 0.0683 [0.0000; 0.1326] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0075]; tau.2 < 0.0001 [0.0000; 0.0869] (within cluster)
##  I^2 = 52.1% [19.1%; 71.6%]; H = 1.45 [1.11; 1.88]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  37.59   18  0.0044
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S4,
           title = "Association of relative age with \n persistence of ADHD", het = FALSE)



S12. Robustness checks

1. Jackknife meta-analysis

repNA = rep(NA, length(unique(dat_prim$study_ID)))
res_S5 = data.frame(es=repNA, ci_lo = repNA, ci_up = repNA, pval = repNA, cohort_excluded=repNA, id = repNA)
list_meta_S5=NULL; id=0
for (cohort in unique(dat_prim$study_ID)) {
  
  res = NA
  id = id+1
  res = meta::metagen(
    TE = logOR,
    seTE = seOR,
    cluster = study_ID,
    method.tau = "REML",
    sm = "OR",
    data = subset(dat_prim, study_ID != cohort))
  
  i = which(unique(dat_prim$study_ID) == cohort)
  list_meta_S5 = append(list_meta_S5, summary(res))
  res_S5$es[i] = res$TE.random
  res_S5$ci_lo[i] = res$lower.random
  res_S5$ci_up[i] = res$upper.random
  res_S5$pval[i] = res$pval.random
  res_S5$cohort_excluded[i] = cohort
  res_S5$id[i] = id
}
res_S5[,1:3] <- exp(res_S5[,1:3])
largest_S5 = meta::metagen(
    TE = logOR,
    seTE = seOR,
    n.e = N,
    cluster = study_ID,
    method.tau = "REML",
    sm = "OR",
    data = subset(dat_prim, study_ID != res_S5[res_S5$pval==max(res_S5$pval), ]$cohort))
  
smallest_S5 = meta::metagen(
    TE = logOR,
    seTE = seOR,
    cluster = study_ID,
    n.e = N,
    method.tau = "REML",
    sm = "OR",
    data = subset(dat_prim, study_ID != res_S5[res_S5$pval==min(res_S5$pval), ]$cohort))
# res_S5[order(res_S5$es), ]

2. Cook’s distance

Main model

res <- metafor::rma.mv(logOR ~ 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim)
x <- cooks.distance(res)
plot(x, type="o", pch=19, xlab="Observed Outcome", ylab="Cook's Distance")

influential <- unique(dat_prim$Cohort_num)[which(x > (3 * mean(x))) ]

dat_S6 <- dat_prim %>%
  filter(!Cohort_num %in% influential)

res_S6 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S6$N),
                        sm = "OR",
                        studlab = paste(dat_S6$Cohort_num),
                        data = dat_S6)
res_S6
## Number of studies: n = 40
## Number of estimates: k = 42
## Number of observations: o = 4668
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0276 [0.9919; 1.0645] 1.51  0.1315
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0044 [0.0000; 0.0124]; tau.1 = 0.0662 [0.0000; 0.1114] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0079]; tau.2 < 0.0001 [0.0000; 0.0886] (within cluster)
##  I^2 = 44.3% [19.7%; 61.4%]; H = 1.34 [1.12; 1.61]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  73.63   41  0.0013
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S6,
           title = "Association of relative age with \n persistence of ADHD", het = FALSE)

3. Robust regression

Main model

dat_S7_cor <- data.frame(subset(dat_off, grepl("S6:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID)

dat_S7_uncor <- subset(dat_off, grepl("Primary", dat_off$Analysis, fixed = TRUE) & !Study %in% dat_S7_cor$Study)

dat_S7 = dplyr::bind_rows(dat_S7_cor, dat_S7_uncor)

res_S7 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S7$N),
                        sm = "OR",
                        studlab = paste(dat_S7$Cohort_num),
                        data = dat_S7)
res_S7
## Number of studies: n = 41
## Number of estimates: k = 43
## Number of observations: o = 4708
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0236 [0.9885; 1.0600] 1.31  0.1908
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0044 [0.0000; 0.0121]; tau.1 = 0.0660 [0.0000; 0.1100] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0079]; tau.2 < 0.0001 [0.0000; 0.0886] (within cluster)
##  I^2 = 42.3% [16.8%; 59.9%]; H = 1.32 [1.10; 1.58]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  72.74   42  0.0023
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S7,
           title = "Association of relative age with \n persistence of ADHD", het = FALSE)

4. Dichotomized MoB

dat_dichotomized[1:4] <- apply(dat_dichotomized[1:4], 2, as.numeric)
dat_S8 =  dat_dichotomized
res_S8 <- meta::metagen(TE = logOR,
                          seTE = seOR,
                          cluster = study_ID,
                          method.tau = "REML",
                          n.e = as.numeric(dat_S8$N),
                          sm = "OR",
                          studlab = paste(dat_S8$Cohort_num),
                          data = dat_S8)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
res_S8
## Number of studies: n = 24
## Number of estimates: k = 25
## Number of observations: o = 1404
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.3266 [1.0012; 1.7578] 1.97  0.0490
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0115 [0.0000; 0.4711]; tau.1 = 0.1072 [0.0000; 0.6864] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.3201]; tau.2 < 0.0001 [0.0000; 0.5658] (within cluster)
##  I^2 = 0.0% [0.0%; 43.9%]; H = 1.00 [1.00; 1.33]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  14.27   24  0.9403
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau
fct_forest(data = res_S8,
           title = "Association of relative age with \n persistence of ADHD", het = FALSE)



S13. Meta-regressions

1. Cohort with RAE assessment

Main model

dat_rae = subset(dat_prim, Study %in% dat_baseline$Study)
dat_rae$p_sig = ifelse(dat_rae$Study %in% subset(dat_baseline, pOR_base < 0.05)$Study, "RAE at baseline: sig", "RAE at baseline: ns")
dat_rae$or_larg = ifelse(dat_rae$Study %in% subset(dat_baseline, exp(logOR_base) >= 1.05)$Study, "RAE at baseline: OR>=1.05", "RAE at baseline: OR<1.05")
res_rae <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_rae$N),
                        sm = "OR",
                        studlab = paste(dat_rae$Cohort_num),
                        data = dat_rae)

res_rae_p = meta::metareg(res_rae, formula = p_sig, intercept = TRUE)
res_rae_or = meta::metareg(res_rae, formula = or_larg, intercept = TRUE)
res_rae_p_woi = meta::metareg(res_rae, formula = p_sig, intercept = FALSE)
res_rae_or_woi = meta::metareg(res_rae, formula = or_larg, intercept = FALSE)
res_rae_p
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0007)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## R^2 (amount of heterogeneity accounted for):            0.00%
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 5.5244, p-val = 0.5962
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 1.8114, p-val = 0.1783
## 
## Model Results:
## 
##                            estimate      se     zval    pval    ci.lb   ci.ub 
## intrcpt                     -0.0394  0.0395  -0.9961  0.3192  -0.1168  0.0381 
## p_sigRAE at baseline: sig    0.0566  0.0421   1.3459  0.1783  -0.0258  0.1390 
##                              
## intrcpt                      
## p_sigRAE at baseline: sig    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rae_or
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0006)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## R^2 (amount of heterogeneity accounted for):            0.00%
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 6.3419, p-val = 0.5004
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 0.9938, p-val = 0.3188
## 
## Model Results:
## 
##                                   estimate      se    zval    pval    ci.lb 
## intrcpt                             0.0072  0.0140  0.5130  0.6079  -0.0202 
## or_largRAE at baseline: OR>=1.05    0.0564  0.0565  0.9969  0.3188  -0.0545 
##                                    ci.ub    
## intrcpt                           0.0345    
## or_largRAE at baseline: OR>=1.05  0.1672    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rae_p_woi
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0007)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 5.5244, p-val = 0.5962
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 2.4254, p-val = 0.2974
## 
## Model Results:
## 
##                            estimate      se     zval    pval    ci.lb   ci.ub 
## p_sigRAE at baseline: ns    -0.0394  0.0395  -0.9961  0.3192  -0.1168  0.0381 
## p_sigRAE at baseline: sig    0.0172  0.0144   1.1972  0.2312  -0.0110  0.0455 
##                              
## p_sigRAE at baseline: ns     
## p_sigRAE at baseline: sig    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rae_or_woi
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0006)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 6.3419, p-val = 0.5004
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 1.6078, p-val = 0.4476
## 
## Model Results:
## 
##                                   estimate      se    zval    pval    ci.lb 
## or_largRAE at baseline: OR<1.05     0.0072  0.0140  0.5130  0.6079  -0.0202 
## or_largRAE at baseline: OR>=1.05    0.0635  0.0548  1.1596  0.2462  -0.0439 
##                                    ci.ub    
## or_largRAE at baseline: OR<1.05   0.0345    
## or_largRAE at baseline: OR>=1.05  0.1709    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_rae_p_sub <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = dat_rae$p_sig,
                        n.e = as.numeric(dat_rae$N),
                        sm = "OR",
                        studlab = paste(dat_rae$Cohort_num),
                        data = dat_rae)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
res_rae_or_sub <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = dat_rae$or_larg,
                        n.e = as.numeric(dat_rae$N),
                        sm = "OR",
                        studlab = paste(dat_rae$Cohort_num),
                        data = dat_rae)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
fct_forest(data = res_rae_p_sub,
           title = "Association of relative age with \n persistence of ADHD", het=FALSE)

fct_forest(data = res_rae_or_sub,
           title = "Association of relative age with \n persistence of ADHD", het=FALSE)

2. ADHD diagnosis tool

Model

meta::metareg(res_prim, formula = diag.procedure, intercept = FALSE)
## 
## Multivariate Meta-Analysis Model (k = 43; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0045  0.0672     41     no       .id 
## sigma^2.2  0.0000  0.0000     43     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 40) = 65.9848, p-val = 0.0060
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 2.8475, p-val = 0.4157
## 
## Model Results:
## 
##                                  estimate      se     zval    pval    ci.lb 
## diag.procedureBroad-based-scale   -0.0029  0.0349  -0.0830  0.9338  -0.0714 
## diag.procedureDiagnosis            0.0251  0.0259   0.9694  0.3323  -0.0257 
## diag.procedureSymptoms             0.0491  0.0356   1.3787  0.1680  -0.0207 
##                                   ci.ub    
## diag.procedureBroad-based-scale  0.0656    
## diag.procedureDiagnosis          0.0759    
## diag.procedureSymptoms           0.1190    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
meta::metareg(res_prim, formula = Baseline_diag, intercept = FALSE)
## 
## Multivariate Meta-Analysis Model (k = 43; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0044  0.0663     41     no       .id 
## sigma^2.2  0.0000  0.0000     43     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 40) = 69.3604, p-val = 0.0027
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 4.8431, p-val = 0.1837
## 
## Model Results:
## 
##                                 estimate      se     zval    pval    ci.lb 
## Baseline_diagBroad-based-scale   -0.0056  0.0396  -0.1409  0.8880  -0.0832 
## Baseline_diagDiagnosis            0.0114  0.0238   0.4764  0.6338  -0.0354 
## Baseline_diagSymptoms             0.0787  0.0367   2.1439  0.0320   0.0068 
##                                  ci.ub    
## Baseline_diagBroad-based-scale  0.0720    
## Baseline_diagDiagnosis          0.0581    
## Baseline_diagSymptoms           0.1507  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
meta::metareg(res_prim, formula = Follow_up_diag, intercept = FALSE)
## 
## Multivariate Meta-Analysis Model (k = 43; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0045  0.0669     41     no       .id 
## sigma^2.2  0.0000  0.0000     43     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 40) = 65.7449, p-val = 0.0063
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 2.9099, p-val = 0.4057
## 
## Model Results:
## 
##                                  estimate      se     zval    pval    ci.lb 
## Follow_up_diagBroad-based-scale   -0.0029  0.0348  -0.0828  0.9340  -0.0711 
## Follow_up_diagDiagnosis            0.0248  0.0256   0.9683  0.3329  -0.0254 
## Follow_up_diagSymptoms             0.0509  0.0363   1.4019  0.1609  -0.0203 
##                                   ci.ub    
## Follow_up_diagBroad-based-scale  0.0654    
## Follow_up_diagDiagnosis          0.0749    
## Follow_up_diagSymptoms           0.1221    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_diag <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        subgroup = diag.procedure,
                        method.tau = "REML",
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Cohort_num),
                        data = dat_prim)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
fct_forest(data = res_diag,
           title = "Association of relative age with \n persistence of ADHD", het=FALSE)

3. Sampling type

Model

meta::metareg(res_prim, formula = Sampling_cat, intercept = TRUE)
## 
## Multivariate Meta-Analysis Model (k = 43; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0048  0.0695     41     no       .id 
## sigma^2.2  0.0000  0.0000     43     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 40) = 74.1356, p-val = 0.0008
## 
## Test of Moderators (coefficients 2:3):
## QM(df = 2) = 1.9466, p-val = 0.3778
## 
## Model Results:
## 
##                                                             estimate      se 
## intrcpt                                                      -0.0832  0.1143 
## Sampling_catConvenient cases                                  0.0883  0.1176 
## Sampling_catPopulation-based/Very large community (N>1000)    0.1265  0.1169 
##                                                                zval    pval 
## intrcpt                                                     -0.7279  0.4667 
## Sampling_catConvenient cases                                 0.7507  0.4528 
## Sampling_catPopulation-based/Very large community (N>1000)   1.0824  0.2791 
##                                                               ci.lb   ci.ub    
## intrcpt                                                     -0.3071  0.1408    
## Sampling_catConvenient cases                                -0.1422  0.3189    
## Sampling_catPopulation-based/Very large community (N>1000)  -0.1026  0.3557    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
meta::metareg(res_prim, formula = Sampling_cat, intercept = FALSE)
## 
## Multivariate Meta-Analysis Model (k = 43; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0048  0.0695     41     no       .id 
## sigma^2.2  0.0000  0.0000     43     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 40) = 74.1356, p-val = 0.0008
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 3.6314, p-val = 0.3041
## 
## Model Results:
## 
##                                                             estimate      se 
## Sampling_catCommunity                                        -0.0832  0.1143 
## Sampling_catConvenient cases                                  0.0051  0.0280 
## Sampling_catPopulation-based/Very large community (N>1000)    0.0434  0.0248 
##                                                                zval    pval 
## Sampling_catCommunity                                       -0.7279  0.4667 
## Sampling_catConvenient cases                                 0.1838  0.8541 
## Sampling_catPopulation-based/Very large community (N>1000)   1.7515  0.0799 
##                                                               ci.lb   ci.ub    
## Sampling_catCommunity                                       -0.3071  0.1408    
## Sampling_catConvenient cases                                -0.0497  0.0599    
## Sampling_catPopulation-based/Very large community (N>1000)  -0.0052  0.0919  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_sampling <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        subgroup = Sampling_cat,
                        method.tau = "REML",
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Cohort_num),
                        data = dat_prim)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
fct_forest(data = res_sampling,
           title = "Association of relative age with \n persistence of ADHD", het=FALSE)

4. ADHD subtypes

Main model

dat_subtype <- data.frame(subset(dat_off, grepl("S8:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID) %>%
  filter(Cut_off_date == "Official")

res_subtype <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_subtype$N),
                        sm = "OR",
                        studlab = paste(dat_subtype$Cohort_num),
                        data = dat_subtype)

res_subtype_reg = meta::metareg(res_subtype, formula = Analysis, intercept = TRUE)
res_subtype_reg
## 
## Multivariate Meta-Analysis Model (k = 31; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     19     no       .id 
## sigma^2.2  0.0027  0.0518     31     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 28) = 30.4927, p-val = 0.3401
## 
## Test of Moderators (coefficients 2:3):
## QM(df = 2) = 0.0631, p-val = 0.9689
## 
## Model Results:
## 
##                                       estimate      se     zval    pval 
## intrcpt                                -0.0023  0.0290  -0.0810  0.9354 
## AnalysisS8: Hyperactive presentation   -0.0045  0.0786  -0.0577  0.9540 
## AnalysisS8: Inattentive presentation   -0.0161  0.0641  -0.2507  0.8020 
##                                         ci.lb   ci.ub    
## intrcpt                               -0.0592  0.0545    
## AnalysisS8: Hyperactive presentation  -0.1585  0.1494    
## AnalysisS8: Inattentive presentation  -0.1416  0.1095    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

fct_forest(data = res_subtype,
           title = "Association of relative age with \n persistence of ADHD", het=FALSE)

5. Above vs. below IQ median

Main model

dat_IQ <- data.frame(subset(dat_off, grepl("S9:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(study_ID) %>%
  filter(Cut_off_date == "Official")

res_IQ <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_IQ$N),
                        sm = "OR",
                        studlab = paste(dat_IQ$Cohort_num),
                        data = dat_IQ)
res_IQ_reg = meta::metareg(res_IQ, formula = Analysis, intercept = TRUE)
res_IQ_reg
## 
## Multivariate Meta-Analysis Model (k = 34; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     21     no       .id 
## sigma^2.2  0.0041  0.0637     34     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 32) = 41.9116, p-val = 0.1128
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 0.0036, p-val = 0.9523
## 
## Model Results:
## 
##                              estimate      se    zval    pval    ci.lb   ci.ub 
## intrcpt                        0.0156  0.0361  0.4312  0.6663  -0.0552  0.0864 
## AnalysisS9: IQ below median    0.0029  0.0487  0.0598  0.9523  -0.0925  0.0984 
##                                
## intrcpt                        
## AnalysisS9: IQ below median    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_IQ_plot <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = Analysis,
                        n.e = as.numeric(dat_IQ$N),
                        sm = "OR",
                        studlab = paste(dat_IQ$Cohort_num),
                        data = dat_IQ)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
fct_forest(data = res_IQ_plot,
           title = "Association of relative age with \n persistence of ADHD", het=FALSE)

6. Strict vs. flexible cut-off

Code

res_mod <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = Cut_off_date,
                        n.e = as.numeric(dat_mod$N),
                        sm = "OR",
                        studlab = paste(dat_mod$Cohort_num),
                        data = dat_mod)
res_mod_reg = meta::metareg(res_mod, formula = Cut_off_date, intercept = TRUE)
res_mod_reg_woi = meta::metareg(res_mod, formula = Cut_off_date, intercept = FALSE)
res_mod_reg
## 
## Multivariate Meta-Analysis Model (k = 61; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0034  0.0585     57     no       .id 
## sigma^2.2  0.0000  0.0000     61     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 59) = 92.9541, p-val = 0.0032
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 1.9692, p-val = 0.1605
## 
## Model Results:
## 
##                       estimate      se     zval    pval    ci.lb   ci.ub    
## intrcpt                 0.0240  0.0168   1.4346  0.1514  -0.0088  0.0569    
## Cut_off_dateProbable   -0.0447  0.0319  -1.4033  0.1605  -0.1072  0.0177    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_mod_reg_woi
## 
## Multivariate Meta-Analysis Model (k = 61; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0034  0.0585     57     no       .id 
## sigma^2.2  0.0000  0.0000     61     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 59) = 92.9541, p-val = 0.0032
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 2.6405, p-val = 0.2671
## 
## Model Results:
## 
##                       estimate      se     zval    pval    ci.lb   ci.ub    
## Cut_off_dateOfficial    0.0240  0.0168   1.4346  0.1514  -0.0088  0.0569    
## Cut_off_dateProbable   -0.0207  0.0271  -0.7632  0.4453  -0.0738  0.0325    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_mod_plot <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        cluster = study_ID,
                        method.tau = "REML",
                        subgroup = Cut_off_date,
                        n.e = as.numeric(dat_mod$N),
                        sm = "OR",
                        studlab = paste(dat_mod$Cohort_num),
                        data = dat_mod)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
fct_forest(data = res_mod_plot,
           title = "Association of relative age with \n persistence of ADHD", het = FALSE)

S14. Small study effects

small_std = metafor::rma.mv(logOR ~ 1 + seOR, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim)
## Warning: Ratio of largest to smallest sampling variance extremely large. May
## not be able to obtain stable results.
small_std
## 
## Multivariate Meta-Analysis Model (k = 43; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed          factor 
## sigma^2.1  0.0000  0.0000     41     no        study_ID 
## sigma^2.2  0.0000  0.0000     43     no  study_ID/es_id 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 75.8138, p-val = 0.0008
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 0.0108, p-val = 0.9173
## 
## Model Results:
## 
##          estimate      se     zval    pval    ci.lb   ci.ub    
## intrcpt    0.0248  0.0157   1.5795  0.1142  -0.0060  0.0555    
## seOR      -0.0257  0.2477  -0.1038  0.9173  -0.5112  0.4598    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

S15. Summary of main results

extract.meta = function(x) {
    data.frame(
      TE=x$TE.random, 
      seTE=x$seTE.random,
      I2=x$I2,
      TAU2=sum(x$tau2),
      N=sum(x$n.e),
      STUDY=x$k.study)
}
library(meta)
## Loading 'meta' package (version 6.5-0).
## Type 'help(meta)' for a brief overview.
## Readers of 'Meta-Analysis with R (Use R!)' should install
## older version of 'meta' package: https://tinyurl.com/dt4y5drs
res_summary = do.call(rbind, lapply(
  list(res_prim, res_S1, res_S2, res_S3, 
       res_S4, smallest_S5, largest_S5, res_S6, res_S7),
  extract.meta))

res_summary$Analysis = c(
  "Primary", "Excluding MoB",
  "Follow-up > 10yo",
  "Outside 8-16yo range",
  "Same diagnosis tool",
  "Smallest (Jackknife)",
  "Largest (Jackknife)",
  "Cook's distance",
  "Robust regression")
res_summary$Type = rep(c("Primary analysis", "Sensitivity analyses", "Robustness analyses"), c(1, 4,4))
meta_all = metagen(TE=TE, seTE=seTE,
                   studlab=paste(res_summary$Analysis),
                   subgroup = paste(res_summary$Type),
                   n.e=as.numeric(res_summary$N),
                   data=res_summary, sm="OR")

forest(meta_all,
      leftcols = c("studlab", "STUDY", "n.e", "I2"),
      leftlabs = c("Study", "n-study", "N", "I²"),
     common = FALSE,
     hetstat = FALSE,
     random = FALSE,
      weight.study = "same",
       at=c(0.66, 1.00, 1.50),
       print.tau2 = FALSE,
       prediction = FALSE,
       xlim = c(0.66, 1.50),
       col.predict = "black",
      print.subgroup.name = FALSE,
       digits.se = 2)