Is the funnel symmetric? On which side, and in which zone (white = non-significant), are the imprecise comparisons?
Answer
The bottom of the funnel (imprecise comparisons) is roughly symmetric around 0, with points in the white (non-significant) zone on both sides: no obvious gap where suppressed non-significant results would be. At the very top, 83 comparisons have SE < 0.02 — suspiciously precise (two studies; possibly SEs recorded as SDs). Tiny variances are always worth checking at extraction.
3 Testing small-study effects and time-lag bias
Exercise 2. First the classic Egger test, which treats every comparison as independent:
regtest(rma(yi, vi, data = dat))
Regression Test for Funnel Plot Asymmetry
Model: mixed-effects meta-regression model
Predictor: standard error
Test for Funnel Plot Asymmetry: z = 3.5610, p = 0.0004
Limit Estimate (as sei -> 0): b = -0.4245 (CI: -0.5092, -0.3398)
Now the multilevel version (Nakagawa et al. 2022): add a precision measure as a moderator of the main model.
The lnRR trap
The SE of a lnRR is computed from the means themselves, which creates an artificial correlation between effect and SE. For lnRR (and SMD), use a precision measure based on sample size only: se_n .
Predict first: will the small-study effect look stronger with sei or with se_n?
Multivariate Meta-Analysis Model (k = 382; method: REML)
Variance Components:
estim sqrt nlvls fixed factor
sigma^2.1 0.2078 0.4559 28 no study_id
sigma^2.2 0.1893 0.4351 382 no study_id/es_id
Test for Residual Heterogeneity:
QE(df = 380) = 100480.3902, p-val < .0001
Number of estimates: 382
Number of clusters: 28
Estimates per cluster: 1-80 (mean: 13.64, median: 8)
Test of Moderators (coefficient 2):¹
F(df1 = 1, df2 = 13.38) = 1.9876, p-val = 0.1814
Model Results:
estimate se¹ tval¹ df¹ pval¹ ci.lb¹ ci.ub¹
intrcpt -0.5648 0.1699 -3.3246 16.78 0.0041 -0.9236 -0.2060 **
se_n 0.6900 0.4894 1.4098 13.38 0.1814 -0.3643 1.7443
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
1) results based on cluster-robust inference (var-cov estimator: CR2,
approx t/F-tests and confidence intervals, df: Satterthwaite approx)
With the SE, the slope looks “significant”; with the sample-size measure (and even more with cluster-robust inference) it is not: no robust evidence of a small-study effect. The SE-based result was largely the lnRR artefact.
PET-PEESE: would the conclusion change if there were bias? The intercept of pet estimates the effect of an infinitely large study (PET); PEESE uses inv_n instead. Rule (Stanley and Doucouliagos 2014): if the PET intercept is significant, report PEESE.
intrcpt
main -26.9 -39.9 -11.1
PET -43.2 -60.8 -17.6
PEESE -35.6 -50.5 -16.3
The adjusted estimates are, if anything, stronger reductions: the conclusion does not rest on publication bias. With strong heterogeneity, treat them as sensitivity checks, not as “the true effect”.
Exercise 3(optional). Time-lag bias: do effects change with publication year?
tl <-rma.mv(yi, vi, mods =~ ___, random =~1| study_id / es_id,data = dat, test ="t", dfs ="contain")tl
Solution
tl <-rma.mv(yi, vi, mods =~ year_c, random =~1| study_id / es_id,data = dat, test ="t", dfs ="contain")tl
Slope ≈ 0 and far from significant: no evidence of a decline effect — but with 28 studies the test has little power.
4 Sensitivity analyses
Exercise 4. Leave-one-study-out. The loop is given: complete it so that each refit drops one whole study. (≈ 1 min to run.)
ids <-unique(dat$study_id)loo <-sapply(ids, function(i) { f <-rma.mv(yi, vi, random =~1| study_id / es_id,data = dat[dat$study_id ___ i, ], test ="t", dfs ="contain")c(est = f$b[1], ci.lb = f$ci.lb, ci.ub = f$ci.ub)})pct(range(loo["est", ])) # range of the pooled effectany(loo["ci.ub", ] >0) # does any CI cross zero?
Solution
ids <-unique(dat$study_id)loo <-sapply(ids, function(i) { f <-rma.mv(yi, vi, random =~1| study_id / es_id,data = dat[dat$study_id != i, ], test ="t", dfs ="contain")c(est = f$b[1], ci.lb = f$ci.lb, ci.ub = f$ci.ub)})pct(range(loo["est", ]))
[1] -29.3 -22.9
any(loo["ci.ub", ] >0)
[1] FALSE
We leave out studies, not rows: rows of a study are not independent.
cd <-cooks.distance(m, cluster = dat$___)sort(round(cd, 2), decreasing =TRUE)[1:5]
Solution
cd <-cooks.distance(m, cluster = dat$study_id)sort(round(cd, 2), decreasing =TRUE)[1:5]
1323 742 522 763 645
0.32 0.14 0.11 0.11 0.07
No study stands out from the others (the largest distance is small and close to the next ones): no single study drives the result.
Exercise 6. Study quality. How many comparisons could not be appraised (NA)? Then refit the model with only the comparisons that meet all validity criteria (validity_biodiv == 1, coded by the authors of the database), and test validity as a moderator (comparing two CIs by eye is not a test).
m_val <-rma.mv(yi, vi, random =~1| study_id / es_id,data =filter(dat, validity_biodiv == ___), test ="t", dfs ="contain")pct(c(m_val$b, m_val$ci.lb, m_val$ci.ub))
Solution
m_val <-rma.mv(yi, vi, random =~1| study_id / es_id,data =filter(dat, validity_biodiv ==1), test ="t", dfs ="contain")pct(c(m_val$b, m_val$ci.lb, m_val$ci.ub))
[1] -27.4 -39.1 -13.4
m_val$s.nlevels[1] # number of studies left
[1] 13
sum(is.na(dat$validity_biodiv)) # comparisons that could not be appraised
[1] 130
m_vmod <-rma.mv(yi, vi, mods =~factor(validity_biodiv), random =~1| study_id / es_id,data = dat, test ="t", dfs ="contain")m_vmod$pval[2] # does validity change the effect?
[1] 0.7367947
Same estimate, validity does not moderate the effect for pests. Note that a third of the comparisons could not be appraised: report it.
5(optional) Fail-safe N: why not
fsn(yi, vi, data = dat)
Fail-safe N Calculation Using the Rosenthal Approach
Observed Significance Level: <.0001
Target Significance Level: 0.05
Fail-safe N: 4098124
Discuss
Millions of “missing” studies would be needed to cancel the effect. Does that make you confident? What does this number assume about the missing studies, about heterogeneity and about dependence?
Answer
It assumes missing studies have exactly zero effect, ignores heterogeneity and the dependence between comparisons, and says nothing about the size of any bias. It is almost always “reassuring”, hence uninformative: do not report it(Nakagawa et al. 2022).
(optional) Trim-and-fill, as a sensitivity analysis only
Trim-and-fill cannot handle dependent effect sizes; apply it to one aggregated effect per study (here assuming ρ = 0.5 within studies, and a common effect within each study — a strong simplification):
Estimated number of missing studies on the right side: 0 (SE = 2.6471)
Random-Effects Model (k = 28; tau^2 estimator: REML)
tau^2 (estimated amount of total heterogeneity): 0.7345 (SE = 0.2107)
tau (square root of estimated tau^2 value): 0.8570
I^2 (total heterogeneity / total variability): 99.98%
H^2 (total variability / sampling variability): 5517.89
Test for Heterogeneity:
Q(df = 27) = 20289.3510, p-val < .0001
Model Results:
estimate se zval pval ci.lb ci.ub
-0.4634 0.1665 -2.7826 0.0054 -0.7898 -0.1370 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Here no study is imputed. Report it, if at all, as a sensitivity check — never as “the corrected effect”.
6 Your turn: natural enemies
Go back to section 1, set grp <- "Natural enemies", and rerun sections 1–3 only (skip the slow leave-one-out). Is there a small-study effect with se_n? Would bias explain the (small, non-significant) increase? Then run Exercise 6: does validity matter here?
The increase of natural enemies is small and not significant; the small-study slope is not significant with se_n, and the PET estimate is close to zero: the evidence is inconclusive, whatever the bias. But validity matters: comparisons meeting all validity criteria show a clearly larger increase of natural enemies (about +27%) than the others (about −7%) — poorly designed comparisons may be masking a real benefit. That is a moderator — the topic of the next session.
7 Debrief: your robustness table
Fill it in for pests — this is what reviewers expect:
Analysis
Estimate [95% CI]
Conclusion changes?
Main multilevel model
Only valid comparisons
Leave-one-study-out (range)
Small-study effect (se_n) / PEESE
Time-lag (slope)
Bias is best prevented by the search, not corrected by statistics.
Asymmetry ≠ publication bias: read the direction; use contour-enhanced funnels.
With several effect sizes per study, use multilevel tests — for lnRR with a sample-size-based precision; drop fail-safe N; trim-and-fill only as sensitivity.
Report all sensitivity analyses in a robustness table.
Next session (16:15):explaining heterogeneity — meta-regression. (The multilevel Egger test you just ran was already a meta-regression!)