[R-sig-ME] Random intercept model with nested effects

Tibor Kiss t|bor@k|@@ @end|ng |rom ruhr-un|-bochum@de
Sun Jul 3 17:41:54 CEST 2022


Dear list members,

I am struggling with random intercept models with nested random effects. To put it simply: I do not understand why I find influential random effects in a random intercept model that cannot occur with the intercept specification. As an illustration, I am using the _dative_ data set, which is found in _languageR_ and also discussed in Baayen (2009: 278-284).

The two relevant factors are SemanticClass (fixed) and Verb (random). Verbs are sampled from the set of ditransitive verbs, but each verb in this set is a member of one of five semantic classes (SemanticClass = c(a, c, f, p, t). Verbs may also appear in more than one semantic class. In Baayen's (2009) analysis, no nesting is used (perhaps for reasons of exposition), but I assume that explicit nesting must be coded.

In order to make the model somewhat easier to interpret (in comparison to the model in Baayen (2009)), I have changed the levels of two predictors (AccessOfRec and AccessOfTheme) from three to two, and also changed the reference level of SemanticClass to _t_ (which is more plausible given the other reference levels). In addition, I am using a function to extract the random structure and calculate levels of the random effect that stay on one side of 0. The code is below.

The crucial result is shown here: 

##     name_class class names     interc   confint
## 5       feed_t     t  feed -2.0099213 1.6863733
## 8       give_t     t  give -1.1068355 0.3574284
## 12      lend_t     t  lend -2.1997060 1.3972652
## 17     offer_t     t offer -2.2969699 1.7727265
## 18       pay_t     t   pay -2.1214353 0.5253131
## 24      sell_t     t  sell  0.8782523 0.5436892
## 32      take_t     t  take  1.9223862 1.8289943
## 35     write_t     t write  1.8757040 1.3270534
## 40     allow_a     a allow -2.5067738 2.2254017
## 44     bring_a     a bring  1.4675516 1.3846133
## 50        do_a     a    do -2.4082479 1.9457716
## 54      give_a     a  give -1.7403999 0.2911642
## 59     issue_a     a issue  2.7544666 2.3742973
## 65       owe_a     a   owe -2.1404955 1.8719220
## 66       pay_a     a   pay  5.2520666 1.0379571
## 92     teach_c     c teach -2.7920566 1.4288249
## 93      tell_c     c  tell -4.1851336 1.1225658
## 101    offer_f     f offer  2.7622290 1.4753894

Recall that the reference level for SemanticClass is set to _t_. But  in addition to verbs belonging to class _t_, verbs belonging to classes _a_, _c_, and _f_ are listed as influential random effects. This strikes me as mysterious because these verbs cannot occur with the intercept.  

Perhaps there is some logical fallacy in my thinking, but I am not able to identify it and would thus appreciate your comments. 

Thanks in advance


Tibor


# libraries

library(languageR)
library(tidyverse)
library(lme4)

# function to extract relevant random effects

relevant.ranefs <- function(model) {
  randoms <- ranef(model, condVar = T)
  ranefs <- data.frame( names = rownames(randoms[[1]]))
  ranefs$interc = randoms[[1]][,1]
  variances <- attr(randoms[[1]], "postVar")
  ranefs$confint <- 1.96 * sqrt(variances[,,1:length(variances)])
  relevant.ranefs <- subset(ranefs, abs(interc)-confint > 0)

# data manipulation

dative.data <- 
  dative %>%
  mutate(AccessRec = ifelse(AccessOfRec == "given", "given", "non_given"),
         AccessTheme = ifelse(AccessOfTheme == "given", "given", "non_given"),
         SemanticClass = relevel(factor(SemanticClass), ref = "t"),
         AccessRec = relevel(factor(AccessRec), ref = "non_given"),
         DefinOfRec = relevel(factor(DefinOfRec), ref = "indefinite")
         )

# model
dative.glmm3 <- glmer(RealizationOfRecipient ~ AccessRec + AccessTheme + SemanticClass + 
                        PronomOfRec + AnimacyOfRec + AnimacyOfTheme + PronomOfTheme + DefinOfTheme + 
                        DefinOfRec + LengthOfRecipient + LengthOfTheme + Modality +
                        (1| SemanticClass:Verb), 
      data = dative.data, family = "binomial", 
      control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e4)))

## Dealing with a convergence warning, as suggested by Ben Bolker

params <- getME(dative.glmm3,c("theta","fixef"))

dative.glmm3 <- 
  update(dative.glmm3,start = params,
         control = glmerControl(optimizer = "bobyqa", optCtrl=list(maxfun=2e4)))

## Convergence warning gone

print(summary(dative.glmm3), corr = FALSE)

# extraction of relevant random effects

dative3.relevant.ranefs <- relevant.ranefs(dative.glmm3)

dative3.relevant.ranefs<-
  dative3.relevant.ranefs %>%
  separate(names, c("class", "names")) %>%
  unite(name_class, c(names, class), remove = FALSE) %>%
  mutate(name_class = factor(name_class, levels = name_class[order(interc, decreasing = TRUE)]))

dative3.relevant.ranefs


—————————
Prof. Dr. Tibor Kiss
Linguistic Data Science Lab
Ruhr-University Bochum



  


More information about the R-sig-mixed-models mailing list