Viechtbauer 2010 - LRT, Permutation Tests, BLUPs and Model Fit

Summary

Beyond Wald tests, metafor offers likelihood-ratio tests (requiring ML, not REML, when fixed effects differ), exact or Monte Carlo permutation tests that avoid normality assumptions, and BLUPs of study-specific true effects whose shrinkage toward grows with sampling variance and shrinks as grows. On BCG, latitude is significant by LRT (), permutation -values are larger than Wald ones, and small trials are visibly shrunk.

Overview

Section 3.5 closes with three inferential tools and a model-comparison tool. All use the BCG data of Viechtbauer 2010 - BCG Vaccine Worked Example.

Main Content

Fit statistics and likelihood ratio tests

fitstats() returns the (restricted) log-likelihood, deviance ( log-likelihood), AIC and BIC. The unrestricted likelihood is used unless REML is used. counts as an additional parameter in random/mixed models.

Likelihood ratio test of nested meta-regression models

anova(full, reduced) compares nested models fitted to the same data. The LRT statistic is under . Conditions: (i) same data; (ii) nested; (iii) under REML the LRT is not meaningful when the fixed effects differ, so fit both with method="ML". The reported proportion of heterogeneity accounted for is . For one could compare an ML/REML fit with method="FE" using but the null lies on the boundary of the parameter space (needs a mixture adjustment), and the -test “usually keeps better control of the Type I error rate anyway and therefore should be preferred” (Viechtbauer 2007b).

LRT for latitude

ML fits: full (latitude) df = 3, AIC 21.3713, BIC 23.0662, logLik -7.6857, , . Reduced (intercept only) df = 2, AIC 29.3302, BIC 30.4601, logLik -12.6651, , . , df = 1, ; variance accounted for 87.73%. Latitude alone accounts for about 88% of the (ML) heterogeneity; is rejected.

Permutation tests

Permutation tests (Follmann and Proschan 1999; Higgins and Thompson 2004)

Alternative to Wald and LRT tests that assume normal observed (and true) effects and asymptotics.

  • No moderators: permute the signs of the observed effects; two-sided = twice the proportion of permuted statistics at least as extreme as observed.
  • With moderators: permute the rows of the design matrix; coefficient = twice the proportion at least as extreme; omnibus = proportion more extreme than the observed .
  • permutest(res, exact=TRUE) fits every permutation once (feasible only for small : has 120 row permutations and 32 sign patterns; : 40,320 and 256; : 3,628,800 and 1,024); exact=FALSE (default) uses iter random permutations (1000 default), so results vary slightly between runs.

BCG permutation results

RE model, exact sign-permutation (8192 iterations, ): with permutation (Wald , ). Mixed model (latitude, year), 10,000 random permutations (an exact test needs more than fits): omnibus , (Wald 0.0022); latitude (Wald 0.0062); year . Conclusions unchanged but permutation -values are “more conservative”. Fig. 10: the permutation distribution of the latitude statistic has a fatter tail than the standard normal (overlaid in red; kernel density in blue). A simulation (random unrelated moderator, 10,000 replicates 5000 permutations = fits) gave empirical Type I error 0.05.

BLUPs

Best linear unbiased predictions of the true effects ( blup())

For the random-effects model the BLUP of is

(For mixed models is replaced by the fitted value .) Since is estimated these are empirical BLUPs, unbiased and asymptotically BLUP (Kackar and Harville 1981). Bayesian reading: posterior means (and modes) of under vague priors on the coefficients, with fixed.

Shrinkage behaviour: if all BLUPs equal ; for very large they approach (especially for small ); in general they lie between and .

BCG BLUPs

With and : study 1: , so (SE 0.4099, prediction interval ). Study 4 (precise): (SE 0.1376). Study 13: (SE 0.2434). Fig. 11 shows observed values versus BLUPs, with the smaller studies shrunk most strongly toward . Reproduced in Python to four decimals; the exact sign-permutation count with held fixed is 12 of 8192, , matching the printed 0.0015.

import numpy as np
def blups(y, v, tau2, mu):
    lam = tau2/(tau2+v); return lam*y + (1-lam)*mu
def sign_permutation_p(y, v, tau2, n=8192):
    """Exact sign-flip permutation p-value for H0: mu=0 (all 2^k sign patterns when k=13 -> 8192)."""
    import itertools
    w = 1/(v+tau2); obs = abs((w*y).sum())/np.sqrt(w.sum()); cnt = 0
    for s in itertools.product([-1,1], repeat=len(y)):
        cnt += abs((w*np.array(s)*y).sum())/np.sqrt(w.sum()) >= obs - 1e-12
    return cnt/2**len(y)

Connections

See Also