R Under development (unstable) (2024-06-30 r86854 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ## compare range, average, etc. of simulations to > ## conditional and unconditional prediction > library(lme4) Loading required package: Matrix > do.plot <- FALSE > > if (.Platform$OS.type != "windows") { + ## use old (<=3.5.2) sample() algorithm if necessary + if ("sample.kind" %in% names(formals(RNGkind))) { + suppressWarnings(RNGkind("Mersenne-Twister", "Inversion", "Rounding")) + } + + fm1 <- lmer(Reaction~Days+(1|Subject),sleepstudy) + set.seed(101) + pp <- predict(fm1) + rr <- range(usim2 <- simulate(fm1,1,use.u=TRUE)[[1]]) + stopifnot(all.equal(rr,c(159.3896,439.1616),tolerance=1e-6)) + if (do.plot) { + plot(pp,ylim=rr) + lines(sleepstudy$Reaction) + points(simulate(fm1,1)[[1]],col=4) + points(usim2,col=2) + } + + set.seed(101) + + ## conditional prediction + ss <- simulate(fm1,1000,use.u=TRUE) + ss_sum <- t(apply(ss,1,quantile,c(0.025,0.5,0.975))) + plot(pp) + matlines(ss_sum,col=c(1,2,1),lty=c(2,1,2)) + stopifnot(all.equal(ss_sum[,2],pp,tolerance=5e-3)) + + ## population-level prediction + pp2 <- predict(fm1, re.form=NA) + ss2 <- simulate(fm1,1000,use.u=FALSE) + ss_sum2 <- t(apply(ss2,1,quantile,c(0.025,0.5,0.975))) + + if (do.plot) { + plot(pp2,ylim=c(200,400)) + matlines(ss_sum2,col=c(1,2,1),lty=c(2,1,2)) + } + + stopifnot(all.equal(ss_sum2[,2],pp2,tolerance=8e-3)) + + ## predict(...,newdata=...) on models with derived variables in the random effects + ## e.g. (f:g, f/g) + set.seed(101) + d <- expand.grid(f=factor(letters[1:10]),g=factor(letters[1:10]), + rep=1:10) + d$y <- rnorm(nrow(d)) + m1 <- lmer(y~(1|f:g),d) + p1A <- predict(m1) + p1B <- predict(m1,newdata=d) + stopifnot(all.equal(p1A,p1B)) + m2 <- lmer(y~(1|f/g),d) + p2A <- predict(m2) + p2B <- predict(m2,newdata=d) + stopifnot(all.equal(p2A,p2B)) + + ## with numeric grouping variables + dn <- transform(d,f=as.numeric(f),g=as.numeric(g)) + m1N <- update(m1,data=dn) + p1NA <- predict(m1N) + p1NB <- predict(m1N,newdata=dn) + stopifnot(all.equal(p1NA,p1NB)) + + ## simulate with modified parameters + set.seed(1) + s1 <- simulate(fm1) + set.seed(1) + s2 <- simulate(fm1,newdata=model.frame(fm1), + newparams=getME(fm1,c("theta","beta","sigma"))) + all.equal(s1,s2) + + fm0 <- update(fm1,.~.-Days) + ## + ## sim() -> simulate() -> refit() -> deviance + ## + + ## predictions and simulations with offsets + + set.seed(101) + d <- data.frame(y=rpois(100,5),x=rlnorm(100,1,1), + f=factor(sample(10,size=100,replace=TRUE))) + gm1 <- glmer(y~offset(log(x))+(1|f),data=d, + family=poisson) + s1 <- simulate(gm1) + } ## skip on windows (for speed) > > proc.time() user system elapsed 1.01 0.14 1.12