[R-sig-ME] Anova()'s Wald chisquare test for predictors with df > 1 in a logistic GLMM
Fox, John
j|ox @end|ng |rom mcm@@ter@c@
Thu Apr 18 18:58:52 CEST 2019
Dear Paul,
The Wald() function suffices for the simple case you use, where there are no interactions. The trick in the more complex case of "type-II" tests for models with terms related by marginality is to generate the correct restriction matrix, which doesn't simply pick out certain coefficients.
Best,
John
-------------------------------------------------
John Fox, Professor Emeritus
McMaster University
Hamilton, Ontario, Canada
Web: http::/socserv.mcmaster.ca/jfox
> On Apr 18, 2019, at 12:18 PM, Paul Johnson <paul.johnson using glasgow.ac.uk> wrote:
>
>> I'm trying to figure out how the Wald chi-square test is performed for a
>> nominal predictor with more than two levels in the context of a logistic
>> GLMM.
>
> Keep in mind that Wald tests and LRTs for GLMMs come with health warnings, e.g.
> https://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#tests-of-effects-i.e.testing-that-several-parameters-are-simultaneously-zero
>
>> But how are they calculated for a multi-level nominal predictor?
>>
>> My (un)educated guess is that for each level of the nominal variable, the
>> z-score is squared and the sum of these squares compared to the right-tail
>> probability of the chi-squared distribution with DF equal to the number of
>> levels of the predictor minus one. And indeed this square-the-z approach
>> seems to correctly reproduce the results of Anova() for predictors with a
>> single degree of freedom. But I can't make it reproduce the results of
>> Anova() for predictors with more than one level. Hence my question: how is
>> the test statistic calculated?
>
> When the null hypothesis is that more than one fixed effect is zero (as with a factor with >2 levels), the covariances of the fixed effects have to be be taken into account. The Wald statistic is
>
> t(R %*% b) %*% solve(R %*% vc %*% t(R)) %*% (R %*% b)
>
> where R is a restriction matrix that picks out the contrasts you're interested in, b is the fixed effect estimates vector, and vc is the estimated covariance matrix of the fixed effects (and we’re assuming that as is usual the null hypothesis values of b are all zero). In the case where you’re testing a multilevel categorical variable, R %*% b is simply the vector of estimates for the k-1 non-reference levels and R %*% vc %*% t(R) is the k-1 X k-1 block of the covariance matrix for those k-1 fixed effects. If the covariances were all zero (e.g. by design — but I don’t think they can be for multilevel factors), the Wald statistic formula above would reduce to your sum of squares of z method.
>
> Below is an binomial glmer example with a Wald test function I found on the web years ago. It gives the same result as car::Anova but it’s easier to see the inner workings.
>
> Best wishes,
> Paul
>
>
> # wald z-test function
> # (adapted from Stijn Ruiter's function http://stijnruiter.nl/blog/?p=309 - broken link)
>
> Wald<-
> function(object, # lme4 or glmmTMB fit
> R, # restrictions matrix. null hypothesis: R %*% fixef(object) = q
> q = NULL, # null values. by default q is a vector of zeroes
> gmmTMB.model = "cond")
> {
> require(lme4)
> if (!is.matrix(R)) stop("Restrictions must be a matrix")
> if(is.null(q)) q <- rep(0, nrow(R))
> b <- fixef(object)
> if(class(b) == "fixef.glmmTMB") b <- b[[gmmTMB.model]]
> vc <- vcov(object)
> if("vcov.glmmTMB" %in% class(vc)) vc <- vc[[gmmTMB.model]]
> w <- t(R %*% b - q) %*% solve(R %*% vc %*% t(R)) %*% (R %*% b - q)
> pw <- pchisq(w[1], length(q), lower.tail = FALSE)
> cat("*************\n* Wald Test *\n*************\n")
> cat("lme4 fixed effects:\n")
> print(fixef(object))
> cat("\nRestrictions:\n")
> print(R)
> cat("\nq = ",q)
> cat("\nChi-square:", round(w[1],3), " df = ", length(q))
> cat("\nProb x>chisq:", round(pw, 5), "\n")
> return(pw)
> }
>
>
> # first example from ?glmer
> library(lme4)
> library(car)
> (gm1 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd),
> data = cbpp, family = binomial))
>
>
> R <- cbind(0, diag(3))
> # ...but ideally you want to generate the restriction matrix automatically
>
> Wald(gm1, R = R)
> anova(gm1, update(gm1, ~ . - period))
> Anova(gm1)
>
>
> _______________________________________________
> R-sig-mixed-models using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-mixed-models
More information about the R-sig-mixed-models
mailing list