library(MASS)
?Insurance
options(contrasts=c("contr.treatment", "contr.poly"))
fm <- glm(Claims ~ District*Group*Age + offset(log(Holders)),
          data = Insurance, family = poisson)
residuals(fm)
fm <- glm(Claims ~ District*Group*Age + offset(log(Holders)),
          data = Insurance, family = poisson, maxit=50, trace=T)
fm <- glm(Claims ~ (District+Group+Age)^2 + offset(log(Holders)),
          data = Insurance, family = poisson)
summary(fm, cor=F)

fm2 <- stepAIC(fm, direction="both")

dropterm(fm2, test="Chisq")

summary(fm2, cor=F)

fm3 <- update(fm2, . ~ District + as.integer(Group) + as.integer(Age) + offset(log(Holders)))
summary(fm3, cor=F)

fm4 <- update(fm2, . ~ District + C(Group, poly, 1) + C(Age, poly, 1) + offset(log(Holders)))
summary(fm4, cor=F)

plot(profile(fm4))

plot(fm4) # diagnostic plots
(dfm <- cbind(Insurance, fitted = round(fitted(fm4)),
              res=round(residuals(fm4, type="pearson"), 1)))

tab <- array(dfm$Claims/dfm$Holders, dim=c(4,4,4))
dimnames(tab) <- list(Age=levels(dfm$Age), Group=levels(dfm$Group), District=levels(dfm$district))
mosaicplot(aperm(tab, 3:1), color=T)

tab2 <- array(fitted(fm4)/dfm$Holders, dim=c(4,4,4))
dimnames(tab2) <- list(Age=levels(dfm$Age), Group=levels(dfm$Group), District=levels(dfm$district))

par(mfrow=c(1,2), pty="s")
mosaicplot(aperm(tab, 3:1), color=T, main="Observed")
mosaicplot(aperm(tab2, 3:1), color=T, main="Expected")

par(mfrow=c(1,3), pty="m")
nd <- Insurance[1:4,]
nd$Holders <- rep(1000,4)
pr <- predict(fm4, nd, se=T, type="response")
error.bar(1:4, pr$fit, -2*pr$se, +2*pr$se, xaxt="n", xlab="Age",
          ylab="claims/1000", ylim=c(0,350))
axis(1, at=1:4, labels=levels(Insurance$Age))

nd <- Insurance[seq(1, by=4, len=4),]
nd$Holders <- rep(1000,4)
pr <- predict(fm4, nd, se=T, type="response")
error.bar(1:4, pr$fit, -2*pr$se, +2*pr$se, xaxt="n", xlab="Group",
          ylab="claims/1000", ylim=c(0,350))
axis(1, at=1:4, labels=levels(Insurance$Group))

nd <- Insurance[seq(1, by=16, len=4),]
nd$Holders <- rep(1000,4)
pr <- predict(fm4, nd, se=T, type="response")
error.bar(1:4, pr$fit, -2*pr$se, +2*pr$se, xaxt="n", xlab="District",
          ylab="claims/1000", ylim=c(0,350))
axis(1, at=1:4, labels=levels(Insurance$District))

par(mfrow=c(1,1), pty="m")

trellis.device()
nd <- Insurance
nd$Holders <- rep(1000,64)
pr <- predict(fm4, nd, se=T, type="response")
barchart(Age ~ pr$fit | Group*District, data=nd, xlab="rate", xlim=c(0,350))
# or better with a log axis:
barchart(Age ~ pr$fit | Group*District, data=nd, xlab="rate",
         scale=list(x=list(log=10)))

