library(mgcv)
## a mixed family simulator function to play with...
sim.gfam <- function(dist,n=400) {
## dist can be norm, pois, gamma, binom, nbinom, tw, ocat (R assumed 4)
## links used are identitiy, log or logit.
dat <- gamSim(1,n=n,verbose=FALSE)
nf <- length(dist) ## how many families
fin <- c(1:nf,sample(1:nf,n-nf,replace=TRUE)) ## family index
dat[,6:10] <- dat[,6:10]/5 ## a scale that works for all links used
y <- dat$y;
for (i in 1:nf) {
ii <- which(fin==i) ## index of current family
ni <- length(ii);fi <- dat$f[ii]
if (dist[i]=="norm") {
y[ii] <- fi + rnorm(ni)*.5
} else if (dist[i]=="pois") {
y[ii] <- rpois(ni,exp(fi))
} else if (dist[i]=="gamma") {
scale <- .5
y[ii] <- rgamma(ni,shape=1/scale,scale=exp(fi)*scale)
} else if (dist[i]=="binom") {
y[ii] <- rbinom(ni,1,binomial()$linkinv(fi))
} else if (dist[i]=="nbinom") {
y[ii] <- rnbinom(ni,size=3,mu=exp(fi))
} else if (dist[i]=="tw") {
y[ii] <- rTweedie(exp(fi),p=1.5,phi=1.5)
} else if (dist[i]=="ocat") {
alpha <- c(-Inf,1,2,2.5,Inf)
R <- length(alpha)-1
yi <- fi
u <- runif(ni)
u <- yi + log(u/(1-u))
for (j in 1:R) {
yi[u > alpha[j]&u <= alpha[j+1]] <- j
}
y[ii] <- yi
}
}
dat$y <- cbind(y,fin)
dat
} ## sim.gfam
## some examples
dat <- sim.gfam(c("binom","tw","norm"))
b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),
family=gfam(list(binomial,tw,gaussian)),data=dat)
predict(b,data.frame(y=1:3,x0=c(.5,.5,.5),x1=c(.3,.2,.3),
x2=c(.2,.5,.8),x3=c(.1,.5,.9)),type="response",se=TRUE)
summary(b)
plot(b,pages=1)
## set up model so that only the binomial observations depend
## on x0...
dat$id1 <- as.numeric(dat$y[,2]==1)
b1 <- gam(y~s(x0,by=id1)+s(x1)+s(x2)+s(x3),
family=gfam(list(binomial,tw,gaussian)),data=dat)
plot(b1,pages=1) ## note the CI width increase
Run the code above in your browser using DataLab