require(graphics)
# Example from Burnham and Anderson (2002), page 100:
data(Cement)
lm1 <- lm(y ~ ., data = Cement)
dd <- dredge(lm1)
top.models <- get.models(dd, subset=cumsum(weight) <= .95)
avgm <- model.avg(top.models)
# helper function
nseq <- function(x, len=length(x)) seq(min(x, na.rm=TRUE),
max(x, na.rm=TRUE), length=len)
# New predictors: X1 along the range of original data, other
# variables held constant at their means
newdata <- as.data.frame(lapply(lapply(Cement[1:5], mean), rep, 25))
newdata$X1 <- nseq(Cement$X1, nrow(newdata))
# Predictions from each of the models in a set:
pred <- sapply(top.models, predict, newdata=newdata)
# Add predictions from the models averaged using two methods:
pred <- cbind(pred,
averaged.0=predict(avgm, newdata),
averaged.NA=predict(update(avgm, method="NA"), newdata))
matplot(x=newdata$X1, y=pred, type="l", lwd=c(rep(1,ncol(pred)-2), 2, 2),
xlab="X1", ylab="y")
legend("topleft",
legend=c(lapply(top.models, formula),
paste("Averaged model (method=", c("0", "NA"), ")", sep="")),
col=1:6, lty=1:5, lwd=c(rep(1,ncol(pred)-2), 2, 2), cex = .75)
# Example with gam models (based on "example(gam)")
require(mgcv)
dat <- gamSim(1, n = 500, dist="poisson", scale=0.1)
gam1 <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3) + (x1 + x2 + x3)^2,
family = poisson, data = dat, method = "REML")
cat(dQuote(getAllTerms(gam1)), "\n")
# include only models with either smooth OR linear term (but not both)
# for each predictor variable:
dd <- dredge(gam1, subset=xor(`s(x1)`, x1) & xor(`s(x2)`, x2) &
xor(`s(x3)`, x3))
# ...this may take a while.
subset(dd, cumsum(weight) < .95)
top.models <- get.models(dd, cumsum(weight) <= .95)
newdata <- as.data.frame(lapply(lapply(dat, mean), rep, 50))
newdata$x1 <- nseq(dat$x1, nrow(newdata))
pred <- cbind(
sapply(top.models, predict, newdata=newdata),
averaged=predict(model.avg(top.models), newdata))
matplot(x=newdata$x1, y=pred, type="l", xlab="x1", ylab="y"
lwd=c(rep(1, ncol(pred) - 2), 2, 2))
Run the code above in your browser using DataLab