context("KFAS and glm comparison") # Poor starting values y <- rep(0:1,c(15,10)) model<-SSModel(y~1,dist="binomial") expect_equivalent(coef(KFS(model,theta=7.1)),coef(KFS(model))) expect_equivalent(coef(KFS(model,theta=-4.6)),coef(KFS(model))) tol<-1e-4 require(MASS) # Test for Gaussian ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14) trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69) group <- gl(2, 10, 20, labels = c("Ctl","Trt")) weight <- c(ctl, trt) glm.gaussian <- glm(weight ~ group) model.gaussian <- SSModel(weight~group) tmp<-KFS(model.gaussian,filtering="state",smoothing="none") model.gaussian <- SSModel(weight~group,H=mean(c(tmp$v[1:tmp$d][tmp$Finf==0]^2/tmp$F[1:tmp$d][tmp$Finf==0], tmp$v[-(1:tmp$d)]^2/tmp$F[-(1:tmp$d)]))) kfas.gaussian <-KFS(model.gaussian,smoothing=c('state','signal','mean')) # Test for Poisson GLM # Same example as in ?glm d <- data.frame(treatment= gl(3,3), outcome = gl(3,1,9), counts = c(18,17,15,20,10,20,25,13,12)) glm.poisson <- glm(counts ~ outcome + treatment, data=d, family = poisson(),control=list(epsilon=1e-15)) model.poisson<-SSModel(counts ~ outcome + treatment, data=d, distribution = 'poisson') kfas.poisson<-KFS(model.poisson,smoothing=c('state','signal','mean')) ## Test for Binomial GLM ## example from Venables and Ripley (2002, pp. 190-2.) ldose <- rep(0:5, 2) numdead <- c(1, 4, 9, 13, 18, 20, 0, 2, 6, 10, 12, 16) sex <- factor(rep(c("M", "F"), c(6, 6))) SF <- cbind(numdead, numalive = 20-numdead) glm.binomial <- glm(SF ~ sex*ldose, family = binomial,control=list(epsilon=1e-15)) model.binomial<-SSModel(numdead ~ sex*ldose, u=20,distribution = 'binomial') kfas.binomial<-KFS(model.binomial,smoothing=c('state','signal','mean'),maxiter=1000,convtol=1e-15) kfas.binomial2<-KFS(model.binomial,smoothing=c('state','signal','mean'),maxiter=1000) ## Test for Gamma GLM # A Gamma example from McCullagh & Nelder (1989, pp. 300-2) clotting <- data.frame( u = c(5,10,15,20,30,40,60,80,100), lot1 = c(118,58,42,35,27,25,21,19,18), lot2 = c(69,35,26,21,18,16,13,12,12)) glm.gamma<-glm(lot1 ~ log(u), data = clotting, family = Gamma("log"),control=list(epsilon=1e-8)) #dispersion=1 model.gamma1<-SSModel(lot1 ~ log(u), data = clotting, distribution = 'gamma') kfas.gamma1<-KFS(model.gamma1,smoothing=c('state','signal','mean'), expected = TRUE) #dispersion from gamma.glm model.gamma2<-SSModel(lot1 ~ log(u), u = 1/summary(glm.gamma)$dispersion, data = clotting, distribution = 'gamma') kfas.gamma2<-KFS(model.gamma2,smoothing=c('state','signal','mean'),maxiter=1000,convtol=1e-8, expected = TRUE) ## Test for NB GLM ## From MASS library, ?glm.nb glm.NB <- glm.nb(Days ~ Sex/(Age + Eth*Lrn), data = quine,control=glm.control(epsilon=1e-12)) # estimate theta theta0<-1 model.NB<-SSModel(Days ~ Sex/(Age + Eth*Lrn), u=theta0, data = quine, distribution = 'negative binomial') kfas.NB<-KFS(model.NB,smoothing='mean', expected = TRUE) theta<-theta.ml(y=quine$Days,mu=c(fitted(kfas.NB))) maxit<-10 i<-0 while(abs(theta-theta0)/theta0>1e-7 && i