[R] Simulate p-value in lme4
Michael Kubovy
kubovy at virginia.edu
Sun Oct 8 13:34:07 CEST 2006
Dear r-helpers,
Spencer Graves and Manual Morales proposed the following methods to
simulate p-values in lme4:
************preliminary************
require(lme4)
require(MASS)
summary(glm(y ~ lbase*trt + lage + V4, family = poisson, data =
epil), cor = FALSE)
epil2 <- epil[epil$period == 1, ]
epil2["period"] <- rep(0, 59); epil2["y"] <- epil2["base"]
epil["time"] <- 1; epil2["time"] <- 4
epil2 <- rbind(epil, epil2)
epil2$pred <- unclass(epil2$trt) * (epil2$period > 0)
epil2$subject <- factor(epil2$subject)
epil3 <- aggregate(epil2, list(epil2$subject, epil2$period > 0),
function(x) if(is.numeric(x)) sum(x) else x[1])
************simulation (SG)************
o <- with(epil3, order(subject, y))
epil3. <- epil3[o,]
norep <- with(epil3., subject[-1]!=subject[-dim(epil3)[1]])
subj1 <- which(c(T, norep))
subj.pred <- epil3.[subj1, c("subject", "pred")]
subj. <- as.character(subj.pred$subject)
pred. <- subj.pred$pred
names(pred.) <- subj.
iter <- 10
chisq.sim <- rep(NA, iter)
set.seed(1)
for(i in 1:iter){
s.i <- sample(subj.)
# Randomize subject assignments to 'pred' groups
epil3.$pred <- pred.[s.i][epil3.$subject]
fit1 <- lmer(y ~ pred+(1 | subject),
family = poisson, data = epil3.)
fit0 <- lmer(y ~ 1+(1 | subject),
family = poisson, data = epil3.)
chisq.sim[i] <- anova(fit0, fit1)[2, "Chisq"]
}
************simulation (MM)************
iter <- 10
chisq.sim <- rep(NA, iter)
Zt <- slot(model1,"Zt") # see ?lmer-class
n.grps <- dim(ranef(model1)[[1]])[1]
sd.ran.effs <- sqrt(VarCorr(model1)[[1]][1])
X <- slot(model1,"X") # see ?lmer-class
fix.effs <- matrix(rep(fixef(model1),dim(X)[1]), nrow=dim(X)[1],
byrow=T)
model.parms <- X*fix.effs # This gives parameters for each case
# Generate predicted values
pred.vals <- as.vector(apply(model.parms, 1, sum))
for(i in 1:iter) {
rand.new <- as.vector(rnorm(grps,0, sd.ran.effs)) #grps should be
n.grps?
rand.vals <- as.vector(rand.new%*%Zt) # Assign random effects
mu <- pred.vals+rand.vals # Expected mean
resp <- rpois(length(mu), exp(mu))
sim.data <- data.frame(slot(model2,"frame"), resp) # Make data frame
sim.model1 <- lmer(resp~1+(1|subject), data=sim.data,
family="poisson")
sim.model2 <- lmer(resp~pred+(1|subject), data=sim.data,
family="poisson")
chisq.sim[i] <- anova(sim.model1,sim.model2)$Chisq[[2]]
}
************end************
Unfortunately the latter fails (even if I replace grps with n.grps):
"Error in slot(model2, "frame") : object "model2" not found"
In any event, I would be eager to hear more discussion of the pros
and cons of these approaches.
_____________________________
Professor Michael Kubovy
University of Virginia
Department of Psychology
USPS: P.O.Box 400400 Charlottesville, VA 22904-4400
Parcels: Room 102 Gilmer Hall
McCormick Road Charlottesville, VA 22903
Office: B011 +1-434-982-4729
Lab: B019 +1-434-982-4751
Fax: +1-434-982-4766
WWW: http://www.people.virginia.edu/~mk9y/
More information about the R-help
mailing list