msm/0000755000176200001440000000000014713226252011052 5ustar liggesusersmsm/tests/0000755000176200001440000000000014713146130012210 5ustar liggesusersmsm/tests/testthat/0000755000176200001440000000000014713146131014051 5ustar liggesusersmsm/tests/testthat/test_pearson.R0000644000176200001440000000252114567357102016713 0ustar liggesuserstest_that("pearson.msm help example",{ psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2))) p <- pearson.msm(psor.msm, timegroups=2, intervalgroups=2, covgroups=2) expect_equal(p$test[["p"]],0) # with exact death times set.seed(1) cav.msm <- msm( state ~ years, subject=PTNUM, data = cav[1:1000,], qmatrix = twoway4.q, deathexact = TRUE, fixedpars=FALSE) p <- pearson.msm(cav.msm) expect_equal(p$test[["stat"]],67,tol=1) }) #test_that("pearson with bootstrap",{ # psor.msm <- msm(state ~ months, subject=ptnum, data=psor[1:29,], # qmatrix = psor.q) # p <- pearson.msm(psor.msm, timegroups=2, intervalgroups=2, covgroups=1, boot=TRUE, B=10) #}) test_that("pearson.msm, models with interactions",{ skip_on_cran() expect_error({ psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt:hieffusn) pearson.msm(psor.msm, timegroups=2, intervalgroups=2, covgroups=2) }, NA) }) msm/tests/testthat/test_models_misc.r0000644000176200001440000002120014472355533017576 0ustar liggesuserscontext("msm misclassification model likelihoods") test_that("cav misclassification model with no covariates",{ misc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars=TRUE) expect_equal(4296.9155995778, misc.msm$minus2loglik, tol=1e-06) miscnew.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, deathexact = 4, fixedpars=TRUE, hmodel=list( hmmCat(prob=c(0.9, 0.1, 0, 0)), hmmCat(prob=c(0.1, 0.8, 0.1, 0)), hmmCat(prob=c(0, 0.1, 0.9, 0)), hmmIdent()) ) expect_equal(miscnew.msm$minus2loglik, misc.msm$minus2loglik) print(misc.msm) eo <- msm.form.eoutput(misc.msm) expect_equal(eo$base.Estimate[1], ematrix.msm(misc.msm)$estimates["Well","Well"]) }) test_that("cav misclassification model with covariates on transition rates",{ misccov.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars = TRUE, covariates = ~ sex, covinits=list(sex=rep(0.1, 5))) expect_equal(4299.38058878142, misccov.msm$minus2loglik, tol=1e-06) expect_equal(odds.msm(misccov.msm), "No covariates on misclassification probabilities") }) test_that("cav misclassification model with covariates on misclassification probabilities",{ misccov.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars=TRUE, misccovariates = ~dage + sex, misccovinits = list(dage=c(0.01,0.02,0.03,0.04), sex=c(-0.013,-0.014,-0.015,-0.016))) expect_equal(4306.3077053482, misccov.msm$minus2loglik, tol=1e-06) expect_equal(odds.msm(misccov.msm)$dage[[1]], exp(0.01)) misccovnew.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, deathexact = 4, fixedpars=TRUE, center=TRUE, hmodel=list( hmmCat(prob=c(0.9, 0.1, 0, 0)), hmmCat(prob=c(0.1, 0.8, 0.1, 0)), hmmCat(prob=c(0, 0.1, 0.9, 0)), hmmIdent()), hcovariates=list(~dage + sex, ~dage + sex, ~dage + sex, ~1), hcovinits = list(c(0.01,-0.013), c(0.02,-0.014,0.03,-0.015), c(0.04,-0.016), NULL) ) expect_equal(misccov.msm$minus2loglik, misccovnew.msm$minus2loglik, tol=1e-06) }) test_that("misclassification model with no misclassification reduces to simple",{ nomisc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = twoway4.q, ematrix=matrix(0, nrow=4, ncol=4), deathexact = 4, fixedpars=TRUE) simple.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = twoway4.q, deathexact = 4, fixedpars=TRUE) expect_equal(nomisc.msm$minus2loglik, simple.msm$minus2loglik) }) test_that("misclassification model with obstrue",{ misc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars=TRUE, obstrue=firstobs) expect_equal(4165.84711809003, misc.msm$minus2loglik, tol=1e-06) }) test_that("misclassification model with exact times",{ miscexact.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, exacttimes=TRUE, fixedpars=TRUE) expect_equal(4864.14764195147, miscexact.msm$minus2loglik, tol=1e-06) }) test_that("misclassification model with initprobs",{ miscinits.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, initprobs=c(0.7, 0.1, 0.1, 0.1), fixedpars=TRUE) expect_equal(4725.9078185031, miscinits.msm$minus2loglik, tol=1e-06) }) test_that("misclassification model with est.initprobs",{ expect_error({ miscinits.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, initprobs=c(0.8, 0.1, 0.1, 0), est.initprobs=TRUE, method="BFGS", control=list(fnscale=4000, maxit=10000), fixedpars=1:9) print(miscinits.msm) print(summary(miscinits.msm)) }, NA) }) test_that("misclassification model with censoring",{ misccens.msm <- msm(state ~ years, subject = PTNUM, data = cav.cens, qmatrix = oneway4.q, ematrix=ematrix, deathexact=TRUE, censor=99, fixedpars=TRUE) expect_equal(4025.42265024404, misccens.msm$minus2loglik, tol=1e-06) }) test_that("misclassification model with two types of censoring",{ misccens.msm <- msm(state ~ years, subject=PTNUM, data=cav.cens2, qmatrix=oneway4.q, ematrix=ematrix, censor=c(99, 999), deathexact=4, censor.states=list(c(1,2,3), c(2,3)), fixedpars=TRUE) expect_equal(3811.69640533587, misccens.msm$minus2loglik, tol=1e-06) cav.cens2$obstrue <- as.numeric(cav.cens2$state %in% c(999)) misccens.msm <- msm(state ~ years, subject=PTNUM, data=cav.cens2, qmatrix=oneway4.q, ematrix=ematrix, censor=c(99, 999), deathexact=4, obstrue=obstrue, censor.states=list(c(1,2,3), c(2,3)), fixedpars=TRUE) expect_equal(3822.04540210944, misccens.msm$minus2loglik, tol=1e-06) }) test_that("misclassification model with no misclassification reduces to simple, with censoring",{ misc.msm <- msm(state ~ years, subject = PTNUM, data = cav.cens, qmatrix = twoway4.q, ematrix=matrix(0, nrow=4, ncol=4), censor=99, deathexact=TRUE, fixedpars=TRUE) simple.msm <- msm(state ~ years, subject = PTNUM, data = cav.cens, qmatrix = twoway4.q, deathexact=TRUE, censor=99, fixedpars=TRUE) expect_equal(misc.msm$minus2loglik, simple.msm$minus2loglik, tol=1e-06) misc.msm <- msm(state ~ years, subject = PTNUM, data = cav.cens, qmatrix = twoway4.q, ematrix=matrix(0, nrow=4, ncol=4), censor=99, fixedpars=TRUE) simple.msm <- msm(state ~ years, subject = PTNUM, data = cav.cens, qmatrix = twoway4.q, censor=99, fixedpars=TRUE) expect_equal(misc.msm$minus2loglik, simple.msm$minus2loglik, tol=1e-06) }) test_that("misclassification model with no misclassification reduces to simple, using hmmCat",{ miscnew.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = twoway4.q, hmodel=list(hmmCat(prob=c(1, 0, 0, 0)), hmmCat(prob=c(0, 1, 0, 0)), hmmCat(prob=c(0, 0, 1, 0)), hmmIdent()), fixedpars=TRUE) simple.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = twoway4.q, fixedpars=TRUE) expect_equal(miscnew.msm$minus2loglik, simple.msm$minus2loglik, tol=1e-06) }) test_that("can't mix ematrix and hcovariates",{ expect_error( misccov.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars=1:17, hcovariates=list(~dage + sex, ~dage + sex, ~dage + sex, ~1), hcovinits = list(c(0.01,0.013), c(0.01,0.013,0.01,0.013), c(0.01,0.013), NULL) ), "hcovariates have been specified, but no hmodel") }) test_that("data inconsistent with initprobs/ematrix",{ cav2 <- cav cav2$state[c(1,8)] <- 3 expect_warning(msm(state ~ years, subject = PTNUM, data = cav2, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars=TRUE), "First observation .+ is impossible") }) test_that("various errors",{ wrong.e <- "foo" expect_error(misc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=wrong.e, deathexact = 4, fixedpars=TRUE),"ematrix should be a numeric matrix") wrong.e <- 1 expect_error(misc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=wrong.e, deathexact = 4, fixedpars=TRUE),"ematrix should be a numeric matrix") wrong.e <- cbind(c(0,1,2), c(0,1,2)) expect_error(misc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=wrong.e, deathexact = 4, fixedpars=TRUE),"Number of rows and columns of ematrix should be equal") wrong.e <- cbind(c(0,1), c(0,2)) expect_error(misc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=wrong.e, deathexact = 4, fixedpars=TRUE),"Dimensions of qmatrix and ematrix should be the same") expect_warning(msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars=TRUE, gen.inits=TRUE), "gen.inits not supported for hidden Markov models, ignoring") }) msm/tests/testthat/test_analyticp.r0000644000176200001440000007405014472342475017300 0ustar liggesuserscontext("analytic transition probability matrices") fixq <- function(Q){ diag(Q) <- 0; diag(Q) <- - rowSums(Q); Q } # avoid namespace faff nsubj <- 50; nobspt <- 6 sim.df <- data.frame(subject = rep(1:nsubj, each=nobspt), time = seq(0, 20, length.out=nobspt), x = rnorm(nsubj*nobspt), y = rnorm(nsubj*nobspt)* 5 + 2 ) set.seed(22061976) test_that("2 state analytic P matrices",{ (two.q <- fixq(rbind(c(0, exp(-2)), c(0, 0)))) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=two.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-3)), c(0, 0)), analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-3)), c(0, 0)), analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) ## 1,2 (two.q <- fixq(rbind(c(0, exp(-2)), c(exp(-2), 0)))) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=two.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-3)), c(exp(-1), 0)), analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-3)), c(exp(-1), 0)), analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) }) test_that("3 state analytic P matrices",{ ## 1,2 (three.q <- fixq(rbind(c(0, exp(-3), exp(-3)), c(0, 0, 0), c(0, 0, 0)))) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-1)), c(0, 0, 0), c(0, 0, 0)), analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-1)), c(0, 0, 0), c(0, 0, 0)), analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) ## 1,4 (three.q <- fixq(rbind(c(0, exp(-3), 0), c(0, 0, exp(-3)), c(0, 0, 0)))) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0), c(0, 0, exp(-1)), c(0, 0, 0)), analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0), c(0, 0, exp(-1)), c(0, 0, 0)), analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) # 4,5 (== 1,4) nsubj <- 500; nobspt <- 6 sim.df <- data.frame(subject = rep(1:nsubj, each=nobspt), time = seq(0, 20, length.out=nobspt), x = rnorm(nsubj*nobspt), y = rnorm(nsubj*nobspt)* 5 + 2 ) (three.q <- fixq(rbind(c(0, 0, 0), c(0, 0, exp(-2)), c(exp(-3), 0, 0)))) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, start=rep(2,500)) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, 0, 0), c(0, 0, exp(-3)), c(exp(-2), 0, 0)), analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, 0, 0), c(0, 0, exp(-3)), c(exp(-2), 0, 0)), analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) ## 1,6 (three.q <- fixq(rbind(c(0, exp(-3), 0), c(0, 0, 0), c(0, exp(-3), 0)))) nsubj <- 50; nobspt <- 6 sim.df <- data.frame(subject = rep(1:nsubj, each=nobspt), time = seq(0, 20, length.out=nobspt), x = rnorm(nsubj*nobspt), y = rnorm(nsubj*nobspt)* 5 + 2 ) set.seed(22061976) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, start=c(rep(3,25),rep(1,25))) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0), c(0, 0, 0), c(0, exp(-1), 0)), analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0), c(0, 0, 0), c(0, exp(-1), 0)), analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) #1,2,4 (= 3,4,5) (three.q <- fixq(rbind(c(0, 0, 0), c(exp(-3), 0, exp(-3)), c(exp(-3), 0, 0)))) set.seed(22061976) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, start=rep(2, 50)) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, 0, 0), c(exp(-2), 0, exp(-2)), c(2*exp(-2), 0, 0)), analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, 0, 0), c(exp(-2), 0, exp(-2)), c(2*exp(-2), 0, 0)), analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) # 1,2,4 (three.q <- fixq(rbind(c(0, exp(-3), exp(-6)), c(0, 0, exp(-3)), c(0, 0, 0)))) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-2)), c(0, 0, exp(-1)), c(0, 0, 0)), analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-2)), c(0, 0, exp(-1)), c(0, 0, 0)), analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) # 1,2,4 (=1,2,6) (three.q <- fixq(rbind(c(0, exp(-3), exp(-6)), c(0, 0, 0), c(0, exp(-3), 0)))) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-2)), c(0, 0, 0), c(0, exp(-2), 0)), analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-2)), c(0, 0, 0), c(0, exp(-2), 0)), analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) #1,3,5 (= 2,4,5) (three.q <- fixq(rbind(c(0, 0, exp(-3)), c(0, 0, exp(-3)), c(exp(-3), 0, 0)))) set.seed(22061976) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, start=c(rep(1, 25), rep(2,25))) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, 0, exp(-1)), c(0, 0, exp(-1)), c(exp(-2), 0, 0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, 0, exp(-1)), c(0, 0, exp(-1)), c(exp(-2), 0, 0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (three.q <- fixq(rbind(c(0, 0, exp(-3)), c(0, 0, exp(-3)), c(exp(-6), 0, 0)))) expect_equal(MatrixExp(three.q, method="analytic"), MatrixExp(three.q, method="pade")) #1,2,4,6 (three.q <- fixq(rbind(c(0, exp(-3), exp(-3)), c(0, 0, exp(-3)), c(0, exp(-3), 0)))) set.seed(22061976) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, start=c(rep(1, 25), rep(2,25))) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-1)), c(0, 0, exp(-1)), c(0, exp(-2), 0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-1)), c(0, 0, exp(-1)), c(0, exp(-2), 0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-1)), c(0, 0, exp(-1)), c(0, exp(-1), 0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), exp(-1)), c(0, 0, exp(-1)), c(0, exp(-1), 0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) }) ## FOUR STATES #1,5,9 test_that("4 state analytic P matrices",{ (four.q <- fixq(rbind(c(0, exp(-3), 0, 0), c(0, 0, exp(-3), 0), c(0, 0, 0, exp(-3)), c(0,0,0,0)))) set.seed(22061976) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=four.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0, 0), c(0, 0, exp(-1), 0), c(0, 0, 0, exp(-1)), c(0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0, 0), c(0, 0, exp(-1), 0), c(0, 0, 0, exp(-1)), c(0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0, 0), c(0, 0, exp(-1), 0), c(0, 0, 0, exp(-2)), c(0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0, 0), c(0, 0, exp(-1), 0), c(0, 0, 0, exp(-2)), c(0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0, 0), c(0, 0, exp(-2), 0), c(0, 0, 0, exp(-1)), c(0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-1), 0, 0), c(0, 0, exp(-2), 0), c(0, 0, 0, exp(-1)), c(0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, 0), c(0, 0, exp(-1), 0), c(0, 0, 0, exp(-1)), c(0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, 0), c(0, 0, exp(-1), 0), c(0, 0, 0, exp(-1)), c(0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, 0), c(0, 0, exp(-1), 0), c(0, 0, 0, exp(-3)), c(0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, 0), c(0, 0, exp(-1), 0), c(0, 0, 0, exp(-3)), c(0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) #13569 (four.q <- fixq(rbind(c(0, exp(-3), 0, exp(-3)), c(0, 0, exp(-3), exp(-3)), c(0, 0, 0, exp(-3)), c(0,0,0,0)))) set.seed(22061976) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=four.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, exp(-2)), c(0, 0, exp(-2), exp(-2)), c(0, 0, 0, 2*exp(-2)), c(0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, exp(-2)), c(0, 0, exp(-2), exp(-2)), c(0, 0, 0, 2*exp(-2)), c(0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik, tol=1e-06) ## no convergence with analytic, in 1.2 or 1.3, but matches with fixed (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, exp(-2)), c(0, 0, exp(-2), exp(-2)), c(0, 0, 0, exp(-2)), c(0,0,0,0)), fixedpars=FALSE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, exp(-2)), c(0, 0, exp(-2), exp(-2)), c(0, 0, 0, exp(-2)), c(0,0,0,0)), fixedpars=FALSE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, exp(-2)), c(0, 0, exp(-3), exp(-3)), c(0, 0, 0, 2*exp(-2)), c(0,0,0,0)), fixedpars=FALSE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, exp(-2)), c(0, 0, exp(-3), exp(-3)), c(0, 0, 0, 2*exp(-2)), c(0,0,0,0)), fixedpars=FALSE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-3), 0, exp(-3)), c(0, 0, exp(-2), exp(-2)), c(0, 0, 0, 2*exp(-2)), c(0,0,0,0)), fixedpars=FALSE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-3), 0, exp(-3)), c(0, 0, exp(-2), exp(-2)), c(0, 0, 0, 2*exp(-2)), c(0,0,0,0)), fixedpars=FALSE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, exp(-2)), c(0, 0, exp(-3), exp(-3)), c(0, 0, 0, exp(-2)), c(0,0,0,0)), fixedpars=FALSE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0, exp(-2), 0, exp(-2)), c(0, 0, exp(-3), exp(-3)), c(0, 0, 0, exp(-2)), c(0,0,0,0)), fixedpars=FALSE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) }) ## FIVE STATES #1_6_11_16 test_that("5 state analytic P matrices",{ (five.q <- fixq(rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)))) set.seed(22061976) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=five.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-4),0), c(0,0,0,0,exp(-5)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-4),0), c(0,0,0,0,exp(-5)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-3),0), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-3),0), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-4),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-4),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-4),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-4),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-4),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-4),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-3)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-3)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-3),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-3),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (five.q <- fixq(rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),0,0), c(0,0,0,exp(-3),0), c(0,0,0,0,exp(-3)), c(0,0,0,0,0)))) expect_equal(MatrixExp(five.q, method="analytic"), MatrixExp(five.q, method="pade")) (five.q <- fixq(rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-2),0), c(0,0,0,0,exp(-3)), c(0,0,0,0,0)))) expect_equal(MatrixExp(five.q, method="analytic"), MatrixExp(five.q, method="pade")) (five.q <- fixq(rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),0,0), c(0,0,0,exp(-3),0), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)))) expect_equal(MatrixExp(five.q, method="analytic"), MatrixExp(five.q, method="pade")) #1_4_6_8_11_12_16 (five.q <- fixq(rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,exp(-2)), c(0,0,0,0,0)))) set.seed(22061976) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=five.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-3),0,exp(-3)), c(0,0,0,exp(-4),exp(-4)), c(0,0,0,0,exp(-5)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-3),0,exp(-3)), c(0,0,0,exp(-4),exp(-4)), c(0,0,0,0,exp(-5)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-3),exp(-3)), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-3),exp(-3)), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-3),0,exp(-3)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-3),0,exp(-3)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-3),0,exp(-3)), c(0,0,0,exp(-4),exp(-4)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-3),0,exp(-3)), c(0,0,0,exp(-4),exp(-4)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,exp(-3)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,exp(-3)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,exp(-3)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-4),exp(-4)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,exp(-3)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-4),exp(-4)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,exp(-3)), c(0,0,exp(-4),0,exp(-4)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,exp(-3)), c(0,0,exp(-4),0,exp(-4)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,exp(-3)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,exp(-3)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-3),exp(-3)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-3),exp(-3)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-3),0,exp(-3)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-3),0,exp(-3)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,exp(-3)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,exp(-3)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-2)), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,2*exp(-2)), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (five.q <- fixq(rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-3),0,exp(-1)), c(0,0,0,exp(-2),exp(-3)), c(0,0,0,0,exp(-5)), c(0,0,0,0,0)))) expect_equal(MatrixExp(five.q, method="analytic"), MatrixExp(five.q, method="pade")) (five.q <- fixq(rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-1)), c(0,0,0,exp(-3),exp(-1)), c(0,0,0,0,exp(-3)), c(0,0,0,0,0)))) expect_equal(MatrixExp(five.q, method="analytic"), MatrixExp(five.q, method="pade")) (five.q <- fixq(rbind(c(0,exp(-2),0,0,exp(-2)), c(0,0,exp(-2),0,exp(-1)), c(0,0,0,exp(-1),exp(-2)), c(0,0,0,0,exp(-4)), c(0,0,0,0,0)))) expect_equal(MatrixExp(five.q, method="analytic"), MatrixExp(five.q, method="pade")) #1_6_7_11_12 (five.q <- fixq(rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),exp(-2),0), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,0), c(0,0,0,0,0)))) set.seed(22061976) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=five.q) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),exp(-3),0), c(0,0,0,exp(-4),exp(-4)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-3),exp(-3),0), c(0,0,0,exp(-4),exp(-4)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,2*exp(-2),0,0,0), c(0,0,exp(-2),exp(-2),0), c(0,0,0,exp(-3),exp(-3)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,2*exp(-2),0,0,0), c(0,0,exp(-2),exp(-2),0), c(0,0,0,exp(-3),exp(-3)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,2*exp(-2),0,0,0), c(0,0,exp(-3),exp(-3),0), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,2*exp(-2),0,0,0), c(0,0,exp(-3),exp(-3),0), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-2),exp(-2),0), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-3),0,0,0), c(0,0,exp(-2),exp(-2),0), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (sim.mod1 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),exp(-2),0), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=TRUE)) (sim.mod2 <- msm(state ~ time, subject=subject, data=sim2.df, qmatrix = rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-2),exp(-2),0), c(0,0,0,exp(-2),exp(-2)), c(0,0,0,0,0), c(0,0,0,0,0)), fixedpars=TRUE, analyticp=FALSE)) expect_equal(sim.mod1$minus2loglik, sim.mod2$minus2loglik) (five.q <- fixq(rbind(c(0,exp(-2),0,0,0), c(0,0,exp(-1),exp(-1),0), c(0,0,0,exp(-0.5),exp(-1.5)), c(0,0,0,0,0), c(0,0,0,0,0)))) expect_equal(MatrixExp(five.q, method="analytic"), MatrixExp(five.q, method="pade")) }) msm/tests/testthat/test_weights.R0000644000176200001440000000647514636332170016725 0ustar liggesuserstest_that("subject weights",{ cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE) cav$swt <- 1 cavwt1.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, subject.weights = swt) expect_equal(cav.msm$minus2loglik, cavwt1.msm$minus2loglik) cav$swt[cav$PTNUM <= 100020] <- 1.2 cavwt2.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, subject.weights = swt) expect_true(cav.msm$minus2loglik != cavwt2.msm$minus2loglik) lik <- logLik(cav.msm, by.subject=TRUE) w <- cav$swt[!duplicated(cav$PTNUM)] expect_equivalent(cavwt2.msm$minus2loglik, - 2*sum(w*lik)) cav$swt[1] <- "bad" expect_error(msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, subject.weights = swt), "must be numeric") cav$swt <- 1 cav$swt[1:2] <- c(1.2, 1.3) expect_warning(msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, subject.weights = swt), "non-unique") cav$swt <- 1 cav$swt[2] <- NA expect_no_warning(msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, subject.weights = swt)) }) test_that("subject weights, model fitting",{ skip_on_cran() cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=FALSE) cav$swt <- 1 cavwt1.msm <- msm( state ~ years, subject=PTNUM, data = cav, # work around boot not finding this in full test() qmatrix = rbind(c(-0.5,0.25,0,0.25),c(0.166, -0.498, 0.166, 0.166), c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)), deathexact = TRUE, fixedpars=FALSE, subject.weights = swt) expect_equal(cav.msm$minus2loglik, cavwt1.msm$minus2loglik) pmatrix.msm(cavwt1.msm, ci="normal") set.seed(1) pmatrix.msm(cavwt1.msm, ci="boot", B=3) pearson.msm(cavwt1.msm, boot = TRUE, B=2) cav$swt[cav$PTNUM <= 100020] <- 1.2 cavwt2.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=FALSE, subject.weights = swt) expect_true(cav.msm$minus2loglik != cavwt2.msm$minus2loglik) cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, covariates = ~sex, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=FALSE) cav$swt <- 1 cavwt1.msm <- msm( state ~ years, subject=PTNUM, data = cav, covariates = ~sex, qmatrix = rbind(c(-0.5,0.25,0,0.25),c(0.166, -0.498, 0.166, 0.166), c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)), deathexact = TRUE, fixedpars=FALSE, subject.weights = swt) pmatrix.msm(cavwt1.msm, covariates=list(sex=0), ci="boot", B=2) }) msm/tests/testthat/test_models_hmm.r0000644000176200001440000003472414567357226017451 0ustar liggesuserscontext("Hidden Markov model likelihoods") three.q <- rbind(c(0, exp(-6), exp(-9)), c(0, 0, exp(-6)), c(0, 0, 0)) four.q <- rbind(c(0, exp(-6), 0, exp(-9)), c(0, 0, exp(-6.01), exp(-9)), c(0, 0, 0, exp(-6.02)), c(0, 0, 0, 0)) five.q <- rbind(c(0, exp(-6), 0, 0, exp(-9)), c(0, 0, exp(-6.01), 0, exp(-9)), c(0, 0, 0, exp(-6.02), exp(-6.03)), c(0, 0, 0, 0, exp(-6.04)), c(0, 0, 0, 0, 0)) hmodel3 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(999)) hmodel4 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=72.5, sd=10), hmmNorm(mean=42.5, sd=18), hmmIdent(999)) hmodel5 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=72.5, sd=10), hmmNorm(mean=62.5, sd=10), hmmNorm(mean=42.5, sd=18), hmmIdent(999)) test_that("HMM normal likelihoods: FEV data",{ (fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, fixedpars=TRUE)) expect_equal(52388.7381942858, fev3.hid$minus2loglik, tol=1e-06) (fev4.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=four.q, deathexact=4, hmodel=hmodel4, fixedpars=TRUE)) expect_equal(50223.9497625937, fev4.hid$minus2loglik, tol=1e-06) (fev5.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=five.q, deathexact=5, hmodel=hmodel5, fixedpars=TRUE)) expect_equal(49937.9840668066, fev5.hid$minus2loglik, tol=1e-06) }) test_that("HMM with obstrue",{ fev$obstrue <- as.numeric(fev$fev==999) fev$fev2 <- fev$fev; fev$fev2[fev$obstrue==1] <- 3 hmodel32 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(3)) (fev3.hid <- msm(fev2 ~ days, subject=ptnum, obstrue=obstrue, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel32, fixedpars=TRUE)) expect_equal(52388.7381942858, fev3.hid$minus2loglik, tol=1e-06) fev$obstrue <- "foo" expect_error(fev3.hid <- msm(fev2 ~ days, subject=ptnum, obstrue=obstrue, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel32, fixedpars=TRUE), "obstrue should be logical or numeric") fev$obstrue <- as.numeric(fev$fev==999); fev$obstrue[1] <- 10 expect_error(fev3.hid <- msm(fev2 ~ days, subject=ptnum, obstrue=obstrue, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel32, fixedpars=TRUE), "Interpreting \"obstrue\" as containing true states, but it contains values not in 0,1,...,3") ## can supply true state in obstrue fev$obstrue <- as.numeric(fev$fev==999); fev$obstrue[fev$obstrue==1] <- 3 fev3.hid <- msm(fev2 ~ days, subject=ptnum, obstrue=obstrue, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel32, fixedpars=TRUE) expect_equal(52388.7381942858, fev3.hid$minus2loglik, tol=1e-06) }) test_that("HMM normal likelihoods: FEV data: covariate on outcome",{ (fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(acute = c(1,1)), fixedpars=TRUE, center=FALSE)) expect_equal(52134.2372359988, fev3.hid$minus2loglik, tol=1e-06) (fev4.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=four.q, deathexact=4, hmodel=hmodel4, hcovariates=list(~acute, ~acute, ~acute, NULL), hcovinits = list(-8, -8, -8, NULL), hconstraint = list(acute = c(1,1,1)), fixedpars=TRUE, center=FALSE)) expect_equal(50095.8606697016, fev4.hid$minus2loglik, tol=1e-06) (fev5.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=five.q, deathexact=5, hmodel=hmodel5, hcovariates=list(~acute, ~acute, ~acute, ~acute, NULL), hcovinits = list(-8, -8, -8, -8, NULL), hconstraint = list(acute = c(1,1,1,1)), fixedpars=TRUE, center=FALSE)) expect_equal(49839.1627881087, fev5.hid$minus2loglik, tol=1e-06) ## Viterbi vit <- viterbi.msm(fev3.hid) expect_equal(vit$fitted[1:10], rep(1,10)) if (0){ # substitute() as used in viterbi.msm doesn't work within testthat, # so run this test by hand datsub <- fev[fev[,"ptnum"]==1,,drop=FALSE] vit2 <- viterbi.msm(fev3.hid, newdata=datsub) expect_equal(vit$fitted[1:10], vit2$fitted[1:10]) expect_equal(vit$pstate.1[1:10], vit2$pstate.1[1:10]) } }) context("Hidden Markov model error handling") test_that("errors in hmodel",{ ## hmodel with wrong named parameters expect_error( hmodel3 <- list(hmmMETNorm(mean=100, sd=16, splat=8, lower=80, upper=Inf, meanerr=0), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=80, meanerr=0), hmmIdent(999)), "unused argument \\(splat" ) ## hmodel with extra unnamed parameter expect_error( hmodel3 <- list(hmmMETNorm(mean=100, sd=16, sderr=8, lower=80, upper=Inf, meanerr=0), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=80, meanerr=0), hmmIdent(999, 3)), "unused argument \\(3" ) ## hmodel with parameters unnamed, but correct number - OK. hmodel.OK <- list(hmmMETNorm(100, 16, 8, 80, Inf, 0), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=80, meanerr=0), hmmIdent(999)) ## hmodel with too few parameters (named or unnamed) expect_error( hmodel3 <- list(hmmMETNorm(100, 16, 80, Inf), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=80, meanerr=0), hmmIdent(999)), "Parameter sderr for hmmMETNorm not supplied" ) ### Initial values for certain parameters in wrong ranges. hmodel3 <- list(hmmMETNorm(mean=100, sd=-16, sderr=8, lower=80, upper=Inf, meanerr=0), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=80, meanerr=0), hmmIdent(999)) expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, fixedpars=1:9), "Initial value -16 of parameter \"sd\" outside allowed range") expect_error( hmodel3 <- list(hmmMETNorm(mean=100, sd=16, sderr="splat", lower=80, upper=Inf, meanerr=0), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=80, meanerr=0), hmmIdent(999)), "Expected numeric values" ) expect_error( hmodel3 <- list( hmmBinom(size=0.1, prob=0.5), hmmCat(prob=c(0.1, 0.8, 0.1, 0)), hmmCat(prob=c(0, 0.1, 0.9, 0)), hmmIdent()), "Value of size should be integer") }) test_that("error handling in HMM fits",{ hmodel3 <- list(hmmMETNorm(mean=100, sd=16, sderr=8, lower=80, upper=Inf, meanerr=0), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=80, meanerr=0), hmmIdent(999)) hmodel4 <- list(hmmMETNorm(mean=100, sd=16, sderr=8, lower=80, upper=Inf, meanerr=0), hmmMEUnif(sderr=8, lower=65, upper=80, meanerr=0), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=65, meanerr=0), hmmIdent(999)) hmodel5 <- list(hmmMETNorm(mean=100, sd=16, sderr=8, lower=80, upper=Inf, meanerr=0), hmmMEUnif(sderr=8, lower=65, upper=80, meanerr=0), hmmMEUnif(sderr=8, lower=50, upper=65, meanerr=0), hmmMETNorm(mean=42, sd=18, sderr=8, lower=0, upper=50, meanerr=0), hmmIdent(999)) ### Wrong number of states in the hmodel, versus the qmatrix. expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel4, fixedpars=1:9), "hmodel of length 4") ### Rubbish in hmodel list hmodel.rubbish <- list("should be a ", " list of ", "hmodel objects") expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel.rubbish, fixedpars=1:9), "hmodel should be a list of HMM distribution objects") ## Death state wrong (not HMM-specific error, but no harm putting it in this file anyway) expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=10, hmodel=hmodel3, fixedpars=1:9), "Exact death states indicator contains states not in 1, 2, 3") ## Covariate list of wrong length expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, hcovariates=list(~acute, ~acute), hcovinits = list(-8, -8, NULL),), "hcovariates of length 2, expected 3") ## Covariate list has rubbish in it expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, hcovariates=list("should be formulae", "rubbish", NULL), hcovinits = list(-8, -8, NULL)), "hcovariates should be a list of formulae or NULLs") ## Covariates not in the data expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, hcovariates=list(~acute, ~nonexistent, NULL), hcovinits = list(-8, -8, NULL)), "object .+ not found") ## Covariate inits of wrong length (just warning, ignores) expect_warning(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, -8), fixedpars=TRUE), "Initial values for hidden covariate effects do not match numbers of covariates") ## Rubbish in hcovinits (just warning, ignores) expect_warning(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3,hcovariates=list(~acute, ~acute, NULL), hcovinits = list("fooo", -8, NULL), fixedpars=TRUE), "hcovinits should be numeric") ## hconstraint has unknown parameters expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(nonexistent = c(1,1), acute = c(1,1))), "parameter .+ in hconstraint unknown") ## hconstraint has rubbish in (note character vectors are allowed) expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list("rubbish", acute = c(1,1))), "parameter .+ in hconstraint unknown") expect_error(fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(sderr=c("wrong length"), acute = c(1,1))), "constraint for \"sderr\" of length 1, should be 2") }) test_that("HMM normal model fit",{ three.q <- rbind(c(0, exp(-6), exp(-9)), c(0, 0, exp(-6)), c(0, 0, 0)) hmodel1 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(999)) fev1.msm <- msm(fev ~ days, subject=ptnum, data=fev[1:500,], qmatrix=three.q, death=3, hmodel=hmodel1, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(acute = c(1,1)), center=FALSE) print(fev1.msm) expect_equal(4269.77165605886, fev1.msm$minus2loglik, tol=1e-06) fev1.msm <- msm(fev ~ days, subject=ptnum, data=fev[1:1000,], qmatrix=three.q, death=3, hmodel=hmodel1, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(acute = c(1,1)), center=FALSE, hranges = list(mean=list(lower=c(60,50),upper=c(110,80)), sd=list(lower=c(11,13),upper=c(20,20)))) expect_gt(fev1.msm$hmodel$pars[1], 60) expect_lt(fev1.msm$hmodel$pars[1], 110) }) test_that("HMM categorical model fit",{ skip_on_cran() misccov.msm <- msm(state ~ years, subject = PTNUM, data = cav[1:1000,], qmatrix = oneway4.q, ematrix=ematrix, death = 4, misccovariates = ~dage + sex, fixedpars=c(11, 17)) misccovnew.msm <- msm(state ~ years, subject = PTNUM, data = cav[1:1000,], qmatrix = oneway4.q, death = 4, fixedpars=c(11,17), # sex on state 2|1, 2|3 hmodel=list( hmmCat(prob=c(0.9, 0.1, 0, 0)), hmmCat(prob=c(0.1, 0.8, 0.1, 0)), hmmCat(prob=c(0, 0.1, 0.9, 0)), hmmIdent()), hcovariates=list(~dage + sex, ~dage + sex, ~dage + sex, ~1) ) print(misccovnew.msm) expect_equal(misccov.msm$minus2loglik, misccovnew.msm$minus2loglik) }) test_that("initcovariates",{ expect_error({ (fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, fixedpars=TRUE, initcovariates = ~acute)) (fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, fixedpars=TRUE, initprobs = c(0.9, 0.1, 0.1), est.initprobs = TRUE, initcovariates = ~acute, initcovinits = list(acute=c(0.1,0.1)))) }, NA) }) test_that("HMMs with one observation for a subject", { hmodel1 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(999)) fevno1 <- fev fevno1 <- fevno1[fevno1$ptnum != 1,] fev1 <- fev fev1 <- fev1[!(fev1$ptnum==1 & fev1$days>191), ] head(fev1) head(fevno1) fev1.msm <- msm(fev ~ days, subject=ptnum, data=fev1, qmatrix=three.q, death=3, hmodel=hmodel1, fixedpars=TRUE) fev1.msm fevno1.msm <- msm(fev ~ days, subject=ptnum, data=fevno1, qmatrix=three.q, death=3, hmodel=hmodel1, fixedpars=TRUE) ## Check gives same result as inserting a uninformative censored state ## at the second obs censrow <- data.frame(ptnum=1, days=200, fev=-99, acute=0) fevcens <- rbind(fev1[1,], censrow, fev1[-1,]) fevcens$obstrue <- NA fevcens$obstrue[2] <- 1 # watch this syntax for censor+hmm! See help(msm) fevcens.msm <- msm(fev ~ days, subject=ptnum, data=fevcens, qmatrix=three.q, death=3, hmodel=hmodel1, censor=-99, censor.states = 1:3, obstrue = obstrue, fixedpars=TRUE) fevcens.msm expect_equal(logLik.msm(fev1.msm), logLik.msm(fevcens.msm)) expect_true(logLik.msm(fevno1.msm) != logLik.msm(fevcens.msm)) }) msm/tests/testthat/test_models.r0000644000176200001440000014506014654465413016577 0ustar liggesuserscontext("msm simple model likelihoods") test_that("simple model, exact death times",{ cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, method="BFGS", control=list(trace=5, REPORT=1)) print(cav.msm) printold.msm(cav.msm) expect_equal(4908.81676837903, cav.msm$minus2loglik) }) test_that("simple model, not exact death times",{ cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = FALSE, fixedpars=TRUE) expect_equal(4833.00640639644, cav.msm$minus2loglik) }) test_that("simple model, covariates",{ cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, covariates = ~ sex, covinits = list(sex=rep(0.01, 7))) expect_equal(4909.17147259115, cav.msm$minus2loglik) }) test_that("autogenerated inits reproduce crudeinits",{ cinits <- crudeinits.msm(state ~ years, PTNUM, data=cav, qmatrix=twoway4.q) expect_equal(msm( state ~ years, subject=PTNUM, data = cav, qmatrix = cinits, deathexact = TRUE, fixedpars=TRUE)$minus2loglik, msm( state ~ years, subject=PTNUM, data = cav, qmatrix=twoway4.i, gen.inits=TRUE, deathexact = TRUE, fixedpars=TRUE)$minus2loglik) }) test_that("data as global variables",{ state.g <- cav$state; time.g <- cav$years; subj.g <- cav$PTNUM cav.msm <- msm(state.g ~ time.g, subject=subj.g, qmatrix = twoway4.i, gen.inits=TRUE, fixedpars=TRUE) expect_equal(4119.9736299032, cav.msm$minus2loglik) }) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), control=list(fnscale=1)) test_that("psor model: covariates, constraints",{ print(psor.msm) printold.msm(psor.msm) expect_equal(1114.89946121717, psor.msm$minus2loglik, tol=1e-06) expect_equal(0.0959350004999946, psor.msm$Qmatrices$baseline[1,2], tol=1e-06) expect_equal(exp(psor.msm$Qmatrices$logbaseline[c(5,10,15)]), psor.msm$Qmatrices$baseline[c(5,10,15)], tol=1e-06) }) test_that("psor model: transition-specific covariates",{ psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = list("2-3"=~ollwsdrt, "3-4"=~hieffusn), control=list(fnscale=1)) expect_equal(hazard.msm(psor.msm)$ollwsdrt["State 1 - State 2","HR"], 1) expect_equal(hazard.msm(psor.msm)$hieffusn["State 2 - State 3","HR"], 1) expect_error(msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = list("meep"=~ollwsdrt, "3-4"=~hieffusn), control=list(fnscale=1)), "not in format \"number-number\"") }) test_that("psor model: transition-specific covariates with pci",{ psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = list("2-3"=~ollwsdrt, "3-4"=~hieffusn), pci = 10, fixedpars=7:8, control=list(fnscale=1)) h <- hazard.msm(psor.msm) expect_equal(h$ollwsdrt["State 1 - State 2","HR"], 1) expect_equal(h$hieffusn["State 1 - State 2","HR"], 1) expect_true(!isTRUE(all.equal(h$"timeperiod[10,Inf)"["State 1 - State 2","HR"], 1))) expect_equal(h$"timeperiod[10,Inf)"["State 2 - State 3","HR"], 1) expect_equal(h$"timeperiod[10,Inf)"["State 3 - State 4","HR"], 1) }) psor.nocen.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), center=FALSE) test_that("no covariate centering",{ expect_equal(exp(psor.nocen.msm$Qmatrices$logbaseline[c(5,10,15)]), psor.nocen.msm$Qmatrices$baseline[c(5,10,15)], tol=1e-06) }) test_that("gen.inits with missing values for state / time",{ psor2 <- psor; psor2$ptnum[13:14] <- psor2$months[7:8] <- psor2$state[7:8] <- NA psor2.msm <- msm(state ~ months, subject=ptnum, data=psor2, gen.inits=TRUE, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), fixedpars=TRUE) expect_equal(1179.95441284169, psor2.msm$minus2loglik, tol=1e-06) }) test_that("exact transition times using exacttimes",{ msmtest5 <- msm(state ~ time, qmatrix = fiveq, subject = ptnum, data = bos, exacttimes=TRUE, fixedpars=TRUE) expect_equal(3057.85781916437, msmtest5$minus2loglik, tol=1e-06) }) test_that("exact transition times using obstype vector of all 2",{ msmtest5 <- msm(state ~ time, qmatrix = fiveq, subject = ptnum, data = bos, obstype=rep(2, nrow(bos)), fixedpars=TRUE) expect_equal(3057.85781916437, msmtest5$minus2loglik, tol=1e-06) }) test_that("exact transition times with death, should be same",{ expect_warning(msmtested <- msm(state ~ time, qmatrix = fiveq, subject = ptnum, data = bos, deathexact=5, obstype=rep(2, nrow(bos)), exacttimes=TRUE, fixedpars=TRUE), "Ignoring death") expect_equal(3057.85781916437, msmtested$minus2loglik, tol=1e-06) (msmtest5 <- msm(state ~ time, qmatrix = fiveq, subject = ptnum, data = bos, deathexact=5, obstype=rep(2, nrow(bos)), fixedpars=TRUE)) # no warning, inconsistently expect_equal(3057.85781916437, msmtest5$minus2loglik, tol=1e-06) }) cav$statefac <- factor(cav$state) cav$statefac2 <- factor(cav$state, labels=c("none","mild","severe","death")) test_that("factors as states, death",{ cav.msm <- msm( statefac ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, method="BFGS", control=list(trace=5, REPORT=1)) expect_equal(4908.81676837903, cav.msm$minus2loglik) expect_error(msm( statefac2 ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE), "state variable should be numeric or a factor with ordinal numbers as levels") }) test_that("factor covariates with factor() in formula",{ ## Should be no need for users to do this. factors should already be identified as such in the data frame expect_warning(cavfaccov.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ factor(pdiag), covinits=list(sex=rep(0.1,7)), fixedpars=TRUE), "covariate .+ unknown") expect_equal(4793.30238295565, cavfaccov.msm$minus2loglik, tol=1e-06) cavfaccov.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ factor(pdiag), covinits=list("factor(pdiag)Hyper"=rep(0.1,7)), fixedpars=TRUE) expect_equal(4793.20440566637, cavfaccov.msm$minus2loglik, tol=1e-06) }) test_that("factors as global variables",{ state.g <- cav$state; time.g <- cav$years; subj.g <- cav$PTNUM; pdiag.g <- factor(cav$pdiag) cavfaccov.msm <- msm(state.g ~ time.g, subject=subj.g, qmatrix = twoway4.q, covariates = ~ pdiag.g, fixedpars=TRUE) expect_equal(4793.30238295565, cavfaccov.msm$minus2loglik, tol=1e-06) }) test_that("factor covariates using existing factors: inits are given to contrasts ",{ ## Warnings could be more informative here expect_warning(cavfaccov.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ pdiag, covinits=list(pdiag=rep(0.1,7)), fixedpars=TRUE), "covariate .+ unknown") expect_equal(4793.30238295565, cavfaccov.msm$minus2loglik, tol=1e-06) expect_warning(cavfaccov.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ pdiag, covinits=list(pdiagNonexistentlevel=rep(0.1,7)), fixedpars=TRUE), "covariate .+ unknown") expect_equal(4793.30238295565, cavfaccov.msm$minus2loglik, tol=1e-06) cavfaccov.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ pdiag, covinits=list(pdiagHyper=rep(0.1,7)), fixedpars=TRUE) expect_equal(4793.20440566637, cavfaccov.msm$minus2loglik, tol=1e-06) cavfaccov.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ pdiag, covinits=list(pdiagHyper=rep(0.1,7),pdiagIDC=rep(0.1,7),pdiagIHD=rep(0.1,7),pdiagOther=rep(0.1,7),pdiagRestr=rep(0.1,7)), fixedpars=TRUE) # OK expect_equal(4793.13035886505, cavfaccov.msm$minus2loglik, tol=1e-06) }) context("censored states") test_that("censored states: final state censored",{ cavcens.msm <- msm(state ~ years, subject=PTNUM, data=cav.cens, qmatrix=twoway4.q, censor=99, fixedpars=TRUE) expect_equal(4724.26606344485, cavcens.msm$minus2loglik, tol=1e-06) v <- viterbi.msm(cavcens.msm) expect_equal(v$observed[v$observed<10], v$fitted[v$observed<10]) expect_equal(v$fitted[v$observed==99][1], 3) }) test_that("two kinds of censoring",{ cavcens2.msm <- msm(state ~ years, subject=PTNUM, data=cav.cens2, qmatrix=twoway4.q, censor=c(99, 999), censor.states=list(c(1,2,3), c(2,3)), fixedpars=TRUE) expect_equal(4678.23348518727, cavcens2.msm$minus2loglik, tol=1e-06) v <- viterbi.msm(cavcens2.msm) expect_equal(v$observed[v$observed<10], v$fitted[v$observed<10]) expect_equal(v$fitted[v$observed==99][1], 3) }) test_that("intermediate state censored",{ cavcens3.msm <- msm(state ~ years, subject=PTNUM, data=cav.cens3, qmatrix=twoway4.q, censor=c(99, 999), censor.states=list(c(2,3), c(1,2,3)), fixedpars=TRUE) expect_equal(4680.66073438518, cavcens3.msm$minus2loglik, tol=1e-06) v <- viterbi.msm(cavcens3.msm) expect_equal(v$observed[v$observed<10], v$fitted[v$observed<10]) expect_true(all(v$fitted[v$observed==99] %in% 2:3)) expect_true(all(v$fitted[v$observed==999] %in% 1:3)) }) test_that("first state censored",{ cav.cens4 <- cav cav.cens4$state[c(1,8,12,22)] <- 99 cavcens4.msm <- msm(state ~ years, subject=PTNUM, data=cav.cens4, qmatrix=twoway4.q, censor=c(99), censor.states=list(c(2,3)), fixedpars=TRUE) expect_equal(4846.06045097812, cavcens4.msm$minus2loglik) v <- viterbi.msm(cavcens4.msm) expect_true(all(v$fitted[v$observed==99] %in% 2:3)) }) test_that("piecewise constant intensities with pci",{ cav5.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, pci = c(5), covinits = list("timeperiod[5,Inf)"=rep(0.01,7)), ) expect_equal(4906.01423796805, cav5.msm$minus2loglik, tol=1e-06) cav10.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, pci = c(5,10), fixedpars=TRUE, covinits = list("timeperiod[5,10)"=rep(0.01,7), "timeperiod[10,Inf)"=rep(0.01,7)), ) expect_equal(4905.61646158639, cav10.msm$minus2loglik, tol=1e-06) }) test_that("piecewise constant intensities with pci, cut points outside data",{ ## Make sure works for pci outside time range, with warning expect_warning(cav5.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, pci = c(-1,5,50,60), covinits = list("timeperiod[5,Inf)"=rep(0.01,7))), "cut point .+ less than") expect_warning(cav.pci.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE, pci = c(-1,50,60))) cav.msm <- msm( state ~ years, subject=PTNUM, data = cav,qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE) expect_equal(cav.pci.msm$minus2loglik, cav.msm$minus2loglik) # degrades to time-homogeneous if all cuts outside data }) suppressWarnings(RNGversion("3.5.0")) set.seed(22061976) cav$pdiag3 <- cav$pdiag cav$pdiag3[!cav$pdiag %in% c("IDC","IHD")] <- "Other" cav$pdiag3 <- factor(cav$pdiag3) subs <- cav$PTNUM %in% sample(unique(cav$PTNUM), 50) cavsub <- subset(cav, subs) cavsub$maxtime <- tapply(cavsub$years, cavsub$PTNUM, max)[as.character(cavsub$PTNUM)] cavsub.extra <- cavsub[cavsub$years==0 & cavsub$maxtime >= 5,] cavsub.extra$years <- 5 cavsub.extra$state <- 99 cavsub.extra10 <- cavsub[cavsub$years==0 & cavsub$maxtime >= 10,] cavsub.extra10$years <- 10 cavsub.extra10$state <- 999 cavsub2 <- rbind(cavsub, cavsub.extra, cavsub.extra10) cavsub2 <- cavsub2[order(cavsub2$PTNUM, cavsub2$years),] cavsub2$after5 <- ifelse(cavsub2$years>=5 & cavsub2$years<10, 1, 0) cavsub2$after10 <- ifelse(cavsub2$years>=10, 1, 0) cavsub2$after510 <- as.numeric(cavsub2$after5 | cavsub2$after10) test_that("piecewise constant intensities with pci, with other covariates",{ cav5cov.msm <- msm( state ~ years, subject=PTNUM, data = cavsub, qmatrix = twoway4.q, covariates = ~ pdiag3 + sex, deathexact = TRUE, pci = c(5,10), fixedpars=TRUE, covinits = list("timeperiod[5,10)"=rep(0.01,7), "timeperiod[10,Inf)"=rep(0.01,7), pdiag3IHD=rep(0.01,7), pdiag3Other=rep(0.01,7)), ) expect_equal(448.122802051545, cav5cov.msm$minus2loglik, tol=1e-06) cav5cov.msm <- msm( state ~ years, subject=PTNUM, data = cavsub2, qmatrix = twoway4.q, deathexact = TRUE, covariates = ~ pdiag3 + sex + after5 + after10, censor=c(99,999), censor.states=list(1:4,1:4), covinits = list(after5=rep(0.01,7), after10=rep(0.01,7), pdiag3IHD=rep(0.01,7), pdiag3Other=rep(0.01,7)), fixedpars=TRUE ) expect_equal(448.122802051545, cav5cov.msm$minus2loglik, tol=1e-06) }) test_that("piecewise constant intensities with pci, with uncentered covariates",{ cav5cov.msm <- msm( state ~ years, subject=PTNUM, data = cavsub, qmatrix = twoway4.q, covariates = ~ pdiag3 + sex, deathexact = TRUE, pci = c(5,10), fixedpars=TRUE, center=FALSE, covinits = list("timeperiod[5,10)"=rep(0.01,7), "timeperiod[10,Inf)"=rep(0.01,7), pdiag3IHD=rep(0.01,7), pdiag3Other=rep(0.01,7)), ) expect_equal(449.691983558378, cav5cov.msm$minus2loglik, tol=1e-06) cav5cov.msm <- msm( state ~ years, subject=PTNUM, data = cavsub2, qmatrix = twoway4.q, deathexact = TRUE, covariates = ~ pdiag3 + sex + after5 + after10, censor=c(99,999), censor.states=list(1:4,1:4), center=FALSE, covinits = list(after5=rep(0.01,7), after10=rep(0.01,7), pdiag3IHD=rep(0.01,7), pdiag3Other=rep(0.01,7)), fixedpars=TRUE ) expect_equal(449.691983558378, cav5cov.msm$minus2loglik, tol=1e-06) }) test_that("piecewise constant intensities with pci, with other censored states",{ cav.cens <- cav cav.cens$state[cav.cens$state==4][1:50] <- 99 cav5cens.msm <- msm(state ~ years, subject=PTNUM, data = cav.cens, qmatrix = twoway4.q, deathexact = TRUE, censor=99, pci = 5, covinits=list("timeperiod[5,Inf)"=rep(0.02,7)), fixedpars=TRUE, method="BFGS", control=list(trace=5, REPORT=1)) expect_equal(4754.41981265159, cav5cens.msm$minus2loglik, tol=1e-06) }) test_that("piecewise constant intensities with covariates in HMMs",{ misccov.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars=TRUE, pci = 5, covinits=list("timeperiod[5,Inf)"=rep(0.0001,5)), misccovariates = ~dage + sex, misccovinits = list(dage=c(0.01,0.02,0.03,0.04), sex=c(-0.013,-0.014,-0.015,-0.016))) expect_equal(4306.29865288466, misccov.msm$minus2loglik, tol=1e-06) }) context("output functions") test_that("qmatrix.msm for psor model, defaults",{ expect_equal(c(-0.0959350004999946, 0, 0, 0, 0.0959350004999946, -0.164306508892574, 0, 0, 0, 0.164306508892574, -0.254382807485639, 0, 0, 0, 0.254382807485639, 0), as.numeric(qmatrix.msm(psor.msm)$estimates), tol=1e-03) expect_equal(c(0.0115942726096754, 0, 0, 0, 0.0115942726096754, 0.0196169975000406, 0, 0, 0, 0.0196169975000406, 0.0375066077515386, 0, 0, 0, 0.0375066077515386, 0), as.numeric(qmatrix.msm(psor.msm)$SE), tol=1e-03) expect_error(qmatrix.msm(psor.msm, ci="normal", cl=-1), "expected cl") expect_equivalent(qmatrix.msm(psor.msm, sojourn=TRUE)$sojourn[1:3], sojourn.msm(psor.msm)$estimates) qmatrix.msm(psor.msm, ci="normal", B=2) qmatrix.msm(psor.msm, sojourn=TRUE, ci="normal", B=2) expect_error(qmatrix.msm("foo"), "expected .+ msm model") expect_error(qmatrix.msm(psor.msm, covariates="foo"), "covariates argument must be") expect_warning(qmatrix.msm(psor.msm, covariates=list(foo=1)), "ignoring") }) test_that("qmatrix.msm defaults to Qmatrices in object",{ expect_equivalent(psor.msm$Qmatrices$baseline, unclass(qmatrix.msm(psor.msm, covariates="mean", ci="none"))) expect_equivalent(psor.nocen.msm$Qmatrices$baseline, unclass(qmatrix.msm(psor.nocen.msm, covariates=0, ci="none"))) }) test_that("qmatrix.msm with supplied covariates",{ qmat <- qmatrix.msm(psor.msm, covariates=list(ollwsdrt=0.1, hieffusn=0.4)) expect_equal(c(-0.121430585652200, 0, 0, 0, 0.121430585652200, -0.207972362475868, 0, 0, 0, 0.207972362475868, -0.257535341208494, 0, 0, 0, 0.257535341208494, 0), as.numeric(qmat$estimates), tol=1e-03) expect_equal(c(0.0162156605802465, 0, 0, 0, 0.0162156605802465, 0.0266727053124233, 0, 0, 0, 0.0266727053124233, 0.0364321127089265, 0, 0, 0, 0.0364321127089265, 0), as.numeric(qmat$SE), tol=1e-04) expect_warning(qmatrix.msm(psor.msm, covariates=list(hieffusn=0.1, foo=0.4)), "Covariate .+ unknown") }) test_that("qmatrix.msm with non-default confidence limits",{ qmat <- qmatrix.msm(psor.msm, covariates=list(ollwsdrt=0.1, hieffusn=0.4), cl=0.99) expect_equal(c(-0.171282667596986, 0, 0, 0, 0.0860880282792585, -0.289385121267802, 0, 0, 0, 0.149463467106753, -0.370756460718086, 0, 0, 0, 0.178889538008097, 0), as.numeric(qmat$L), tol=1e-04) }) test_that("qmatrix.msm sojourn component",{ soj <- qmatrix.msm(psor.msm, covariates=list(ollwsdrt=0.1, hieffusn=0.4), sojourn=TRUE)$sojourn expect_equal(c(8.23515751512713, 4.80833120370037, 3.88296221911705, Inf), as.numeric(soj), tol=1e-03) expect_equal(as.numeric(soj[1:3]), sojourn.msm(psor.msm, covariates=list(ollwsdrt=0.1, hieffusn=0.4))[,"estimates"]) }) test_that("qmatrix.msm bug for user-supplied covariates fixed in 1.1.3",{ expect_equal(qmatrix.msm(psor.nocen.msm, covariates=0)$SE[1,2], qmatrix.msm(psor.nocen.msm, covariates=list(hieffusn=0, ollwsdrt=0))$SE[1,2]) expect_equal(qmatrix.msm(psor.nocen.msm, covariates=0)$SE[1,1], qmatrix.msm(psor.nocen.msm, covariates=list(hieffusn=0, ollwsdrt=0))$SE[1,1]) expect_equal(qmatrix.msm(psor.nocen.msm, covariates=0)$L[1,2], qmatrix.msm(psor.nocen.msm, covariates=list(hieffusn=0, ollwsdrt=0))$L[1,2]) expect_equal(qmatrix.msm(psor.nocen.msm, covariates=0)$L[1,2], qmatrix.msm(psor.nocen.msm, covariates=list(hieffusn=0))$L[1,2]) cm <- psor.nocen.msm$qcmodel$covmeans expect_equal(qmatrix.msm(psor.nocen.msm, covariates="mean")$SE[1,2], qmatrix.msm(psor.nocen.msm, covariates=list(hieffusn=cm["hieffusn"], ollwsdrt=cm["ollwsdrt"]))$SE[1,2]) }) test_that("qmatrix.msm: unspecified covariate values default to zero",{ expect_equivalent(psor.nocen.msm$Qmatrices$baseline, unclass(qmatrix.msm(psor.nocen.msm, covariates=list(ollwsdrt=0), ci="none"))) # missing covs default to zero expect_equal(qmatrix.msm(psor.msm, covariates=list(hieffusn=0)), qmatrix.msm(psor.msm, covariates=list(ollwsdrt=0, hieffusn=0))) expect_equal(qmatrix.msm(psor.nocen.msm, covariates=list(hieffusn=0)), qmatrix.msm(psor.nocen.msm, covariates=list(ollwsdrt=0, hieffusn=0))) }) test_that("sojourn.msm",{ expect_equal(psor.msm$sojourn, sojourn.msm(psor.msm, covariates="mean")) expect_equal(psor.nocen.msm$sojourn, sojourn.msm(psor.nocen.msm, covariates=0)) soj <- sojourn.msm(psor.msm, covariates=list(ollwsdrt=0.1, hieffusn=0.4)) expect_equal(c(8.23515751512713, 4.80833120370037, 3.88296221911705, 1.09971073904434, 0.616674252838334, 0.549301375677405, 6.33875136203292, 3.73961380505919, 2.94271599303942, 10.6989240349703, 6.18246967994404, 5.12363260020806), as.numeric(unlist(soj)), tol=1e-04) soj <- sojourn.msm(psor.msm, covariates=list(ollwsdrt=0.1, hieffusn=0.4), cl=0.99) expect_equal(5.83830234564607, soj[1,"L"], tol=1e-04) expect_error(sojourn.msm("foo"), "expected .+ msm model") expect_error(sojourn.msm(psor.msm, covariates="foo"),"covariates argument must be") expect_warning(sojourn.msm(psor.msm, covariates=list(foo=1)), "ignoring") }) test_that("pmatrix.msm",{ expect_equal(0.149287738928777, pmatrix.msm(psor.msm, ci="none", t=10)[1,3], tol=1e-04) p <- pmatrix.msm(psor.msm, t=10, covariates=list(ollwsdrt=0.1, hieffusn=0.2)) expect_equal(0.18196160265907, p[1,3], tol=1e-04) set.seed(22061976); expect_equal(0.12, pmatrix.msm(psor.msm, ci="normal", B=3)$L[2,3], tol=1e-01, scale=1) expect_error(pmatrix.msm("foo"), "expected .+ msm model") expect_error(pmatrix.msm(psor.msm, t="foo"), "must be a positive number") expect_error(pmatrix.msm(psor.msm, -9), "must be a positive number") expect_equivalent(unclass(pmatrix.msm(psor.msm, 0)), diag(4)) expect_warning(pmatrix.msm(psor.msm, 1, covariates=list(foo=1)), "ignoring") }) test_that("pnext.msm",{ expect_equal(pnext.msm(psor.msm, ci="none")$estimate[1,2], 1) expect_equal(pnext.msm(psor.msm, ci="delta")$estimate[1,2], 1) expect_equal(pnext.msm(psor.msm, ci="normal", B=2)$estimate[1,2], 1) }) test_that("qratio.msm",{ q <- qratio.msm(psor.msm, c(1,2), c(2,3)) expect_equal(c(0.583878474075081, 0.0996029045389022, 0.417943274168735, 0.815694601537263), as.numeric(q), tol=1e-04) q <- qratio.msm(psor.msm, c(1,2), c(2,3), cl=0.99) expect_equal(0.376262194364283, as.numeric(q["L"]), tol=1e-04) q <- qratio.msm(psor.msm, c(1,1), c(2,3)) expect_equal(c(-0.583878474075081, 0.0996029045389022, -0.815694601537263, -0.417943274168735), as.numeric(q), tol=1e-04) q <- qratio.msm(psor.msm, c(2,2), c(2,3)) expect_equivalent(c(-1,0,-1,-1), q) qratio.msm(psor.msm, c(1,2), c(2,3), ci="norm", B=2) expect_error(qratio.msm("foo")) expect_error(qratio.msm(psor.msm, "foo")) expect_error(qratio.msm(psor.msm, c(1,8), c(1,0))) expect_error(qratio.msm(psor.msm, c(1,2), c(1,0))) expect_error(qratio.msm(psor.msm, c(1,2), c(2,3), cl="foo")) expect_error(qratio.msm(psor.msm, c(1,2), c(2,3), cl=2), "expected cl in") qq <- qratio.msm(psor.msm, c(1,2), c(2,2)) QQ <- qmatrix.msm(psor.msm) expect_equal(qq[["estimate"]], (QQ[1,2]/QQ[2,2])[["estimate"]]) qq <- qratio.msm(psor.msm, c(1,1), c(2,2)) QQ <- qmatrix.msm(psor.msm) expect_equal(qq[["estimate"]], (QQ[1,1]/QQ[2,2])[["estimate"]]) }) test_that("coef.msm",{ co <- coef.msm(psor.msm) expect_equal(0.498319866154661, co$hieffusn[1,2], tol=1e-04) expect_error(coef.msm("foo")) }) test_that("hazard.msm",{ haz <- hazard.msm(psor.msm) expect_equal(0.385347226135311, haz$ollwsdrt[1,2], tol=1e-04) expect_equal(0.385347226135311, haz$ollwsdrt[2,2], tol=1e-04) expect_equal(2.35928404626333, haz$hieffusn[1,3], tol=1e-04) expect_equal(2.35928404626333, haz$hieffusn[3,3], tol=1e-04) haz <- hazard.msm(psor.msm, hazard.scale=2) expect_equal(0.148492484690178, haz$ollwsdrt[1,2], tol=1e-04) expect_equal(haz$ollwsdrt[1,2], haz$ollwsdrt[2,2]) expect_equal(haz$hieffusn[1,3], haz$hieffusn[3,3]) haz <- hazard.msm(psor.msm, hazard.scale=c(1,2)) expect_equal(0.385347226135311, haz$ollwsdrt[1,2], tol=1e-04) expect_equal(haz$ollwsdrt[1,2], haz$ollwsdrt[2,2], tol=1e-04) expect_equal(haz$hieffusn[1,3], haz$hieffusn[3,3]) expect_error(hazard.msm("foo")) expect_error(hazard.msm(psor.msm, hazard.scale="foo")) expect_error(hazard.msm(psor.msm, hazard.scale=c(1,2,3)), "hazard.scale of length") }) test_that("transient.msm and absorbing.msm",{ expect_equivalent(c(1,2,3), transient.msm(psor.msm)) expect_equivalent(4, absorbing.msm(psor.msm)) expect_error(transient.msm("foo")) expect_error(absorbing.msm("foo")) expect_error(transient.msm(qmatrix="foo")) expect_error(absorbing.msm(qmatrix="foo")) expect_error(transient.msm(qmatrix=c(1,4,5,6))) expect_error(absorbing.msm(qmatrix=c(1,4,5,6))) expect_error(transient.msm(qmatrix=cbind(c(1,2,3),c(1,3,2)))) expect_error(absorbing.msm(qmatrix=cbind(c(1,2,3),c(1,3,2)))) expect_error(transient.msm()) expect_error(absorbing.msm()) }) test_that("prevalence.msm",{ p <- prevalence.msm(psor.msm) expect_equal(59, p$Observed[5,5], tol=1e-06) expect_equal(59, p$Expected[5,5], tol=1e-06) expect_equal(57.35294, p$"Observed percentages"[4,4], tol=1e-03) expect_equal(49.96882, p$"Expected percentages"[4,4], tol=1e-03) summ <- summary.msm(psor.msm) expect_equal(summ$prevalences, p) p <- prevalence.msm(psor.msm, times=seq(0,60,5)) expect_equal(63, p$Observed[5,5], tol=1e-06) expect_equal(63, p$Expected[5,5], tol=1e-06) expect_equal(50.70423, p$"Observed percentages"[4,4], tol=1e-03) expect_equal(41.46338, p$"Expected percentages"[4,4], tol=1e-03) expect_error(prevalence.msm("foo")) expect_error(summary.msm("foo")) p <- prevalence.msm(psor.msm, covariates=list(hieffusn=0, ollwsdrt=1)) expect_equal(p$Observed[1,1], 1) p <- prevalence.msm(psor.msm, covariates=list(hieffusn=0, ollwsdrt=1), ci="normal", B=10) expect_true(is.numeric(p[[2]]$ci[,,"2.5%"][1,1])) plot.prevalence.msm(psor.msm) }) test_that("pmatrix.piecewise.msm",{ times <- c(5, 10, 15) covariates <- list(list(ollwsdrt=0, hieffusn=0), list(ollwsdrt=0, hieffusn=1), list(ollwsdrt=1, hieffusn=0), list(ollwsdrt=1, hieffusn=1) ) p <- pmatrix.msm(psor.msm, 3, covariates=covariates[[1]]) pp <- pmatrix.piecewise.msm(psor.msm, 0, 3, times, covariates) expect_equal(pp[1,3], p[1,3], tol=1e-04) p <- pmatrix.piecewise.msm(psor.msm, 0, 7, times, covariates) expect_equal(0.172773087945103, p[1,3], tol=1e-04) pp <- pmatrix.piecewise.msm(psor.msm, 0, 19, times, covariates) expect_equal(0.0510873669808412, pp[1,3], tol=1e-04) p <- pmatrix.msm(psor.msm, 5, covariates=covariates[[1]]) %*% pmatrix.msm(psor.msm, 5, covariates=covariates[[2]]) %*% pmatrix.msm(psor.msm, 5, covariates=covariates[[3]]) %*% pmatrix.msm(psor.msm, 4, covariates=covariates[[4]]) expect_equal(pp[1,3], p[1,3], tol=1e-04) covariates <- list(list(ollwsdrt=0, hieffusn=0),list(ollwsdrt=0, hieffusn=1)) p <- pmatrix.piecewise.msm(psor.msm, 0, 7, times=5, covariates) expect_equal(0.172773087945103, p[1,3], tol=1e-04) expect_error(pmatrix.piecewise.msm("foo", 1,2, c(1, 2), c(1,2)), "expected .+ msm model") expect_error(pmatrix.piecewise.msm("foo", 1, 2, c(1, 0.5, 2), list(0, 1, 0, 1)), "expected .+ msm model") expect_error(pmatrix.piecewise.msm(psor.msm, 1, 2, c(1, 0.5, 2), list(0, 1, 0, 1)), "times should be a vector of numbers in increasing order") expect_error(pmatrix.piecewise.msm(psor.msm, 1, 2, "rubbish", list(0, 1, 0, 1)),"times should be a vector of numbers in increasing order") expect_error(pmatrix.piecewise.msm(psor.msm, 1, 2, c(1, 1.5, 2), "rubbish")) expect_error(pmatrix.piecewise.msm(psor.msm, 1, 2, c(1, 1.5, 2), list("rubbish", "foo","bar","boing")), "covariates argument") expect_error(pmatrix.piecewise.msm(psor.msm, 1, 2, c(1, 1.5, 2), list(0, 1, 0, 1)), "covariates argument") }) test_that("pmatrix.piecewise.msm given just Q matrices",{ p1 <- pmatrix.piecewise.msm( t1 = 0, t2 = 6, times = c(2, 4), covariates = list(list(cov1 = 1), list(cov1 = 2), list(cov1 = 3)), qlist = list( Q1 = rbind(c(0.9, 0.1), c(0.1, 0.9)), Q2 = rbind(c(0.8, 0.2), c(0.1, 0.9)), Q3 = rbind(c(0.7, 0.3), c(0.1, 0.9)) ) ) expect_equal(round(p1), rbind(c(166, 238), c(99, 304))) }) test_that("totlos.msm",{ tl <- totlos.msm(psor.msm, ci="normal", B=2) sj <- sojourn.msm(psor.msm, ci="none") expect_equal(tl[1,1], sj$estimates[[1]]) en <- envisits.msm(psor.msm, ci="normal", B=2) expect_equal(en[1,2], 1) }) test_that("logLik.msm",{ expect_equivalent(unclass(logLik.msm(psor.msm)), psor.msm$minus2loglik / -2) expect_error(logLik.msm("foo")) }) test_that("lrtest.msm",{ psor2.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt, constraint = list(ollwsdrt=c(1,1,2)), control=list(fnscale=1)) expect_equal(lrtest.msm(psor2.msm, psor.msm)[1,"-2 log LR"], psor2.msm$minus2loglik - psor.msm$minus2loglik) }) test_that("qmatrix subset function",{ Q <- qmatrix.msm(psor.msm) expect_equivalent(Q[1,2]["SE"], Q$SE[1,2]) expect_error(Q[1,2,3,4,5], "unused arguments") expect_error(Q[1], "Two dimensions must be supplied") expect_equivalent(Q[], Q) Q[1,] Q[,2] Q[c(1,2),] Q[c(2,1),] Q[c(1,2),c(1,2)] }) test_that("efpt.msm",{ Q <- twoway4.q expect_equivalent(unclass(efpt.msm(qmatrix=Q, tostate=3)), c(Inf,Inf,0,Inf)) Q <- rbind(c(-0.25,0.25,0), c(0.166, -0.332, 0.166), c(0, 0.25, -0.25)) expect_equal(efpt.msm(qmatrix=Q, tostate=3)[c(1,2)], solve(-Q[1:2,1:2], c(1,1)),tol=1e-06) Q <- twoway4.q; Q[2,4] <- Q[2,1] <- 0; diag(Q) <- 0; diag(Q) <- -rowSums(Q) expect_equivalent(unclass(efpt.msm(qmatrix=Q, tostate=3)), c(Inf, 6.02409638554217, 0, Inf), tol=1e-05) expect_equivalent(unclass(efpt.msm(psor.msm, tostate=c(2))), c(10.4237243422138, 0, Inf, Inf), tol=1e-05) expect_equivalent(unclass(efpt.msm(psor.msm, tostate=c(3))), c(16.5099104995137, 6.08618615729989, 0, Inf), tol=1e-05) expect_equivalent(unclass(efpt.msm(psor.msm, tostate=c(2,3))), c(10.4237243422138, 0, 0, Inf), tol=1e-05) }) test_that("score residuals",{ sres <- scoreresid.msm(psor.msm) expect_equal(c(0.0608163009112361, 0.187998750251689, 0.0143302186951471), as.numeric(sres[1:3]), tol=1e-05) psor2 <- na.omit(psor); psor2$months[psor2$ptnum==5] <- psor2$months[psor2$ptnum==5]*10 psor.0.q <- rbind(c(0,0.1,0,0),c(0,0,0.2,0),c(0,0,0,0.3),c(0,0,0,0)) psor.infl.msm <- msm(state ~ months, subject=ptnum, data=psor2, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), qmatrix = psor.0.q) sres <- scoreresid.msm(psor.infl.msm) if (interactive()) sres <- scoreresid.msm(psor.infl.msm, plot=TRUE) expect_equal(names(which.max(sres)), "5") }) test_that("observed, expected etc",{ ## two covariates expect_equal(get.covhist(psor.msm)$example$time, c(6.4606, 17.078, 26.3217, 30.5763, 6.4052, 7.6893, 3.3593, 12.7775)) expect_equivalent(observed.msm(psor.msm)$obstab[,"State 4"], c(0, 6, 25, 39, 48, 50, 52, 53, 55, 56, 57)) expect_equal(as.numeric(expected.msm(psor.msm, covariates="population")$Expected[1:5,"State 3"]), c(0, 11.7058415609289, 14.8078062584701, 9.50355791490463, 5.83372436779321), tol=1e-05) expect_equal(as.numeric(expected.msm(psor.msm, covariates="mean")$Expected[1:5,"State 3"]), c(0, 11.165395364321, 14.8732589026358, 9.67192721319246, 6.26754773418822), tol=1e-05) }) test_that("observed, expected etc with one covariate, should run",{ expect_error({ psor1.msm <- msm(state ~ months, covariates=~ollwsdrt, subject=ptnum, data=psor, qmatrix = psor.q) get.covhist(psor1.msm) observed.msm(psor1.msm) expected.msm(psor1.msm) expected.msm(psor1.msm, covariates="mean") }, NA) }) test_that("observed, expected etc with PCI, should run",{ expect_error({ psor1.msm <- msm(state ~ months, covariates=~ollwsdrt+hieffusn, subject=ptnum, data=psor, qmatrix = psor.q, pci=c(5,10)) covhist <- get.covhist(psor1.msm) observed.msm(psor1.msm) expected.msm(psor1.msm) expected.msm(psor1.msm, covariates="mean") }, NA) }) test_that("subset argument to observed",{ subs <- psor.msm$data$mf$"(subject)"[!duplicated(psor.msm$data$mf$"(subject)") & psor.msm$data$mf$ollwsdrt==0] expect_equivalent(observed.msm(psor.msm, subset=subs)$obstab[,"State 4"], c(0, 5, 20, 30, 37, 38, 40, 41, 43, 44, 45)) }) test_that("error handling: formula",{ ## formula expect_error(msm(), "state ~ time formula not given") expect_error(cav.msm <- msm(state, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE), "not found") expect_error(cav.msm <- msm(~1, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE), "invalid data") expect_error(cav.msm <- msm("foo", subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE), "not a formula") }) test_that("error handling: qmatrix",{ wrong.q <- cbind(c(0,1,2), c(0,1,2)) expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = wrong.q, deathexact = TRUE, fixedpars=TRUE),"Number of rows and columns of qmatrix should be equal") wrong.q <- cbind(c(0,1), c(0,1)) expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = wrong.q, fixedpars=TRUE),"State vector contains elements not in 1, 2") expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = wrong.q, deathexact = TRUE, fixedpars=TRUE),"Not all the states specified in \"deathexact\" are absorbing") wrong.q <- "foo" expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = wrong.q, deathexact = TRUE, fixedpars=TRUE),"qmatrix should be a numeric matrix") wrong.q <- 1 expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = wrong.q, deathexact = TRUE, fixedpars=TRUE),"qmatrix should be a numeric matrix") }) test_that("error handling: subject",{ expect_error(cav.msm <- msm(state~years, subject="foo", data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE), "variable lengths differ") expect_error(cav.msm <- msm(state~years, subject=foo, data = cav, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE), "not found") }) test_that("error handling: obstype",{ expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = twoway4.q, obstype="foo", deathexact = TRUE, fixedpars=TRUE),"should be numeric") expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = twoway4.q, obstype=rep(1,10), deathexact = TRUE, fixedpars=TRUE),"obstype of length") ##FIXME expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = twoway4.q, obstype=rep(4, nrow(cav)), deathexact = TRUE, fixedpars=TRUE),"elements of obstype should be 1, 2, or 3") obstype <- rep(1, nrow(cav)) obstype[c(1,8)] <- 5 expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = twoway4.q, obstype=obstype, deathexact = TRUE, fixedpars=TRUE), NA) # no error: obstype for first subject doesn't matter obstype[2] <- 5 expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = twoway4.q, obstype=obstype, deathexact = TRUE, fixedpars=TRUE),"elements of obstype should be 1, 2, or 3") # error }) test_that("error handling: covariates",{ expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = "wibble"),"should be a formula or list of formulae") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sux),"not found") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, fixedpars=TRUE, misccovariates = "wobble"),"should be a formula") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sox),"not found") }) test_that("error handling: covinits",{ expect_warning(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sex, covinits="foo", fixedpars=TRUE),"covinits should be a list") expect_warning(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sex, covinits=list(sex="foo", age="bar"), fixedpars=TRUE),"should be numeric") expect_warning(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sex, covinits=list(sex=c(1,2,3), age="bar"), fixedpars=TRUE),"should be a list of numeric vectors") expect_warning(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sex, covinits=list(age=rep(0.1, 7)), fixedpars=TRUE),"covariate age in covinits unknown") expect_warning(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sex, covinits=list(age=rep(0.1, 7), foo=1, bar=2), fixedpars=TRUE),"covariates age, foo, bar in covinits unknown") expect_warning(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sex, covinits=list(sex=1), fixedpars=TRUE),"initial values of length 1, should be 7") expect_warning(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, misccovariates = ~ sex, misccovinits="foo", fixedpars=TRUE), "hcovinits should be numeric") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, misccovariates = ~ sex, misccovinits=list(sex=1, age="bar"), fixedpars=TRUE), "misccovariates supplied but no ematrix") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, misccovariates = ~ sex, misccovinits=list(sex=1, age="bar"), fixedpars=TRUE),"misccovariates supplied but no ematrix") expect_warning(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, ematrix=ematrix, misccovariates = ~ sex, misccovinits=list(sex=1, age="bar"), fixedpars=TRUE),"covinits should be a list of numeric") }) test_that("error handling: constraints",{ expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sex, constraint="foo"),"constraint should be a list") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sex, constraint=list(foo="bar")),"constraint should be a list of numeric vectors") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, covariates = ~ sex, constraint=list(foo=1)),"Covariate .+ in constraint statement not in model.") expect_warning(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, misccovariates = ~ sex, constraint="foo", fixedpars=TRUE),"constraint specified but no covariates") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, misccovariates = ~ sex, miscconstraint=list(foo="bar")),"constraint should be a list of numeric vectors") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, misccovariates = ~ sex, miscconstraint=list(foo=1)),"Covariate .+ in constraint statement not in model.") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, misccovariates = ~ sex, miscconstraint=list(sex=1)),"constraint of length 1, should be 4") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, qconstraint="foo", fixedpars=TRUE),"qconstraint should be numeric") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, qconstraint=list(c(1,1,2)), fixedpars=TRUE),"qconstraint should be numeric") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, qconstraint=c(1,1,2), fixedpars=TRUE),"baseline intensity constraint of length 3, should be 7") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, econstraint="foo", fixedpars=TRUE) ,"econstraint should be numeric") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, econstraint=list(c(1,1,2)), fixedpars=TRUE) ,"econstraint should be numeric") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, econstraint=c(1,1,2), fixedpars=TRUE),"baseline misclassification constraint of length 3, should be 4") }) test_that("error handling: initprobs",{ expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, initprobs="poo", fixedpars=TRUE),"initprobs should be numeric") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, initprobs=c(1,2), fixedpars=TRUE),"initprobs vector of length 2, should be vector of length 4 or a matrix") expect_error(cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, initprobs=c(2,1,1,1), fixedpars=TRUE), NA) # scaled to sum to 1. }) test_that("error handling: check states",{ wrong.q <- cbind(c(0,1), c(0,1)) # extra states in data expect_error(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = wrong.q, fixedpars=TRUE),"State vector contains elements not in 1, 2") wrong.q <- rbind(c(0,1,2,3,1), c(0,1,3,4,1), c(0,1,2,3,2), c(0,1,2,3,4), c(0,0,0,0,0)) expect_warning(cav.msm <- msm(state~years, subject=PTNUM, data = cav, qmatrix = wrong.q, fixedpars=TRUE),"State vector doesn't contain observations of 5") }) test_that("error handling: check times",{ cav.wrong <- cav cav.wrong$years[3:5] <- 4:2 expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE),"not ordered by time") cav.wrong <- cav cav.wrong$PTNUM[4:5] <- 100003 expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = twoway4.q, deathexact = TRUE, fixedpars=TRUE),"Observations within subjects .+ are not adjacent in the data") cav2 <- cav cav2$years[10] <- cav2$years[9] expect_warning(msm(state ~ years, subject=PTNUM, data = cav2, qmatrix = twoway4.q, fixedpars=TRUE), "Different states observed at the same time on the same subject at observations 9 and 10") ## with missing data cav2$years[6] <- NA ## report original rows before excluding missing data expect_warning(msm(state ~ years, subject=PTNUM, data = cav2, qmatrix = twoway4.q, fixedpars=TRUE), "Different states observed at the same time on the same subject at observations 9 and 10") cav2 <- cav2[6:nrow(cav),] expect_warning(msm(state ~ years, subject=PTNUM, data = cav2, qmatrix = twoway4.q, fixedpars=TRUE), "Different states observed at the same time on the same subject at observations 4 and 5", "Subject 100002 only has one complete observation") }) test_that("error handling: check model",{ cav.wrong <- cav cav.wrong$state[4] <- 1 expect_warning(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = oneway4.q, deathexact = TRUE, fixedpars=TRUE),"Data may be inconsistent with transition matrix for model without misclassification:\nindividual 100002 moves from state 2 to state 1 at observation 4") expect_warning(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = oneway4.i, gen.inits=TRUE, fixedpars=TRUE),"individual 100046 moves from state 2 to state 1 at observation 225") ## row number reporting with missing data - should be the same cav.wrong$PTNUM[2] <- NA expect_warning(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = oneway4.q, deathexact = TRUE, fixedpars=TRUE),"100002 moves from state 2 to state 1 at observation 4") cav.wrong <- cav cav.wrong$state[4] <- 1 expect_warning(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = twoway4.q, exacttimes=TRUE, fixedpars=TRUE),"individual 100003 moves from state 1 to state 3 at observation 10") ## row number reporting with missing data cav.wrong$state[3] <- NA expect_warning(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = twoway4.q, exacttimes=TRUE, fixedpars=TRUE),"individual 100003 moves from state 1 to state 3 at observation 10") # should complain about obs 10 obstype <- rep(2, nrow(cav)) obstype[10] <- 1 expect_warning(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = twoway4.q, obstype=obstype, fixedpars=TRUE),"individual 100006 moves from state 1 to state 3 at observation 29") ## absorbing-absorbing transitions cav.wrong$state[6] <- 4 expect_warning(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = twoway4.q, obstype=obstype, fixedpars=TRUE),"Absorbing - absorbing transition at observation 7") }) test_that("error handling: death",{ expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = "foo", fixedpars=TRUE) ,"Exact death states indicator must be numeric") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = 5, fixedpars=TRUE) ,"Exact death states indicator contains states not in 1, 2, ... , 4") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = 1:5, fixedpars=TRUE) ,"Exact death states indicator contains states not in 1, 2, ... , 4") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = 3, fixedpars=TRUE),"Not all the states specified in \"deathexact\" are absorbing" ) }) test_that("error handling: censor",{ expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, censor="rubbish", fixedpars=TRUE),"censor must be numeric") expect_warning(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, censor=1, fixedpars=TRUE),"some censoring indicators are the same as actual states") expect_warning(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, censor.states="rubbish", fixedpars=TRUE) ,"censor.states supplied but censor not supplied") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.cens, qmatrix = twoway4.q, censor=99, censor.states="rubbish", fixedpars=TRUE) ,"censor.states should be all numeric") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav.cens, qmatrix = twoway4.q, censor=99, censor.states=list(c(1,2,3), "rubbish"), fixedpars=TRUE) ,"censor.states should be a vector") }) test_that("error handling: obstype",{ expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, obstype="rubbish", fixedpars=TRUE) ,"obstype should be numeric") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, obstype=c(1,2,3), fixedpars=TRUE) ,"obstype of length 3, should be length 1 or 2846") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, obstype=4, fixedpars=TRUE),"elements of obstype should be 1, 2, or 3" ) expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, obstype=rep(4,nrow(cav)), fixedpars=TRUE) ,"elements of obstype should be 1, 2, or 3") }) test_that("error handling: fixedpars",{ expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, fixedpars="foo"),"Elements of fixedpars should be in 1, ..., 7") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, fixedpars=list(c(1,3,4))),"Elements of fixedpars should be in 1, ..., 7") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, fixedpars=1:8),"Elements of fixedpars should be in 1, ..., 7") expect_error(cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, fixedpars=0.5),"Elements of fixedpars should be in 1, ..., 7") }) test_that("error handling: plot",{ expect_error(plot.msm("foo"),"expected .+ msm model") expect_error(plot.msm(psor.msm, from="foo"), "from must be numeric") expect_error(plot.msm(psor.msm, to="foo"), "to must be numeric") expect_error(plot.msm(psor.msm, from = 1:8, to=3),"from must be a vector of states in 1, ..., 4") expect_error(plot.msm(psor.msm, to = 3),"to must be an absorbing state") expect_error(plot.msm(psor.msm, range="foo")) expect_error(plot.msm(psor.msm, range=1:6),"range must be a numeric vector of two elements") }) test_that("recreate.olddata",{ expect_error(recreate.olddata(psor.msm), NA) }) test_that("form.output",{ qo <- msm.form.qoutput(psor.msm) expect_equal(qo$base.Estimate[2], qmatrix.msm(psor.msm, covariates="mean")$estimates[1,2]) print(qmatrix.msm(psor.msm)) }) test_that("plots",{ skip_on_cran() expect_error({ plot.msm(psor.msm) plotprog.msm(state ~ months, subject=ptnum, data=psor) plot.survfit.msm(psor.msm) contour.msm(psor.msm) persp.msm(psor.msm) image.msm(psor.msm) surface.msm(psor.msm, xrange=c(-2.4,-2.3)) }, NA) }) test_that("miscellaneous",{ expect_error(msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), control=list(fnscale=1), na.action=na.fail)) expect_error(model.matrix(psor.msm), NA) expect_error(model.frame(psor.msm), NA) }) test_that("single-column matrix in covariates",{ psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) psor$matcov <- matrix(psor$ollwsdrt, ncol=1) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~matcov, fixedpars=TRUE) psor2.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt, fixedpars=TRUE) expect_equal(psor.msm$minus2loglik, psor2.msm$minus2loglik) }) msm/tests/testthat/test_deriv.r0000644000176200001440000002773714677770471016447 0ustar liggesusers## depends on psor.msm skip_if_not_installed("numDeriv") context("analytic derivatives of likelihood") test_that("derivatives by subject: sum to overall derivative",{ psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), fixedpars=FALSE) q.mle <- psor.msm$paramdata$opt$par deriv.overall <- grad.msm(q.mle, expand.data(psor.msm), psor.msm$qmodel, psor.msm$qcmodel, psor.msm$cmodel, psor.msm$hmodel, psor.msm$paramdata) deriv.subj <- Ccall.msm(q.mle, do.what="deriv.subj", expand.data(psor.msm), psor.msm$qmodel, psor.msm$qcmodel, psor.msm$cmodel, psor.msm$hmodel, psor.msm$paramdata) expect_equal(deriv.overall, colSums(deriv.subj)) }) options(msm.test.analytic.derivatives=TRUE) err <- 1e-04 test_that("analytic derivatives match numeric",{ cav.msm <- msm(state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, death = TRUE, fixedpars=TRUE) expect_lt(deriv_error(cav.msm), err) cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, death = FALSE, fixedpars=TRUE) expect_lt(deriv_error(cav.msm), err) cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qconstraint = c(1,1,2,2,2,3,3), qmatrix = twoway4.q, death = FALSE, fixedpars=TRUE) expect_lt(deriv_error(cav.msm), err) psor.0.q <- rbind(c(0,0.1,0,0),c(0,0,0.2,0),c(0,0,0,0.3),c(0,0,0,0)) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.0.q, fixedpars=TRUE) expect_lt(deriv_error(psor.msm), err) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.0.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), fixedpars=TRUE) expect_lt(deriv_error(psor.msm), err) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.0.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), death=TRUE, fixedpars=TRUE) expect_lt(deriv_error(psor.msm), err) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.0.q, covariates = ~ollwsdrt+hieffusn, death=TRUE, fixedpars=TRUE) expect_lt(deriv_error(psor.msm), err) msmtest5 <- msm(state ~ time, qmatrix = fiveq, subject = ptnum, data = bos, exacttimes=TRUE, fixedpars=TRUE) expect_lt(deriv_error(msmtest5), err) msmtest5 <- msm(state ~ time, qmatrix = fiveq, subject = ptnum, data = bos, exacttimes=TRUE, qconstraint=c(1,2,1,2,1,2,1), fixedpars=TRUE) expect_lt(deriv_error(msmtest5), err) msmtest5 <- msm(state ~ time, qmatrix = fiveq, covariates = ~time, subject = ptnum, data = bos, exacttimes=TRUE, fixedpars=TRUE) expect_lt(deriv_error(msmtest5), err) msmtest5 <- msm(state ~ time, qmatrix = fiveq, covariates = ~time, constraint=list(time=c(1,2,1,2,1,2,2)), subject = ptnum, data = bos, exacttimes=TRUE, fixedpars=TRUE) expect_lt(deriv_error(msmtest5), err) }) test_that("analytic derivatives for models with censoring",{ cavcens.msm <- msm(state ~ years, subject=PTNUM, data=cav.cens, qmatrix=twoway4.q, censor=99, fixedpars=TRUE) expect_lt(deriv_error(cavcens.msm), err) }) if (0) { ### NOTE: NUMERIC DERIVS BREAK WITH THESE MATRICES when analyticp=TRUE: CLOSE TO REPEATED EIGENVALUES. psor.1.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) psor.1.q <- rbind(c(0,0.1,0,0),c(0,0,0.10001,0),c(0,0,0,0.1001),c(0,0,0,0)) diag(psor.1.q) <- -rowSums(psor.1.q) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.1.q, fixedpars=TRUE) psor.msm$paramdata$deriv_test psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.1.q, fixedpars=TRUE, analyticp=FALSE) psor.msm$paramdata$deriv_test psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.1.q, qconstraint=c(1,1,2), fixedpars=TRUE) psor.msm$paramdata$deriv_test psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.1.q, qconstraint=c(1,1,2), fixedpars=TRUE, analyticp=FALSE) psor.msm$paramdata$deriv_test psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.1.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), fixedpars=FALSE, analyticp=TRUE) psor.msm$paramdata$deriv_test psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.1.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), fixedpars=FALSE, analyticp=FALSE) psor.msm$paramdata$deriv_test } context("analytic derivatives of likelihood in HMMs") test.df <- data.frame(time=1:2, obs=c(1,1), x=c(1,2), y=c(3,4)) test_that("Categorical, 2 obs",{ tm <- msm(obs ~ time, qmatrix=rbind(c(0,1,0),c(0,0,0),c(0,0,0)), ematrix=rbind(c(0.8,0.1,0.1),c(0.1,0.9,0),c(0,0,0)), data=test.df, fixedpars=TRUE) expect_lt(deriv_error(tm), err) }) test_that("Categorical, lots of obs ",{ nobs <- 100 test.df <- data.frame(time=1:nobs, obs=sample(c(1,2),size=nobs,replace=TRUE), x=c(1,2), y=c(3,4)) tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), ematrix=rbind(c(0.8,0.2),c(0.9,0.1)), data=test.df, fixedpars=TRUE) expect_lt(deriv_error(tm), err) }) test_that("Categorical, a covariate",{ tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), hmodel=list(hmmCat(c(0.8,0.2)),hmmCat(c(0.9,0.1))), hcovariates=list(~x,~1), data=test.df, fixedpars=TRUE) expect_lt(deriv_error(tm), err) }) test_that("Categorical, a covariate on more than one state",{ tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), hmodel=list(hmmCat(c(0.8,0.2)),hmmCat(c(0.9,0.1))), hcovariates=list(~x,~x), data=test.df, fixedpars=TRUE) expect_lt(deriv_error(tm), err) }) test_that("Categorical, 4 potential obs",{ tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), hmodel=list(hmmCat(c(0.8,0.1,0.05,0.05)),hmmCat(c(0.05,0.9,0.02,0.03))), data=test.df, fixedpars=TRUE) expect_lt(deriv_error(tm), err) }) test_that("Derivatives not supported with misclassification constraints",{ expect_warning(tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), ematrix=rbind(c(0.8,0.2),c(0.9,0.1)), econstraint=c(1,1), data=test.df, fixedpars=TRUE), "Analytic derivatives not available") expect_warning(tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), hmodel=list(hmmCat(c(0.8,0.1,0.05,0.05)),hmmCat(c(0.05,0.9,0.02,0.03))), data=test.df, hconstraint=list(p=c(1,1,2,3,4,5)), fixedpars=TRUE), "Analytic derivatives not available") expect_warning(tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), hmodel=list(hmmCat(c(0.8,0.1,0.05,0.05)),hmmCat(c(0.05,0.9,0.02,0.03))), data=test.df, hcovariates=list(~x+y,~x+y), hconstraint=list(p=c(1,1,2,3,4,5),x=c(1,2,2,3,4,5),y=c(1,2,3,3,3,3)), fixedpars=TRUE), "Analytic derivatives not available") expect_warning(tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), hmodel=list(hmmCat(c(0.8,0.2)),hmmCat(c(0.9,0.1))), hcovariates=list(~x,~x), hconstraint=list(x=c(1,1)), data=test.df, fixedpars=TRUE), "Analytic derivatives not available") }) test_that("Derivatives with CAV misclassification model",{ misc.msm <- msm(state ~ years, subject = PTNUM, data = cav[1:200,], qmatrix = oneway4.q, ematrix=ematrix, misccovariates = ~dage + sex, covariates = ~ dage, covinits = list(dage=c(0.1,0.2,0.3,0.4,0.5)), misccovinits = list(dage=c(0.01,0.02,0.03,0.04), sex=c(-0.013,-0.014,-0.015,-0.016)), fixedpars=TRUE) expect_lt(deriv_error(misc.msm), err) misc.msm <- msm(state ~ years, subject = PTNUM, data = cav[1:20,], qmatrix = oneway4.q, ematrix=ematrix, initprobs=c(0.5, 0.2, 0.1, 0.2), fixedpars=TRUE) expect_lt(deriv_error(misc.msm), err) misc.msm <- msm(state ~ years, subject = PTNUM, data = cav[1:2,], qmatrix = rbind(c(0,0.5,0),c(0,0,0.5),c(0,0,0)), hmodel=list(hmmCat(c(0.9,0.1,0)), hmmCat(c(0.1,0.8,0.1)), hmmCat(c(0,0.1,0.9))), initprobs=c(0.5, 0.2, 0.3), fixedpars=TRUE) expect_lt(deriv_error(misc.msm), err) }) ## others in slow/test_fits_hmm.r test_that("simple exponential",{ nobs <- 3 test.df <- data.frame(time=1:nobs, obs=c(rexp(nobs,c(sample(c(1,2),size=nobs,replace=TRUE))))) tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), hmodel=list(hmmExp(1.5),hmmExp(2)), data=test.df, fixedpars=TRUE) expect_lt(deriv_error(tm), err) }) test_that("Information matrix",{ nobs <- 1000 suppressWarnings(RNGversion("3.5.0")) set.seed(1) test.df <- data.frame(time=1:nobs, obs=sample(c(1,2),size=nobs,replace=TRUE)) p1 <- 0.2; p2 <- 0.2; pr1 <- c(1-p1, p1) # P obs(1,2) | true 1 pr2 <- c(p2, 1-p2) # P obs(1,2) | true 2 (tm <- msm(obs ~ time, qmatrix=rbind(c(0,1),c(0,0)), hmodel=list(hmmCat(pr1),hmmCat(pr2)), data=test.df, fixedpars=TRUE, hessian=TRUE)) expect_equal(c(0.88475550512612, 0.202501688704573, -0.474183198550202), tm$paramdata$info[1:3], tol=1e-05) tm$paramdata$opt$hessian }) set.seed(22061976) nsubj <- 100; nobspt <- 6 sim.df <- data.frame(subject = rep(1:nsubj, each=nobspt), time = seq(0, 20, length.out=nobspt), x = rnorm(nsubj*nobspt), y = rnorm(nsubj*nobspt)* 5 + 20) three.q <- rbind(c(0, exp(-6), exp(-9)), c(0, 0, exp(-6)), c(0, 0, 0)) set.seed(22061976) nsubj <- 100; nobspt <- 6 sim.df <- data.frame(subject = rep(1:nsubj, each=nobspt), time = seq(0, 20, length.out=nobspt), x = rnorm(nsubj*nobspt), y = rnorm(nsubj*nobspt)* 5 + 20) test_that("poisson",{ hmodel3 <- list(hmmPois(6), hmmPois(12), hmmIdent(999)) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, hmodel = hmodel3) sim.hid <- msm(obs ~ time, subject=subject, data=sim2.df, qmatrix=three.q, hmodel=hmodel3, fixedpars=TRUE) expect_lt(deriv_error(sim.hid), err) }) test_that("binomial",{ hmodel3 <- list(hmmBinom(10, 0.1), hmmBinom(20, 0.3), hmmIdent(999)) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, hmodel = hmodel3) sim.hid <- msm(obs ~ time, subject=subject, data=sim2.df, qmatrix=three.q, hmodel=hmodel3, fixedpars=TRUE) expect_lt(deriv_error(sim.hid), err) }) ## Derivatives not working yet for beta-binomial if (0){ test_that("betabinomial",{ hmodel3 <- list(hmmBetaBinom(20, 0.7, 0.1), hmmBetaBinom(20, 0.3, 0.1), hmmIdent(999)) three.q <- rbind(c(0, exp(-2), exp(-4)), c(0, 0, exp(-2)), c(0, 0, 0)) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, hmodel = hmodel3) sim.hid <- msm(obs ~ time, subject=subject, data=sim2.df[1:2,], qmatrix=three.q, hmodel=hmodel3, fixedpars=TRUE) sim.hid sim.hid$paramdata$deriv_test deriv_error(sim.hid) expect_lt(deriv_error(sim.hid), err) sim.hid <- msm(obs ~ time, subject=subject, data=sim2.df, qmatrix=three.q, hmodel=hmodel3) }) } test_that("negative binomial",{ hmodel3 <- list(hmmNBinom(10, 0.1), hmmNBinom(20, 0.3), hmmIdent(999)) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, hmodel = hmodel3) sim.hid <- msm(obs ~ time, subject=subject, data=sim2.df, qmatrix=three.q, hmodel=hmodel3, fixedpars=TRUE) expect_lt(deriv_error(sim.hid), err) }) test_that("beta",{ ### some kind of underflow with about 200 obs or more. big derivs, prob poorly identified model hmodel3 <- list(hmmBeta(0.5,0.5), hmmBeta(2, 2), hmmIdent(999)) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, hmodel = hmodel3) sim.hid <- msm(obs ~ time, subject=subject, data=sim2.df[1:100,], qmatrix=three.q, hmodel=hmodel3, fixedpars=TRUE) expect_lt(deriv_error(sim.hid), err) }) test_that("t",{ hmodel3 <- list(hmmT(1, 2, 2), hmmT(4, 2, 3), hmmIdent(999)) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=three.q, hmodel = hmodel3) sim.hid <- msm(obs ~ time, subject=subject, data=sim2.df[1:100,], qmatrix=three.q, hmodel=hmodel3, fixedpars=TRUE) expect_lt(deriv_error(sim.hid), err) }) options(msm.test.analytic.derivatives=NULL) msm/tests/testthat/test_datasumm.r0000644000176200001440000000634414471426252017123 0ustar liggesuserscontext("msm data summaries") test_that("statetable.msm", { stab <- statetable.msm(state, PTNUM, data=cav) expect_that(stab, equals(structure(c(1367L, 46L, 4L, 204L, 134L, 13L, 44L, 54L, 107L, 148L, 48L, 55L), .Dim = 3:4, .Dimnames = structure(list(from = c("1","2", "3"), to = c("1", "2", "3", "4")), .Names = c("from", "to")), class = "table"))) expect_equal(as.numeric(stab), c(1367, 46, 4, 204, 134, 13, 44, 54, 107, 148, 48, 55)) expect_error(statetable.msm(state,PTNUM), "not found") stabc <- statetable.msm(state, PTNUM, cav.cens) expect_equal(as.numeric(stabc), c(1367, 46, 4, 204, 134, 13, 44, 54, 107, 127, 40, 34, 21, 8, 21)) }) test_that("crudeinits.msm", { cinits <- crudeinits.msm(state ~ years, PTNUM, data=cav, qmatrix=twoway4.q) expect_equal(as.numeric(cinits), c(-0.117314905786477, 0.116817878212849, 0, 0, 0.067989320398981, -0.375848825554382, 0.049084006577444, 0, 0, 0.137134030945518, -0.256747111328168, 0, 0.049325585387496, 0.121896916396016, 0.207663104750724, 0)) expect_error(crudeinits.msm(state ~ years, PTNUM, qmatrix=twoway4.q), "not found") }) test_that("crudeinits.msm ignores inconsistent transitions unless exact times", { cav.wrong <- cav; cav.wrong$state[4] <- 1 expect_error(crudeinits.msm(state ~ years, PTNUM, oneway4.q, cav), NA) expect_warning(msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = twoway4.q, exacttimes=TRUE, fixedpars=TRUE), "inconsistent with intensity") obstype <- rep(2, nrow(cav)); obstype[10] <- 1 expect_warning(msm(state ~ years, subject=PTNUM, data = cav.wrong, qmatrix = twoway4.q, obstype=obstype, fixedpars=TRUE), "inconsistent with intensity") }) test_that("crudeinits.msm handles NAs", { psor2 <- psor; psor2$ptnum[13:14] <- psor2$months[7:8] <- psor2$state[7:8] <- NA expect_equal(crudeinits.msm(state ~ months, ptnum, data=psor2, qmatrix=psor.q), crudeinits.msm(state ~ months, ptnum, data=psor2[-c(7,8,13,14),], qmatrix=psor.q)) }) test_that("crudeinits.msm handles censoring",{ expect_error(crudeinits.msm(state ~ years, PTNUM, twoway4.q, cav.cens), "elements not in 1, 2") cru <- crudeinits.msm(state~ years, PTNUM, twoway4.q, cav.cens, censor=99) expect_equal(as.numeric(cru), c(-0.111798558088660, 0.122878533946307, 0, 0, 0.0689030388220138, -0.373978146793108, 0.0618112185064827, 0, 0, 0.144248713763056, -0.223471328446514, 0, 0.0428955192666458, 0.106850899083745, 0.161660109940032, 0)) cru <- crudeinits.msm(state~ years, PTNUM, twoway4.q, cav.cens2, censor=c(99,999), censor.states=list(c(1,2,3),c(2,3))) expect_equal(as.numeric(cru), c(-0.107299472349819, 0.134927714425074, 0, 0, 0.0697104852209013, -0.369584609077378, 0.0789635719132074, 0, 0, 0.158393403890305, -0.170075385659216, 0, 0.0375889871289174, 0.0762634907619986, 0.0911118137460085, 0), tol=1e-06) cru <- crudeinits.msm(state~ years, PTNUM, twoway4.q, cav.cens3, censor=c(99,999), censor.states=list(c(2,3),c(1,2,3))) expect_equal(as.numeric(cru), c(-0.112107245394208, 0.124370575094641, 0, 0, 0.0686998668421821, -0.370347934726264, 0.0659650781282531, 0, 0, 0.135425737325276, -0.238489128617530, 0, 0.0434073785520255, 0.110551622306348, 0.172524050489277, 0), tol=1e-06) }) msm/tests/testthat/test_viterbi.R0000644000176200001440000000256514471426252016715 0ustar liggesusers## Thanks to https://github.com/helmingstay for the test case pars <- list(npair = 20, q = 0.05, prob=list(S=0.2, I=0.8), deltat=5, tmax=20) sim.grid <- with(pars, expand.grid(time=seq(0,tmax,by=deltat), subject=1:npair)) ## initial conditions / observation model config <- list( qmat = rbind( c(0, pars$q), c(0, 0) ), hmod = list( S=hmmBinom(size=1, prob=0.2), I=hmmBinom(size=1, prob=0.8) ) ) sim.dat <- simmulti.msm(sim.grid, config$qmat, drop.absorb=F, hmodel=list( S=hmmBinom(size=1, prob=0.2), ## sim uses larger size I=hmmBinom(size=2, prob=0.8) ) ) panel <- subset(sim.dat, select=c(subject, time, obs)) panel <- within(panel, { ## force state 2 obstrue <- ifelse(obs==2, 2, NA) obs <- ifelse(obs>1, 1, 0) }) result <- msm(data=panel, obs ~ time, subject=subject, obstrue=obstrue, qmatrix=config$qmat, hmodel=config$hmod, fixedpars=T ) pred <- merge(panel, viterbi.msm(result), by=c('subject', 'time'), sort=F) test_that("Viterbi with obstrue",{ predtrue <- subset(pred, obstrue==2) expect_equal(predtrue$pstate[1,1], 0) expect_equal(predtrue$pstate[1,2], 1) expect_true(isTRUE(all.equal(rowSums(predtrue$pstate), rep(1,nrow(predtrue))))) }) msm/tests/testthat/test_phase.R0000644000176200001440000001172314471676373016360 0ustar liggesuserstest_that("one phased state", { psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, fixedpars=TRUE, phase.states=c(1)) expect_equal(psor.msm$minus2loglik, 1308.35590680014, tol=1e-06) } ) test_that("working example",{ skip_on_cran() ## SIMULATE mst1 <- 5 # Short-stay mean mst2 <- 30 # Long-stay mean p2 <- 0.9 # Long-stay probability q23 <- 1/5 # Transition rate between phases l1 <- (p2/mst1) mu1 <- (1-p2)/mst1 mu2 <- 1/(mst2-mst1) Q <- rbind(c(0,l1,mu1*0.4,mu1*0.6), c(0,0,mu2*0.4,mu2*0.6), c(0,0,0,q23), c(0,0,0,0)) # Given the hidden state, the observed state is deterministic E <- rbind(c(1,0,0,0), c(1,0,0,0), c(0,1,0,0), c(0,0,1,0)) nsubj <- 1000; nobspt <- 10 set.seed(1) sim.df <- data.frame(subject = rep(1:nsubj, each=nobspt), time = seq(0, 100, length=nobspt)) sim2.df <- simmulti.msm(sim.df[,1:2], qmatrix=Q, ematrix=E) statetable.msm(obs, subject, sim2.df) ## FIT Q3 <- rbind(c(0,0.5,0.5),c(0,0,0.5),c(0,0,0)) s.msm <- msm(obs ~ time, subject=subject, data=sim2.df, phase.states=1, qmatrix=Q3, # default inits phase.inits=list(list(trans=0.05, exit=matrix(c(0.1,0.1,0.1,0.1),nrow=2))), control=list(trace=1,REPORT=1,fnscale=50000,maxit=10000),method="BFGS") # Parameter estimates should agree with the values used for simulation s.msm c(l1, mu1*0.4, mu1*0.6, mu2*0.4, mu2*0.6, q23) means <- phasemeans.msm(s.msm) expect_equal(means[[1,"Short stay mean"]], 5, tol=1) expect_equal(means[[1,"Long stay mean"]], 30, tol=5) expect_equal(means[[1,"Long stay probability"]], 0.9, tol=0.1) }) test_that("two phased states", { ## note phase transition within state 2 appears hard to estimate. psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, fixedpars=TRUE, phase.states=c(1,2)) expect_equal(psor.msm$minus2loglik, 1303.768173132893, tol=1e-06) }) test_that("supplying initial values",{ psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, phase.states=c(1,2), phase.inits = list( list(trans=c(0.42032), exit=c(0.17404,0.04809)), list(trans=c(0.42032), exit=c(0.17404,0.04809))), fixedpars=TRUE) expect_equal(psor.msm$minus2loglik, 1280.788860486683, tol=1e-06) }) test_that("errors in initial values",{ expect_error(psor2.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, phase.states=c(1,2), phase.inits = "foo"), "phase.inits should be a list") expect_error(psor2.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, phase.states=c(1,2), phase.inits = list(1,2,3)), "phase.inits of length 3, but there are 2 phased states") expect_error(psor2.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, phase.states=c(1,2), phase.inits = list(1,2)), "phase.inits.+ list of length 1, should be 2") expect_error(psor2.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, phase.states=c(1), phase.inits = list(list(trans=c(0.42032, 1), exit=c(0.17404,0.04809)))), "phase.inits.+trans of length 2, should be 1") expect_error(psor2.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, phase.states=c(1), phase.inits = list(list(trans=c(0.42032), exit=c(0.17404,0.04809,1,1)))), "phase.inits.+exit has 4 columns, should be 2") expect_error(psor2.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, phase.states=c(1), phase.inits = list(list(trans=c(0.42032), exit=matrix(c(0.17404,0.04809,1,1),ncol=2,byrow=TRUE)))), "phase.inits.+exit has 2 rows, but there are 1 exit states from this state") }) test_that("with censoring", { psor2 <- psor psor2$state[c(16,18)] <- 99 psorc.msm <- msm(state ~ months, subject=ptnum, data=psor2, qmatrix = psor.q, fixedpars=TRUE, censor = 99, censor.states=c(3,4)) expect_equal(psorc.msm$minus2loglik, 1290.189703452163, tol=1e-06) }) test_that("HMM on top", { ### Note 1.6 clarifies obstrue not supported for hmmCat: so test result in 1.5 wrong miscnew.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, death = 5, #obstrue=firstobs, fixedpars=TRUE, # could try to fit, but weakly identifiable. fit seems improved though (-2LL 3864 vs 3951) # control=list(trace=1,REPORT=1,fnscale=4000, maxit=10000), phase.states = 1, hmodel=list( hmmCat(prob=c(0.9, 0.1, 0, 0)), hmmCat(prob=c(0.1, 0.8, 0.1, 0)), hmmCat(prob=c(0, 0.1, 0.9, 0)), hmmIdent(4)) ) expect_equal(miscnew.msm$minus2loglik, 4357.70908245511, tol=1e-06) }) msm/tests/testthat/test_hmodel2list.R0000644000176200001440000000621714535131666017500 0ustar liggesusersthree.q <- rbind(c(0, exp(-6), exp(-9)), c(0, 0, exp(-6)), c(0, 0, 0)) test_that("hmodel2list",{ hmodel3 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(999)) (fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3, fixedpars=TRUE)) (fev3.hid2 <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel2list(fev3.hid$hmodel), fixedpars=TRUE)) expect_equal(fev3.hid2$minus2loglik, fev3.hid$minus2loglik) hm <- hmodel2list(fev3.hid$hmodel) hml <- hmodel2list(fev3.hid$hmodel, hmmdist = FALSE) expect_equal(hm[[1]], do.call(hmmNorm, hml[[1]])) }) test_that("hmodel2list with hmmCat",{ misccovnew.msm <- msm(state ~ years, subject = PTNUM, data = cav[1:1000,], qmatrix = oneway4.q, death = 4, fixedpars=TRUE, hmodel=list( hmmCat(prob=c(0.9, 0.1, 0, 0)), hmmCat(prob=c(0.1, 0.8, 0.1, 0)), hmmCat(prob=c(0, 0.1, 0.9, 0)), hmmIdent()), hcovariates=list(~dage + sex, ~dage + sex, ~dage + sex, ~1)) misccovnew2.msm <- msm(state ~ years, subject = PTNUM, data = cav[1:1000,], qmatrix = oneway4.q, death = 4, fixedpars=TRUE, hmodel = hmodel2list(misccovnew.msm$hmodel), hcovariates=list(~dage + sex, ~dage + sex, ~dage + sex, ~1)) expect_equal(misccovnew2.msm$minus2loglik, misccovnew.msm$minus2loglik) hm <- hmodel2list(misccovnew.msm$hmodel) hml <- hmodel2list(misccovnew.msm$hmodel, hmmdist = FALSE) expect_equal(hm[[1]], do.call(hmmCat, hml[[1]])) expect_equal(hm[[2]], do.call(hmmCat, hml[[2]])) }) ## For univariate, each element has one element per par ## For multivariate, each element has one element per outcome dist, which in turn has ## one element per par test_that("hmodel2list with hmmMV",{ fev$fevmat <- cbind(fev$fev, fev$fev*runif(nrow(fev), 0.95, 1.05)) hmodel3mv <- list(hmmMV(hmmNorm(mean=100, sd=16), hmmNorm(mean=95, sd=18)), hmmMV(hmmNorm(mean=54, sd=16), hmmNorm(mean=50, sd=18)), hmmIdent(999)) (fev3.hid <- msm(fevmat ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel3mv, fixedpars=TRUE)) (fev3.hid2 <- msm(fevmat ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel2list(fev3.hid$hmodel), fixedpars=TRUE)) expect_equal(fev3.hid$minus2loglik, fev3.hid2$minus2loglik) hm <- hmodel2list(fev3.hid$hmodel) hml <- hmodel2list(fev3.hid$hmodel, hmmdist=FALSE) expect_equal(hm[[1]], hmmMV(do.call(hmmNorm, hml[[1]][[1]]), do.call(hmmNorm, hml[[1]][[2]]))) expect_equal(hm[[2]], hmmMV(do.call(hmmNorm, hml[[2]][[1]]), do.call(hmmNorm, hml[[2]][[2]]))) }) msm/tests/testthat/helper.r0000644000176200001440000000301114527616625015523 0ustar liggesuserstwoway4.q <- rbind(c(-0.5, 0.25, 0, 0.25), c(0.166, -0.498, 0.166, 0.166), c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)) twoway4.q2 <- rbind(c(-0.51, 0.24, 0, 0.25), c(0.162, -0.498, 0.168, 0.166), c(0, 0.26, -0.5, 0.25), c(0, 0, 0, 0)) twoway3.q <- rbind(c(-0.5, 0.25, 0), c(0.166, -0.498, 0.166), c(0, 0.25, -0.5)) oneway4.q <- rbind(c(0, 0.148, 0, 0.0171), c(0, 0, 0.202, 0.081), c(0, 0, 0, 0.126), c(0, 0, 0, 0)) rownames(twoway4.q) <- colnames(twoway4.q) <- rownames(oneway4.q) <- colnames(oneway4.q) <- c("Well","Mild","Severe","Death") twoway4.i <- twoway4.q; twoway4.i[twoway4.i!=0] <- 1 oneway4.i <- oneway4.q; oneway4.i[oneway4.i!=0] <- 1 psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) fiveq <- rbind(c(0,0.01,0,0,0.002), c(0,0,0.07,0,0.01), c(0,0,0,0.07,0.02), c(0,0,0,0,0.03), c(0,0,0,0,0)) ematrix <- rbind(c(0, 0.1, 0, 0),c(0.1, 0, 0.1, 0),c(0, 0.1, 0, 0),c(0, 0, 0, 0)) rownames(oneway4.q) <- colnames(oneway4.q) <- rownames(ematrix) <- colnames(ematrix) <- c("Well","Mild","Severe","Death") cav.cens <- cav cav.cens$state[cav$state==4][1:50] <- 99 cav.cens2 <- cav cav.cens2$state[cav$state==4][1:50] <- 99 cav.cens2$state[cav$state==4][51:100] <- 999 cav.cens3 <- cav ns <- c(cav$state[2:nrow(cav)], 0) cav.cens3$state[cav$state==4][1:50] <- 99 cav.cens3$state[ns==4][1:50] <- 999 deriv_error <- function(object){ if (!isTRUE(getOption("msm.test.analytic.derivatives"))) stop("msm.test.analytic.derivatives option not set") object$paramdata$deriv_test$error["nd"] } msm/tests/testthat/test_simul.R0000644000176200001440000000077114556702251016377 0ustar liggesuserstest_that("simfitted.msm",{ skip_on_cran() psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt) expect_equal(simfitted.msm(psor.msm)$time[1], psor$months[1]) psorc <- psor psorc$state[2] <- 99 psorc.msm <- msm(state ~ months, subject=ptnum, data=psorc, qmatrix = psor.q, covariates = ~ollwsdrt, censor=99) set.seed(1) simdat <- simfitted.msm(psorc.msm)$state[2] expect_equal(simdat, psorc$state[2]) }) msm/tests/testthat/test_utils.r0000644000176200001440000001655514472344730016456 0ustar liggesuserscontext("Distribution functions and utilities") test_that("MatrixExp",{ A <- matrix(c(-0.11, 0.01, 0.001, 0.2, -0.2, 0, 0, 0, 0), nrow=3, byrow=TRUE) me <- MatrixExp(A, method="pade") res <- c(0.896703832431769, 0.171397960992687, 0, 0.00856989804963433, 0.81957474998506, 0, 0.00094726269518597, 9.0272890222537e-05, 1) expect_equal(res, as.numeric(me), tol=1e-06) ev <- eigen(A) me2 <- ev$vectors %*% diag(exp(ev$values)) %*% solve(ev$vectors) expect_equal(me2, me, tol=1e-06) ## repeated eigenvalues A <- matrix(c(-0.1, 0.1, 0, 0.1, -0.1, 0, 0, 0, 0), nrow=3, byrow=TRUE) me <- MatrixExp(A, method="series") mep <- MatrixExp(A, method="pade") expect_equal(me, mep, tol=1e-06) }) test_that("truncated normal",{ suppressWarnings(RNGversion("3.5.0")) set.seed(220676) rl <- rnorm(10) expect_equal(dtnorm(rl), dnorm(rl), tol=1e-06) expect_equal(dtnorm(rl, mean=2, sd=1.2), dnorm(rl, mean=2, sd=1.2), tol=1e-06) d <- dtnorm(rl, mean=2, sd=1.2, lower=seq(-4,5)) expect_equal(c(0.260110259383406, 0.108097895222820, 0.0558659556833655, 0.160829438765247, 0.343919966894772, 0, 0, 0, 0, 0), d, tol=1e-06) expect_equal(c(0, 0.5, 1), ptnorm(c(-1000, 0, 1000)), tol=1e-06) expect_equal(c(0.139068959153926, 0, 0.156451685781240), ptnorm(c(-1, 0, 1), mean=c(0,1,2), sd=c(1,2,3), lower=c(-2,1,0)), tol=1e-06) expect_equal(rl, qtnorm(ptnorm(rl)), tol=1e-03) expect_warning(qtnorm(c(-1, 0, 1, 2)), "NaN") expect_warning(qtnorm(c(-1, 0, 1, 2),lower=-1,upper=1), "NaN") expect_equal(rl, qtnorm(ptnorm(rl, mean=1:10), mean=1:10)) ## NA handling in rtnorm expect_warning(rtnorm(3, mean=c(1, NA, 0)), "NAs produced") expect_warning(res <- rtnorm(3, sd=c(1, NA, 1), lower=c(NA, 0, 2)), "NAs produced") expect_equal(res[1:2], c(NaN, NaN)) ## Zero SDs in rtnorm expect_equal(rnorm(1, mean=1, sd=0), 1) expect_warning(rtnorm(1, mean=1, sd=0, lower=2), "NAs produced") }) test_that("Measurement error distributions: normal",{ expect_equal(dnorm(2), dmenorm(2), tol=1e-06) expect_equal(dnorm(2, log=TRUE), dmenorm(2, log=TRUE), tol=1e-06) expect_equal(c(0.0539909665131881, 0.241970724519143, 0.398942280401433), dmenorm(c(-2, 0, 2), mean=c(0,1,2)), tol=1e-06) expect_equal(c(0.119536494085260, 0.120031723608082, 0.0967922982964366), dmenorm(c(-2, 0, 2), mean=c(0,1,2), lower=c(-3,-2,-1), sderr=c(2,3,4)), tol=1e-06) expect_equal(pmenorm(c(-2, 0, 2)), pnorm(c(-2, 0, 2)), tol=1e-06) expect_equal(pmenorm(c(-2, 0, 2), log.p=TRUE), pnorm(c(-2, 0, 2), log.p=TRUE), tol=1e-06) expect_equal(pmenorm(c(-2, 0, 2), lower.tail=FALSE), pnorm(c(-2, 0, 2), lower.tail=FALSE), tol=1e-06) expect_equal(c(0.347443301205908, 0.500000000140865, 0.652556698813763), pmenorm(c(-2, 0, 2), sderr=5), tol=1e-06) expect_equal(c(0.00930146266876999, 0.0249300921973760, 0.0583322325986182), pmenorm(c(-2, 0, 2), sderr=5, meanerr=10), tol=1e-06) expect_equal(qmenorm(pmenorm(c(-2, 0, 2), sderr=5, lower=0), sderr=5, lower=0), qmenorm(pmenorm(c(-2, 0, 2))), tol=1e-03) }) test_that("Measurement error distributions: uniform",{ expect_equal(c(0,1,1,0,0), dmeunif(c(-2, 0, 0.7, 1, 2))) expect_equal(dunif(c(-2, 0, 0.7, 1, 2), min=-3:1, max=4:8), dmeunif(c(-2, 0, 0.7, 1, 2), lower=-3:1, upper=4:8), tol=1e-06) expect_equal(c(0.120192106440279, 0.139607083057178, 0.136490639905731, 0.120192106440279, 0.120192106440279), dmeunif(c(-2, 0, 0.7, 1, 2), lower=-3:1, upper=4:8, sderr=1), tol=1e-06) expect_equal(pmeunif(c(0.1, 0.5, 0.9)), punif(c(0.1, 0.5, 0.9)), tol=1e-04) expect_equal(c(0.468171571157871, 0.500000000120507, 0.531828429094026), pmeunif(c(0.1, 0.5, 0.9), sderr=5), tol=1e-06) expect_equal(c(0.0189218497312070, 0.0229301821964305, 0.0276311076816442), pmeunif(c(0.1, 0.5, 0.9), sderr=5, meanerr=10), tol=1e-06) expect_equal(c(0.1, 0.5, 0.9), qmeunif(pmeunif(c(0.1, 0.5, 0.9), sderr=5, lower=-1), sderr=5, lower=-1), tol=1e-03) expect_equal(c(0.1, 0.5, 0.9), qmeunif(pmeunif(c(0.1, 0.5, 0.9))), tol=1e-03) }) test_that("Exponential distribution with piecewise constant hazard",{ expect_equal(1, integrate(dpexp, 0, Inf)$value) rate <- c(0.1, 0.2, 0.05, 0.3) t <- c(0, 10, 20, 30) expect_equal(1, integrate(dpexp, 0, Inf, rate=rate, t=t)$value, tol=1e-04) x <- rexp(10) expect_equal(dpexp(x), dexp(x)) expect_equal(dpexp(x, log=TRUE), log(dpexp(x))) expect_equal(dpexp(x, log=TRUE), dexp(x, log=TRUE)) stopifnot(ppexp(-5) == 0) stopifnot(ppexp(0) == 0) stopifnot(ppexp(Inf) == 1) set.seed(22061976) q <- rexp(10) expect_equal(pexp(q), ppexp(q)) expect_equal(pexp(q, log.p=TRUE), ppexp(q, log.p=TRUE)) rate <- c(0.1, 0.2, 0.05, 0.3) t <- c(0, 10, 20, 30) stopifnot(ppexp(-5, rate, t) == 0) stopifnot(ppexp(0, rate, t) == 0) expect_equal(1, ppexp(Inf, rate, t)) expect_equal(1, ppexp(9999999, rate, t)) expect_equal(pexp(c(5, 6, 7), rate[1]), ppexp(c(5, 6, 7), rate, t)) expect_error(ppexp(q, rate=c(1,2,3), t=c(1,2)),"length of t must be equal to length of rate") expect_warning(ppexp(q, rate=-4),"NaN") expect_error(ppexp(q, rate=c(1,2,3), t=c(-1, 4, 6)), "first element of t should be 0") set.seed(22061976) p <- runif(10) expect_equal(qpexp(p), qexp(p), tol=1e-03) expect_equal(qpexp(p, lower.tail=FALSE), qexp(p, lower.tail=FALSE), tol=1e-03) expect_equal(qpexp(log(p), log.p=TRUE), qexp(log(p), log.p=TRUE), tol=1e-03) expect_equal(p, ppexp(qpexp(p)), tol=1e-03) set.seed(22061976) q <- rexp(10) expect_equal(q, qpexp(ppexp(q)), tol=1e-03) ## "special" argument to qgeneric r <- c(0.3,0.6,0.8,1.3) t <- c(0,2,3,5) expect_equal(qpexp(p = c(0.1,0.5,0.9,1) , rate=r, t=t), c(qpexp(p=0.1, rate=r, t=t), qpexp(p=0.5, rate=r, t=t), qpexp(p=0.9, rate=r, t=t), qpexp(p=1, rate=r, t=t))) expect_error(qpexp(p=0.1, rate=r, t=t[-1]), "length of t must be equal to length of rate") expect_error(qpexp(p=0.1, rate=r, t=c(0.1, t[-1])), "first element of t should be 0") set.seed(220676) rt <- rpexp(10) set.seed(220676) r <- rexp(10) expect_equal(rt, r, tol=1e-06) set.seed(12345) expect_equal(rpexp(1, rate=1:3, t = 0:2), 0.4418078, tol=1e-6) expect_equal(rpexp(1, rate=1:3, t = 1:3), 1.527473, tol=1e-6) expect_equal(rpexp(1, rate=0:2, t = 0:2), 1.808467, tol=1e-6) expect_equal(rpexp(1, rate=c(0.01,0), t = 0:1), Inf) expect_equal(rpexp(1, rate=1:3, t = 0:2, start=1.7), 1.927705, tol=1e-6) expect_equal(rpexp(1, rate=0:2, t = 0:2, start=4), 4.011969, tol=1e-6) }) test_that("deltamethod",{ ## Example in help(deltamethod) ## Simple linear regression, E(y) = alpha + beta x x <- 1:100 suppressWarnings(RNGversion("3.5.0")) set.seed(220676) y <- rnorm(100, 4*x, 5) toy.lm <- lm(y ~ x) (estmean <- coef(toy.lm)) (estvar <- summary(toy.lm)$cov.unscaled * summary(toy.lm)$sigma^2) ## Estimate of (1 / (alphahat + betahat)) expect_equal(0.206982798128202, as.numeric(1 / (estmean[1] + estmean[2]))) ## Approximate standard error expect_equal(0.0396485739892983, deltamethod(~ 1 / (x1 + x2), estmean, estvar)) estvar2 <- estvar; estvar2[1,2] <- Inf expect_equal(deltamethod(~ 1 / (x1 + x2), estmean, estvar2), Inf) }) msm/tests/testthat/test_msm2Surv.R0000644000176200001440000000126514471700042016773 0ustar liggesuserstest_that("msm2Surv example works",{ msmdat <- data.frame( subj = c(1, 1, 1, 1, 1, 2, 2, 2), days = c(0, 27, 75, 97, 1106, 0, 90, 1037), status = c(1, 2, 3, 4, 4, 1, 2, 2), age = c(66, 66, 66, 66, 69, 49, 49, 51), treat = c(1, 1, 1, 1, 1, 0, 0, 0) ) # transitions only allowed to next state up or state 4 Q <- rbind(c(1, 1, 0, 1), c(0, 1, 1, 1), c(0, 0, 1, 1), c(0, 0, 0, 0)) dat <- msm2Surv(data=msmdat, subject="subj", time="days", state="status", Q=Q) expect_true(inherits(dat, "msdata")) expect_equivalent(na.omit(as.vector(t(attr(dat, "trans")))), 1:5) }) msm/tests/testthat/test_draic.r0000644000176200001440000000267414471654445016403 0ustar liggesuserspsor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), control=list(fnscale=1)) ## Merge states 2 and 3 psor$state3 <- ifelse(psor$state==3, 2, ifelse(psor$state==4, 3, psor$state)) psor3.q <- psor.q[1:3,1:3] psor3.msm <- msm(state3 ~ months, subject=ptnum, data=psor, qmatrix = psor3.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1),ollwsdrt=c(1,1)), control=list(fnscale=1)) test_that("DRAIC",{ d <- draic.msm(psor.msm, psor3.msm) expect_true(is.numeric(d$draic)) dl <- draic.msm(psor.msm, psor3.msm, likelihood.only=TRUE) expect_equal(d$lik.restricted["complex","-LL"], dl[["complex"]]) expect_equal(as.numeric(dl[["complex"]]), 415.032735368145, tolerance=1e-06) expect_true(is.numeric(draic.msm(psor.msm, psor3.msm, tl=0.99)$ti["Lower"])) }) test_that("DRAIC with observed information", { skip_on_cran() expect_error(draic.msm(psor.msm, psor3.msm, information="observed"), NA) }) test_that("DRLCV",{ psor.msm <- msm(state ~ months, subject=ptnum, data=psor[1:29,], qmatrix = psor.q) psor3.msm <- msm(state3 ~ months, subject=ptnum, data=psor[1:29,], qmatrix = psor3.q) expect_error(drlcv.msm(psor.msm, psor3.msm, verbose=FALSE), NA) }) msm/tests/testthat/test_models_hmmmulti.r0000644000176200001440000001546114677770471020524 0ustar liggesuserscontext("HMMs with multivariate responses") ## Simulate data from a Markov model nsubj <- 30; nobspt <- 5 sim.df <- data.frame(subject = rep(1:nsubj, each=nobspt), time = seq(0, 20, length.out=nobspt)) suppressWarnings(RNGversion("3.5.0")) set.seed(1) two.q <- rbind(c(-0.1, 0.1), c(0, 0)) dat <- simmulti.msm(sim.df[,1:2], qmatrix=two.q, drop.absorb=FALSE) ## Bin(40, 0.1) for state 1, Bin(40, 0.5) for state 2 dat$obs1 <- dat$obs2 <- NA suppressWarnings(RNGversion("3.5.0")) set.seed(1) dat$obs1[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.1) dat$obs2[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.1) dat$obs1[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.5) dat$obs2[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.5) dat$obs <- cbind(obs1 = dat$obs1, obs2 = dat$obs2) dat$dobs1 <- dat$dobs2 <- NA suppressWarnings(RNGversion("3.5.0")) set.seed(1) ## Bin(40, 0.1) and Bin(40, 0.2) for state 1, dat$dobs1[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.1) dat$dobs2[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.2) ## Bin(40, 0.5) and Bin(40, 0.6) for state 2 dat$dobs1[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.6) dat$dobs2[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.5) dat$dobs <- cbind(dobs1 = dat$dobs1, dobs2 = dat$dobs2) options(msm.test.analytic.derivatives=TRUE) err <- 1e-04 test_that("HMMs with multiple responses from the same distribution",{ skip_if_not_installed("numDeriv") hmm <- msm(obs ~ time, subject=subject, data=dat, qmatrix=two.q, hmodel = list(hmmBinom(size=40, prob=0.2), hmmBinom(size=40, prob=0.2)), fixedpars=TRUE) expect_equal(hmm$minus2loglik, 4387.58552977954, tol=1e-06) expect_lt(deriv_error(hmm), err) print(hmmBinom(size=40, prob=0.2)) }) test_that("HMMs with multiple responses: cbind() in formula",{ skip_if_not_installed("numDeriv") hmm <- msm(cbind(obs1, obs2) ~ time, subject=subject, data=dat, qmatrix=two.q, hmodel = list(hmmBinom(size=40, prob=0.2), hmmBinom(size=40, prob=0.2)), fixedpars=TRUE) expect_equal(hmm$minus2loglik, 4387.58552977954, tol=1e-06) }) test_that("HMMs with multiple responses from different distributions",{ skip_if_not_installed("numDeriv") hmm <- msm(dobs ~ time, subject=subject, data=dat, qmatrix=two.q, hmodel = list(hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3))), fixedpars=TRUE) expect_equal(hmm$minus2loglik, 3767.11569380418, tol=1e-06) expect_lt(deriv_error(hmm), err) expect_error(msm(obs1 ~ time, subject=subject, data=dat, qmatrix=two.q, hmodel = list(hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3))), fixedpars=TRUE), "Only one column in state outcome data") print(hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3))) }) test_that("HMMs with multiple responses from different distributions: non-default initprobs, different probs",{ skip_if_not_installed("numDeriv") hmm <- msm(dobs ~ time, subject=subject, data=dat, qmatrix=two.q, initprobs=c(0.6, 0.4), hmodel = list(hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmMV(hmmBinom(size=40, prob=0.4), hmmBinom(size=40, prob=0.4))), fixedpars=TRUE) expect_lt(deriv_error(hmm), err) }) dat$dobsmiss <- dat$dobs dat$dobsmiss[1:10,2] <- NA test_that("HMMs with multiple responses from different distributions: missing data",{ skip_if_not_installed("numDeriv") hmm <- msm(dobsmiss ~ time, subject=subject, data=dat, qmatrix=two.q, hmodel = list(hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3))), fixedpars=TRUE) expect_lt(deriv_error(hmm), err) }) dat$obstrue <- NA obstimes <- seq(2, 147, by=5) # times when true state is known dat$obstrue[obstimes] <- dat$state[obstimes] test_that("HMMs with multiple responses: true state known sometimes",{ skip_if_not_installed("numDeriv") hmm <- msm(dobs ~ time, subject=subject, data=dat, qmatrix=two.q, obstrue=obstrue, hmodel = list(hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3))), fixedpars=TRUE) expect_equal(hmm$minus2loglik, 3804.03972787726, tol=1e-06) expect_lt(deriv_error(hmm), err) }) datd <- dat datd$dobs[c(5,10),1] <- 999 three.q <- rbind(cbind(two.q, c(0.1,0.1)), c(0,0,0)) options(msm.test.analytic.derivatives=NULL) test_that("HMMs with multiple responses: exact death and hmmIdent",{ hmm <- msm(dobs ~ time, subject=subject, data=datd, qmatrix=three.q, death = 3, hmodel = list(hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmIdent(999)), fixedpars=TRUE) expect_error(msm(dobs ~ time, subject=subject, data=datd, qmatrix=three.q, death = 3, hmodel = list(hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmPois(1)), fixedpars=TRUE), "States specified in \"deathexact\" should have the identity hidden distribution hmmIdent") }) ## censoring? test_that("hmm errors",{ expect_error(msm(obs ~ time, subject=subject, data=dat, qmatrix=two.q, hmodel = "wrong"), "should be a list") expect_error(msm(obs ~ time, subject=subject, data=dat, qmatrix=two.q, hmodel = list(hmmBinom(size=40, prob=0.2), hmmBinom(size=40, prob=0.2)), hcovariates="Wrong", fixedpars=TRUE), "should be a list") }) msm/tests/testthat/test_ppass.R0000644000176200001440000000475414535056671016406 0ustar liggesuserspsor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt) test_that("ppass.msm",{ pp <- ppass.msm(psor.msm, tot=10) pm <- pmatrix.msm(psor.msm, t=10) expect_equal(pp[,4], pm[,4]) # state 4 is absorbing pp <- ppass.msm(qmatrix=twoway4.q, tot=1000) expect_equal(pp[1,2], 0.5) expect_warning(ppass.msm(qmatrix=twoway4.q, tot=100, ci="normal"), "No fitted model supplied: not calculating confidence intervals") }) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt, pci=5) test_that("ppass.msm with pci",{ ## if tot is before 5, then do by hand qq <- qmatrix.msm(psor.msm, covariates=0, ci="none") qq[3,] <- 0 expect_equal(ppass.msm(psor.msm, tot=3, covariates=0)[,3], MatrixExp(qq, t=3)[,3]) ## if tot is 7, then do one cycle of piecewise p qq0 <- qmatrix.msm(psor.msm, covariates=0, ci="none") qq1 <- qmatrix.msm(psor.msm, covariates=list(ollwsdrt=0,timeperiod="[5,Inf)"), ci="none") qq0[3,] <- qq1[3,] <- 0 expect_equal( pmatrix.piecewise.msm(qlist = list(qq0,qq1), t1=0, t2=7, times=5)[,3], ppass.msm(psor.msm, tot=7, covariates=0, ci="none")[,3]) pp <- ppass.msm(psor.msm, tot=7, ci="normal", B=10) expect_gt(pp[["U"]][1,3], pp[["estimates"]][1,3] ) }) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt + months) test_that("ppass.msm with non-pci time-dependent models",{ qq0 <- qmatrix.msm(psor.msm, covariates=0, ci="none") qq1 <- qmatrix.msm(psor.msm, covariates=list(ollwsdrt=0,months=3), ci="none") qq0[3,] <- qq1[3,] <- 0 pp <- ppass.msm(psor.msm, tot=7, piecewise.times = 3, piecewise.covariates = list(list(ollwsdrt=0, months=0), list(ollwsdrt=0, months=3))) expect_equal(pp[,3], pmatrix.piecewise.msm(qlist = list(qq0,qq1), t1=0, t2=7, times=3)[,3], ) expect_error(ppass.msm(psor.msm, tot=7, piecewise.times = 3, piecewise.covariates = list(list(ollwsdrt=0, months=3))), "Number of covariate lists must be one greater") expect_error(ppass.msm(psor.msm, tot=7, piecewise.times = c(3,2), piecewise.covariates = list(list(ollwsdrt=0, months=3))), "times should be a vector of numbers in increasing order") }) msm/tests/testthat/test_tidy.R0000644000176200001440000001507114534652727016226 0ustar liggesuserstest_that("tidy.msm",{ psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2))) x <- tidy(psor.msm) expect_equal(x$estimate[x$parclass=="hr" & x$state==2 & x$term=="hieffusn"], hazard.msm(psor.msm)$hieffusn[2,"HR"]) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q) x <- tidy(psor.msm) expect_equal(x$conf.low[x$parclass=="intens" & x$state==2], qmatrix.msm(psor.msm)[["L"]][2,3]) }) test_that("tidy.msm with covariates called baseline or Baseline",{ psor$baseline <- psor$logbaseline <- psor$ollwsdrt psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~baseline) x <- tidy(psor.msm) expect_equal(x$estimate[x$parclass=="hr" & x$state==2 & x$term=="baseline"], hazard.msm(psor.msm)$baseline[2,"HR"]) psor$Baseline <- psor$ollwsdrt psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~Baseline) psor.msm x <- tidy(psor.msm) expect_equal(x$estimate[x$parclass=="hr" & x$state==2 & x$term=="Baseline"], hazard.msm(psor.msm)$Baseline[2,"HR"]) }) test_that("tidy.msm with misclassification models",{ misccov.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars=TRUE, misccovariates = ~dage + sex, misccovinits = list(dage=c(0.01,0.02,0.03,0.04), sex=c(-0.013,-0.014,-0.015,-0.016))) x <- tidy(misccov.msm) expect_equal(x$estimate[x$parclass=="misc" & x$state==2 & x$tostate==1], ematrix.msm(misccov.msm)[2,1][["estimate"]]) misccov.msm <- suppressWarnings(msm(state ~ years, subject = PTNUM, data = cav[1:500,], qmatrix = oneway4.q, ematrix=ematrix, deathexact = 4, fixedpars=FALSE, control=list(maxit=20), misccovariates = ~dage + sex)) x <- tidy(misccov.msm) expect_equal(x$conf.high[x$parclass=="misc" & x$state==2 & x$tostate==1], ematrix.msm(misccov.msm)[["U"]][2,1]) x <- ematrix.msm(misccov.msm) tx <- tidy(x) expect_equal(tx$conf.high[tx$state==3 & tx$tostate==2], x[["U"]][3,2]) x <- ematrix.msm(misccov.msm, ci="none") tx <- tidy(x) expect_equal(tx$estimate[tx$state==3 & tx$tostate==2], x[3,2]) }) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2))) test_that("Tidying extractor function output",{ x <- qmatrix.msm(psor.msm) tx <- tidy(x) expect_equal(tx$conf.low[tx$state==3], x[["L"]][3,4]) x <- qmatrix.msm(psor.msm, ci="none") tx <- tidy(x) expect_equal(tx$estimate[tx$state==3], x[3,4]) x <- pmatrix.msm(psor.msm) tx <- tidy(x) expect_equal(tx$estimate[tx$state==3 & tx$tostate==4], x[3,4]) x <- pmatrix.msm(psor.msm, ci="normal", B=10) tx <- tidy(x) expect_equal(tx$conf.low[tx$state==3 & tx$tostate==4], x[["L"]][3,4]) x <- pnext.msm(psor.msm) tx <- tidy(x) expect_equal(tx$estimate[tx$state==3 & tx$tostate==4], x[["estimates"]][3,4]) x <- pnext.msm(psor.msm, ci="none") tx <- tidy(x) expect_equal(tx$estimate[tx$state==3 & tx$tostate==4], x[["estimates"]][3,4]) x <- ppass.msm(psor.msm, tot=3) tx <- tidy(x) expect_equal(tx$estimate[tx$state==3 & tx$tostate==4], x[3,4]) x <- ppass.msm(psor.msm, tot=3, ci="normal", B=10) tx <- tidy(x) expect_equal(tx$conf.low[tx$state==3 & tx$tostate==4], x[["L"]][3,4]) }) test_that("tidy for HMMs",{ three.q <- rbind(c(0, exp(-6), exp(-9)), c(0, 0, exp(-6)), c(0, 0, 0)) hmodel3 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(999)) fev3.hid <- msm(fev ~ days, subject=ptnum, data=fev[1:1000,], qmatrix=three.q, deathexact=3, hmodel=hmodel3, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), fixedpars=FALSE, center=FALSE) tx <- tidy(fev3.hid) expect_equal(tx$estimate[tx$parclass=="hmm" & tx$state==2 & tx$term=="mean"], fev3.hid$hmodel$pars[[3]]) expect_equal(tx$conf.high[tx$parclass=="hmm" & tx$state==2 & tx$term=="sd"], fev3.hid$hmodel$ci[4,][2]) # initprobs fev3.hid <- suppressWarnings(msm(fev ~ days, subject=ptnum, data=fev[1:2000,], qmatrix=three.q, deathexact=3, hmodel=hmodel3, est.initprobs = TRUE, control=list(maxit=10))) tx <- tidy(fev3.hid) expect_equal(tx$estimate[tx$parclass=="initp" & tx$state==2], fev3.hid$hmodel$initprobs["State 2","Estimate"]) expect_equal(tx$conf.low[tx$parclass=="initp" & tx$state==2], fev3.hid$hmodel$initprobs["State 2","LCL"]) # initcovariates fev3.hid <- suppressWarnings(msm(fev ~ days, subject=ptnum, data=fev[1:3000,], qmatrix=three.q, exacttimes=TRUE, deathexact=3, hmodel=hmodel3, initcovariates = ~acute, est.initprobs = TRUE, control=list(maxit=100))) tx <- tidy(fev3.hid) expect_equal(tx$estimate[tx$parclass=="initpcov" & tx$state==2], fev3.hid$hmodel$icoveffect[[1]]) }) test_that("tidy prevalence.msm",{ x <- prevalence.msm(psor.msm) tx <- tidy(x) expect_equal(tx$expected[tx$output=="count" & tx$time==tx$time[8] & tx$state==2], x$Expected[8,"State 2"]) x <- prevalence.msm(psor.msm, ci="normal", B=3) tx <- tidy(x) expect_equal(tx$conf.high[tx$output=="count" & tx$time==tx$time[8] & tx$state==2], unname(x$Expected$ci[8,2,"97.5%"])) }) test_that("tidy totlos.msm",{ x <- totlos.msm(psor.msm) tx <- tidy(x) expect_equal(tx$estimate[tx$state==3], x[["State 3"]]) x <- totlos.msm(psor.msm, ci="normal", B=3) tx <- tidy(x) expect_equal(tx$conf.high[tx$state==3], x["97.5%",][["State 3"]]) x <- efpt.msm(psor.msm, tostate = 3) tx <- tidy(x) expect_equal(x[3], tx$estimate[tx$state==3]) x <- efpt.msm(psor.msm, tostate = 3, ci="normal", B=3) tx <- tidy(x) expect_equal(unname(x[3,2]), tx$conf.high[tx$state==2]) x <- envisits.msm(psor.msm) tx <- tidy(x) expect_equal(tx$estimate[tx$state==3], x[["State 3"]]) }) msm/tests/testthat/test_boot.R0000644000176200001440000000106114527617326016210 0ustar liggesuserstest_that("bootstrap iterations that returned an error are dropped",{ suppressWarnings( psor.msm <- msm(state ~ months, subject=ptnum, data=psor[1:100,], qmatrix = rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)), covariates = ~ollwsdrt+hieffusn,fixedpars=FALSE, control=list(maxit=10)) ) random_error <- function(x){if (rbinom(1,1,0.5)) stop("Error") else 1} set.seed(1) suppressWarnings( q.list <- boot.msm(psor.msm, random_error, B=10) ) expect_lt(length(q.list), 10) }) msm/tests/test_base.R0000644000176200001440000000004614471426252014313 0ustar liggesuserslibrary(testthat) test_check("msm") msm/MD50000644000176200001440000003124414713226252011366 0ustar liggesusersc460517ff8c3020244e6e94197b5a792 *ChangeLog 56d5575d0b4dd6df338b9eed050e5251 *DESCRIPTION ba68affc323cb18703bb8ce285ddc6c3 *NAMESPACE ae66bb9f50cfb5e2be7a908a55f76eab *NEWS.md fe6538df6d5986f08a80b06008d303eb *R/MatrixExp.R 804d3c05e8871b43b42ab7c9eec4e683 *R/boot.R 195856200de56a64f8e3edc91c2b4bcd *R/constants.R 6576b076ade0bcc5898ba43f111a9eb0 *R/datasets_doc.R 9ecab1073a44633a5e4c5e6de779cd6b *R/deltamethod.R a08dd2901a339ab646c19e1aca5f9600 *R/draic.R 4b2dd9e0ac2f2e2184234198784885f0 *R/efpt.R 26d7c5c7a18aea3205b5deae2c974ebe *R/hmm-dists.R 13a9c790db5c2a9a1d99f4fd4c9d7682 *R/hmm.R 86b8594428fd449f22a8000c3c9843ba *R/hmodel2list.R b9d1f85b1a9dd9576957f71f92e41331 *R/internals_doc.R bbb47f9ac55e99da25b98a2beb994917 *R/medists.R 385a5afaed084d25a47eefbd266a5cec *R/msm-package.R 68580dbe9a25627a39f971dfe6c06faf *R/msm.R 1d480b306cb40db15ca3775896e8bd47 *R/mstate.R 571f18753afb0509b3a4ceb6785f77b7 *R/olddata.R 83f719dabd7e192a7c32129a62c466a2 *R/optim.R ade4dccbfe5064a2f1bbfa5528c2e3c8 *R/outputs.R 0db922267cab1c50a28ea28e1812f87d *R/pearson.R 2e0945cb46b3b01252f810cbd6b53c0b *R/pexp.R 167b7c6fbf38b3422d8d90eea22c419b *R/phase.R 61688d877055719744e5b235f4561c04 *R/plot.R feaee3c1951399a4e0d3c90d52fd05a1 *R/ppass.R a4448a7eefa8ad133d15ca0739c9f100 *R/prevalence.R a7f4c205027719da9ee0a923dbe5611c *R/print.R eeaa4f3318e19923de36453293122379 *R/qgeneric.R caa401192f3b4c7970a3f13459f0a81a *R/scoreresid.R 360f9a2eebedabf9334dbb311ebeccfe *R/simul.R 04baad7340cde7406455f4773eaa3b11 *R/summary.R 9a08105c5d3e245f589e7fd9ab881d1c *R/tidy.R 1a66ee18778a0c1fc8517e82218a6a45 *R/tnorm.R 9e96194ff444d83260e430c2c00757cc *R/totlos.R 9fdf10e329189a10900c3e422b0158e5 *R/utils.R b6457d18b1d4dfb79a53619bbd329664 *R/viterbi.R 781171cc53a5c873fcdc8b6168009d00 *build/vignette.rds 2e83efb31c764734aa67ed4e686c7fc1 *data/bos3.rda 21080bd2b47eb8885142701c92c14c73 *data/bos4.rda 35ea8ffa25baf02ee38f4ccb5fdc0446 *data/msmdata.rda 06e7302ddafa6ae8bfa42e939b85d471 *inst/CITATION 2966ec2a2cadc89a000931d448391350 *inst/NEWS c6f3ba1f30060fa77a0c818724d9581d *inst/doc/msm-manual.R 268e2df5718977ebab0977db5378ccfe *inst/doc/msm-manual.Rnw aaf55dc6b860ef5b2a3c0fd69c5dd5c1 *inst/doc/msm-manual.pdf ca2b9d76ae4df2b4f1adef54f7053fb7 *man/MatrixExp.Rd 19ba7f5fa9359a7000e43475b3263ba8 *man/aneur.Rd f4dd5dd30b7ae85b4ea0ca78611c17cb *man/boot.msm.Rd e7907155ffc75a9faf6a373470136c9f *man/bos.Rd 02d24561533028332418d37073774af0 *man/cav.Rd 8bc7f5712686b151b8f4dcf47e10b767 *man/cmodel.object.Rd 5dc3f3dbefbf2f9d7b8a19308cc3af7d *man/coef.msm.Rd eaa82462d84ece5dd38a97aac043aafe *man/crudeinits.msm.Rd a12f8ac8ee230e6d5afe8528622bf81f *man/deltamethod.Rd ba092d092755c1de260ac5e5b3868507 *man/draic.msm.Rd 3056e9823647e58e1812106031644b2e *man/ecmodel.object.Rd 28402a2aeb52afb849b71dfa0984a001 *man/efpt.msm.Rd cf0da56cb6e6f1f9cf2e96274fd1fa51 *man/ematrix.msm.Rd 85149777554455a68adbec7864d8ca8e *man/emodel.object.Rd cf4bd366ea36544829820d09c232ad9e *man/fev.Rd 97cb47e80306f89ef440f84aebad3ba6 *man/hazard.msm.Rd 83c36ab2281352f06937afb740c03858 *man/hmm-dists.Rd 0727d813e72f07da04f71745db23e8c2 *man/hmmMV.Rd 1896f37dcf626b5959a569307f5bf664 *man/hmodel.object.Rd 7d1867d548ba869c1157191bca073237 *man/hmodel2list.Rd a96b19c599d136c37bf4990ec867ba57 *man/logLik.msm.Rd f79dc33f15f8191179ced2735fbeb24d *man/lrtest.msm.Rd b2f75f121d8059ad424efefb9075d80e *man/medists.Rd 0e18d3398c098554fa2f53e9d4f865a5 *man/model.frame.msm.Rd d23fdda7bd1cb3ae6b16c1a20d611ead *man/msm-package.Rd 3577acdb987abab747e81ba38881ee70 *man/msm.Rd 692d62427000a680f4e85a69ebfd7065 *man/msm.form.qoutput.Rd 30e8148739de058bba564518e2a479cc *man/msm.object.Rd 09bd2d87685ed25837a82a7122d7c281 *man/msm2Surv.Rd 8f8cb4958e1bac05cdd00f1f8844e286 *man/odds.msm.Rd be47855ba7a8c62248dae1d5684bad6c *man/paramdata.object.Rd b21cb14de84903225cfe73879d1bef18 *man/pearson.msm.Rd 6513034f0ba33b5f4d61c36da5510c7d *man/pexp.Rd 55e1c4c91a8a6d5b54ea186b9d773e5e *man/phasemeans.msm.Rd 3d24d0a22a6a1d7a23fd8b2423b114af *man/plot.msm.Rd 27c1cf9918583e3ee10968df789b981d *man/plot.prevalence.msm.Rd 9ef8af9bff16afd8b54009e553d79acb *man/plot.survfit.msm.Rd 9cf33082cba416e7327fef55ff58c3b5 *man/plotprog.msm.Rd 7a542520a88f454534605ee2bc3288ee *man/pmatrix.msm.Rd b044bb485dc59811d3e310d9215bb48d *man/pmatrix.piecewise.msm.Rd 9cb1e95b823dd41fe81faff5ea8786b8 *man/pnext.msm.Rd 7939b3bf03adfb19fcbae5978f4a5251 *man/ppass.msm.Rd aea2827cf02e7519831fca7d95a57124 *man/prevalence.msm.Rd 428ed0fd5118866be58879ef620841c1 *man/print.msm.Rd cecf635205952247dac8c2f1824c9a3b *man/printold.msm.Rd 239f49812e60c74546605c27ff6a94ef *man/psor.Rd a398b47e460223fddf20faa5e91a927e *man/qcmodel.object.Rd 40575b7f9c3ced3b2531b245606c2f36 *man/qgeneric.Rd 373485f5333dc08230e5c9285ea6457f *man/qmatrix.msm.Rd 25f47223ec14158d64b07474a01724ac *man/qmodel.object.Rd 9dae1e056c5a4c21395d4dcee7209eb0 *man/qratio.msm.Rd 800a46c91f4bc84da09ed2efd256b6dc *man/recreate.olddata.Rd a95e72a29774e3af6d288b34b9745a25 *man/scoreresid.msm.Rd c000e57607ad3b3ae8fc2c8d0539cda0 *man/sim.msm.Rd d583cabc6e6c1799f3d308c0075a7c8c *man/simfitted.msm.Rd 3c6b0f2d22e296c57b055e4ceada1990 *man/simmulti.msm.Rd e28c92b709a68a70e89b5d11f6cfff21 *man/sojourn.msm.Rd d333a32e275eff0ba628671956667b1b *man/statetable.msm.Rd 39d1b657e072933c4e7051e3c5052f32 *man/summary.msm.Rd b70b31a7f80e4443c30ed38d7f6d5b41 *man/surface.msm.Rd a6febb155dcf68f64e56a0da74fcb520 *man/tidy.msm.Rd b7180a2593cf94ee4a57641fb560a946 *man/tidy.msm.est.Rd c4a04f6c4fcaeefb88558a5e187e94bd *man/tidy.msm.estbystate.Rd a5054f6a625427b7e5608c3cbe23df3a *man/tidy.msm.prevalence.Rd 86b475056924d8b048d27afa579aaa47 *man/tnorm.Rd d4514b299415116e2d57e64d8c5a0c74 *man/totlos.msm.Rd 8a0ccaa3140e2605ad2f7818851d1968 *man/transient.msm.Rd 013f38d2dd2ae26e461fb3b55f71d289 *man/twophase.Rd facd9e11c5df7528e6021f3dd38b12c3 *man/updatepars.msm.Rd 1836ff84ce2a880ef1a9279f1464376e *man/viterbi.msm.Rd 619d13ce6900fca2139e2139408d39ad *src/Makevars 2054ebf3d8d6a436017347d05cd8f512 *src/analyticp.c 5ff6242e5b1d05358bab24dd3be8bccd *src/expm.h 7addf00a0875818aa1e78c9d3f5ff0a8 *src/hmm.c 082ac588d4bd343cd0676d01213a1e91 *src/hmm.h 40084d7909dfcf8a82c7e329e706d316 *src/hmmderiv.c 9ae2352a2da6924041a57e6ec609cc32 *src/lik.c fee896c3be93271eb27bc40d85b8520f *src/msm-init.c 2887681d68abdf90ce7df7fa13e82843 *src/msm.h 6dd79e9b7c97b58c19c64ff2f92bf440 *src/pijt.c 7a2c53c3ce4c4dd37a62ef4dfcc35ce3 *tests/test_base.R cd00af64ec331af182dafd74c77107f8 *tests/testthat/helper.r e63e537aa0930b05fff245a23619ea07 *tests/testthat/test_analyticp.r e2c81ab5ca5fc13977db33116a39dd2b *tests/testthat/test_boot.R 04f8c782394158413e836b845d4479a2 *tests/testthat/test_datasumm.r ae716fa7b3ac8067ae614bb0a6f76866 *tests/testthat/test_deriv.r 937966194b0c4897040751a795709bfc *tests/testthat/test_draic.r 12f117aa64759bcd6f4ea82c292cc247 *tests/testthat/test_hmodel2list.R 816c9aa73c147b1c49bb2894c6c78f03 *tests/testthat/test_models.r e500bed26455440902491d358566d54a *tests/testthat/test_models_hmm.r 5966c98916c1421e8bc2277b373bb289 *tests/testthat/test_models_hmmmulti.r abe663b515b493b9485f195a147f25bd *tests/testthat/test_models_misc.r e069a0dee4b17c02a6ecb377c01478f1 *tests/testthat/test_msm2Surv.R bcc8e77b4055031ebe4d00b79e70de4a *tests/testthat/test_pearson.R ab4b73a8d65d1c3cce2ca122bfa986a2 *tests/testthat/test_phase.R 45a06c42888ce5525282cd52207bc7b4 *tests/testthat/test_ppass.R 2d88c2ca5d88ff1be44e3bd73e8aee04 *tests/testthat/test_simul.R b25cab5de6435014a6c5d6da501d41f7 *tests/testthat/test_tidy.R 2063dc77210f491c90f04c26865ae214 *tests/testthat/test_utils.r ce824132995f8521b0054dc54992ae84 *tests/testthat/test_viterbi.R b513402f9fe37f688cb186152e431854 *tests/testthat/test_weights.R abf5c593f0f0d810b47aa8e8bf50999a *vignettes/Sweave-local.sty e0052e8fc1fae86b46fd0aba280c5692 *vignettes/figures/dags/p2q1.odg 6f316449798c364e529b327f94f3e28f *vignettes/figures/dags/p2q1.pdf 2bcbdcf47e6974c3b548de41c465a7ee *vignettes/figures/dags/p2q1.ps cd238727969774b0647a895c0211494f *vignettes/figures/dags/p2q12.odg 99d920032a621204386887c3633714b3 *vignettes/figures/dags/p2q12.pdf 3778109cb33481c0290b538e5ba9de56 *vignettes/figures/dags/p2q12.ps eae87a29049543ec1a3ec2801ef3eae3 *vignettes/figures/dags/p3q12.odg a66ba5ec09755d664674a71e263d1175 *vignettes/figures/dags/p3q12.pdf d4e331d0f31dc43533366d2f41b9f26f *vignettes/figures/dags/p3q12.ps 6404bd1b7d0408c1b1ec45551000f43e *vignettes/figures/dags/p3q124.odg a4d012a17281f0ccedd3467b9cd470ed *vignettes/figures/dags/p3q124.pdf 24c522cd83f8106d85adcc70affcdc4d *vignettes/figures/dags/p3q124.ps f2159d3a9aa130e284abd09ff480bab4 *vignettes/figures/dags/p3q1246.odg b73b4e87467382e9ff339027847e9325 *vignettes/figures/dags/p3q1246.pdf 8a8d3ff84fb77f83a38d4b0e771306bf *vignettes/figures/dags/p3q1246.ps f5ea2548e172d6d93ef7bd3cdbbeb7d7 *vignettes/figures/dags/p3q135.odg f0f7efaae9b19f153bd6bb6f08b2dbd1 *vignettes/figures/dags/p3q135.pdf d17d4b05b60c2ea687a2184fdb8b9fe6 *vignettes/figures/dags/p3q135.ps fba3e0895db0bd7f169a890ad03287b6 *vignettes/figures/dags/p3q14.odg 50dee61bda0c6b1d8514fda04f64e9e2 *vignettes/figures/dags/p3q14.pdf 42dc346ef9a84eb555f109eca6ab253c *vignettes/figures/dags/p3q14.ps 240b6e76d6d8f46eb940fb3a37133849 *vignettes/figures/dags/p3q16.odg e1e57ad78e297d74968968bc77cff8fa *vignettes/figures/dags/p3q16.pdf f3bd67b551c8f333531fd972e5f5e9b3 *vignettes/figures/dags/p3q16.ps 58e91c96d35338e07a026d0c63ea2dea *vignettes/figures/dags/p4q13569.odg 93d11351873b96458bd32af02ee81b98 *vignettes/figures/dags/p4q13569.pdf 7352324901bcf719815e028e70d35e0e *vignettes/figures/dags/p4q13569.ps 39afd3f1bee833a8cbb491014a844386 *vignettes/figures/dags/p4q159.odg 7e8e8019849d1d5b0618206da5b62138 *vignettes/figures/dags/p4q159.pdf fd243cfa8f962f195c74977c9cc710f0 *vignettes/figures/dags/p4q159.ps 8310504068e4a60514cdc55155f2089e *vignettes/figures/dags/p5q1_4_6_8_11_12_16.odg f56ba00423a56c860f50fd744102b66b *vignettes/figures/dags/p5q1_4_6_8_11_12_16.pdf 2f9617b50cb64d6c5a33a84fc1874430 *vignettes/figures/dags/p5q1_4_6_8_11_12_16.ps 79269e8048c339d5b68b4d04f77502a6 *vignettes/figures/dags/p5q1_6_11_16.odg 1f46c751b525d843cbcac57e25e104a6 *vignettes/figures/dags/p5q1_6_11_16.pdf d3eb1119555c563bfbd434d6c1b6ad44 *vignettes/figures/dags/p5q1_6_11_16.ps f51e573e1ee0416774241ab15065ba25 *vignettes/figures/dags/p5q1_6_7_11_12.odg 4b90822210633b471edcadc410258f99 *vignettes/figures/dags/p5q1_6_7_11_12.pdf 9c4de94e3dce8d1adad3e08458e24766 *vignettes/figures/dags/p5q1_6_7_11_12.ps 3f41f9a36481dd33390cfaf81ee2ca5c *vignettes/figures/fev_viterbi.pdf 58492d16e59e4fbbaf6bec498afd436d *vignettes/figures/general.eps e3889cf40ff59689f1a6cfac011c7115 *vignettes/figures/general.pdf 06f4bff6b071901d1120c7431193c59d *vignettes/figures/hidden.pdf 617de047188fd38e66a6bc687d449669 *vignettes/figures/hidden.ps 691da9f48c3e9592810c8d8b87337dc2 *vignettes/figures/illdeath.eps af3adf546c0c77610b76919d15607a18 *vignettes/figures/illdeath.pdf 21b77d1ce79130c2ca239c0675f11e6e *vignettes/figures/multistate.eps 2d8ca6ab876fe50cf7bfee4724fdcbc3 *vignettes/figures/multistate.pdf f700cbb68eb80b74cb0879ed2ca7fb04 *vignettes/figures/p2q1.eps 8ec73693aa663c3a367f7bd5ea663c7c *vignettes/figures/p2q1.pdf 0bf2f40965070379fd1e1b2632187194 *vignettes/figures/p2q12.eps 7f89c5f85f787b2b41c623cbf366d042 *vignettes/figures/p2q12.pdf fe947efe77d0a5f76864fde47a41bf30 *vignettes/figures/p3q12.eps 04f638273c713543f6dad7c71778df07 *vignettes/figures/p3q12.pdf 3bd5bdd12fc5bca6317205fbc11be88d *vignettes/figures/p3q124.eps 98c0baea7a7468465b6d5fba30a62cfa *vignettes/figures/p3q124.pdf d03d816972e4ed184f339da7e3096d88 *vignettes/figures/p3q1246.eps 634cc49ae5959dbfaab98007521e3150 *vignettes/figures/p3q1246.pdf af7ec57beb1bc7307c342a4b7fc9abef *vignettes/figures/p3q135.eps 0ae4b74fa9984b26cdaf3a37ef0ec733 *vignettes/figures/p3q135.pdf 370378f12f9e8c20dc721a6117609aa0 *vignettes/figures/p3q14.eps 5178056951a81e36e697d91d6f655348 *vignettes/figures/p3q14.pdf 4893a2f5ddbcebb454debb76e23e354f *vignettes/figures/p3q16.eps 1d88c1377297306389a460a8a5598ff2 *vignettes/figures/p3q16.pdf a153b95b87e76c38a19922d1af19fbda *vignettes/figures/p4q13569.eps a54418b47ce58e6fa28c500af30d5566 *vignettes/figures/p4q13569.pdf 116a887d8a095a8e65f26cad5e7ed019 *vignettes/figures/p4q159.eps 0bbc74d48ecbcee9199ebea6811bf377 *vignettes/figures/p4q159.pdf d4326b78b1bf427a26518702dcabc2ee *vignettes/figures/p5q1_4_6_8_11_12_16.eps 684cf4d5299dab735d4ddf4fdaedcca4 *vignettes/figures/p5q1_4_6_8_11_12_16.pdf ec84497da69d66cce67b111baa86b8dc *vignettes/figures/p5q1_6_11_16.eps 3fa510d2be43accb7ce3cbbe125c93a5 *vignettes/figures/p5q1_6_11_16.pdf 963d4adc9b148996dce630c797d89dbb *vignettes/figures/p5q1_6_7_11_12.eps 2de6c2326f3031d048c31b507d6a2f20 *vignettes/figures/p5q1_6_7_11_12.pdf 2ea085b4ec235c4882c6a0958c9362a5 *vignettes/figures/sampling.pdf 338ee5ff690c41f8e65fcfe97b84a394 *vignettes/figures/sampling.ps 268e2df5718977ebab0977db5378ccfe *vignettes/msm-manual.Rnw 9ca7c43342d24a72789969e55f295ac0 *vignettes/msm.bib msm/R/0000755000176200001440000000000014713146127011255 5ustar liggesusersmsm/R/deltamethod.R0000644000176200001440000001146614527612472013706 0ustar liggesusers#' The delta method #' #' Delta method for approximating the standard error of a transformation #' \eqn{g(X)} of a random variable \eqn{X = (x_1, x_2, \ldots)}{X = (x1, x2, #' \ldots)}, given estimates of the mean and covariance matrix of \eqn{X}. #' #' The delta method expands a differentiable function of a random variable #' about its mean, usually with a first-order Taylor approximation, and then #' takes the variance. For example, an approximation to the covariance matrix #' of \eqn{g(X)} is given by #' #' \deqn{ Cov(g(X)) = g'(\mu) Cov(X) [g'(\mu)]^T }{ Cov(g(X)) = g'(mu) Cov(X) #' [g'(mu)]^T } #' #' where \eqn{\mu}{mu} is an estimate of the mean of \eqn{X}. This function #' uses symbolic differentiation via \code{\link{deriv}}. #' #' A limitation of this function is that variables created by the user are not #' visible within the formula \code{g}. To work around this, it is necessary #' to build the formula as a string, using functions such as \code{sprintf}, #' then to convert the string to a formula using \code{as.formula}. See the #' example below. #' #' If you can spare the computational time, bootstrapping is a more accurate #' method of calculating confidence intervals or standard errors for #' transformations of parameters. See \code{\link{boot.msm}}. Simulation from #' the asymptotic distribution of the MLEs (see e.g. Mandel 2013) is also a #' convenient alternative. #' #' @param g A formula representing the transformation. The variables must be #' labelled \code{x1, x2,\dots{}} For example, #' #' \code{~ 1 / (x1 + x2)} #' #' If the transformation returns a vector, then a list of formulae representing #' (\eqn{g_1, g_2, \ldots}{g1, g2, \ldots}) can be provided, for example #' #' \code{list( ~ x1 + x2, ~ x1 / (x1 + x2) )} #' @param mean The estimated mean of \eqn{X} #' @param cov The estimated covariance matrix of \eqn{X} #' @param ses If \code{TRUE}, then the standard errors of \eqn{g_1(X), #' g_2(X),\ldots}{g1(X), g2(X),\ldots} are returned. Otherwise the covariance #' matrix of \eqn{g(X)} is returned. #' @return A vector containing the standard errors of \eqn{g_1(X), g_2(X), #' \ldots}{g1(X), g2(X), \ldots} or a matrix containing the covariance of #' \eqn{g(X)}. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @references Oehlert, G. W. (1992) \emph{A note on the delta method}. #' American Statistician 46(1). #' #' Mandel, M. (2013) \emph{Simulation based confidence intervals for functions #' with complicated derivatives.} The American Statistician 67(2):76-81. #' @keywords math #' @examples #' #' #' ## Simple linear regression, E(y) = alpha + beta x #' x <- 1:100 #' y <- rnorm(100, 4*x, 5) #' toy.lm <- lm(y ~ x) #' estmean <- coef(toy.lm) #' estvar <- summary(toy.lm)$cov.unscaled * summary(toy.lm)$sigma^2 #' #' ## Estimate of (1 / (alphahat + betahat)) #' 1 / (estmean[1] + estmean[2]) #' ## Approximate standard error #' deltamethod (~ 1 / (x1 + x2), estmean, estvar) #' #' ## We have a variable z we would like to use within the formula. #' z <- 1 #' ## deltamethod (~ z / (x1 + x2), estmean, estvar) will not work. #' ## Instead, build up the formula as a string, and convert to a formula. #' form <- sprintf("~ %f / (x1 + x2)", z) #' form #' deltamethod(as.formula(form), estmean, estvar) #' #' #' @export deltamethod deltamethod <- function(g, # a formula or list of formulae (functions) giving the transformation g(x) in terms of x1, x2, etc mean, # mean, or maximum likelihood estimate, of x cov, # covariance matrix of x ses=TRUE # return standard errors, else return covariance matrix ) { ## Var (G(x)) = G'(mu) Var(X) G'(mu)^T cov <- as.matrix(cov) n <- length(mean) if (!is.list(g)) g <- list(g) if ( (dim(cov)[1] != n) || (dim(cov)[2] != n) ) stop(paste("Covariances should be a ", n, " by ", n, " matrix")) syms <- paste("x",1:n,sep="") for (i in 1:n) assign(syms[i], mean[i]) gdashmu <- t(sapply(g, function( form ) { as.numeric(attr(eval( ## Differentiate each formula in the list deriv(form, syms) ## evaluate the results at the mean ), "gradient")) ## and build the results row by row into a Jacobian matrix })) new.covar <- gdashmu %*% cov %*% t(gdashmu) if (ses){ new.se <- sqrt(diag(new.covar)) new.se } else new.covar } msm/R/plot.R0000644000176200001440000002774214654456033012376 0ustar liggesusers### Estimated survival probability from each state #' Plots of multi-state models #' #' This produces a plot of the expected probability of survival against time, #' from each transient state. Survival is defined as not entering an absorbing #' state. #' #' Note that while this function is only relevant to models with absorbing #' states, models in \pkg{msm} can have any transition structure and do not #' necessarily have to have an absorbing state. #' #' #' @param x Output from \code{\link{msm}}, representing a fitted multi-state #' model object. #' @param from States from which to consider survival. Defaults to the complete #' set of transient states. #' @param to Absorbing state to consider. Defaults to the highest-labelled #' absorbing state. #' @param range Vector of two elements, giving the range of times to plot for. #' @param covariates Covariate values for which to evaluate the expected #' probabilities. This can either be:\cr #' #' the string \code{"mean"}, denoting the means of the covariates in the data #' (this is the default),\cr #' #' the number \code{0}, indicating that all the covariates should be set to #' zero,\cr #' #' or a list of values, with optional names. For example #' #' \code{list (60, 1)} #' #' where the order of the list follows the order of the covariates originally #' given in the model formula, or a named list, #' #' \code{list (age = 60, sex = 1)} #' @param legend.pos Vector of the \eqn{x} and \eqn{y} position, respectively, #' of the legend. #' @param xlab x axis label. #' @param ylab y axis label. #' @param lwd Line width. See \code{\link{par}}. #' @param ... Other arguments to be passed to the generic \code{\link{plot}} #' and \code{\link{lines}} functions. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}} #' @keywords models #' @export plot.msm <- function(x, from=NULL, to=NULL, range=NULL, covariates="mean", legend.pos=NULL, xlab="Time", ylab="Fitted survival probability", lwd=1,...) { if (!inherits(x, "msm")) stop("expected x to be a msm model") if (is.null(from)) from <- transient.msm(x) else { if (!is.numeric(from)) stop("from must be numeric") if (any (! (from %in% 1:x$qmodel$nstates ) ) ) stop("from must be a vector of states in 1, ..., ", x$qmodel$nstates) } if (is.null(to)){ if (length(absorbing.msm(x))==0) stop("\"to\" not specified, and no absorbing state. See help(plot.msm)") to <- max(absorbing.msm(x)) } else { if (!is.numeric(to)) stop("to must be numeric") if (! (to %in% absorbing.msm(x) ) ) stop("to must be an absorbing state") } if (is.null(range)) rg <- range(model.extract(x$data$mf, "time")) else { if (!is.numeric(range) || length(range)!= 2) stop("range must be a numeric vector of two elements") rg <- range } timediff <- (rg[2] - rg[1]) / 50 times <- seq(rg[1], rg[2], timediff) pr <- numeric() cols <- rainbow(length(from)) for (t in times) pr <- c(pr, pmatrix.msm(x, t, times[1], covariates)[from[1], to]) plot(times, 1 - pr, type="l", xlab=xlab, ylab=ylab, lwd=lwd, ylim=c(0,1), lty = 1, col=cols[1],...) lt <- 2 for (st in from[-1]){ pr <- numeric() for (t in times) pr <- c(pr, pmatrix.msm(x, t, times[1], covariates)[st, to]) lines(times, 1 - pr, type="l", lty = lt, lwd=lwd, col=cols[lt],...) lt <- lt+1 } if (!is.numeric(legend.pos) || length(legend.pos) != 2) legend.pos <- c(max(times) - 15*timediff, 1) legend(legend.pos[1], legend.pos[2], legend=paste("From state",from), lty = seq(lt-1), col=cols, lwd=lwd) invisible() } ### Plot KM estimate of time to first occurrence of each state #' Kaplan Meier estimates of incidence #' #' Compute and plot Kaplan-Meier estimates of the probability that each #' successive state has not occurred yet. #' #' If the data represent observations of the process at arbitrary times, then #' the first occurrence of the state in the data will usually be greater than #' the actual first transition time to that state. Therefore the probabilities #' plotted by \code{\link{plotprog.msm}} will be overestimates. #' #' @param formula A formula giving the vectors containing the observed states #' and the corresponding observation times. For example, #' #' \code{state ~ time} #' #' Observed states should be in the set \code{1, \dots{}, n}, where \code{n} is #' the number of states. #' @param subject Vector of subject identification numbers for the data #' specified by \code{formula}. If missing, then all observations are assumed #' to be on the same subject. These must be sorted so that all observations on #' the same subject are adjacent. #' @param data An optional data frame in which the variables represented by #' \code{state}, \code{time} and \code{subject} can be found. #' @param legend.pos Vector of the \eqn{x} and \eqn{y} position, respectively, #' of the legend. #' @param xlab x axis label. #' @param ylab y axis label. #' @param lwd Line width. See \code{\link{par}}. #' @param xlim x axis limits, e.g. c(0,10) for an axis ranging from 0 to 10. #' Default is the range of observation times. #' @param mark.time Mark the empirical survival curve at each censoring point, #' see \code{\link[survival]{lines.survfit}}. #' @param ... Other arguments to be passed to the \code{\link{plot}} and #' \code{\link[survival]{lines.survfit}} functions. #' @seealso \code{\link[survival]{survfit}}, #' \code{\link[survival]{plot.survfit}} #' @keywords models #' @export plotprog.msm <- function(formula, subject, data, legend.pos=NULL, xlab="Time", ylab="1 - incidence probability", lwd=1, xlim=NULL, mark.time=TRUE, ...) { data <- na.omit(data) mf <- model.frame(formula, data=data) state <- mf[,1] time <- mf[,2] if (!is.null(data)) subject <- eval(substitute(subject), as.list(data), parent.frame()) subject <- match(subject, unique(subject)) rg <- range(time) if (is.null(xlim)) xlim=rg plot(0, xlim=xlim, ylim=c(0,1), type="n", xlab=xlab, ylab=ylab, ...) states <- sort(unique(state))[-1] cols <- rainbow(length(states)) for (i in states) { dat <- cbind(subject, time, state) st <- as.data.frame( do.call("rbind", by(dat, subject, function(x) { c(anystate = if(any(x[,"state"]>=i)) 1 else 0, mintime = if(any(x[,"state"]>=i)) min(x[x[,"state"] >= i, "time"]) else max(x[,"time"])) } ))) # slow lines(survfit(Surv(st$mintime,st$anystate) ~ 1), col=cols[i-1], lty=i-1, lwd=lwd, mark.time=mark.time, ...) } timediff <- (rg[2] - rg[1]) / 50 if (!is.numeric(legend.pos) || length(legend.pos) != 2) legend.pos <- c(max(time) - 25*timediff, 1) legend(legend.pos[1], legend.pos[2], lty=states-1, lwd=lwd, col=cols, legend=paste("To state", states, c(rep("or greater", length(states)-1), ""))) invisible() } ### Likelihood surface plots #' Explore the likelihood surface #' #' Plot the log-likelihood surface with respect to two parameters. #' #' Draws a contour or perspective plot. Useful for diagnosing irregularities #' in the likelihood surface. If you want to use these plots before running #' the maximum likelihood estimation, then just run \code{msm} with all #' estimates fixed at their initial values. #' #' \code{contour.msm} just calls surface.msm with \code{type = "contour"}. #' #' \code{persp.msm} just calls surface.msm with \code{type = "persp"}. #' #' \code{image.msm} just calls surface.msm with \code{type = "image"}. #' #' As these three functions are methods of the generic functions #' \code{contour}, \code{persp} and \code{image}, they can be invoked as #' \code{contour(x)}, \code{persp(x)} or \code{image(x)}, where \code{x} is a #' fitted \code{msm} object. #' #' @aliases surface.msm persp.msm contour.msm image.msm #' @param x Output from \code{\link{msm}}, representing a fitted msm model. #' @param params Integer vector with two elements, giving the indices of the #' parameters to vary. All other parameters will be fixed. Defaults to #' \code{c(1,2)}, representing the first two log transition intensities. See #' the \code{fixedpars} argument to \code{msm} for a definition of these #' indices. #' @param np Number of grid points to use in each direction, by default 10. An #' \code{np x np} grid will be used to evaluate the likelihood surface. If 100 #' likelihood function evaluations is slow, then reduce this. #' @param type Character string specifying the type of plot to produce. #' \tabular{ll}{ \code{"contour"} \tab Contour plot, using the R function #' \code{\link{contour}}. \cr \code{"filled.contour"} \tab Solid-color contour #' plot, using the R function \code{\link{filled.contour}}. \cr \code{"persp"} #' \tab Perspective plot, using the R function \code{\link{persp}}. \cr #' \code{"image"} \tab Grid color plot, using the R function #' \code{\link{image}}. \cr } #' @param point Vector of length \code{n}, where \code{n} is the number of #' parameters in the model, including the parameters that will be varied here. #' This specifies the point at which to fix the likelihood. By default, this #' is the maximum likelihood estimates stored in the fitted model \code{x}, #' \code{x$estimates}. #' @param xrange Range to plot for the first varied parameter. Defaults to #' plus and minus two standard errors, obtained from the Hessian at the maximum #' likelihood estimate. #' @param yrange Range to plot for the second varied parameter. Defaults to #' plus and minus two standard errors, obtained from the Hessian at the maximum #' likelihood estimate. #' @param ... Further arguments to be passed to the plotting function. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}}, \code{\link{contour}}, #' \code{\link{filled.contour}}, \code{\link{persp}}, \code{\link{image}}. #' @keywords models #' @export surface.msm <- function(x, params=c(1,2), np=10, type=c("contour","filled.contour","persp","image"), point=NULL, xrange=NULL, yrange=NULL,...) { type <- match.arg(type) if (is.null(point)) point <- x$paramdata$opt$par se <- sqrt(diag(x$covmat[x$paramdata$optpars,x$paramdata$optpars])) i1 <- params[1]; i2 <- params[2] if (is.null(xrange)) { pmin <- point[i1] - 2*se[i1] pmax <- point[i1] + 2*se[i1] p1 <- seq(pmin, pmax, length.out=np) } else p1 <- seq(xrange[1], xrange[2], length.out=np) if (is.null(yrange)){ pmin <- point[i2] - 2*se[i2] pmax <- point[i2] + 2*se[i2] p2 <- seq(pmin, pmax, length.out=np) } else p2 <- seq(yrange[1], yrange[2], length.out=np) z <- matrix(nrow=np, ncol=np) for (i in 1:np) { for (j in 1:np) { point[i1] <- p1[i]; point[i2] <- p2[j] z[i,j] <- -0.5*Ccall.msm(point, "lik", expand.data(x), x$qmodel, x$qcmodel, x$cmodel, x$hmodel, x$paramdata) } } switch(type, contour = contour(p1, p2, z, ...), filled.contour = filled.contour(p1, p2, z, ...), image = image(p1, p2, z, ...), persp = persp(p1, p2, z, zlab="Log-likelihood",...) ) invisible() } #' @rdname surface.msm #' @export contour.msm <- function(x, ...) { surface.msm(x, type="contour",...) } #' @rdname surface.msm #' @export persp.msm <- function(x, ...) { surface.msm(x, type="persp",...) } #' @rdname surface.msm #' @export image.msm <- function(x, ...) { surface.msm(x, type="image",...) } msm/R/hmodel2list.R0000644000176200001440000000677614535132511013640 0ustar liggesusers#' Convert a hmodel object to HMM constructor function calls #' #' @param hmodel A list of class \code{hmodel}, as returned in the \code{hmodel} component of the #' fitted model object from \code{\link{msm}}. #' #' @param hmmdist \code{TRUE} or \code{FALSE} (see "Value" section). #' #' @returns #' #' If \code{hmmdist=TRUE}, returns a list of objects of class \code{hmmdist}. #' These are the kind of objects #' returned by HMM constructor functions such #' as \code{\link{hmmNorm}}, \code{\link{hmmPois}} etc. Therefore the list can be #' passed as the \code{hmodel} argument to \code{\link{msm}}. #' #' If \code{hmmdist=FALSE}, returns a list comprised of the corresponding input #' arguments for the constructor functions, i.e. parameter values of HMM emission #' distributions. The list has one element per state. Each of these elements #' has one element per parameter (for univariate HMMs), or one element per outcome #' distribution, which in turn has one element per parameter (for multivariate HMMs). #' #' @author Will Hulme \code{https://github.com/wjchulme} and Chris Jackson. #' #' @export hmodel2list <- function(hmodel, hmmdist = TRUE){ if(!hmodel$hidden) stop("`hmodel` is not an msm hidden Markov model object") ## makes a state-specific vector of parameters extracted from hmodel ## into a list of parameters (treating hmmCat as a special case) makeargslist <- function(params, label){ ## params = named vector of parameters for the distribution function ## label = label (character) of the distribution function if(!(label %in% .msm.HMODELFNS$label)) stop("Distribution ", label, " not currently supported for hmodel2list") if(label=="categorical") list(prob = params[names(params) %in% c("p", "p0", "pbase")], basecat = params[names(params)=="basecat"]) else if(label=="identity") list(x = params[names(params) == "which"]) else as.list(params) } labellist <- as.list(na.omit(as.vector(hmodel$labels))) paramlist <- split(hmodel$pars, list(hmodel$parout, hmodel$parstate)) paramlist <- paramlist[sapply(paramlist, length)>0] # for e.g. hmmMV mixed with hmmIdent paramnestedlist <- mapply(makeargslist, paramlist, labellist, SIMPLIFY=FALSE, USE.NAMES=FALSE) distlist <- lapply(labellist, function(label){ match.fun(.msm.HMODELFNS$hmmname[.msm.HMODELFNS$label==label]) }) if(hmodel$mv){ hmmdistlist <- invoke_map_base(distlist, paramnestedlist) hmmdistnestedlist <- split(hmmdistlist, rep(seq_len(hmodel$nstates), times=hmodel$nout)) msmlist <- lapply(hmmdistnestedlist, function(hmmdist){lift_dl_base(msm::hmmMV)(hmmdist)}) if(hmmdist) msmlist else split(paramnestedlist, rep(seq_len(hmodel$nstates), times=hmodel$nout)) } else { if(hmmdist) invoke_map_base(distlist, paramnestedlist) else paramnestedlist } } ## base R rewrites of functions originally in purrr invoke_map_base <- function(fnlist, paramlist){ reslist <- vector(length(fnlist), mode="list") for (i in seq_along(reslist)) reslist[[i]] <- do.call(fnlist[[i]], paramlist[[i]]) reslist } lift_dl_base <- function (..f, ..., .unnamed = FALSE) { force(..f) defaults <- list(...) function(.x = list(), ...) { if (.unnamed) { .x <- unname(.x) } do.call("..f", c(.x, defaults, list(...))) } } msm/R/hmm-dists.R0000644000176200001440000004746014535132301013307 0ustar liggesusers #' Hidden Markov model constructors #' #' These functions are used to specify the distribution of the response #' conditionally on the underlying state in a hidden Markov model. A list of #' these function calls, with one component for each state, should be used for #' the \code{hmodel} argument to \code{msm}. The initial values for the #' parameters of the distribution should be given as arguments. Note the #' initial values should be supplied as literal values - supplying them as #' variables is currently not supported. #' #' \code{hmmCat} represents a categorical response distribution on the set #' \code{1, 2, \dots{}, length(prob)}. The Markov model with misclassification #' is an example of this type of model. The categories in this case are (some #' subset of) the underlying states. #' #' The \code{hmmIdent} distribution is used for underlying states which are #' observed exactly without error. For hidden Markov models with multiple #' outcomes, (see \code{\link{hmmMV}}), the outcome in the data which takes the #' special \code{hmmIdent} value must be the first of the multiple outcomes. #' #' \code{hmmUnif}, \code{hmmNorm}, \code{hmmLNorm}, \code{hmmExp}, #' \code{hmmGamma}, \code{hmmWeibull}, \code{hmmPois}, \code{hmmBinom}, #' \code{hmmTNorm}, \code{hmmNBinom} and \code{hmmBeta} represent Uniform, #' Normal, log-Normal, exponential, Gamma, Weibull, Poisson, Binomial, #' truncated Normal, negative binomial and beta distributions, respectively, #' with parameterisations the same as the default parameterisations in the #' corresponding base R distribution functions. #' #' \code{hmmT} is the Student t distribution with general mean \eqn{\mu}{mu}, #' scale \eqn{\sigma}{sigma} and degrees of freedom \code{df}. The variance is #' \eqn{\sigma^2 df/(df + 2)}{sigma^2 df/(df + 2)}. Note the t distribution in #' base R \code{\link{dt}} is a standardised one with mean 0 and scale 1. #' These allow any positive (integer or non-integer) \code{df}. By default, #' all three parameters, including \code{df}, are estimated when fitting a #' hidden Markov model, but in practice, \code{df} might need to be fixed for #' identifiability - this can be done using the \code{fixedpars} argument to #' \code{\link{msm}}. #' #' The \code{hmmMETNorm} and \code{hmmMEUnif} distributions are truncated #' Normal and Uniform distributions, but with additional Normal measurement #' error on the response. These are generalisations of the distributions #' proposed by Satten and Longini (1996) for modelling the progression of CD4 #' cell counts in monitoring HIV disease. See \code{\link{medists}} for #' density, distribution, quantile and random generation functions for these #' distributions. See also \code{\link{tnorm}} for density, distribution, #' quantile and random generation functions for the truncated Normal #' distribution. #' #' See the PDF manual \file{msm-manual.pdf} in the \file{doc} subdirectory for #' algebraic definitions of all these distributions. New hidden Markov model #' response distributions can be added to \pkg{msm} by following the #' instructions in Section 2.17.1. #' #' Parameters which can be modelled in terms of covariates, on the scale of a #' link function, are as follows. #' #' \tabular{ll}{ PARAMETER NAME \tab LINK FUNCTION \cr \code{mean} \tab #' identity \cr \code{meanlog} \tab identity \cr \code{rate} \tab log \cr #' \code{scale} \tab log \cr \code{meanerr} \tab identity \cr \code{meanp} \tab #' logit \cr \code{prob} \tab logit or multinomial logit } #' #' Parameters \code{basecat, lower, upper, size, meanerr} are fixed at their #' initial values. All other parameters are estimated while fitting the hidden #' Markov model, unless the appropriate \code{fixedpars} argument is supplied #' to \code{msm}. #' #' For categorical response distributions \code{(hmmCat)} the outcome #' probabilities initialized to zero are fixed at zero, and the probability #' corresponding to \code{basecat} is fixed to one minus the sum of the #' remaining probabilities. These remaining probabilities are estimated, and #' can be modelled in terms of covariates via multinomial logistic regression #' (relative to \code{basecat}). #' #' @name hmm-dists #' @aliases hmm-dists hmmCat hmmIdent hmmUnif hmmNorm hmmLNorm hmmExp hmmGamma #' hmmWeibull hmmPois hmmBinom hmmTNorm hmmMETNorm hmmMEUnif hmmNBinom #' hmmBetaBinom hmmBeta hmmT #' @param prob (\code{hmmCat}) Vector of probabilities of observing category #' \code{1, 2, \dots{}, length(prob)} respectively. Or the probability #' governing a binomial or negative binomial distribution. #' @param basecat (\code{hmmCat}) Category which is considered to be the #' "baseline", so that during estimation, the probabilities are parameterised #' as probabilities relative to this baseline category. By default, the #' category with the greatest probability is used as the baseline. #' @param x (\code{hmmIdent}) Code in the data which denotes the #' exactly-observed state. #' @param mean (\code{hmmNorm,hmmLNorm,hmmTNorm}) Mean defining a Normal, or #' truncated Normal distribution. #' @param sd (\code{hmmNorm,hmmLNorm,hmmTNorm}) Standard deviation defining a #' Normal, or truncated Normal distribution. #' @param meanlog (\code{hmmNorm,hmmLNorm,hmmTNorm}) Mean on the log scale, for #' a log Normal distribution. #' @param sdlog (\code{hmmNorm,hmmLNorm,hmmTNorm}) Standard deviation on the #' log scale, for a log Normal distribution. #' @param rate (\code{hmmPois,hmmExp,hmmGamma}) Rate of a Poisson, Exponential #' or Gamma distribution (see \code{\link{dpois}}, \code{\link{dexp}}, #' \code{\link{dgamma}}). #' @param shape (\code{hmmPois,hmmExp,hmmGamma}) Shape parameter of a Gamma or #' Weibull distribution (see \code{\link{dgamma}}, \code{\link{dweibull}}). #' @param shape1,shape2 First and second parameters of a beta distribution (see #' \code{\link{dbeta}}). #' @param scale (\code{hmmGamma}) Scale parameter of a Gamma distribution (see #' \code{\link{dgamma}}), or unstandardised Student t distribution. #' @param df Degrees of freedom of the Student t distribution. #' @param size Order of a Binomial distribution (see \code{\link{dbinom}}). #' @param disp Dispersion parameter of a negative binomial distribution, also #' called \code{size} or \code{order}. (see \code{\link{dnbinom}}). #' @param meanp Mean outcome probability in a beta-binomial distribution #' @param sdp Standard deviation describing the overdispersion of the outcome #' probability in a beta-binomial distribution #' @param lower (\code{hmmUnif,hmmTNorm,hmmMEUnif}) Lower limit for an Uniform #' or truncated Normal distribution. #' @param upper (\code{hmmUnif,hmmTNorm,hmmMEUnif}) Upper limit for an Uniform #' or truncated Normal distribution. #' @param sderr (\code{hmmMETNorm,hmmUnif}) Standard deviation of the Normal #' measurement error distribution. #' @param meanerr (\code{hmmMETNorm,hmmUnif}) Additional shift in the #' measurement error, fixed to 0 by default. This may be modelled in terms of #' covariates. #' @return Each function returns an object of class \code{hmmdist}, which is a #' list containing information about the model. The only component which may #' be useful to end users is \code{r}, a function of one argument \code{n} #' which returns a random sample of size \code{n} from the given distribution. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}} #' @references Satten, G.A. and Longini, I.M. Markov chains with measurement #' error: estimating the 'true' course of a marker of the progression of human #' immunodeficiency virus disease (with discussion) \emph{Applied Statistics} #' 45(3): 275-309 (1996). #' #' Jackson, C.H. and Sharples, L.D. Hidden Markov models for the onset and #' progresison of bronchiolitis obliterans syndrome in lung transplant #' recipients \emph{Statistics in Medicine}, 21(1): 113--128 (2002). #' #' Jackson, C.H., Sharples, L.D., Thompson, S.G. and Duffy, S.W. and Couto, E. #' Multi-state Markov models for disease progression with classification error. #' \emph{The Statistician}, 52(2): 193--209 (2003). #' @keywords distribution NULL ### Categorical distribution on the set 1,...,n #' @rdname hmm-dists #' @export hmmCat <- function(prob, basecat) { label <- "categorical" prob <- lapply(prob, eval) p <- unlist(prob) if (any(p < 0)) stop("non-positive probability") if (all(p == 0)) stop("insufficient positive probabilities") p <- p / sum(p) ncats <- length(p) link <- "log" # covariates are added to log odds relative to baseline in lik.c(AddCovs) cats <- seq(ncats) basei <- if (missing(basecat)) which.max(p) else which(cats==basecat) r <- function(n, rp=p) sample(cats, size=n, prob=rp, replace=TRUE) pars <- c(ncats, basei, p) plab <- rep("p", ncats) plab[p==0] <- "p0" plab[basei] <- "pbase" names(pars) <- c("ncats", "basecat", plab) hdist <- list(label=label, pars=pars, link=link, r=r) ## probabilities are always pars[c(3,3+pars[0])] class(hdist) <- "hmmdist" hdist } ### Constructor for a standard univariate distribution (i.e. not hmmCat) hmmDIST <- function(label, link, r, call, ...) { call <- c(as.list(call), list(...)) miss.pars <- which ( ! (.msm.HMODELPARS[[label]] %in% names(call)[-1]) ) if (length(miss.pars) > 0) { stop("Parameter ", .msm.HMODELPARS[[label]][min(miss.pars)], " for ", call[[1]], " not supplied") } pars <- unlist(lapply(call[.msm.HMODELPARS[[label]]], eval)) names(pars) <- .msm.HMODELPARS[[label]] hmmCheckInits(pars) hdist <- list(label = label, pars = pars, link = link, r = r) class(hdist) <- "hmmdist" hdist } ### Multivariate distribution composed of independent univariates #' Multivariate hidden Markov models #' #' Constructor for a a multivariate hidden Markov model (HMM) where each of the #' \code{n} variables observed at the same time has a (potentially different) #' standard univariate distribution conditionally on the underlying state. The #' \code{n} outcomes are independent conditionally on the hidden state. #' #' If a particular state in a HMM has such an outcome distribution, then a call #' to \code{\link{hmmMV}} is supplied as the corresponding element of the #' \code{hmodel} argument to \code{\link{msm}}. See Example 2 below. #' #' A multivariate HMM where multiple outcomes at the same time are generated #' from the \emph{same} distribution is specified in the same way as the #' corresponding univariate model, so that \code{\link{hmmMV}} is not required. #' The outcome data are simply supplied as a matrix instead of a vector. See #' Example 1 below. #' #' The outcome data for such models are supplied as a matrix, with number of #' columns equal to the maximum number of arguments supplied to the #' \code{\link{hmmMV}} calls for each state. If some but not all of the #' variables are missing (\code{NA}) at a particular time, then the observed #' data at that time still contribute to the likelihood. The missing data are #' assumed to be missing at random. The Viterbi algorithm may be used to #' predict the missing values given the fitted model and the observed data. #' #' Typically the outcome model for each state will be from the same family or #' set of families, but with different parameters. Theoretically, different #' numbers of distributions may be supplied for different states. If a #' particular state has fewer outcomes than the maximum, then the data for that #' state are taken from the first columns of the response data matrix. However #' this is not likely to be a useful model, since the number of observations #' will probably give information about the underlying state, violating the #' missing at random assumption. #' #' Models with outcomes that are dependent conditionally on the hidden state #' (e.g. correlated multivariate normal observations) are not currently #' supported. #' #' #' @param ... The number of arguments supplied should equal the maximum number #' of observations made at one time. Each argument represents the univariate #' distribution of that outcome conditionally on the hidden state, and should #' be the result of calling a univariate hidden Markov model constructor (see #' \code{\link{hmm-dists}}). #' @return A list of objects, each of class \code{hmmdist} as returned by the #' univariate HMM constructors documented in \code{\link{hmm-dists}}. The #' whole list has class \code{hmmMVdist}, which inherits from \code{hmmdist}. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{hmm-dists}},\code{\link{msm}} #' @references Jackson, C. H., Su, L., Gladman, D. D. and Farewell, V. T. #' (2015) On modelling minimal disease activity. Arthritis Care and Research #' (early view). #' @keywords distribution #' @examples #' #' ## Simulate data from a Markov model #' nsubj <- 30; nobspt <- 5 #' sim.df <- data.frame(subject = rep(1:nsubj, each=nobspt), #' time = seq(0, 20, length=nobspt)) #' set.seed(1) #' two.q <- rbind(c(-0.1, 0.1), c(0, 0)) #' dat <- simmulti.msm(sim.df[,1:2], qmatrix=two.q, drop.absorb=FALSE) #' #' ### EXAMPLE 1 #' ## Generate two observations at each time from the same outcome #' ## distribution: #' ## Bin(40, 0.1) for state 1, Bin(40, 0.5) for state 2 #' dat$obs1[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.1) #' dat$obs2[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.1) #' dat$obs1[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.5) #' dat$obs2[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.5) #' dat$obs <- cbind(obs1 = dat$obs1, obs2 = dat$obs2) #' #' ## Fitted model should approximately recover true parameters #' msm(obs ~ time, subject=subject, data=dat, qmatrix=two.q, #' hmodel = list(hmmBinom(size=40, prob=0.2), #' hmmBinom(size=40, prob=0.2))) #' #' ### EXAMPLE 2 #' ## Generate two observations at each time from different #' ## outcome distributions: #' ## Bin(40, 0.1) and Bin(40, 0.2) for state 1, #' dat$obs1 <- dat$obs2 <- NA #' dat$obs1[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.1) #' dat$obs2[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.2) #' #' ## Bin(40, 0.5) and Bin(40, 0.6) for state 2 #' dat$obs1[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.6) #' dat$obs2[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.5) #' dat$obs <- cbind(obs1 = dat$obs1, obs2 = dat$obs2) #' #' ## Fitted model should approximately recover true parameters #' msm(obs ~ time, subject=subject, data=dat, qmatrix=two.q, #' hmodel = list(hmmMV(hmmBinom(size=40, prob=0.3), #' hmmBinom(size=40, prob=0.3)), #' hmmMV(hmmBinom(size=40, prob=0.3), #' hmmBinom(size=40, prob=0.3))), #' control=list(maxit=10000)) #' #' @export hmmMV hmmMV <- function(...){ args <- list(...) if (any(sapply(args, class) != "hmmdist")) stop("All arguments of \"hmmMV\" should be HMM distribution objects") class(args) <- c("hmmMVdist","hmmdist") args } hmmCheckInits <- function(pars) { for (i in names(pars)) { if (!is.numeric(pars[i])) stop("Expected numeric values for all parameters") else if (i %in% .msm.INTEGERPARS) { if (!identical(all.equal(pars[i], round(pars[i])), TRUE)) stop("Value of ", i, " should be integer") } ## Range check now done in msm.form.hranges } } #' @rdname hmm-dists #' @export hmmIdent <- function(x) { hmm <- hmmDIST(label = "identity", link = "identity", r = function(n)rep(x, n), match.call()) hmm$pars <- if (missing(x)) numeric() else x names(hmm$pars) <- if(length(hmm$pars)>0) "which" else NULL hmm } #' @rdname hmm-dists #' @export hmmUnif <- function(lower, upper) { hmmDIST (label = "uniform", link = "identity", r = function(n) runif(n, lower, upper), match.call()) } #' @rdname hmm-dists #' @export hmmNorm <- function(mean, sd) { hmmDIST (label = "normal", link = "identity", r = function(n, rmean=mean) rnorm(n, rmean, sd), match.call()) } #' @rdname hmm-dists #' @export hmmLNorm <- function(meanlog, sdlog) { hmmDIST (label = "lognormal", link = "identity", r = function(n, rmeanlog=meanlog) rlnorm(n, rmeanlog, sdlog), match.call()) } #' @rdname hmm-dists #' @export hmmExp <- function(rate) { hmmDIST (label = "exponential", link = "log", r = function(n, rrate=rate) rexp(n, rrate), match.call()) } #' @rdname hmm-dists #' @export hmmGamma <- function(shape, rate) { hmmDIST (label = "gamma", link = "log", r = function(n, rrate=rate) rgamma(n, shape, rrate), match.call()) } #' @rdname hmm-dists #' @export hmmWeibull <- function(shape, scale) { hmmDIST (label = "weibull", link = "log", r = function(n, rscale=scale) rweibull(n, shape, rscale), match.call()) } #' @rdname hmm-dists #' @export hmmPois <- function(rate) { hmmDIST (label = "poisson", link = "log", r = function(n, rrate=rate) rpois(n, rrate), match.call()) } #' @rdname hmm-dists #' @export hmmBinom <- function(size, prob) { hmmDIST (label = "binomial", link = "qlogis", r = function(n, rprob=prob) rbinom(n, size, rprob), match.call()) } #' @rdname hmm-dists #' @export hmmBetaBinom <- function(size, meanp, sdp) { hmmDIST (label = "betabinomial", link = "qlogis", r = function(n) rbinom(n, size, rbeta(n, meanp/sdp, (1-meanp)/sdp)), match.call()) } #' @rdname hmm-dists #' @export hmmNBinom <- function(disp, prob) { hmmDIST (label = "nbinom", link = "qlogis", r = function(n, rprob=prob) rnbinom(n, disp, rprob), match.call()) } #' @rdname hmm-dists #' @export hmmBeta <- function(shape1, shape2) { hmmDIST (label = "beta", link = "log", r = function(n) rbeta(n, shape1, shape2), match.call()) } #' @rdname hmm-dists #' @export hmmTNorm <- function(mean, sd, lower=-Inf, upper=Inf) { hmmDIST (label = "truncnorm", link = "identity", r = function(n, rmean=mean) rtnorm(n, rmean, sd, lower, upper), match.call(), lower=lower, upper=upper) } #' @rdname hmm-dists #' @export hmmMETNorm <- function(mean, sd, lower, upper, sderr, meanerr=0) { hmmDIST (label = "metruncnorm", link = "identity", r = function(n, rmeanerr=meanerr) rnorm(n, rmeanerr + rtnorm(n, mean, sd, lower, upper), sderr), match.call(), meanerr=meanerr) } #' @rdname hmm-dists #' @export hmmMEUnif <- function(lower, upper, sderr, meanerr=0) { hmmDIST (label = "meuniform", link = "identity", r = function(n, rmeanerr=meanerr) rnorm(n, rmeanerr + runif(n, lower, upper), sderr), match.call(), meanerr=meanerr) } #' @rdname hmm-dists #' @export hmmT <- function(mean, scale, df) { hmmDIST(label="t", link="identity", r = function(n, rmean=mean) { rmean + scale*rt(n,df) }, match.call()) } msm/R/print.R0000644000176200001440000003235414534663125012546 0ustar liggesusers #' Print a fitted msm model object #' #' Print a fitted msm model object (in old format, from msm 1.3.1 and earlier) #' #' See \code{\link{print.msm}} for a better and cleaner output format, and an #' explanation of the change. #' #' @param x Output from \code{\link{msm}}, representing a fitted multi-state #' model object. #' @param ... Other arguments to be passed to \code{\link{format}}. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{print.msm}} #' @keywords models #' @export printold.msm <- function(x, ...) { cat("\nCall:\n", deparse(x$call), "\n\n", sep = "") if (!attr(x,"fixed")) { cat ("Maximum likelihood estimates: \n") covmessage <- if (x$qcmodel$ncovs == 0) "" else paste("with covariates set to", (if (x$center) "their means" else "0")) for (i in c("baseline", x$qcmodel$covlabels)) { title <- if (i == "baseline") paste("Transition intensity matrix",covmessage,"\n") else paste("Log-linear effects of", i, "\n") cat (title, "\n") print_ci(x$Qmatrices[[i]], x$QmatricesL[[i]], x$QmatricesU[[i]]) cat("\n") } if (x$emodel$misc) { misccovmessage <- if (x$ecmodel$ncovs == 0) "" else paste("with covariates set to", (if (x$center) "their means" else "0")) for (i in c("baseline", x$ecmodel$covlabels)) { title <- if (i == "baseline") paste("Misclassification matrix",misccovmessage,"\n") else paste("Effects of", i, "on log (P(state r)/P(baseline state))\n") cat (title, "\n") print_ci(x$Ematrices[[i]], x$EmatricesL[[i]], x$EmatricesU[[i]]) cat("\n") } if (any(x$paramdata$plabs[x$paramdata$optpars] == "initp")) { cat("Initial state occupancy probabilities\n\n") print(x$hmodel$initprobs) cat("\n") if (any(x$hmodel$nicovs > 0)) { cat("Covariates on logit initial state probabilities\n") print(x$hmodel$icoveffect) } cat("\n") } } else if (x$hmodel$hidden && is.null(x$qmodel$phase.states)) { print(x$hmodel); cat("\n") } } cat ("-2 * log-likelihood: ", x$minus2loglik, "\n") # cat("[Note: a cleaner summary is available from \"printnew.msm\",\n which will be the default in future versions.]\n") } ### Convert three-transition-matrices (estimate,lower,upper) format to three-columns format mattotrans <- function(x, matrix, lower=NULL, upper=NULL, fixed=NULL, keep.diag=FALSE, intmisc="intens"){ imat <- if (intmisc=="intens") x$qmodel$imatrix else x$emodel$imatrix if (keep.diag) diag(imat) <- as.numeric(rowSums(imat) > 0) keep <- which(t(imat)==1, arr.ind=TRUE) keep <- keep[,2:1,drop=FALSE] # order by row(from-state), not column(to-state) fromlabs <- rownames(imat)[keep[,1]] tolabs <- colnames(imat)[keep[,2]] res <- matrix(nrow=sum(imat), ncol=4) rnames <- if (intmisc=="intens") paste(fromlabs, "-", tolabs) else paste("Obs", tolabs, "|", fromlabs) dimnames(res) <- list(rnames, c("Estimate", "L", "U","Fixed")) res[,1] <- matrix[keep] if (!is.null(lower)) res[,2] <- lower[keep] if (!is.null(upper)) res[,3] <- upper[keep] if (!is.null(fixed)) res[,4] <- fixed[keep] res } ### Format transition intensities and their covariate effects in one tidy matrix #' Extract msm model parameter estimates in compact format #' #' Extract estimates and confidence intervals for transition intensities (or #' misclassification probabilities), and their covariate effects, in a tidy #' matrix format with one row per transition. This is used by the print method #' (\code{\link{print.msm}}) for \code{msm} objects. Covariate effects are #' returned as hazard or odds ratios, not on the log scale. #' #' #' @aliases msm.form.qoutput msm.form.eoutput #' @param x A fitted multi-state model object, as returned by #' \code{\link{msm}}. #' @param covariates Covariate values defining the "baseline" parameters (see #' \code{\link{qmatrix.msm}}). #' @param cl Width of the symmetric confidence interval to present. Defaults #' to 0.95. #' @param digits Minimum number of significant digits for the formatted #' character matrix returned as an attribute. This is passed to #' \code{\link{format}}. Defaults to 4. #' @param ... Other arguments to be passed to \code{\link{format}}. #' @return A numeric matrix with one row per transition, and one column for #' each estimate or confidence limit. The \code{"formatted"} attribute #' contains the same results formatted for pretty printing. #' \code{msm.form.qoutput} returns the transition intensities and their #' covariates, and \code{msm.form.eoutput} returns the misclassification #' probabilities and their covariates. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{print.msm}} #' @keywords models #' @export msm.form.qoutput <- function(x, covariates="mean", cl=0.95, digits=4, ...){ qbase <- qmatrix.msm(x, covariates=covariates, cl=cl) if (is.null(x$QmatricesFixed)) x <- msm.form.output(x, "intens") # for back-compat with pre 1.4.1 model objects y <- mattotrans(x, qbase$estimates, qbase$L, qbase$U, qbase$fixed, keep.diag=TRUE) ret <- data.frame(base=y) fres <- matrix("", nrow=nrow(y), ncol=x$qcmodel$ncovs+1) covlabels <- make.unique(c("Baseline", x$qcmodel$covlabels))[-(1)] colnames(fres) <- c("Baseline", covlabels) rownames(fres) <- rownames(y) fres[,1] <- format.ci(y[,1],y[,2],y[,3],y[,4],digits=digits,...) im <- t(x$qmodel$imatrix); diag(im) <- -colSums(im); nd <- which(im[im!=0]==1) for (i in seq(length.out=x$qcmodel$ncovs)){ nm <- x$qcmodel$covlabels[[i]] nmout <- covlabels[[i]] ## FIXME if Baseline is a cov, then Qmatrices are unaffected ## but output should be changed. ret sohuld be named by covlabels hrs <- mattotrans(x, x$Qmatrices[[nm]], x$QmatricesL[[nm]], x$QmatricesU[[nm]], x$QmatricesFixed[[nm]], keep.diag=FALSE) hrs[,1:3] <- exp(hrs[,1:3]) ret[nmout] <- matrix(ncol=3, nrow=nrow(ret), dimnames=list(NULL,colnames(hrs)[1:3])) ret[nd,nmout] <- hrs[,1:3,drop=FALSE] fres[nd,1+i] <- format.ci(hrs[,1], hrs[,2], hrs[,3], hrs[,4], digits=digits, ...) } attr(ret, "formatted") <- fres # as strings with formatted CIs instead of numbers ret } ### Format misclassification intensities and their covariate effects in one tidy matrix #' @rdname msm.form.qoutput #' @export msm.form.eoutput <- function(x, covariates="mean", cl=0.95, digits=4, ...){ ebase <- ematrix.msm(x, covariates=covariates, cl=cl) if (is.null(x$EmatricesFixed)) x <- msm.form.output(x, "misc") # for back-compat with pre 1.4.1 model objects y <- mattotrans(x, ebase$estimates, ebase$L, ebase$U, ebase$fixed, keep.diag=TRUE, intmisc="misc") rete <- data.frame(base=y) frese <- matrix("", nrow=nrow(y), ncol=x$ecmodel$ncovs+1) colnames(frese) <- c("Baseline", x$ecmodel$covlabels) rownames(frese) <- rownames(y) frese[,1] <- format.ci(y[,1],y[,2],y[,3],y[,4],digits=digits,...) im <- t(x$emodel$imatrix); diag(im) <- -colSums(im); nd <- which(im[im!=0]==1) for (i in seq(length.out=x$ecmodel$ncovs)){ nm <- x$ecmodel$covlabels[[i]] ors <- mattotrans(x, x$Ematrices[[nm]], x$EmatricesL[[nm]], x$EmatricesU[[nm]], x$EmatricesFixed[[nm]], keep.diag=FALSE, intmisc="misc") ors[,1:3] <- exp(ors[,1:3]) rete[nm] <- matrix(ncol=3, nrow=nrow(rete), dimnames=list(NULL,colnames(ors)[1:3])) rete[nd,nm] <- ors[,1:3] frese[nd,1+i] <- format.ci(ors[,1], ors[,2], ors[,3], ors[,4], digits=digits,...) } attr(rete, "formatted") <- frese # as strings with formatted CIs instead of numbers rete } ## New more helpful and tidier print output #' Print a fitted msm model object #' #' Print a fitted msm model object #' #' This is the new method of formatting msm objects for printing. The old #' method was based on printing lists of matrices. That produced a lot of #' wasted space for parameters which were zero, and it was difficult to match #' corresponding numbers between matrices. The new method presents all the #' transition intensities and covariate effects as a single compact table, and #' likewise for misclassification matrices. #' #' Also in the old method, covariate effects were presented as log hazard #' ratios or log odds ratios. The log scale is more convenient mathematically, #' but unnatural to interpret. The new method presents hazard ratios for #' covariates on transition intensities and odds ratios for misclassification #' probabilities. #' #' \code{printnew.msm} is an alias for \code{print.msm}. #' #' @aliases print.msm printnew.msm #' @param x Output from \code{\link{msm}}, representing a fitted multi-state #' model object. #' @param covariates Covariates for which to print ``baseline'' transition #' intensities or misclassification probabilities. See #' \code{\link{qmatrix.msm}} for more details. #' @param digits Minimum number of significant digits, passed to #' \code{\link{format}}. Defaults to 4. #' @param ... Other arguments to be passed to \code{\link{format}}. #' @return The object returned by \code{print.msm} is a numeric matrix with one #' column for each estimate or confidence limit for intensities and their #' covariates, in the same arrangement as printed, but with the underlying #' numbers in full precision. The results formatted for printing are stored in #' the \code{"formatted"} attribute of the object, as a character matrix. #' These can alternatively be produced by \code{\link{msm.form.qoutput}}, which #' has no printing side-effect. \code{\link{msm.form.eoutput}} produces the #' same arrangement for misclassification probabilities instead of intensities. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}}, \code{\link{printold.msm}}, #' \code{\link{msm.form.qoutput}}. #' @keywords models #' @export print.msm <- function(x, covariates=NULL, digits=4, ...) { cat("\nCall:\n", deparse(x$call), "\n\n", sep = "") ret <- NULL if (!x$foundse & !attr(x, "fixed")) { cat("Optimisation probably not converged to the maximum likelihood.\noptim() reported convergence but estimated Hessian not positive-definite.\n") } else { if (is.null(x$cl)) { cl <- 0.95 warning("Found msm object saved before version 1.3. Models will need to be refitted under the newer version for output functions to work") } else cl <- x$cl if (!attr(x,"fixed")) { if (is.null(covariates)) { covvalue <- (if (x$center) "their means" else "0") covariates <- if (x$center) "mean" else 0 } else covvalue <- "the values supplied in \"covariates\"" covmessage <- if (attr(x$data$mf, "ncovs")==0) "" else paste0("\nBaselines are with covariates set to ", covvalue) cat("Maximum likelihood estimates", covmessage, "\n", sep="") if (x$qcmodel$ncovs> 0) hrmessage <- paste0(" with hazard ratios for each covariate") else hrmessage <- "" q.header <- paste0("Transition intensities", hrmessage, "\n") ret <- msm.form.qoutput(x, covariates, cl=cl, digits=digits, ...) fres <- attr(ret, "formatted") cat("\n"); cat(q.header) print(fres, quote=FALSE) if (x$emodel$misc) { ormessage <- if (x$ecmodel$ncovs>0) paste0(" with odds ratios for each covariate") else "" e.header <- paste0("Misclassification probabilities", ormessage, "\n") rete <- msm.form.eoutput(x, covariates, cl=cl, digits=digits, ...) frese <- attr(rete, "formatted") cat("\n"); cat(e.header) print(frese, quote=FALSE) if (any(x$paramdata$plabs[x$paramdata$optpars] == "initp")) { i.header <- paste0("Initial state occupancy probabilities\n") cat("\n"); cat(i.header) print(x$hmodel$initprobs) if (any(x$hmodel$nicovs > 0)) { ic.header <- "Covariates on logit initial state probabilities\n" cat("\n"); cat(ic.header) print(x$hmodel$icoveffect) } } } else if (x$hmodel$hidden && (is.null(x$hmodel$phase.only) || !x$hmodel$phase.only)){ cat("\n") print(x$hmodel) } if (!is.null(x$qmodel$phase.states)) { cat("\nPhase-type model\n") print(phasemeans.msm(x)) } } } cat ("\n-2 * log-likelihood: ", x$minus2loglik, "\n") invisible(ret) } #' @rdname print.msm #' @export printnew.msm <- print.msm msm/R/qgeneric.R0000644000176200001440000001021314527612330013167 0ustar liggesusers#' Generic function to find quantiles of a distribution #' #' Generic function to find the quantiles of a distribution, given the #' equivalent probability distribution function. #' #' This function is intended to enable users to define \code{"q"} functions for #' new distributions, in cases where the distribution function \code{pdist} is #' available analytically, but the quantile function is not. #' #' It works by finding the root of the equation \eqn{h(q) = pdist(q) - p = 0}. #' Starting from the interval \eqn{(-1, 1)}, the interval width is expanded by #' 50\% until \eqn{h()} is of opposite sign at either end. The root is then #' found using \code{\link{uniroot}}. #' #' This assumes a suitably smooth, continuous distribution. #' #' An identical function is provided in the \pkg{flexsurv} package. #' #' @param pdist Probability distribution function, for example, #' \code{\link{pnorm}} for the normal distribution, which must be defined in #' the current workspace. This should accept and return vectorised parameters #' and values. It should also return the correct values for the entire real #' line, for example a positive distribution should have \code{pdist(x)==0} for #' \eqn{x<0}. #' @param p Vector of probabilities to find the quantiles for. #' @param special Vector of character strings naming arguments of the #' distribution function that should not be vectorised over. Used, for example, #' for the \code{rate} and \code{t} arguments in \code{\link{qpexp}}. #' @param ... The remaining arguments define parameters of the distribution #' \code{pdist}. These MUST be named explicitly. #' #' This may also contain the standard arguments \code{log.p} (logical; default #' \code{FALSE}, if \code{TRUE}, probabilities p are given as log(p)), and #' \code{lower.tail} (logical; if \code{TRUE} (default), probabilities are P[X #' <= x] otherwise, P[X > x].). #' #' If the distribution is bounded above or below, then this should contain #' arguments \code{lbound} and \code{ubound} respectively, and these will be #' returned if \code{p} is 0 or 1 respectively. Defaults to \code{-Inf} and #' \code{Inf} respectively. #' @return Vector of quantiles of the distribution at \code{p}. #' @author Christopher Jackson #' @keywords distribution #' @examples #' #' qnorm(c(0.025, 0.975), 0, 1) #' qgeneric(pnorm, c(0.025, 0.975), mean=0, sd=1) # must name the arguments #' #' @export qgeneric qgeneric <- function(pdist, p, special=NULL, ...) { args <- list(...) args.special <- if (!is.null(special)) args[special] else NULL args <- args[!names(args) %in% special] if (is.null(args$log.p)) args$log.p <- FALSE if (is.null(args$lower.tail)) args$lower.tail <- TRUE if (is.null(args$lbound)) args$lbound <- -Inf if (is.null(args$ubound)) args$ubound <- Inf if (args$log.p) p <- exp(p) if (!args$lower.tail) p <- 1 - p ret <- numeric(length(p)) ret[p == 0] <- args$lbound ret[p == 1] <- args$ubound args[c("lower.tail","log.p","lbound","ubound")] <- NULL ## Other args assumed to contain params of the distribution. ## Replicate all to their maximum length, along with p maxlen <- max(sapply(c(args, p=list(p)), length)) for (i in seq_along(args)) args[[i]] <- rep(args[[i]], length.out=maxlen) p <- rep(p, length.out=maxlen) ret[p < 0 | p > 1] <- NaN ind <- (p > 0 & p < 1) if (any(ind)) { hind <- seq_along(p)[ind] h <- function(y) { args <- lapply(args, function(x)x[hind[i]]) p <- p[hind[i]] args$q <- y args <- c(args, args.special) (do.call(pdist, args) - p) } ptmp <- numeric(length(p[ind])) for (i in 1:length(p[ind])) { interval <- c(-1, 1) while (h(interval[1])*h(interval[2]) >= 0) { interval <- interval + c(-1,1)*0.5*(interval[2]-interval[1]) } ptmp[i] <- uniroot(h, interval, tol=.Machine$double.eps)$root } ret[ind] <- ptmp } if (any(is.nan(ret))) warning("NaNs produced") ret } msm/R/pearson.R0000644000176200001440000014230514654465665013073 0ustar liggesusers### Pearson-type goodness-of fit test (Aguirre-Hernandez and Farewell, 2002; Titman and Sharples, 2007) #' Pearson-type goodness-of-fit test #' #' Pearson-type goodness-of-fit test for multi-state models fitted to #' panel-observed data. #' #' This method (Aguirre-Hernandez and Farewell, 2002) is intended for data #' which represent observations of the process at arbitrary times ("snapshots", #' or "panel-observed" data). For data which represent the exact transition #' times of the process, \code{\link{prevalence.msm}} can be used to assess #' fit, though without a formal test. #' #' When times of death are known exactly, states are misclassified, or an #' individual's final observation is a censored state, the modification by #' Titman and Sharples (2008) is used. The only form of censoring supported is #' a state at the end of an individual's series which represents an unknown #' transient state (i.e. the individual is only known to be alive at this #' time). Other types of censoring are omitted from the data before performing #' the test. #' #' See the references for further details of the methods. The method used for #' censored states is a modification of the method in the appendix to Titman #' and Sharples (2008), described at #' \url{https://chjackson.github.io/msm/misc/robustcensoring.pdf} #' (Titman, 2007). #' #' Groupings of the time since initiation, the time interval and the impact of #' covariates are based on equally-spaced quantiles. The number of groups #' should be chosen that there are not many cells with small expected numbers #' of transitions, since the deviance statistic will be unstable for sparse #' contingency tables. Ideally, the expected numbers of transitions in each #' cell of the table should be no less than about 5. Conversely, the power of #' the test is reduced if there are too few groups. Therefore, some sensitivity #' analysis of the test results to the grouping is advisable. #' #' Saved model objects fitted with previous versions of R (versions less than #' 1.2) will need to be refitted under the current R for use with #' \code{pearson.msm}. #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param transitions This should be an integer vector indicating which #' interval transitions should be grouped together in the contingency table. #' Its length should be the number of allowed interval transitions, excluding #' transitions from absorbing states to absorbing states. #' #' The allowed interval transitions are the set of pairs of states \eqn{(a,b)} #' for which it is possible to observe \eqn{a} at one time and \eqn{b} at any #' later time. For example, in a "well-disease-death" model with allowed #' \emph{instantaneous} 1-2, 2-3 transitions, there are 5 allowed #' \emph{interval} transitions. In numerical order, these are 1-1, 1-2, 1-3, #' 2-2 and 2-3, excluding absorbing-absorbing transitions. #' #' Then, to group transitions 1-1,1-2 together, and transitions 2-2,2-3 #' together, specify #' #' \code{transitions = c(1,1,2,3,3)}. #' #' Only transitions from the same state may be grouped. By default, each #' interval transition forms a separate group. #' @param timegroups Number of groups based on quantiles of the time since the #' start of the process. #' @param intervalgroups Number of groups based on quantiles of the time #' interval between observations, within time groups #' @param covgroups Number of groups based on quantiles of \eqn{\sum_r #' q_{irr}}{sum_r q_{irr}}, where \eqn{q_{irr}} are the diagonal entries of the #' transition intensity matrix for the \emph{i}th transition. These are a #' function of the covariate effects and the covariate values at the \emph{i}th #' transition: \eqn{q_{irr}} is minus the sum of the off-diagonal entries #' \eqn{q_{rs}^{(0)} exp (\beta_{rs}^T z_i)} on the \emph{r}th row. #' #' Thus \code{covgroups} summarises the impact of covariates at each #' observation, by calculating the overall rate of progression through states #' at that observation. #' #' For time-inhomogeneous models specified using the \code{pci} argument to #' \code{\link{msm}}, if the only covariate is the time period, #' \code{covgroups} is set to 1, since \code{timegroups} ensures that #' transitions are grouped by time. #' @param groups A vector of arbitrary groups in which to categorise each #' transition. This can be an integer vector or a factor. This can be used to #' diagnose specific areas of poor fit. For example, the contingency table #' might be grouped by arbitrary combinations of covariates to detect types of #' individual for whom the model fits poorly. #' #' The length of \code{groups} should be \code{x$data$n}, the number of #' observations used in the model fit, which is the number of observations in #' the original dataset with any missing values excluded. The value of #' \code{groups} at observation \eqn{i} is used to categorise the transition #' which \emph{ends} at observation i. Values of \code{groups} at the first #' observation for each subject are ignored. #' @param boot Estimate an "exact" p-value using a parametric bootstrap. #' #' All objects used in the original call to \code{\link{msm}} which produced #' \code{x}, such as the \code{qmatrix}, should be in the working environment, #' or else an \dQuote{object not found} error will be given. This enables the #' original model to be refitted to the replicate datasets. #' #' Note that \code{groups} cannot be used with bootstrapping, as the simulated #' observations will not be in the same categories as the original #' observations. #' @param B Number of bootstrap replicates. #' @param next.obstime This is a vector of length \code{x$data$n} (the number #' of observations used in the model fit) giving the time to the next #' \emph{scheduled} observation following each time point. This is only used #' when times to death are known exactly. #' #' For individuals who died (entered an absorbing state) before the next #' scheduled observation, and the time of death is known exactly, #' \code{next.obstime} would be \emph{greater} than the observed death time. #' #' If the individual did not die, and a scheduled observation did follow that #' time point, \code{next.obstime} should just be the same as the time to that #' observation. #' #' \code{next.obstime} is used to determine a grouping of the time interval #' between observations, which should be based on scheduled observations. If #' exact times to death were used in the grouping, then shorter intervals would #' contain excess deaths, and the goodness-of-fit statistic would be biased. #' #' If \code{next.obstime} is unknown, it is multiply-imputed using a #' product-limit estimate based on the intervals to observations other than #' deaths. The resulting tables of transitions are averaged over these #' imputations. This may be slow. #' @param N Number of imputations for the estimation of the distribution of the #' next scheduled observation time, when there are exact death times. #' @param indep.cens If \code{TRUE}, then times to censoring are included in #' the estimation of the distribution to the next scheduled observation time. #' If \code{FALSE}, times to censoring are assumed to be systematically #' different from other observation times. #' @param maxtimes A vector of length \code{x$data$n}, or a common scalar, #' giving an upper bound for the next scheduled observation time. Used in the #' multiple imputation when times to death are known exactly. If a value #' greater than \code{maxtimes} is simulated, then the next scheduled #' observation is taken as censored. This should be supplied, if known. If #' not supplied, this is taken to be the maximum interval occurring in the #' data, plus one time unit. For observations which are not exact death times, #' this should be the time since the previous observation. #' @param pval Calculate a p-value using the improved approximation of Titman #' (2009). This is optional since it is not needed during bootstrapping, and #' it is computationally non-trivial. Only available currently for non-hidden #' Markov models for panel data without exact death times. Also not available #' for models with censoring, including time-homogeneous models fitted with the #' \code{pci} option to \code{\link{msm}}. #' @return A list whose first two elements are contingency tables of observed #' transitions \eqn{O} and expected transitions \eqn{E}, respectively, for each #' combination of groups. The third element is a table of the deviances #' \eqn{(O - E)^2 / E} multiplied by the sign of \eqn{O - E}. If the expected #' number of transitions is zero then the deviance is zero. Entries in the #' third matrix will be bigger in magnitude for groups for which the model fits #' poorly. \cr #' #' \item{list("\"test\"")}{the fourth element of the list, is a data frame with #' one row containing the Pearson-type goodness-of-fit test statistic #' \code{stat}. The test statistic is the sum of the deviances. For #' panel-observed data without exact death times, misclassification or censored #' observations, \code{p} is the p-value for the test statistic calculated #' using the improved approximation of Titman (2009). #' #' For these models, for comparison with older versions of the package, #' \code{test} also presents \code{p.lower} and \code{p.upper}, which are #' theoretical lower and upper limits for the p-value of the test statistic, #' based on \ifelse{latex}{\eqn{\chi^2}}{chi-squared} distributions with #' \code{df.lower} and \code{df.upper} degrees of freedom, respectively. #' \code{df.upper} is the number of independent cells in the contingency table, #' and \code{df.lower} is \code{df.upper} minus the number of estimated #' parameters in the model.} #' #' \item{list("\"intervalq\"")}{(not printed by default) contains the #' definition of the grouping of the intervals between observations. These #' groups are defined by quantiles within the groups corresponding to the time #' since the start of the process.} #' #' \item{list("\"sim\"")}{If there are exact death times, this contains #' simulations of the contingency tables and test statistics for each #' imputation of the next scheduled sampling time. These are averaged over to #' produce the presented tables and test statistic. This element is not printed #' by default. #' #' With exact death times, the null variance of the test statistic (formed by #' taking mean of simulated test statistics) is less than twice the mean #' (Titman, 2008), and the null distribution is not #' \ifelse{latex}{\eqn{\chi^2}}{chi-squared}. In this case, \code{p.upper} is an #' upper limit for the true asymptotic p-value, but \code{p.lower} is not a #' lower limit, and is not presented.} #' #' \item{list("\"boot\"")}{If the bootstrap has been used, the element will #' contain the bootstrap replicates of the test statistics (not printed by #' default).} #' #' \item{list("\"lambda\"")}{If the Titman (2009) p-value has been calculated, #' this contains the weights defining the null distribution of the test #' statistic as a weighted sum of \ifelse{latex}{\eqn{\chi^2_1}}{chi-squared(1)} #' random variables (not printed by default).} #' @author Andrew Titman \email{a.titman@@lancaster.ac.uk}, Chris Jackson #' \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}}, \code{\link{prevalence.msm}}, #' \code{\link{scoreresid.msm}}, #' @references Aguirre-Hernandez, R. and Farewell, V. (2002) A Pearson-type #' goodness-of-fit test for stationary and time-continuous Markov regression #' models. \emph{Statistics in Medicine} 21:1899-1911. #' #' Titman, A. and Sharples, L. (2008) A general goodness-of-fit test for Markov #' and hidden Markov models. \emph{Statistics in Medicine} 27(12):2177-2195 #' #' Titman, A. (2009) Computation of the asymptotic null distribution of #' goodness-of-fit tests for multi-state models. \emph{Lifetime Data Analysis} #' 15(4):519-533. #' #' Titman, A. (2008) Model diagnostics in multi-state models of biological #' systems. PhD thesis, University of Cambridge. #' @keywords models #' @examples #' #' psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) #' psor.msm <- msm(state ~ months, subject=ptnum, data=psor, #' qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, #' constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2))) #' pearson.msm(psor.msm, timegroups=2, intervalgroups=2, covgroups=2) #' # More 1-2, 1-3 and 1-4 observations than expected in shorter time #' # intervals - the model fits poorly. #' # A random effects model might accommodate such fast progressors. #' #' @export pearson.msm pearson.msm <- function(x, transitions=NULL, timegroups=3, intervalgroups=3, covgroups=3, groups=NULL, boot=FALSE, B=500, next.obstime=NULL, # user-supplied next observation times, if known. N=100, indep.cens=TRUE, # use censoring times when calculating the empirical distribution of sampling times maxtimes=NULL,# upper limit for imputed next observation times pval=TRUE # calculate p-values for test. false if calling from bootstrap ){ dat <- x$data$mf ## Error handling if (!inherits(x, "msm")) stop("expected \"x\" t to be a msm model") if (x$hmodel$hidden && !x$emodel$misc) stop("only HMMs handled are misclassification models specified using \"ematrix\"") if (any(dat$"(obstype)"==2)) stop("exact transition times are not supported, only panel-observed data") if (!is.null(transitions) && !is.numeric(transitions)) stop("expected \"transitions\" to be numeric") if (!is.numeric(timegroups) || length(timegroups) != 1) stop ("expected \"timegroups\" to be a single number") if (!is.numeric(intervalgroups) || length(intervalgroups) != 1) stop ("expected \"intervalgroups\" to be a single number") if (!is.numeric(covgroups) || length(covgroups) != 1) stop ("expected \"covgroups\" to be a single number") if (!is.numeric(B) || length(B) != 1) stop ("expected \"B\" to be a single number") if (!is.numeric(N) || length(N) != 1) stop ("expected \"N\" to be a single number") ## Use only one covariate group for pci models with no other covariates if (!is.null(x$pci) && length(grep("timeperiod\\[([0-9]+|Inf),([0-9]+|Inf)\\)", x$qcmodel$covlabels)) == x$qcmodel$ncovs) covgroups <- 1 ## Label various constants nst <- x$qmodel$nstates exact.death <- any(dat$"(obstype)" == 3) dstates <- if (exact.death) absorbing.msm(x) else NULL ndstates <- if (exact.death) transient.msm(x) else 1:nst nndstates <- length(ndstates) ## Do minimum needed to port this to msm version 1.4 od <- dat[,c("(subject)","(time)","(state)","(obstype)")] names(od) <- c("subject","time","state","obstype") od$cov <- dat[,attr(dat,"covnames.q"),drop=FALSE] if (x$emodel$misc) od$misccov <- dat[,attr(dat,"covnames.e")] ncovs <- x$qcmodel$ncovs od$state <- factor(od$state, levels=sort(unique(od$state))) n <- nrow(od) ## Method is restricted to "terminal" censoring (means not dead, occurs at end) ## Drop censored states not at the end of individual series lastobs <- c(od$subject[1:(n-1)] != od$subject[2:n], TRUE) cens.notend <- (od$state %in% x$cmodel$censor) & (!lastobs) if (any(cens.notend)) { od <- od[!cens.notend,] warning("Omitting censored states not at the end of individual series") } ## Drop individuals with only one observation od <- od[!od$subject %in% unique(od$subject)[table(od$subject)==1],] ## Drop observations of censoring types other than "not dead" if (length(x$cmodel$censor) >= 2) { ind <- NULL for (i in 1:length(x$cmodel$censor)) { if (identical(x$cmodel$states[x$cmodel$index[i] : (x$cmodel$index[i+1]-1)], as.numeric(transient.msm(x)))) {ind <- i; break} } if (is.null(ind)){ warning("Omitting all censored states") cens.drop <- od$state %in% x$cmodel$censor } else { cens.drop <- od$state %in% x$cmodel$censor[-ind] warning("Omitting censored states of types other than ",x$cmodel$censor[ind]) } od <- od[!cens.drop,] } n <- nrow(od) nstcens <- length(unique(od$state)) # no. unique states in data, should be same as number of markov states plus number of censor types (max 1) cens <- nstcens > nst # is there any remaining censoring od$prevstate <- factor(c(NA,od$state[1:(n-1)]), levels=1:nndstates) od$prevtime <- c(NA, od$time[1:(n-1)]) od$ind <- 1:n # index into original data (useful if any rows of od are dropped) od$firstobs <- rep(tapply(1:n,od$subject,min)[as.character(unique(od$subject))], table(od$subject)[as.character(unique(od$subject))]) od$obsno <- 1:n - od$firstobs + 1 od$subj.num <- match(od$subject, unique(od$subject)) if (!is.null(next.obstime) && (!is.numeric(next.obstime) || length(next.obstime) != n)) stop (paste("expected \"next.obstime\" to be a numeric vector length", n)) od$timeinterval <- if (is.null(next.obstime)) (od$obsno>1)*(od$time - od$time[c(1,1:(n-1))]) else next.obstime if (!is.null(maxtimes) && (!is.numeric(maxtimes) || !(length(maxtimes) %in% c(1,n)))) stop (paste("expected \"maxtimes\" to be a numeric vector length 1 or", n)) if (!is.null(groups) && (!(length(groups) == n))) stop (paste("expected \"groups\" to be a vector length", n)) od$maxtimes <- if (is.null(maxtimes)) ifelse(od$state %in% dstates, max(od$timeinterval) + 1, od$timeinterval) ## Set max possible obs time for deaths to be max observed plus arbitrary one unit else rep(maxtimes, length=n) # if supplied as a scalar, use it for all obs od$usergroup <- factor(if (!is.null(groups)) groups else rep(1, n)) ## User-supplied groups ## Check and label transition groupings. Store data in a list ## Includes transitions to terminal censoring as separate states trans <- list() trans$allowed <- intervaltrans.msm(x, exclude.absabs=TRUE, censor=cens) trans$labsall <- paste(trans$allowed[,1], trans$allowed[,2], sep="-") trans$allowed[trans$allowed[,2] > nst, 2] <- nst+1 # these are to be used as indices, so label censoring as nst+1 not e.g. 99 trans$na <- nrow(trans$allowed) trans$use <- if (is.null(transitions)) 1:trans$na else transitions # why was this a matrix before? if (length(trans$use) != trans$na) stop("Supplied ", length(trans$use), " transition indices, expected ", trans$na) else if (!x$emodel$misc && ! all(tapply(trans$allowed[,1], trans$use, function(u)length(unique(u))) == 1) ) stop("Only transitions from the same origin can be grouped") ## convert ordinal transition indices to informative labels trans$labsagg <- tapply(trans$labsall, trans$use, function(u)paste(u,collapse=",")) trans$from <- trans$allowed[,1][!duplicated(trans$use)] # from-state corresp to each element of trans$labsagg trans$to <- trans$allowed[,2][!duplicated(trans$use)] # to-state corresp to each element of trans$labsagg trans$ngroups <- length(unique(trans$use)) ## Determine unique Q matrices determined by covariate combinations if (ncovs>0) { uniq <- unique(od$cov) nouniq <- dim(uniq)[1] pastedu <- do.call("paste",uniq) pastedc <- do.call("paste",od$cov) qmatindex <- match(pastedc,pastedu) qmat <- array(0,dim=c(nst,nst,nouniq)) for (i in 1:nouniq) qmat[,,i] <- qmatrix.msm(x, covariates=as.list(uniq[i,,drop=FALSE]), ci="none") }else{ qmatindex <- rep(1,n) nouniq <- 1 qmat <- array(qmatrix.msm(x,ci="none"),dim=c(nst,nst,1)) } qmatmaster <- qmat qmat <- qmat[,,qmatindex] od$rates <- apply(qmat,3,function(u) sum(diag(u))) ## Now work with a dataset with one row per transition md <- od[od$obsno>1,] qmat <- qmat[,,od$obsno>1] qmatindex <- qmatindex[od$obsno>1] ntrans <- nrow(md) nfromstates <- length(unique(md$prevstate)) ## Groups based on time since initiation (not observation number) timegroups.use <- min(length(unique(md$time)), timegroups) md$timegroup <- qcut(md$time, timegroups.use) ## Group time differences by quantiles within time since initiation intervalq <- tapply(md$timeinterval[md$state %in% ndstates], md$timegroup[md$state %in% ndstates], ## Categorise quantiles based only on full observations, not deaths or censoring. function(x) quantile(x,probs=seq(0,1,1/intervalgroups))) md$intervalgroup <- rep(1, ntrans) for (i in levels(md$timegroup)) md$intervalgroup[md$timegroup==i] <- unclass(qcut(md$timeinterval[md$timegroup==i], qu = intervalq[[i]])) md$intervalgroup <- factor(md$intervalgroup) ## Groups based on covariates covgroups.use <- min(length(unique(md$rates)), covgroups) md$covgroup <- if (ncovs > 0) qcut(md$rates, covgroups.use) else factor(rep(1,ntrans)) groupdims <- c(length(levels(md$timegroup)),length(levels(md$intervalgroup)),length(levels(md$covgroup)),length(levels(md$usergroup))) groupdimnames <- list(levels(md$timegroup),levels(md$intervalgroup),levels(md$covgroup),levels(md$usergroup)) ## Determine empirical distribution of time interval lengths. ## Then impute next scheduled observation for transitions which end in exact death times md$obtype <- rep(0, ntrans) if (exact.death) md$obtype[md$state %in% dstates] <- 1 md$obtype[md$state %in% x$cmodel$censor] <- 2 md$cens <- factor(as.numeric(md$obtype==2), levels=c(0,1)) ndeath <- sum(md$obtype==1) if (exact.death && is.null(next.obstime)) { cat("Imputing sampling times after deaths...\n") incl <- if (indep.cens) (0:2) else (0:1) empiricaldist <- empiricaldists(md$timeinterval[md$obtype %in% incl], md$state[md$obtype %in% incl], as.numeric(md$timegroup[md$obtype %in% incl]), timegroups, ndstates) imputation <- array(0,c(ndeath,N,4)) dimnames(imputation) <- list(NULL, NULL, c("times","cens","intervalgroup","timeqmatindex")) deathindex <- which(md$obtype==1) for (i in 1:ndeath) { mintime <- md$timeinterval[deathindex[i]] centime <- md$maxtimes[deathindex[i]] # - md$time[deathindex[i]] + mintime tg <- md$timegroup[deathindex[i]] ## returns list of times, whether would have ended in censoring, and time category. st <- sampletimes(mintime, centime, empiricaldist[,tg,empiricaldist["time",tg,]>0,drop=FALSE], N, tg, intervalq) for (j in c("times","cens","intervalgroup")) imputation[i,,j] <- st[,j] } } else imputation <- deathindex <- NULL ndeathindex <- setdiff(1:ntrans, deathindex) ## Transition probability matrices are indexed by unique combinations of time intervals and Q matrices. timeint <- c(md$timeinterval[md$obtype != 1],c(imputation[,,"times"])) # time intervals, excluding deaths, concatenated with imputations of next interval after death qmatint <- c(qmatindex[md$obtype != 1],rep(qmatindex[deathindex],N)) # index into unique Q matrices timeqmat <- paste(timeint,qmatint,sep="-") timeqmata <- data.frame(timeint,qmatint)[!duplicated(timeqmat),] pastedu <- unique(timeqmat) timeqmatindex <- match(timeqmat,pastedu) ## Work out the transition probability matrix for each unique time interval and Q matrix npmats<-length(pastedu) pmi <- array(0,dim=c(nst,nst,npmats)) for (i in unique(timeqmata[,2])) pmi[,,timeqmata[,2]==i] <- MatrixExp(qmatmaster[,,i], timeqmata[timeqmata[,2]==i,1], method="pade") md$timeqmatindex<-rep(0,ntrans) md$timeqmatindex[md$obtype != 1] <- timeqmatindex[1:(ntrans-ndeath)] if (exact.death && is.null(next.obstime)) imputation[,,"timeqmatindex"] <- timeqmatindex[(ntrans-ndeath+1):length(timeqmatindex)] ### Calculate transition probabilities for non-death intervals prob <- array(0,dim=c(nst,ntrans)) ## array of obs state probs, conditional on previous obs state if (x$emodel$misc) { misccov <- if (x$ecmodel$ncovs > 0) od$misccov[od$obsno>1,,drop=FALSE] else NULL p.true <- array(dim=c(nst, ntrans)) # prob of each true state conditional on complete history including current obs initp <- x$hmodel$initpmat if (x$ecmodel$ncovs > 0) { uniqmisc <- unique(misccov) ematindex <- match(do.call("paste",misccov), do.call("paste", uniqmisc)) emat <- array(0,dim=c(nst,nst,nrow(uniqmisc))) for (i in 1:nrow(uniqmisc)) emat[,,i] <- ematrix.msm(x, covariates=as.list(uniqmisc[i,]),ci="none") } else emat <- ematrix.msm(x, ci="none") for (i in 1:ntrans) { ematrix <- if (x$ecmodel$ncovs>0) emat[,,ematindex[i]] else emat if (md$state[i] %in% ndstates) { T <- pmi[,,md$timeqmatindex[i]] * matrix(ematrix[,md$state[i]], nrow=nst, ncol=nst, byrow=TRUE) p.true[,i] <- if (md$obsno[i] == 2) t(initp[md$subj.num[i],]) %*% T else t(p.true[,i-1]) %*% T p.true[,i] <- p.true[,i] / sum(p.true[,i]) # prob of each true state } if (!(md$state[i] %in% dstates)) { prob[,i] <- if (md$obsno[i] == 2) initp[md$subj.num[i],] %*% pmi[,,md$timeqmatindex[i]] %*% ematrix else p.true[,i-1] %*% pmi[,,md$timeqmatindex[i]] %*% ematrix } } } else prob[cbind(rep(1:nst,ntrans-ndeath),rep((1:ntrans)[ndeathindex],each=nst))] <- pmi[cbind(rep(md$prevstate[(1:ntrans)[ndeathindex]],each=nst), rep(1:nst,ntrans - ndeath),rep(md$timeqmatindex[(1:ntrans)[ndeathindex]],each=nst))] if (exact.death && is.null(next.obstime)) { stat.sim <- rep(0,N) obs.rep <- exp.rep <- dev.rep <- array(0, dim=c(groupdims, trans$ngroups, N)) dimnames(obs.rep) <- dimnames(exp.rep) <- dimnames(dev.rep) <- c(groupdimnames, list(trans$labsagg), list(1:N)) cat("Calculating replicates of test statistics for imputations...\n") for (i in 1:N) { ## Calculate transition probabilities for death intervals if (x$emodel$misc) { for (j in 1:ndeath) { k <- deathindex[j] ematrix <- if (x$ecmodel$ncovs>0) emat[,,ematindex[k]] else emat prob[,k] <- if (md$obsno[k] == 2) initp[md$subj.num[k],] %*% pmi[,,imputation[j,i,"timeqmatindex"]] %*% ematrix else p.true[,k-1] %*% pmi[,,imputation[j,i,"timeqmatindex"]] %*% ematrix } } else prob[cbind(rep(1:nst,ndeath),rep(deathindex,each=nst))] <- pmi[cbind(rep(md$prevstate[deathindex],each=nst),rep(1:nst,ndeath),rep(imputation[,i,"timeqmatindex"],each=nst))] md$intervalgroup[deathindex] <- factor(imputation[,i,"intervalgroup"], labels=levels(md$intervalgroup[deathindex])[sort(unique(imputation[,i,"intervalgroup"]))]) md$cens[deathindex] <- as.numeric(imputation[,i,"cens"]) # factor levels 0/1 ## Observed transition table, including to censoring indicators obs.rep.i <- table(md$state, md$prevstate, md$timegroup, md$intervalgroup, md$covgroup, md$usergroup) ## Expected transition table exp.cens <- array(0, dim = c(nst, nndstates, groupdims, 2)) for (j in 1:nst) exp.cens[j,,,,,,] <- tapply(prob[j,], list(md$prevstate,md$timegroup,md$intervalgroup,md$covgroup,md$usergroup,md$cens), sum) exp.cens <- replace(exp.cens,is.na(exp.cens),0) exp.unadj <- array(0, dim=c(nstcens, nndstates, groupdims)) exp.unadj[1:nst,,,,,] <- exp.cens[,,,,,,1] for (j in dstates) exp.unadj[j,,,,,] <- exp.cens[j,,,,,,1] + exp.cens[j,,,,,,2] if (cens) exp.unadj[nst+1,,,,,] <- apply(exp.cens[1:nndstates,,,,,,2,drop=FALSE], 2:6, sum) # total censored from any non-death state ## Remove very small values, caused by inaccuracy in numerical matrix exponential. exp.unadj <- replace(exp.unadj,(exp.unadj0)as.list(md$cov[i,])else 0)[md$prevstate[i],] Sigma <- matrix(0, nrow=C*nst,ncol=C*nst) for (c in 1:C) { block <- matrix(0,nrow=nst,ncol=nst) prc <- pr[md$group==c,,drop=FALSE] for (r in 1:nst) block[r,-r] <- - colSums(prc[,r]*prc[,-r,drop=FALSE]) diag(block) <- colSums(prc * (1 - prc)) rows <- cols <- (c-1)*nst + 1:nst Sigma[rows,cols] <- block } PSigmaPT <- P %*% Sigma %*% t(P) ## compute Psi = Cov(score(theta), Orc), where Orc is observed counts in pearson table ## arranged as npars x RC ## bottom left and top right blocks wrong way round in paper dp <- Ccall.msm(x$paramdata$opt$par, do.what="dpmat", expand.data(x), x$qmodel, x$qcmodel, x$cmodel, x$hmodel, x$paramdata) # ntrans x R x npars: trans in data order Psiarr <- apply(dp, c(2,3), function(x)tapply(x, md$group, sum)) npars <- x$paramdata$nopt # only includes qbase,qcov, since no hmms here ## permute C x R x npars Psiarr to R x C x npars Psi and then collapse first two dims Psi <- t(array(aperm(Psiarr,c(2,1,3)), dim=c(R*C,npars))) ## rows ordered with tostate changing fastest, then category (match P) EI <- 0.5*x$paramdata$info Omega <- rbind(cbind(EI, Psi %*% P), cbind(t(P) %*% t(Psi),PSigmaPT)) ## compute B: RC x npars matrix with entries derc/dtheta_m / sqrt(erc) ## erc(theta) is just sum over (i in that cat) of prc(theta) Barr <- Psiarr fromgroups <- md$prevstate[!duplicated(md$group)][order(unique(md$group))] # ugh for (i in 1:nfrom) { fi <- unique(from)[i] rows <- fromgroups==fi et <- exptable[,,,,from==fi] Barr[rows,to[from==fi],] <- - Barr[rows,to[from==fi],] / as.numeric(sqrt(et[et>0])) } Bmat <- array(aperm(Barr,c(2,1,3)), dim=c(R*C,npars)) A <- cbind(Bmat %*% solve(EI), diag(R*C)) V <- A %*% Omega %*% t(A) lambda <- eigen(V,only.values=TRUE)$values psi <- function(u)prod((1 - 2i*lambda*u)^(-0.5)) fn <- function(u){ res <- numeric(length(u)) for (i in seq_along(u)) res[i] <- Im(psi(u[i])*exp(-1i*u[i]*stat) / (2*pi*u[i])) res } int <- try(integrate(fn, -Inf, Inf)) if (inherits(int, "try-error")) { message("Unable to calculate more accurate p-value"); p.acc <- p.err <- NULL} else { p.acc <- 0.5 + int$value p.err <- int$abs.error if (p.acc - 2*p.err < 0) p.acc <- 0 if (p.acc + 2*p.err > 1) p.acc <- 1 } } test <- data.frame(stat=stat) if (acc.p) test$p <- p.acc test$df.lower <- if (exact.death && is.null(next.obstime)) NA else df.lower test$p.lower <- if (exact.death && is.null(next.obstime)) NA else 1 - pchisq(stat, df.lower) test$df.upper <- df.upper test$p.upper <- 1-pchisq(stat, df.upper) rownames(test) <- "" ## Simulated observation times to use as sampling frame for bootstrapped data if (!is.null(imputation)) { imp.times <- matrix(rep(x$data$mf$"(time)", N), nrow=length(x$data$mf$"(time)"), ncol=N) prevtime <- imp.times[which(x$data$mf$"(state)" %in% dstates) - 1,] imp.times[x$data$mf$"(state)" %in% dstates, ] <- prevtime + imputation[,,"times"] } else imp.times <- NULL if (boot) { if (!is.null(groups)) stop("Bootstrapping not valid with user-specified groups") cat("Starting bootstrap refitting...\n") boot.stats <- pearson.boot.msm(x, imp.times=imp.times, transitions=transitions, timegroups=timegroups, intervalgroups=intervalgroups, covgroups=covgroups, groups=groups, B=B) test$p.boot <- sum(boot.stats > stat) / B } pearson <- list(observed=obstable, expected=exptable, deviance=devtable*sign(obstable-exptable), test=test, intervalq=intervalq) names(pearson) <- c("Observed","Expected","Deviance*sign(O-E)","test","intervalq") if (exact.death && is.null(next.obstime)) pearson$sim <- list(observed=obs.rep, expected=exp.rep, deviances=dev.rep, stat=stat.sim, imputation=imputation) if (boot) pearson$boot <- boot.stats if (acc.p) pearson$lambda <- lambda pearson <- reformat.pearson.msm(pearson) class(pearson) <- "pearson.msm" pearson } ### Reformat array output from Pearson test as a matrix with transition type in columns reformat.pearson.msm <- function(pearson) { pp <- pearson nd <- length(dim(pearson$Observed)) for (i in 1:3) { dim(pp[[i]]) <- c(prod(dim(pp[[i]])[-nd]), dim(pp[[i]])[nd]) rnames <- do.call("expand.grid", dimnames(pearson$Observed)[1:4]) colnames(pp[[i]]) <- dimnames(pearson$Observed)[[nd]] pp[[i]] <- as.data.frame(pp[[i]]) pp[[i]] <- cbind(rnames, pp[[i]]) colnames(pp[[i]])[1:4] <- c("Time","Interval","Cov","User") drop <- NULL # drop columns labelling categories with only one value for (j in 1:4) if (length(unique(pp[[i]][,j]))==1) drop <- c(drop,j) pp[[i]] <- pp[[i]][,-drop] } pp } ### Keep the simulation and bootstrap output but don't print it #' @export print.pearson.msm <- function(x, ...){ print(x[!(names(x) %in% c("sim","boot","intervalq","lambda"))]) } ### Adaptation of cut(quantile()) so that if two quantiles are equal, a unique category is created for x equal to that ### For point intervals, the label is just the value of the point ### Else, the labels are in (a,b] or [a,b) type interval notation qcut <- function(x, n, qu=NULL, eps=1e-06, digits=2, drop.unused.levels=FALSE) { if (is.null(qu)) qu <- quantile(x, probs = seq(0, 1, 1/n)) q2.equal <- sequence(table(qu)) <= 2 qu <- qu[q2.equal] ## If three or more quantiles are equal, only keep two of them. ## Ensure all x fall within intervals, widening upper and lower intervals if necessary. qu[qu==max(qu)] <- max(max(qu),x) qu[qu==min(qu)] <- min(min(qu),x) n <- length(qu)-1 lagq <- c(-Inf, qu[1:n]) qlabs <- paste("[",round(qu[1:n],digits),",",round(qu[2:(n+1)],digits),")",sep="") inti <- qu[1:n]==qu[2:(n+1)] # which intervals are points qlabs[inti] <- round(qu[1:n][inti], digits) lastopen <- if (n==1) FALSE else c(FALSE, inti[1:(n-1)]) substr(qlabs[lastopen],1,1) <- "(" # interval with a point interval just before it is open on the left if (!inti[n]) substr(qlabs[length(qlabs)], nchar(qlabs[length(qlabs)]), nchar(qlabs[length(qlabs)])) <- "]" # last interval is closed on the right qu[qu==lagq] <- qu[qu==lagq] + eps x.cut <- cut(x, qu, right=FALSE, include.lowest=TRUE, labels=qlabs) tx <- tapply(x, x.cut, unique) nxcats <- sapply(tx, length) # number of unique x values in each category nxcats[is.na(tx)] <- 0 ## If only one unique x value is in a category, then label the category with that value if (any(nxcats==1)) levels(x.cut)[nxcats == 1] <- round(unlist(tx[nxcats==1]), digits) if (drop.unused.levels) x.cut <- factor(x.cut, exclude=NULL) # drop unused factor levels x.cut } pearson.boot.msm <- function(x, imp.times=NULL, transitions=NULL, timegroups=4, intervalgroups=4, covgroups=4, groups=NULL, B=500){ bootstat <- numeric(B) x$call$formula <- if (x$emodel$misc) substitute(obs ~ time) else substitute(state ~ time) x$call$qmatrix <- qmatrix.msm(x,ci="none") # put MLE in inits. x$call$hessian <- x$call$death <- FALSE x$call$obstype <- NULL x$call$subject <- substitute(subject) x$call$subject.weights <- substitute(subject.weights) i <- 1 while (i <= B) { if (!is.null(imp.times)) x$data$mf$"(time)" <- imp.times[,sample(ncol(imp.times), size=1)] # resample one of the imputed sets of observation times boot.df <- simfitted.msm(x,drop.absorb=TRUE) x$call$data <- substitute(boot.df) refit.msm <- try(eval(x$call)) # estimation might not converge for a particular bootstrap resample if (inherits(refit.msm, "msm")) { p <- pearson.msm(refit.msm, transitions=transitions, timegroups=timegroups, intervalgroups=intervalgroups, covgroups=covgroups, groups=groups, boot=FALSE, pval=FALSE) bootstat[i] <- p$test$stat i <- i + 1 } } bootstat } ### Work out empirical distribution of sampling times for each observation (or time since initiation) group: empiricaldists <- function(timeinterval, state, obgroup, obgroups, ndstates) { empdist <- array(0,c(3, obgroups, max(table(obgroup[state %in% ndstates])))) # Need times, cum value and point mass value dimnames(empdist) <- list(c("time", "surv", "pdeath"), levels(obgroup), NULL) ## First dimension: 1: time, 2: surv prob 3: death prob in prev interval ## Second dim: observation group. Third dim: size of biggest obs group (i.e. maximum number of event times for KM estimate) for (i in 1:obgroups) { ##s1 <- survfit(Surv(timeinterval[obgroup==i],(state[obgroup==i] %in% ndstates))~1,type="kaplan-meier") ##survfit seems to ignore increments of small size ## TODO investigate this ##Instead use own code to create KM t <- round(timeinterval[(obgroup==i & state %in% ndstates)],4) eligt <- sort(unique(t)) events <- table(t) allt <- sort(round(timeinterval[obgroup==i],4)) empdist["time",i,1:length(eligt)] <- eligt for (j in 1:length(eligt)) { nrisk <- sum(allt + sqrt(.Machine$double.eps) >= eligt[j]) if (nrisk==0) nrisk <- 1 # avoid floating point fuzz in comparing last point empdist["surv",i,j] <- if (j>1) (empdist["surv",i,j-1]*(1 - events[j]/nrisk)) else (1 - events[j]/nrisk) empdist["pdeath",i,j] <- if (j>1) (empdist["surv",i,j-1] - empdist["surv",i,j]) else (1 - empdist["surv",i,j]) ## Now deals with ties correctly } } empdist } ### For a single death, sample N points from the distribution of the next sampling time ### mintime, centime: minimum and maximum possible times ### dist: matrix of times, survival probs and previous-interval death probs sampletimes <- function(mintime, centime, dist, N, obgroup, intervalq) { ## dist takes the overall distribution from the relevant obgroup, but since we supply obgroup it might be better to just supply the whole thing dist <- array(dist, dim=dim(dist)[c(1,3)], dimnames=dimnames(dist)[c(1,3)]) dist <- dist[,dist[1,]>mintime,drop=FALSE] # Remove times before the minimum possible time. if (length(dist) > 0) { dist[c("surv","pdeath"),] <- dist[c("surv","pdeath"),] / dist["surv",1] # Normalise ## Compute the censoring fraction cen <- 1 - sum(dist["pdeath",dist["time",]0) { cend <- as.numeric(runif(N) < cen) if (length(dist["time",])>1) { ## Suppress "Walker's alias method used, results incompatible with R < 2.2.0" warning times <- suppressWarnings(sample(dist["time",],N,replace=TRUE,prob=dist["pdeath",])) * (cend==0) + centime*(cend==1) }else{ times <- dist["time",]*(cend==0) + centime*(cend==1) } }else{ cend <- rep(1,N) times <- rep(centime,N) } }else{ cend <- rep(1,N) times <- rep(centime,N) } intervalgroup <- qcut(times,qu=intervalq[[obgroup]]) cbind(times=times, cens=cend, intervalgroup=intervalgroup) } ## make internal to pearson function ## requires table of expected values with dims: nstcens, nndstates, groupdims ## also observed table with same dims ## prob need to calculate these in every case. ## why not do this calculation with the ungrouped version of the table, collapse the first two dims, then aggregate the table by trans$use ### Replace fromstate,tostate dimensions at beginning by a single allowed-transition dimension at end agg.tables <- function(obs.full, exp.full, groupdims, groupdimnames, trans) { obstable <- exptable <- array(dim=c(groupdims, trans$na)) for (i in 1:trans$na) { obstable[,,,,i] <- obs.full[trans$allowed[i,2],trans$allowed[i,1],,,,] exptable[,,,,i] <- exp.full[trans$allowed[i,2],trans$allowed[i,1],,,,] } obstable <- replace(obstable,is.na(obstable),0) exptable <- replace(exptable,is.na(exptable),0) ## Aggregate by transition groups obstable <- aperm(apply(obstable, 1:4, function(u)tapply(u, trans$use, sum)), c(2:5,1)) exptable <- aperm(apply(exptable, 1:4, function(u)tapply(u, trans$use, sum)), c(2:5,1)) dimnames(obstable) <- dimnames(exptable) <- c(groupdimnames, list(trans$labsagg)) list(obs=obstable, exp=exptable) } ### Adjust expected counts to account for informative censoring times, according to method in paper addendum. adjust.expected.cens <- function(exp.unadj, obs, nst, ndstates, dstates, groupdims, N, cens, md, nstcens) { ## Compute total expected counts from each from-state, summed over destination state (n-tilde in paper addendum) nndstates <- length(ndstates) dims <- c(nndstates, groupdims) nobs <- apply(obs, 2:6, sum) # Obs trans summed over first dimension = destination state = Number of trans from state r in group nobs.xd <- nobs - array(obs[nst,,,,,], dim=dims) # Number of trans excluding death nobs.xdc <- if (cens) nobs.xd - array(obs[nst+1,,,,,,drop=FALSE], dim=dims) else nobs.xd # excluding death and censoring po <- array(0, dim = c(nst+1, dims)) # p-hat in appendix to paper, MLEs from unrestricted alternative model for (j in ndstates) # prop of uncensored trans from state r (and group) ending in state j (not death), multiplied by prop of trans not ending in death. po[j,,,,,] <- (array(obs[j,,,,,], dim=dims) * nobs.xd)/(nobs.xdc*nobs + (nobs.xdc*nobs==0)) for (j in dstates) po[nst,,,,,] <- array(obs[j,,,,,], dim=dims) / (nobs + (nobs==0)) # prop of trans from state r (and group) ending in death. (if zero in denom, this is 0) po[nst+1,,,,,] <- 1 - apply(po[dstates,,,,,,drop=FALSE], 2:6, sum) po <- replace(po, is.na(po), 0) nexp <- apply(exp.unadj, 2:6, sum) nexp.xd <- nexp - array(exp.unadj[nst,,,,,], dim=dims) nexp.xdc <- if (cens) nexp.xd - array(exp.unadj[nst+1,,,,,,drop=FALSE],dim=dims) else nexp.xd ps <- array(0,dim=c(nst+1, dims)) # p-tilde-star in addendum to paper. "robustified" MLEs from null Markov model for (j in ndstates) ps[j,,,,,] <- (array(exp.unadj[j,,,,,], dim=dims)*nexp.xd)/(nexp.xdc*nexp + (nexp.xdc*nexp==0)) for (j in dstates) ps[j,,,,,] <- array(exp.unadj[j,,,,,], dim=dims)/(nexp + (nexp==0)) ps[nst+1,,,,,] <- 1 - apply(ps[dstates,,,,,,drop=FALSE], 2:6, sum) ps <- replace(ps,is.na(ps),0) ncen <- tapply(md$cens, list(md$prevstate,md$timegroup,md$intervalgroup,md$covgroup,md$usergroup), function(x)sum(x==1)) dim(ncen) <- dims ncen <- replace(ncen, is.na(ncen), 0) exp.adj <- array(0, dim=c(nstcens,dims)) # = p-tilde-star * n / phat (in notation of paper) = ps * obs / po exp.adj[ndstates,,,,,] <- ps[ndstates,,,,,,drop=FALSE] * rep(nobs.xdc * nobs,each=nndstates) / rep(nobs.xd + (nobs.xd==0),each=nndstates) for (j in dstates) exp.adj[j,,,,,] <- array(ps[j,,,,,], dim=dims) * nobs if (cens) exp.adj[nst+1,,,,,] <- nobs - apply(exp.adj[1:nst,,,,,,drop=FALSE], 2:6, sum) exp.adj } msm/R/totlos.R0000644000176200001440000003355714660326731012743 0ustar liggesusers## Estimate total length of stay in a given state. #' Total length of stay, or expected number of visits #' #' Estimate the expected total length of stay, or the expected number of #' visits, in each state, for an individual in a given period of evolution of a #' multi-state model. #' #' The expected total length of stay in state \eqn{j} between times \eqn{t_1} #' and \eqn{t_2}, from the point of view of an individual in state \eqn{i} at #' time 0, is defined by the integral from \eqn{t_1} to \eqn{t_2} of the #' \eqn{i,j} entry of the transition probability matrix \eqn{P(t) = Exp(tQ)}, #' where \eqn{Q} is the transition intensity matrix. #' #' The corresponding expected number of visits to state \eqn{j} (excluding the #' stay in the current state at time 0) is \eqn{\sum_{i!=j} T_i Q_{i,j}}, where #' \eqn{T_i} is the expected amount of time spent in state \eqn{i}. #' #' More generally, suppose that \eqn{\pi_0}{pi_0} is the vector of #' probabilities of being in each state at time 0, supplied in \code{start}, #' and we want the vector \eqn{\mathbf{x}}{x} giving the expected lengths of #' stay in each state. The corresponding integral has the following solution #' (van Loan 1978; van Rosmalen et al. 2013) #' #' \deqn{\mathbf{x} = #' \left[ #' \begin{array}{ll} #' 1 & \mathbf{0}_K #' \end{array} #' \right] #' Exp(t Q') #' \left[ #' \begin{array}{l} \mathbf{0}_K\\I_K #' \end{array} #' \right] #' }{x = [1, 0_K] Exp(t Q') [0_K, I_K]'} #' #' where \deqn{Q' = \left[ #' \begin{array}{ll} 0 & \mathbf{\pi}_0\\ #' \mathbf{0}_K & Q - rI_K #' \end{array} #' \right] #' }{Q' = rbind(c(0, pi_0), cbind(0_K, Q - r I_K))} #' #' \eqn{\pi_0}{pi_0} is the row vector of initial state probabilities supplied #' in \code{start}, \eqn{\mathbf{0}_K}{0_K} is the row vector of K zeros, #' \eqn{r} is the discount rate, \eqn{I_K}{I_K} is the K x K identity matrix, #' and \eqn{Exp} is the matrix exponential. #' #' Alternatively, the integrals can be calculated numerically, using the #' \code{\link{integrate}} function. This may take a long time for models with #' many states where \eqn{P(t)} is expensive to calculate. This is required #' where \code{tot = Inf}, since the package author is not aware of any #' analytic expression for the limit of the above formula as \eqn{t} goes to #' infinity. #' #' With the argument \code{num.integ=TRUE}, numerical integration is used even #' where the analytic solution is available. This facility is just provided for #' checking results against versions 1.2.4 and earlier, and will be removed #' eventually. Please let the package maintainer know if any results are #' different. #' #' For a model where the individual has only one place to go from each state, #' and each state is visited only once, for example a progressive disease model #' with no recovery or death, these are equal to the mean sojourn time in each #' state. However, consider a three-state health-disease-death model with #' transitions from health to disease, health to death, and disease to death, #' where everybody starts healthy. In this case the mean sojourn time in the #' disease state will be greater than the expected length of stay in the #' disease state. This is because the mean sojourn time in a state is #' conditional on entering the state, whereas the expected total time diseased #' is a forecast for a healthy individual, who may die before getting the #' disease. #' #' In the above formulae, \eqn{Q} is assumed to be constant over time, but the #' results generalise easily to piecewise-constant intensities. This function #' automatically handles models fitted using the \code{pci} option to #' \code{\link{msm}}. For any other inhomogeneous models, the user must specify #' \code{piecewise.times} and \code{piecewise.covariates} arguments to #' \code{\link{totlos.msm}}. #' #' @aliases totlos.msm envisits.msm #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param start Either a single number giving the state at the beginning of the #' period, or a vector of probabilities of being in each state at this time. #' @param end States to estimate the total length of stay (or number of visits) #' in. Defaults to all states. This is deprecated, since with the analytic #' solution (see "Details") it doesn't save any computation to only estimate #' for a subset of states. #' @param fromt Time from which to estimate. Defaults to 0, the beginning of #' the process. #' @param tot Time up to which the estimate is made. Defaults to infinity, #' giving the expected time spent in or number of visits to the state until #' absorption. However, the calculation will be much more efficient if a finite #' (potentially large) time is specified: see the "Details" section. For #' models without an absorbing state, \code{t} must be specified. #' @param covariates The covariate values to estimate for. This can either #' be:\cr #' #' the string \code{"mean"}, denoting the means of the covariates in the data #' (this is the default),\cr #' #' the number \code{0}, indicating that all the covariates should be set to #' zero,\cr #' #' or a list of values, with optional names. For example #' #' \code{list (60, 1)} #' #' where the order of the list follows the order of the covariates originally #' given in the model formula, or a named list, #' #' \code{list (age = 60, sex = 1)} #' #' @param piecewise.times Times at which piecewise-constant intensities change. #' See \code{\link{pmatrix.piecewise.msm}} for how to specify this. This is #' only required for time-inhomogeneous models specified using explicit #' time-dependent covariates, and should not be used for models specified using #' "pci". #' @param piecewise.covariates Covariates on which the piecewise-constant #' intensities depend. See \code{\link{pmatrix.piecewise.msm}} for how to #' specify this. #' @param num.integ Use numerical integration instead of analytic solution (see #' below). #' @param discount Discount rate in continuous time. #' @param env Supplied to \code{\link{totlos.msm}}. If \code{TRUE}, return the #' expected number of visits to each state. If \code{FALSE}, return the total #' length of stay in each state. \code{\link{envisits.msm}} simply calls #' \code{\link{totlos.msm}} with \code{env=TRUE}. #' @param ci If \code{"normal"}, then calculate a confidence interval by #' simulating \code{B} random vectors from the asymptotic multivariate normal #' distribution implied by the maximum likelihood estimates (and covariance #' matrix) of the log transition intensities and covariate effects, then #' calculating the total length of stay for each replicate. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' #' If \code{"none"} (the default) then no confidence interval is calculated. #' @param cl Width of the symmetric confidence interval, relative to 1 #' @param B Number of bootstrap replicates #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' @param ... Further arguments to be passed to the \code{\link{integrate}} #' function to control the numerical integration. #' @return A vector of expected total lengths of stay #' (\code{\link{totlos.msm}}), or expected number of visits #' (\code{\link{envisits.msm}}), for each transient state. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{sojourn.msm}}, \code{\link{pmatrix.msm}}, #' \code{\link{integrate}}, \code{\link{boot.msm}}. #' @references C. van Loan (1978). Computing integrals involving the matrix #' exponential. IEEE Transactions on Automatic Control 23(3)395-404. #' #' J. van Rosmalen, M. Toy and J.F. O'Mahony (2013). A mathematical approach #' for evaluating Markov models in continuous time without discrete-event #' simulation. Medical Decision Making 33:767-779. #' @keywords models #' @export totlos.msm totlos.msm <- function(x, start=1, end=NULL, fromt=0, tot=Inf, covariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, num.integ=FALSE, discount=0, env=FALSE, ci=c("none","normal","bootstrap"), # calculate a confidence interval cl = 0.95, # width of symmetric confidence interval B = 1000, # number of bootstrap replicates cores=NULL, ...) { if (!inherits(x, "msm")) stop("expected x to be a msm model") nst <- x$qmodel$nstates if (!is.numeric(start) || ((length(start)==1) && (! start %in% 1 : nst))) stop("start should be a state in 1, ..., ", nst, " or a vector of length ",nst) else if (length(start) == 1) {p0 <- rep(0, nst); p0[start] <- 1; start <- p0} else if (length(start) > 1) { if (length(start) != nst) stop("start should be a state in 1, ..., ", nst, " or a vector of length ",nst) } if (is.null(end)) end <- 1 : nst if (! all(end %in% 1 : nst)) stop("end should be a set of states in 1, ..., ", nst) if (!is.numeric(fromt) || !is.numeric(tot) || length(fromt) != 1 || length(tot) != 1 || fromt < 0 || tot < 0) stop("fromt and tot must be single non-negative numbers") if (fromt > tot) stop("tot must be greater than fromt") if (length(absorbing.msm(x)) == 0) if (tot==Inf) stop("Must specify a finite end time for a model with no absorbing state") if (!is.null(x$pci)){ piecewise.times <- x$pci piecewise.covariates <- msm.fill.pci.covs(x, covariates) } ncuts <- length(piecewise.times) npieces <- length(piecewise.covariates) if (!is.null(piecewise.times) && (!is.numeric(piecewise.times) || is.unsorted(piecewise.times))) stop("piecewise.times should be a vector of numbers in increasing order") if (!is.null(piecewise.covariates) && (npieces != ncuts + 1)) stop("Number of piecewise.covariate lists must be one greater than the number of cut points") if (is.null(piecewise.covariates)) { ## define homogeneous model as piecewise with one piece npieces <- 1 covs <- list(covariates) ptimes <- c(fromt, tot) } else { ## ignore all cut points outside [fromt,tot] keep <- which((piecewise.times > fromt) & (piecewise.times < tot)) ## cov value between fromt and min(first cut, tot) cov1 <- piecewise.covariates[findInterval(fromt, piecewise.times) + 1] covs <- c(cov1, piecewise.covariates[keep+1]) npieces <- length(covs) ptimes <- c(fromt, piecewise.times[keep], tot) } tmat <- envmat <- matrix(nrow=npieces, ncol=nst) if (tot==Inf) { tmat[,absorbing.msm(x)] <- Inf # set by hand or else integrate() will fail envmat[,absorbing.msm(x)] <- 1 rem <- setdiff(seq_len(nst), absorbing.msm(x)) } else rem <- seq_len(nst) for (i in 1:npieces) { from.t <- ptimes[i] to.t <- ptimes[i+1] Q <- qmatrix.msm(x, covariates=covs[[i]], ci="none") if (num.integ || to.t==Inf){ for (j in rem){ f <- function(time) { y <- numeric(length(time)) for (k in seq_along(y)) y[k] <- (start %*% pmatrix.msm(x, time[k], t1=0, covariates=covs[[i]], ci="none")) [j] y } tmat[i,j] <- integrate(f, from.t, to.t, ...)$value } } else { QQ <- rbind(c(0, start), cbind(rep(0,nst), Q - discount*diag(nst))) tmat[i,] <- as.vector(c(1, rep(0, nst)) %*% (MatrixExp(to.t*QQ) - MatrixExp(from.t*QQ)) %*% rbind(rep(0, nst), diag(nst))) } Q0 <- Q; diag(Q0) <- 0 envmat[i,rem] <- tmat[i,rem] %*% Q0[rem,rem] } res <- if (env) colSums(envmat) else colSums(tmat) names(res) <- rownames(x$qmodel$qmatrix) ci <- match.arg(ci) t.ci <- switch(ci, bootstrap = totlos.ci.msm(x=x, start=start, end=end, fromt=fromt, tot=tot, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, discount=discount, env=env, cl=cl, B=B, cores=cores, ...), normal = totlos.normci.msm(x=x, start=start, end=end, fromt=fromt, tot=tot, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, discount=discount, env=env, cl=cl, B=B, ...), none = NULL) res <- if (ci=="none") res[end] else rbind(res, t.ci)[,end] class(res) <- c("msm.estbystate", class(res)) res } #' @export print.msm.estbystate <- function(x, ...){ print(unclass(x)) } #' @export as.data.frame.msm.estbystate <- function(x,...){ as.data.frame(unclass(x)) } ## Expected number of visits #' @rdname totlos.msm #' @export envisits.msm <- function(x=NULL, start=1, end=NULL, fromt=0, tot=Inf, covariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, num.integ=FALSE, discount=0, ci=c("none","normal","bootstrap"), # calculate a confidence interval cl = 0.95, # width of symmetric confidence interval B = 1000, # number of bootstrap replicates cores=NULL, ...) { totlos.msm(x=x, start=start, end=end, fromt=fromt, tot=tot, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, num.integ=num.integ, discount=discount, env=TRUE, ci=ci, cl=cl, B=B, cores=cores, ...) } msm/R/constants.R0000644000176200001440000001571414535107132013417 0ustar liggesusers### PACKAGE GLOBAL CONSTANTS ### ### List of allowed hidden Markov model distributions ### and names of parameters for each distribution ### MUST BE KEPT IN THE SAME ORDER as the C variable HMODELS in src/lik.c .msm.HMODELPARS <- list( categorical=c("ncats","basecat","p"), identity = NULL, uniform = c("lower", "upper"), normal = c("mean", "sd"), lognormal = c("meanlog", "sdlog"), exponential = c("rate"), gamma = c("shape","rate"), weibull = c("shape","scale"), poisson = c("rate"), binomial = c("size","prob"), betabinomial = c("size","meanp","sdp"), truncnorm = c("mean", "sd", "lower", "upper"), metruncnorm = c("mean", "sd", "lower", "upper", "sderr", "meanerr"), meuniform = c("lower", "upper", "sderr", "meanerr"), nbinom = c("disp","prob"), beta = c("shape1","shape2"), t = c("mean","scale","df") ) ## TODO - e.g. non-central beta, cauchy, chisq, noncentral chisq, F, ## non-central F, geometric, hypergeometric, logistic, noncentral t. .msm.HMODELS <- names(.msm.HMODELPARS) ### Models with analytic derivatives available .msm.HMODELS.DERIV <- c("categorical","identity","uniform","normal","lognormal","exponential", "gamma","weibull","poisson","binomial","nbinom","beta","t") ### Models with expected information matrix available .msm.HMODELS.INFO <- c("categorical","identity") .msm.HMODELFNS <- data.frame( label = .msm.HMODELS, hmmname = c("hmmCat", "hmmIdent", "hmmUnif", "hmmNorm", "hmmLNorm", "hmmExp", "hmmGamma", "hmmWeibull", "hmmPois", "hmmBinom", "hmmBetaBinom", "hmmTNorm", "hmmMETNorm", "hmmMEUnif", "hmmNBinom", "hmmBeta", "hmmT"), stringsAsFactors = FALSE ) ### Parameter in each distribution that can have covariates on it .msm.LOCPARS <- c(categorical="p", identity=NA, uniform=NA, normal="mean", lognormal="meanlog", exponential="rate", gamma="rate", weibull="scale", poisson="rate", binomial="prob", betabinomial="meanp", truncnorm="mean", metruncnorm="meanerr", meuniform="meanerr", nbinom="prob", beta=NA, t="mean") ### Link functions for generalised regressions. ### MUST BE KEPT IN SAME ORDER as LINKFNS in lik.c .msm.LINKFNS <- c("identity", "log", "qlogis") .msm.INVLINK <- c(identity="identity", log="exp", qlogis="plogis") ### Parameters which are always fixed, never estimated .msm.AUXPARS <- c("lower", "upper", "which", "size", "meanerr", "ncats", "basecat", "p0", "pbase", "initpbase", "initp0") ### Parameters which should be defined as integer .msm.INTEGERPARS <- c("size") ### Defined ranges for parameters .msm.PARRANGES <- list(qbase=c(0, Inf), lower=c(-Inf,Inf), upper=c(-Inf, Inf), mean=c(-Inf, Inf), sd=c(0, Inf), meanlog=c(-Inf,Inf), sdlog=c(0, Inf), rate=c(0, Inf), shape=c(0, Inf), scale=c(0, Inf), shape1=c(0,Inf), shape2=c(0,Inf), meanp=c(0, 1), sdp=c(0, Inf), prob=c(0, 1), meanerr=c(-Inf, Inf), sderr=c(0, Inf), disp=c(0, Inf), p=c(-Inf,Inf), # handled separately using multinomial logit initp=c(-Inf,Inf), # handled separately using multinomial logit df=c(0, Inf), qcov=c(-Inf,Inf),hcov=c(-Inf,Inf),initpcov=c(-Inf,Inf) ) for (i in .msm.AUXPARS) .msm.PARRANGES[[i]] <- c(-Inf, Inf) .msm.PARRANGES <- do.call("rbind",.msm.PARRANGES) colnames(.msm.PARRANGES) <- c("lower","upper") ### Transforms to optimise some parameters on a different scale ### Univariate transforms only: doesn't include multinomial logit transform used for misclassification p and initial state probs .msm.TRANSFORMS <- do.call("rbind", apply(.msm.PARRANGES, 1, function(x) { if (identical(x, c(lower=0, upper=Inf))) c(fn="log",inv="exp") else if (identical(x, c(lower=0, upper=1))) c(fn="qlogis",inv="plogis") else NULL } ) ) ### Distinct labelled (1 and) 2 and 3 state directed graphs. ### graphs with common "iso" are isomorphic (i.e. identical when states are unlabelled) ### "perm" is permutation of states needed to transform graph into the first in the list of isomorphisms ### This database is used to determine the appropriate method for calculating the analytic P matrix. ### The numbered label gives the indices into the matrix of rates (vectorised by reading across rows) ### e.g. the model with qmatrix of the form ### *,1,1 ### 0,*,1 ### 0,0,* is "1-2-4" ### well-disease, well-death, disease-death transitions allowed. .msm.graphs <- list( "1" = list(), "2" = list( "1" = list(iso=1, perm=c(1,2)), "2" = list(iso=1, perm=c(2,1)), "1-2" = list(iso=2, perm=c(1,2)) ), "3" = list( "1-2" = list(iso=1, perm=c(1,2,3)), "3-4" = list(iso=1, perm=c(3,1,2)), "5-6" = list(iso=1, perm=c(2,3,1)), "1-4" = list(iso=2, perm=c(1,2,3)), "1-5" = list(iso=2, perm=c(2,3,1)), "2-3" = list(iso=2, perm=c(2,1,3)), "2-6" = list(iso=2, perm=c(1,3,2)), "3-6" = list(iso=2, perm=c(3,2,1)), "4-5" = list(iso=2, perm=c(3,1,2)), "1-6" = list(iso=3, perm=c(1,2,3)), "2-4" = list(iso=3, perm=c(3,1,2)), "3-5" = list(iso=3, perm=c(2,3,1)), "1-2-4" = list(iso=4,perm=c(1,2,3)), "1-2-6" = list(iso=4,perm=c(1,3,2)), "1-5-6" = list(iso=4,perm=c(2,3,1)), "2-3-4" = list(iso=4,perm=c(2,1,3)), "3-4-5" = list(iso=4,perm=c(3,1,2)), "3-5-6" = list(iso=4,perm=c(3,2,1)), "1-3-5" = list(iso=5,perm=c(1,2,3)), "1-3-6" = list(iso=5,perm=c(2,1,3)), "1-4-6" = list(iso=5,perm=c(3,1,2)), "2-3-5" = list(iso=5,perm=c(1,3,2)), "2-4-5" = list(iso=5,perm=c(2,3,1)), "2-4-6" = list(iso=5,perm=c(3,2,1)), "1-2-4-6" = list(iso=6,perm=c(1,2,3)), "1-3-5-6" = list(iso=6,perm=c(2,3,1)), "2-3-4-5" = list(iso=6,perm=c(3,1,2)) ), "4" = list( "1-5-9" = list(iso=1,perm=c(1,2,3,4)), "1-3-5-6-9" = list(iso=2,perm=c(1,2,3,4)) ), "5" = list( "1-6-11-16" = list(iso=1,perm=c(1,2,3,4,5)), "1-4-6-8-11-12-16" = list(iso=2,perm=c(1,2,3,4,5)), "1-6-7-11-12" = list(iso=3,perm=c(1,2,3,4,5)) ) ) ## Tasks to be performed in C .msm.CTASKS <- c("lik","deriv","info","viterbi","lik.subj","deriv.subj","dpmat") msm/R/boot.R0000644000176200001440000007031214527724163012353 0ustar liggesusers### Reconstruct data for original msm model fit. Replace ### generically-named variables in model data frame ("(subject)", ### "(time)", "(state)" etc.) with the names specified by the user for ### the original model call, to allow model refits for ### cross-validation or bootstrapping using the original call. If not ### found in the usernames attribute, these columns are dropped, ### assuming they're not needed for the refit. Drop imputed ### observations at piecewise constant intensity change points. ### NOTE assuming timeperiod covariate OK to leave as is ### Factor handling: strips factor() from variable names, ## if original data was factor, will be factor in mf as well, so refit will work ## if not factor in df but factor() in formula, stripping factor() allows refit to work ## TODO can test this with simple refits ## test whether labels are OK, check changelog reconstruct.data <- function(mf){ un <- attr(mf, "usernames") par.name <- paste0("(",names(un),")") ids <- match(par.name, names(mf)) names(mf) <- replace(names(mf), ids, un) if (!is.null(mf$"(pci.imp)")) mf <- mf[!mf$"(pci.imp)",] if(is.na(un["subject"])) { un["subject"] <- "subject" mf$subject <- mf$"(subject)" attr(mf, "usernames") <- un } for (i in grep("^\\(.+\\)$", names(mf), value=TRUE)) mf[,i] <- NULL colnames(mf) <- gsub("factor\\((.+)\\)", "\\1", colnames(mf)) mf } ### Take a bootstrap sample from the data contained in a fitted msm ### model. Sample pairs of consecutive observations, i.e. independent ### transitions. Not applicable if model is hidden or some states are ### censored. bootdata.trans.msm <- function(x) { dat <- reconstruct.data(model.frame(x)) un <- attr(dat, "usernames") ## sample random rows of original data, excluding last observation inds <- sample(which(duplicated(dat[,un["subject"]], fromLast=TRUE)), replace=TRUE) ## make new data by interleaving corresponding "from-state" and "to-state" rows ntrans <- length(inds) dat <- dat[,-match(un["subject"], names(dat)),drop=FALSE] z <- array(c(unlist(dat[inds,]), # "from-state" data unlist(dat[inds+1,])), # "to-state" data dim=c(ntrans, ncol(dat), 2)) data.boot <- matrix(aperm(z, c(3,1,2)), nrow=2*ntrans, ncol=ncol(dat), dimnames=list(NULL,names(dat))) data.boot <- as.data.frame(data.boot) ## label every transition in new data as from a different subject data.boot[,un["subject"]] <- rep(1:ntrans, each=2) ## make sure factor covariates retain their original level labels facvars <- names(dat)[sapply(dat, is.factor)] faccovs <- setdiff(facvars, un) for (i in faccovs) data.boot[,i] <- factor(data.boot[,i], labels=sort(unique(dat[,i]))) data.boot } ### Take a bootstrap sample from the data contained in a fitted msm ### model. Sample subjects. Used for hidden models or models with ### censoring, in which the transitions within a subject are not ### independent. bootdata.subject.msm <- function(x) { dat <- model.frame(x) subj.num <- match(dat$"(subject)", unique(dat$"(subject)")) subjs <- sample(unique(subj.num), replace=TRUE) inds <- new.subj <- NULL for (i in seq_along(subjs)) { subj.inds <- which(subj.num == subjs[i]) inds <- c(inds, subj.inds) new.subj <- c(new.subj, rep(i, length(subj.inds))) } data.boot <- dat[inds,] data.boot[,"(subject)"] <- new.subj data.boot <- reconstruct.data(data.boot) data.boot } ### Given a fitted msm model, draw a bootstrap dataset, refit the ### model, and optionally compute a statistic on the refitted model. ### Repeat B times, store the results in a list. ### msm objects tend to be large, so it is advised to compute a statistic on them by specifying "stat", instead ### of using this function to return a list of refitted msm objects. ### To compute more than one statistic, specify, e.g. stat=function(x)list(stat1(x),stat2(x)) ### Some of the arguments to the msm call might be user-defined objects. ### e.g. qmatrix, ematrix, hmodel, ... ### Put in help file that these must be in the working environment. #' Bootstrap resampling for multi-state models #' #' Draw a number of bootstrap resamples, refit a \code{\link{msm}} model to the #' resamples, and calculate statistics on the refitted models. #' #' The bootstrap datasets are computed by resampling independent pairs of #' observations at successive times (for non-hidden models without censoring), #' or independent individual series (for hidden models or models with #' censoring). Therefore this approach doesn't work if, for example, the data #' for a HMM consist of a series of observations from just one individual, and #' is inaccurate for small numbers of independent transitions or individuals. #' #' Confidence intervals or standard errors for the corresponding statistic can #' be calculated by summarising the returned list of \code{B} replicated #' outputs. This is currently implemented for most the output functions #' \code{\link{qmatrix.msm}}, \code{\link{ematrix.msm}}, #' \code{\link{qratio.msm}}, \code{\link{pmatrix.msm}}, #' \code{\link{pmatrix.piecewise.msm}}, \code{\link{totlos.msm}} and #' \code{\link{prevalence.msm}}. For other outputs, users will have to write #' their own code to summarise the output of \code{\link{boot.msm}}. #' #' Most of \pkg{msm}'s output functions present confidence intervals based on #' asymptotic standard errors calculated from the Hessian. These are expected #' to be underestimates of the true standard errors (Cramer-Rao lower bound). #' Some of these functions use a further approximation, the delta method (see #' \code{\link{deltamethod}}) to obtain standard errors of transformed #' parameters. Bootstrapping should give a more accurate estimate of the #' uncertainty. #' #' An alternative method which is less accurate though faster than #' bootstrapping, but more accurate than the delta method, is to draw a sample #' from the asymptotic multivariate normal distribution implied by the maximum #' likelihood estimates (and covariance matrix), and summarise the transformed #' estimates. See \code{\link{pmatrix.msm}}. #' #' All objects used in the original call to \code{\link{msm}} which produced #' \code{x}, such as the \code{qmatrix}, should be in the working environment, #' or else \code{boot.msm} will produce an \dQuote{object not found} error. #' This enables \code{boot.msm} to refit the original model to the replicate #' datasets. However there is currently a limitation. In the original call to #' \code{msm}, the \code{"formula"} argument should be specified directly, as, #' for example, #' #' \code{msm(state ~ time, data = ...)} #' #' and not, for example, #' #' \code{form = data$state ~ data$time} #' #' \code{msm(formula=form, data = ...)} #' #' otherwise \code{boot.msm} will be unable to draw the replicate datasets. #' #' \code{boot.msm} will also fail with an incomprehensible error if the #' original call to msm used a used-defined object whose name is the same as a #' built-in R object, or an object in any other loaded package. For example, #' if you have called a Q matrix \code{q}, when \code{q()} is the built-in #' function for quitting R. #' #' If \code{stat} is \code{NULL}, then \code{B} different \code{msm} model #' objects will be stored in memory. This is unadvisable, as \code{msm} objects #' tend to be large, since they contain the original data used for the #' \code{msm} fit, so this will be wasteful of memory. #' #' To specify more than one statistic, write a function consisting of a list of #' different function calls, for example, #' #' \code{stat = function(x) list (pmatrix.msm(x, t=1), pmatrix.msm(x, t=2))} #' #' @param x A fitted msm model, as output by \code{\link{msm}}. #' @param stat A function to call on each refitted msm model. By default this #' is \code{\link{pmatrix.msm}}, returning the transition probability matrix in #' one time unit. If \code{NULL} then no function is computed. #' @param B Number of bootstrap resamples. #' @param file Name of a file in which to save partial results after each #' replicate. This is saved using \code{\link{save}} and can be restored using #' \code{\link{load}}, producing an object called \code{boot.list} containing #' the partial results. Not supported when using parallel processing. #' @param cores Number of processor cores to use for parallel processing. #' Requires the \pkg{doParallel} package to be installed. If not specified, #' parallel processing is not used. If \code{cores} is set to the string #' \code{"default"}, the default methods of \code{\link[parallel]{makeCluster}} #' (on Windows) or \code{\link[doParallel]{registerDoParallel}} (on Unix-like) #' are used. #' @param remove.errors If \code{TRUE} then bootstrap refits which resulted in an #' error are removed from the returned list, and a message is returned which states the #' proportion of failed fits and the first error message. If \code{FALSE}, then #' the error message for failed refits is placed in the #' corresponding component of the returned list. #' @return A list with \code{B} components, containing the result of calling #' function \code{stat} on each of the refitted models. If \code{stat} is #' \code{NULL}, then each component just contains the refitted model. If one #' of the \code{B} model fits was unsuccessful and resulted in an error, then #' the corresponding list component will contain the error message. #' @author C.H.Jackson #' @seealso \code{\link{qmatrix.msm}}, \code{\link{qratio.msm}}, #' \code{\link{sojourn.msm}}, \code{\link{ematrix.msm}}, #' \code{\link{pmatrix.msm}}, \code{\link{pmatrix.piecewise.msm}}, #' \code{\link{totlos.msm}}, \code{\link{prevalence.msm}}. #' @references Efron, B. and Tibshirani, R.J. (1993) \emph{An Introduction to #' the Bootstrap}, Chapman and Hall. #' @keywords models #' @examples #' #' \dontrun{ #' ## Psoriatic arthritis example #' data(psor) #' psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) #' psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = #' psor.q, covariates = ~ollwsdrt+hieffusn, #' constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), #' control = list(REPORT=1,trace=2), method="BFGS") #' ## Bootstrap the baseline transition intensity matrix. This will take a long time. #' q.list <- boot.msm(psor.msm, function(x)x$Qmatrices$baseline) #' ## Manipulate the resulting list of matrices to calculate bootstrap standard errors. #' apply(array(unlist(q.list), dim=c(4,4,5)), c(1,2), sd) #' ## Similarly calculate a bootstrap 95% confidence interval #' apply(array(unlist(q.list), dim=c(4,4,5)), c(1,2), #' function(x)quantile(x, c(0.025, 0.975))) #' ## Bootstrap standard errors are larger than the asymptotic standard #' ## errors calculated from the Hessian #' psor.msm$QmatricesSE$baseline #' } #' #' @export boot.msm boot.msm <- function(x, stat=pmatrix.msm, B=1000, file=NULL, cores=NULL, remove.errors=TRUE){ boot.fn <- function(dummy){ boot.data <- if (x$hmodel$hidden || x$cmodel$ncens) bootdata.subject.msm(x) else bootdata.trans.msm(x) x$call$data <- substitute(boot.data) res <- try(eval(x$call)) if (!inherits(res, "try-error") && !is.null(stat)) res <- try(stat(res)) res } if (is.null(cores) || cores==1) parallel <- FALSE else parallel <- TRUE; if (parallel) { if (!is.null(cores) && cores=="default") cores <- NULL if (requireNamespace("doParallel", quietly = TRUE)){ ### can't get this working separated out into a function like portable.parallel(). Variable exporting / scoping doesnt' work. if (.Platform$OS.type == "windows") { cl <- parallel::makeCluster(cores) doParallel::registerDoParallel(cl) } else doParallel::registerDoParallel(cores=cores) boot.list <- foreach::"%dopar%"(foreach::foreach(i=1:B, .packages="msm", .export=c("x",ls(.GlobalEnv))), { boot.fn(i) }) if (.Platform$OS.type == "windows") parallel::stopCluster(cl) } else stop("\"parallel\" package not available") } else { boot.list <- vector(B, mode="list") for (i in 1:B) { boot.list[[i]] <- boot.fn() if (!is.null(file)) save(boot.list, file=file) } } if (remove.errors) boot.list <- handle_refit_errors(boot.list) boot.list } handle_refit_errors <- function(blist){ errors <- vapply(blist, function(x)inherits(x, "try-error"), TRUE) nerrors <- sum(errors) if (nerrors > 0) { message(sprintf("%s/%s bootstrap refits ended in an error", nerrors, length(blist))) message(sprintf("First error: %s", blist[[min(which(errors))]])) } blist[!errors] } ### Utilities for calculating bootstrap CIs for particular statistics qmatrix.ci.msm <- function(x, covariates="mean", sojourn=FALSE, cl=0.95, B=1000, cores=NULL) { q.list <- boot.msm(x, function(x)qmatrix.msm(x=x, covariates=covariates)$estimates, B=B, cores=cores) q.array <- array(unlist(q.list), dim=c(dim(q.list[[1]]), length(q.list))) q.ci <- apply(q.array, c(1,2), function(x)(c(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)), sd(x)))) q.ci <- aperm(q.ci, c(2,3,1)) if (sojourn) { soj.array <- apply(q.array, 3, function(x) -1/diag(x)) soj.ci <- apply(soj.array, 1, function(x)(c(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)), sd(x)))) list(q=q.ci, soj=soj.ci) } else q.ci } ematrix.ci.msm <- function(x, covariates="mean", cl=0.95, B=1000, cores=NULL) { e.list <- boot.msm(x, function(x)ematrix.msm(x=x, covariates=covariates)$estimates, B=B, cores=cores) e.array <- array(unlist(e.list), dim=c(dim(e.list[[1]]), length(e.list))) e.ci <- apply(e.array, c(1,2), function(x)(c(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)), sd(x)))) aperm(e.ci, c(2,3,1)) } qratio.ci.msm <- function(x, ind1, ind2, covariates="mean", cl=0.95, B=1000, cores=NULL) { q.list <- boot.msm(x, function(x)qratio.msm(x=x, ind1=ind1, ind2=ind2, covariates=covariates)["estimate"], B=B, cores=cores) q.vec <- unlist(q.list) c(quantile(q.vec, c(0.5 - cl/2, 0.5 + cl/2)), sd(q.vec)) } pnext.ci.msm <- function(x, covariates="mean", cl=0.95, B=1000, cores=NULL) { p.list <- boot.msm(x, function(x)pnext.msm(x=x, covariates=covariates, ci="none")$estimates, B=B, cores=cores) p.array <- array(unlist(p.list), dim=c(dim(p.list[[1]]), length(p.list))) p.ci <- apply(p.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) aperm(p.ci, c(2,3,1)) } pmatrix.ci.msm <- function(x, t, t1, covariates="mean", cl=0.95, B=1000, cores=NULL) { p.list <- boot.msm(x, function(x)pmatrix.msm(x=x, t=t, t1=t1, covariates=covariates,ci="none"), B=B, cores=cores) p.array <- array(unlist(p.list), dim=c(dim(p.list[[1]]), length(p.list))) p.ci <- apply(p.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) aperm(p.ci, c(2,3,1)) } pmatrix.piecewise.ci.msm <- function(x, t1, t2, times, covariates="mean", cl=0.95, B=1000, cores=NULL) { p.list <- boot.msm(x, function(x)pmatrix.piecewise.msm(x=x, t1=t1, t2=t2, times=times, covariates=covariates,ci="none"), B=B, cores=cores) p.array <- array(unlist(p.list), dim=c(dim(p.list[[1]]), length(p.list))) p.ci <- apply(p.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) aperm(p.ci, c(2,3,1)) } totlos.ci.msm <- function(x, start=1, end=NULL, fromt=0, tot=Inf, covariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, discount=0, env=FALSE, cl=0.95, B=1000, cores=NULL,...) { t.list <- boot.msm(x, function(x)totlos.msm(x=x, start=start, end=end, fromt=fromt, tot=tot, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, discount=discount, env=env, ci="none",...), B=B, cores=cores) t.array <- do.call("rbind", t.list) apply(t.array, 2, function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) } efpt.ci.msm <- function(x, qmatrix=NULL, tostate, start, covariates="mean", cl=0.95, B=1000, cores=NULL) { t.list <- boot.msm(x, function(x)efpt.msm(x=x, qmatrix=qmatrix, start=start, tostate=tostate, covariates=covariates, ci="none"), B=B, cores=cores) t.array <- do.call("rbind", t.list) apply(t.array, 2, function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) } ppass.ci.msm <- function(x, qmatrix, tot, start, covariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, cl=0.95, B=1000, cores=NULL,...) { t.list <- boot.msm(x, function(x)ppass.msm(x=x, qmatrix=qmatrix, tot=tot, start=start, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, ci="none",...), B=B, cores=cores) nst <- ncol(t.list[[1]]) t.array <- do.call("rbind", lapply(t.list, as.vector)) ci <- apply(t.array, 2, function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) di <- dimnames(t.list[[1]]) list(L=matrix(ci[1,],ncol=nst,dimnames=di), U=matrix(ci[2,],ncol=nst, dimnames=di)) } phasemeans.ci.msm <- function(x, covariates="mean", cl=0.95, B=1000, cores=NULL, ...) { p.list <- boot.msm(x, function(x)phasemeans.msm(x=x, covariates=covariates, ci="none", ...), B=B, cores=cores) p.array <- array(unlist(p.list), dim=c(dim(p.list[[1]]), length(p.list))) p.ci <- apply(p.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) aperm(p.ci, c(2,3,1)) } expected.ci.msm <- function(x, times=NULL, timezero=NULL, initstates=NULL, covariates="mean", misccovariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, risk=NULL, cl=0.95, B=1000, cores=NULL) { if(is.null(risk)) risk <- observed.msm(x)$risk e.list <- boot.msm(x, function(x){ expected.msm(x, times, timezero, initstates, covariates, misccovariates, piecewise.times, piecewise.covariates, risk) }, B=B, cores=cores) e.tab.array <- array(unlist(lapply(e.list, function(x)x[[1]])), dim=c(length(times), x$qmodel$nstates+1, length(e.list))) e.perc.array <- array(unlist(lapply(e.list, function(x)x[[2]])), dim=c(length(times), x$qmodel$nstates, length(e.list))) e.tab.ci <- apply(e.tab.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) e.perc.ci <- apply(e.perc.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) res <- list(aperm(e.tab.ci, c(2,3,1)), aperm(e.perc.ci, c(2,3,1))) names(res) <- c("Expected", "Expected percentages") res } #' Update the maximum likelihood estimates in a fitted model object. #' #' Update the maximum likelihood estimates in a fitted model object. Intended for #' developer use only. #' #' @param x A fitted multi-state model object, as returned by #' \code{\link{msm}}. #' @param pars Vector of new parameters, in their untransformed real-line #' parameterisations, to substitute for the maximum likelihood estimates #' corresponding to those in the \code{estimates} component of the fitted model #' object (\code{\link{msm.object}}). The order of the parameters is #' documented in \code{\link{msm}}, argument \code{fixedpars}. #' @return An updated \code{\link{msm}} model object with the updated maximum #' likelihood estimates, but with the covariances / standard errors unchanged. #' #' Point estimates from output functions such as \code{\link{qmatrix.msm}}, #' \code{\link{pmatrix.msm}}, or any related function, can then be evaluated #' with the new parameters, and at arbitrary covariate values. #' #' This function is used, for example, when computing confidence intervals from #' \code{\link{pmatrix.msm}}, and related functions, using the #' \code{ci="normal"} method. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @keywords models #' @export updatepars.msm updatepars.msm <- function(x, pars){ x.rep <- x x.rep$paramdata$params <- pars x.rep$estimates <- pars output <- msm.form.output(x.rep, "intens") x.rep$Qmatrices <- output$Qmatrices if (x$emodel$misc) { output <- msm.form.output(x.rep, "misc") x.rep$Ematrices <- output$Ematrices names(x.rep$Ematrices)[1] <- "logitbaseline" } x.rep } ### Compute a CI for a statistic using a sample from the assumed MVN ### distribution of MLEs of log Q, logit E and covariate effects on these ### Not user visible: only support statistics based on Q matrix and E matrix ### i.e. statistics computed as functions of x$Qmatrices, x$Ematrices and x$paramdata$params normboot.msm <- function(x, stat, B=1000) { ## simulate from vector of unreplicated parameters, to avoid numerical problems with rmvnorm when lots of correlations are 1 if (!x$foundse) stop("Asymptotic standard errors not available in fitted model") sim <- rmvnorm(B, x$opt$par, x$covmat[x$paramdata$optpars,x$paramdata$optpars]) params <- matrix(nrow=B, ncol=x$paramdata$npars) # replicate constrained parameters. params[,x$paramdata$optpars] <- sim params[,x$paramdata$fixedpars] <- rep(x$paramdata$params[x$paramdata$fixedpars], each=B) params[,x$paramdata$hmmpars] <- rep(msm.mninvlogit.transform(x$paramdata$params[x$paramdata$hmmpars], x$hmodel), each=B) params <- params[, !duplicated(abs(x$paramdata$constr)), drop=FALSE][, abs(x$paramdata$constr), drop=FALSE] * rep(sign(x$paramdata$constr), each=B) sim.stat <- vector(B, mode="list") for (i in 1:B) { x.rep <- updatepars.msm(x, params[i,]) sim.stat[[i]] <- stat(x.rep) } sim.stat } qmatrix.normci.msm <- function(x, covariates="mean", sojourn=FALSE, cl=0.95, B=1000) { q.list <- normboot.msm(x, function(x)qmatrix.msm(x=x, covariates=covariates, ci="none"), B) q.array <- array(unlist(q.list), dim=c(dim(q.list[[1]]), length(q.list))) q.ci <- apply(q.array, c(1,2), function(x)(c(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)), sd(x)))) q.ci <- aperm(q.ci, c(2,3,1)) if (sojourn) { soj.array <- apply(q.array, 3, function(x) -1/diag(x)) soj.ci <- apply(soj.array, 1, function(x)(c(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)), sd(x)))) list(q=q.ci, soj=soj.ci) } else q.ci } ematrix.normci.msm <- function(x, covariates="mean", cl=0.95, B=1000) { e.list <- normboot.msm(x, function(x)ematrix.msm(x=x, covariates=covariates, ci="none"), B) e.array <- array(unlist(e.list), dim=c(dim(e.list[[1]]), length(e.list))) e.ci <- apply(e.array, c(1,2), function(x)(c(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)), sd(x)))) aperm(e.ci, c(2,3,1)) } qratio.normci.msm <- function(x, ind1, ind2, covariates="mean", cl=0.95, B=1000) { q.list <- normboot.msm(x, function(x)qratio.msm(x=x, ind1=ind1, ind2=ind2, covariates=covariates, ci="none")["estimate"], B) q.vec <- unlist(q.list) c(quantile(q.vec, c(0.5 - cl/2, 0.5 + cl/2)), sd(q.vec)) } pnext.normci.msm <- function(x, covariates="mean", cl=0.95, B=1000) { p.list <- normboot.msm(x, function(x)pnext.msm(x=x, covariates=covariates, ci="none")$estimates, B) p.array <- array(unlist(p.list), dim=c(dim(p.list[[1]]), length(p.list))) p.ci <- apply(p.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) aperm(p.ci, c(2,3,1)) } pmatrix.normci.msm <- function(x, t, t1, covariates="mean", cl=0.95, B=1000) { p.list <- normboot.msm(x, function(x)pmatrix.msm(x=x, t=t, t1=t1, covariates=covariates, ci="none"), B) p.array <- array(unlist(p.list), dim=c(dim(p.list[[1]]), length(p.list))) p.ci <- apply(p.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) aperm(p.ci, c(2,3,1)) } pmatrix.piecewise.normci.msm <- function(x, t1, t2, times, covariates="mean", cl=0.95, B=1000) { p.list <- normboot.msm(x, function(x)pmatrix.piecewise.msm(x=x, t1=t1, t2=t2, times=times, covariates=covariates, ci="none"), B) p.array <- array(unlist(p.list), dim=c(dim(p.list[[1]]), length(p.list))) p.ci <- apply(p.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) aperm(p.ci, c(2,3,1)) } totlos.normci.msm <- function(x, start=1, end=NULL, fromt=0, tot=Inf, covariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, discount=0, env=FALSE, cl=0.95, B=1000, ...) { t.list <- normboot.msm(x, function(x)totlos.msm(x=x, start=start, end=end, fromt=fromt, tot=tot, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, discount=discount, env=env, ci="none", ...), B) t.array <- do.call("rbind", t.list) apply(t.array, 2, function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) } efpt.normci.msm <- function(x, qmatrix=NULL, tostate, start, covariates="mean", cl=0.95, B=1000, ...) { t.list <- normboot.msm(x, function(x)efpt.msm(x=x, qmatrix=qmatrix, tostate=tostate, start=start, covariates=covariates, ci="none", ...), B) t.array <- do.call("rbind", t.list) apply(t.array, 2, function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) } ppass.normci.msm <- function(x, qmatrix, tot, start, covariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, cl=0.95, B=1000, ...) { t.list <- normboot.msm(x, function(x)ppass.msm(x=x, qmatrix=qmatrix, tot=tot, start=start, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, ci="none", ...), B) nst <- ncol(t.list[[1]]) t.array <- do.call("rbind", lapply(t.list, as.vector)) ci <- apply(t.array, 2, function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) di <- dimnames(t.list[[1]]) list(L=matrix(ci[1,],ncol=nst,dimnames=di), U=matrix(ci[2,],ncol=nst, dimnames=di)) } expected.normci.msm <- function(x, times=NULL, timezero=NULL, initstates=NULL, covariates="mean", misccovariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, risk=NULL, cl=0.95, B=1000) { if(is.null(risk)) risk <- observed.msm(x)$risk e.list <- normboot.msm(x, function(x){ expected.msm(x, times, timezero, initstates, covariates, misccovariates, piecewise.times, piecewise.covariates, risk) }, B) e_tab_vec <- unlist(lapply(e.list, function(x)x$"Expected")) e.tab.array <- array(e_tab_vec, dim=c(length(times), x$qmodel$nstates+1, B)) e_perc_vec <- unlist(lapply(e.list, function(x)x$"Expected percentages")) e.perc.array <- array(e_perc_vec, dim=c(length(times), x$qmodel$nstates, B)) e.tab.ci <- apply(e.tab.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) e.perc.ci <- apply(e.perc.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) res <- list(aperm(e.tab.ci, c(2,3,1)), aperm(e.perc.ci, c(2,3,1))) names(res) <- c("Expected", "Expected percentages") res } phasemeans.normci.msm <- function(x, covariates="mean", cl=0.95, B=1000, ...) { p.list <- normboot.msm(x, function(x)phasemeans.msm(x=x, covariates=covariates, ci="none", ...), B) p.array <- array(unlist(p.list), dim=c(dim(p.list[[1]]), length(p.list))) p.ci <- apply(p.array, c(1,2), function(x)(quantile(x, c(0.5 - cl/2, 0.5 + cl/2)))) aperm(p.ci, c(2,3,1)) } msm/R/msm-package.R0000644000176200001440000000232014534620514013560 0ustar liggesusers#' Multi-State Markov and Hidden Markov Models in Continuous Time #' #' msm: Functions for fitting continuous-time Markov and hidden Markov #' multi-state models to longitudinal data. Designed for processes #' observed at arbitrary times in continuous time (intermittently #' observed or panel data) but some other observation schemes are #' supported. Both Markov transition rates and the hidden Markov #' output process can be modelled in terms of covariates, which may be #' constant or piecewise-constant in time. #' #' @name msm-package #' @aliases msm-package #' @docType package #' @useDynLib msm, .registration=TRUE #' #' @importFrom graphics plot persp contour image filled.contour legend lines par text #' @importFrom grDevices rainbow #' @importFrom stats coef as.formula deriv dexp dnorm integrate logLik model.extract model.frame model.matrix na.fail na.omit na.pass numericDeriv optimHess pchisq pexp plogis pnorm qlogis qnorm quantile rbeta rbinom reformulate rexp rgamma rlnorm rnbinom rnorm rpois rt runif rweibull sd setNames terms uniroot reshape #' @importFrom utils head tail #' @importFrom mvtnorm rmvnorm #' @importFrom survival Surv survfit #' @importFrom expm expm #' "_PACKAGE" msm/R/tnorm.R0000644000176200001440000002223414654466415012553 0ustar liggesusers#' Truncated Normal distribution #' #' Density, distribution function, quantile function and random generation for #' the truncated Normal distribution with mean equal to \code{mean} and #' standard deviation equal to \code{sd} before truncation, and truncated on #' the interval \code{[lower, upper]}. #' #' The truncated normal distribution has density #' #' \deqn{ f(x, \mu, \sigma) = \phi(x, \mu, \sigma) / (\Phi(u, \mu, \sigma) - #' \Phi(l, \mu, \sigma)) }{ f(x, mu, sigma) = phi(x, mu, sigma) / (Phi(upper, #' mu, sigma) - Phi(lower, mu, sigma)) } for \eqn{l <= x #' <= u}{lower <= x <= upper}, and 0 otherwise. #' #' \eqn{\mu}{mean} is the mean of the original Normal distribution before #' truncation, \cr \eqn{\sigma}{sd} is the corresponding standard deviation, #' \cr \eqn{u} is the upper truncation point, \cr \eqn{l} is the lower #' truncation point, \cr \eqn{\phi(x)}{phi(x)} is the density of the #' corresponding normal distribution, and \cr \eqn{\Phi(x)}{Phi(x)} is the #' distribution function of the corresponding normal distribution. #' #' If \code{mean} or \code{sd} are not specified they assume the default values #' of \code{0} and \code{1}, respectively. #' #' If \code{lower} or \code{upper} are not specified they assume the default #' values of \code{-Inf} and \code{Inf}, respectively, corresponding to no #' lower or no upper truncation. #' #' Therefore, for example, \code{dtnorm(x)}, with no other arguments, is simply #' equivalent to \code{dnorm(x)}. #' #' Only \code{rtnorm} is used in the \code{msm} package, to simulate from #' hidden Markov models with truncated normal distributions. This uses the #' rejection sampling algorithms described by Robert (1995). #' #' These functions are merely provided for completion, and are not optimized #' for numerical stability or speed. To fit a hidden Markov model with a #' truncated Normal response distribution, use a \code{\link{hmmTNorm}} #' constructor. See the \code{\link{hmm-dists}} help page for further details. #' #' @name tnorm #' @aliases tnorm dtnorm ptnorm qtnorm rtnorm #' @param x,q vector of quantiles. #' @param p vector of probabilities. #' @param n number of observations. If \code{length(n) > 1}, the length is #' taken to be the number required. #' @param mean vector of means. #' @param sd vector of standard deviations. #' @param lower lower truncation point. #' @param upper upper truncation point. #' @param log logical; if TRUE, return log density or log hazard. #' @param log.p logical; if TRUE, probabilities p are given as log(p). #' @param lower.tail logical; if TRUE (default), probabilities are P[X <= x], #' otherwise, P[X > x]. #' @return \code{dtnorm} gives the density, \code{ptnorm} gives the #' distribution function, \code{qtnorm} gives the quantile function, and #' \code{rtnorm} generates random deviates. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{dnorm}} #' @references Robert, C. P. Simulation of truncated normal variables. #' Statistics and Computing (1995) 5, 121--125 #' @keywords distribution #' @examples #' #' x <- seq(50, 90, by=1) #' plot(x, dnorm(x, 70, 10), type="l", ylim=c(0,0.06)) ## standard Normal distribution #' lines(x, dtnorm(x, 70, 10, 60, 80), type="l") ## truncated Normal distribution #' NULL ### Truncated normal distribution #' @rdname tnorm #' @export dtnorm <- function(x, mean=0, sd=1, lower=-Inf, upper=Inf, log=FALSE) { ret <- numeric(length(x)) ret[x < lower | x > upper] <- if (log) -Inf else 0 ret[upper < lower] <- NaN ind <- x >=lower & x <=upper if (any(ind)) { denom <- pnorm(upper, mean, sd) - pnorm(lower, mean, sd) xtmp <- dnorm(x, mean, sd, log) if (log) xtmp <- xtmp - log(denom) else xtmp <- xtmp/denom ret[x >=lower & x <=upper] <- xtmp[ind] } ret } #' @rdname tnorm #' @export ptnorm <- function(q, mean=0, sd=1, lower=-Inf, upper=Inf, lower.tail=TRUE, log.p=FALSE) { ret <- numeric(length(q)) if (lower.tail) { ret[q < lower] <- 0 ret[q > upper] <- 1 } else { ret[q < lower] <- 1 ret[q > upper] <- 0 } ret[upper < lower] <- NaN ind <- q >=lower & q <=upper if (any(ind)) { denom <- pnorm(upper, mean, sd) - pnorm(lower, mean, sd) if (lower.tail) qtmp <- pnorm(q, mean, sd) - pnorm(lower, mean, sd) else qtmp <- pnorm(upper, mean, sd) - pnorm(q, mean, sd) if (log.p) qtmp <- log(qtmp) - log(denom) else qtmp <- qtmp/denom ret[q >=lower & q <=upper] <- qtmp[ind] } ret } #' @rdname tnorm #' @export qtnorm <- function(p, mean=0, sd=1, lower=-Inf, upper=Inf, lower.tail=TRUE, log.p=FALSE) { qgeneric(ptnorm, p=p, mean=mean, sd=sd, lower=lower, upper=upper, lbound=lower, ubound=upper, lower.tail=lower.tail, log.p=log.p) } ## Rejection sampling algorithm by Robert (Stat. Comp (1995), 5, 121-5) ## for simulating from the truncated normal distribution. #' @rdname tnorm #' @export rtnorm <- function (n, mean = 0, sd = 1, lower = -Inf, upper = Inf) { if (length(n) > 1) n <- length(n) mean <- rep(mean, length=n) sd <- rep(sd, length=n) lower <- rep(lower, length=n) upper <- rep(upper, length=n) ret <- numeric(n) ind <- seq(length.out=n) sdzero <- sd < .Machine$double.eps ## return the mean, unless mean is outside the range, then return nan sdna <- sdzero & ((mean < lower) | (mean > upper)) lower <- (lower - mean) / sd ## Algorithm works on mean 0, sd 1 scale upper <- (upper - mean) / sd nas <- is.na(mean) | is.na(sd) | is.na(lower) | is.na(upper) | sdna if (any(nas)) warning("NAs produced") ## Different algorithms depending on where upper/lower limits lie. alg <- ifelse( ((lower > upper) | nas), -1,# return NaN ifelse( sdzero, 4, # SD zero, so set the sampled value to the mean. ifelse( ((lower < 0 & upper == Inf) | (lower == -Inf & upper > 0) | (is.finite(lower) & is.finite(upper) & (lower < 0) & (upper > 0) & (upper-lower > sqrt(2*pi))) ), 0, # standard "simulate from normal and reject if outside limits" method. Use if bounds are wide. ifelse( (lower >= 0 & (upper > lower + 2*sqrt(exp(1)) / (lower + sqrt(lower^2 + 4)) * exp((lower*2 - lower*sqrt(lower^2 + 4)) / 4))), 1, # rejection sampling with exponential proposal. Use if lower >> mean ifelse(upper <= 0 & (-lower > -upper + 2*sqrt(exp(1)) / (-upper + sqrt(upper^2 + 4)) * exp((upper*2 - -upper*sqrt(upper^2 + 4)) / 4)), 2, # rejection sampling with exponential proposal. Use if upper << mean. 3))))) # rejection sampling with uniform proposal. Use if bounds are narrow and central. ind.nan <- ind[alg==-1]; ind.no <- ind[alg==0]; ind.expl <- ind[alg==1]; ind.expu <- ind[alg==2]; ind.u <- ind[alg==3] ind.sd0 <- ind[alg==4]; ret[ind.nan] <- NaN ret[ind.sd0] <- 0 # SD zero, so set the sampled value to the mean. while (length(ind.no) > 0) { y <- rnorm(length(ind.no)) done <- which(y >= lower[ind.no] & y <= upper[ind.no]) ret[ind.no[done]] <- y[done] ind.no <- setdiff(ind.no, ind.no[done]) } stopifnot(length(ind.no) == 0) while (length(ind.expl) > 0) { a <- (lower[ind.expl] + sqrt(lower[ind.expl]^2 + 4)) / 2 z <- rexp(length(ind.expl), a) + lower[ind.expl] u <- runif(length(ind.expl)) done <- which((u <= exp(-(z - a)^2 / 2)) & (z <= upper[ind.expl])) ret[ind.expl[done]] <- z[done] ind.expl <- setdiff(ind.expl, ind.expl[done]) } stopifnot(length(ind.expl) == 0) while (length(ind.expu) > 0) { a <- (-upper[ind.expu] + sqrt(upper[ind.expu]^2 +4)) / 2 z <- rexp(length(ind.expu), a) - upper[ind.expu] u <- runif(length(ind.expu)) done <- which((u <= exp(-(z - a)^2 / 2)) & (z <= -lower[ind.expu])) ret[ind.expu[done]] <- -z[done] ind.expu <- setdiff(ind.expu, ind.expu[done]) } stopifnot(length(ind.expu) == 0) while (length(ind.u) > 0) { z <- runif(length(ind.u), lower[ind.u], upper[ind.u]) rho <- ifelse(lower[ind.u] > 0, exp((lower[ind.u]^2 - z^2) / 2), ifelse(upper[ind.u] < 0, exp((upper[ind.u]^2 - z^2) / 2), exp(-z^2/2))) u <- runif(length(ind.u)) done <- which(u <= rho) ret[ind.u[done]] <- z[done] ind.u <- setdiff(ind.u, ind.u[done]) } stopifnot(length(ind.u) == 0) ret*sd + mean } msm/R/mstate.R0000644000176200001440000002155114527460333012702 0ustar liggesusers## Function to convert data for a msm model fit to data for a coxph model fit #' Convert data for `msm' to data for `survival', `mstate' or `flexsurv' #' analysis #' #' Converts longitudinal data for a \code{\link{msm}} model fit, where #' observations represent the exact transition times of the process, to #' counting process data. This enables, for example, flexible parametric #' multi-state models to be fitted with \code{\link[flexsurv]{flexsurvreg}} #' from the \pkg{flexsurv} package, or semiparametric models to be implemented #' with \code{\link[survival]{coxph}} and the \pkg{mstate} package. #' #' For example, if the data supplied to \code{\link{msm}} look like this: #' #' \tabular{lllll}{ \code{subj} \tab \code{days} \tab \code{status} \tab #' \code{age} \tab \code{treat} \cr 1\tab 0\tab 1 \tab 66\tab 1\cr 1\tab 27\tab #' 2 \tab 66\tab 1\cr 1\tab 75\tab 3 \tab 66\tab 1\cr 1\tab 97\tab 4 \tab #' 66\tab 1\cr 1\tab 1106\tab 4 \tab 69\tab 1\cr 2\tab 0\tab 1 \tab 49\tab 0\cr #' 2\tab 90\tab 2 \tab 49\tab 0\cr 2\tab 1037\tab 2 \tab 51\tab 0\cr } #' #' then the output of \code{\link{msm2Surv}} will be a data frame looking like #' this: #' #' \tabular{lllllllllll}{ \code{id} \tab \code{from} \tab \code{to} \tab #' \code{Tstart} \tab \code{Tstop} \tab \code{time} \tab \code{status} \tab #' \code{age} \tab \code{treat} \tab \code{trans}\cr 1 \tab 1 \tab 2 \tab 0 #' \tab 27 \tab 27 \tab 1 \tab 66 \tab 1 \tab 1\cr 1 \tab 1 \tab 4 \tab 0 \tab #' 27 \tab 27 \tab 0 \tab 66 \tab 1 \tab 2\cr 1 \tab 2 \tab 3 \tab 27 \tab 75 #' \tab 48 \tab 1 \tab 66 \tab 1 \tab 3\cr 1 \tab 2 \tab 4 \tab 27 \tab 75 \tab #' 48 \tab 0 \tab 66 \tab 1 \tab 4\cr 1 \tab 3 \tab 4 \tab 75 \tab 97 \tab 22 #' \tab 1 \tab 69 \tab 1 \tab 5\cr 2 \tab 1 \tab 2 \tab 0 \tab 90 \tab 90 \tab #' 1 \tab 49 \tab 0 \tab 1\cr 2 \tab 1 \tab 4 \tab 0 \tab 90 \tab 90 \tab 0 #' \tab 49 \tab 0 \tab 2\cr 2 \tab 2 \tab 3 \tab 90 \tab 1037 \tab 947 \tab 0 #' \tab 49 \tab 0 \tab 3\cr 2 \tab 2 \tab 4 \tab 90 \tab 1037 \tab 947 \tab #' 0\tab 49 \tab 0 \tab 4\cr } #' #' At 27 days, subject 1 is observed to move from state 1 to state 2 (first #' row, status 1), which means that their potential transition from state 1 to #' state 4 is censored (second row, status 0). #' #' See the \pkg{mstate} package and the references below for more details of #' this data format and using it for semi-parametric multi-state modelling. #' #' @param data Data frame in the format expected by a \code{\link{msm}} model #' fit with \code{exacttimes=TRUE} or all \code{obstype=2}. Each row #' represents an observation of a state, and the time variable contains the #' exact and complete transition times of the underlying process. This is #' explained in more detail in the help page for \code{\link{msm}}, section #' \code{obstype=2}. #' @param subject Name of the subject ID in the data (character format, i.e. #' quoted). #' @param time Name of the time variable in the data (character). #' @param state Name of the state variable in the data (character). #' @param covs Vector of covariate names to carry through (character). If not #' supplied, this is taken to be all remaining variables in the data. #' @param Q Transition intensity matrix. This should have number of rows and #' number of columns both equal to the number of states. If an instantaneous #' transition is not allowed from state \eqn{r} to state \eqn{s}, then \code{Q} #' should have \eqn{(r,s)} entry 0, otherwise it should be non-zero. The #' diagonal entries are ignored. #' @return A data frame of class \code{"msdata"}, with rows representing #' observed or censored transitions. There will be one row for each observed #' transition in the original data, and additional rows for every potential #' transition that could have occurred out of each observed state. #' #' The data frame will have columns called: #' #' \item{id}{Subject ID} \item{from}{Starting state of the transition} #' \item{to}{Finishing state of the transition} \item{Tstart}{The starting time #' of the transition} \item{Tstop}{The finishing time of the transition} #' \item{time}{The time difference = \code{Tstop} - \code{Tstart}} #' \item{status}{Event or censoring indicator, with 1 indicating an observed #' transition, and 0 indicating censoring} \item{trans}{Transition number} #' #' and any remaining columns will represent covariates. Any covariates whose #' names clash with the standard variables in the returned data (\code{"id"}, #' \code{"from"}, \code{"to"}, \code{"Tstart"}, \code{"Tstop"}, \code{"time"}, #' \code{"status"} or \code{"trans"}) have \code{".2"} appended to their names. #' #' The transition matrix in \pkg{mstate} format is stored in the \code{trans} #' attribute of the returned object. See the example code below. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link[mstate]{msprep}}, in \pkg{mstate}, which produces data #' in a similar format, given data in "wide" format with one row per subject. #' @references Putter H, Fiocco M, Geskus RB (2007). Tutorial in biostatistics: #' Competing risks and multi-state models. \emph{Statistics in Medicine} 26: #' 2389-2430. #' #' Liesbeth C. de Wreede, Marta Fiocco, Hein Putter (2011). \pkg{mstate}: An R #' Package for the Analysis of Competing Risks and Multi-State Models. #' \emph{Journal of Statistical Software}, 38(7), 1-30. #' #' Jackson, C. H. (2014). flexsurv: Flexible parametric survival and #' multi-state models. R package version 0.5. #' @examples #' #' msmdat <- data.frame( #' subj = c(1, 1, 1, 1, 1, 2, 2, 2), #' days = c(0, 27, 75, 97, 1106, 0, 90, 1037), #' status = c(1, 2, 3, 4, 4, 1, 2, 2), #' age = c(66, 66, 66, 66, 69, 49, 49, 51), #' treat = c(1, 1, 1, 1, 1, 0, 0, 0) #' ) #' # transitions only allowed to next state up or state 4 #' Q <- rbind(c(1, 1, 0, 1), #' c(0, 1, 1, 1), #' c(0, 0, 1, 1), #' c(0, 0, 0, 0)) #' dat <- msm2Surv(data=msmdat, subject="subj", time="days", state="status", #' Q=Q) #' dat #' attr(dat, "trans") #' #' @export msm2Surv msm2Surv <- function(data, # data frame subject, time, state, # names of subject, time and state variables (character) covs=NULL, # names of covariates (character vector) Q # transition intensity matrix. should be zero where transitions are disallowed. ) { if (!inherits(data, "data.frame")) stop("`data` should inherit class `data.frame`") data <- as.data.frame(data) if (missing(subject)) stop("subject variable not given") if (missing(time)) stop("time variable not given") if (missing(state)) stop("state variable not given") fpt <- !duplicated(data[,subject]) # indicator for patient's first observation lpt <- !duplicated(data[,subject], fromLast=TRUE) # ... last observation ... nev <- nrow(data[!lpt,]) ## Data frame of observed events ev <- data.frame(id=data[!lpt,subject], from=data[!lpt,state],to=data[!fpt,state], Tstart=data[!lpt,time], Tstop=data[!fpt,time], time=data[!fpt,time]-data[!lpt,time], status=rep(1,nev)) if (is.null(covs)) covs <- setdiff(colnames(data), c(subject, time, state)) ## rename any covariates which clash with standard names in the returned data for (i in c("id", "from", "to","Tstart","Tstop","time","status","trans")) covs[covs==i] <- colnames(data)[colnames(data)==i] <- paste(i, ".2", sep="") for (i in covs) ev[,i] <- data[!lpt, i] neq <- sum(ev$Tstart == ev$Tstop) if (neq > 0) { warning("Omitting ",neq, " rows with two observations at the same time") ev <- ev[ev$Tstart < ev$Tstop,] } diag(Q) <- 0; Q[Q>0] <- 1 if (is.null(rownames(Q))) rownames(Q) <- 1:nrow(Q) if (is.null(colnames(Q))) colnames(Q) <- 1:ncol(Q) Qf <- Q[ev$from,] Qf[cbind(1:nrow(Qf), ev$to)] <- 0 nto <- rowSums(Qf) ncens <- sum(nto) cto <- which(t(Qf)==1,arr.ind=TRUE)[,1] ## Data frame of censored events cens <- data.frame(id=rep(ev$id, nto), from=rep(ev$from, nto), to=cto, Tstart=rep(ev$Tstart, nto), Tstop=rep(ev$Tstop, nto), time=rep(ev$Tstop, nto) - rep(ev$Tstart, nto), status=rep(0, ncens)) for (i in covs) cens[,i] <- rep(ev[,i], nto) surv <- rbind(ev, cens) surv <- surv[order(surv$id, surv$Tstart, surv$to),] surv <- surv[!(surv$from==surv$to),] Qi <- t(Q); Qi[Qi==1] <- seq_along(which(t(Q)==1)); Qi <- t(Qi) surv$trans <- Qi[cbind(surv$from,surv$to)] rownames(surv) <- NULL tmat <- t(Q) tmat[t(Q)==1] <- seq_along(tmat[t(Q)==1]) tmat <- t(tmat); tmat[Q==0] <- NA names(dimnames(tmat)) <- c("from","to") attr(surv, "trans") <- tmat class(surv) <- c("msdata","data.frame") surv } msm/R/olddata.R0000644000176200001440000001003414471700417013005 0ustar liggesusers## forget about data.orig, this was just without pci imputation ## not supported whichcovh.orig ## could use unname to remove names on stuff #' Convert data stored in msm object to old format #' #' Converts the \code{data} element of msm objects to the old format. #' #' This is just provided for convenience and to illustrate the changes. It is #' not guaranteed to be complete, and is liable to be withdrawn. Users who #' were relying on the previous undocumented format are advised to upgrade #' their code to use the new format, which uses model frames and model design #' matrices in the standard format used in version 1.4, based on #' \code{\link{model.frame}} and \code{\link{model.matrix}}. #' #' @param x Object returned by the \code{\link{msm}} function, representing a #' fitted multi-state model. #' @return A list of vectors and matrices in the undocumented ad-hoc format #' used for the \code{data} component of \code{msm} objects in \pkg{msm} #' versions 1.3.1 and earlier. recreate.olddata <- function(x) { x$data <- expand.data(x) mf <- x$data$mf; mf.agg <- x$data$mf.agg; mm.cov <- x$data$mm.cov; mm.cov.agg <- x$data$mm.cov.agg; mm.mcov <- x$data$mm.mcov; mm.hcov <- x$data$mm.hcov; mm.icov <- x$data$mm.icov get.covdata <- function(mm, mf) { list(covlabels=colnames(mm)[-1], ncovs=ncol(mm)-1, covfactor=sapply(mf, is.factor), covfactorlevels=lapply(mf, levels), covmat=mm, covmat.orig=mf, covlabels.orig=colnames(mf) ## forget about covrows.kept ) } covdata <- get.covdata(mm.cov, mf) misccovdata <- if (x$emodel$misc) get.covdata(mm.mcov, mf) else NULL if (x$hmodel$hidden) { hcovdata <- list() for (i in seq(x$qmodel$nstates)) hcovdata[[i]] <- get.covdata(mm.hcov[[i]], mf) icovdata <- get.covdata(mm.icov, mf) whichcovh <- lapply(mm.hcov, function(x)match(colnames(x)[-1], colnames(mm)[-1])) for (i in seq(x$qmodel$nstates)) hcovdata[[i]]$whichcov <- whichcovh[[i]] } else hcovdata <- icovdata <- NULL ## TESTME - watch for factors, interactions and intercept, reduce if no covs. mmh <- if (!is.null(mm.hcov)) do.call("cbind",mm.hcov) else NULL mm <- cbind(mm.cov, mm.icov, mmh) mm <- mm[,unique(colnames(mm))] covdata$whichcov <- match(colnames(mm.cov)[-1], colnames(mm)[-1]) covdata$whichcov.orig <- match(attr(mf, "covnames.q"), attr(mf, "covnames")) misccovdata$whichcov <- match(colnames(mm.mcov)[-1], colnames(mm)[-1]) # names should be in mm.hcov icovdata$whichcov <- match(colnames(mm.icov)[-1], colnames(mm)[-1]) ret <- list( fromstate = model.extract(mf.agg, "fromstate"), tostate = model.extract(mf.agg, "tostate"), timelag = model.extract(mf.agg, "timelag"), nocc = model.extract(mf.agg, "nocc"), whicha = model.extract(mf.agg, "whicha"), noccsum = model.extract(mf.agg, "noccsum"), obstype = if (!is.null(mf.agg)) model.extract(mf.agg, "obstype") else model.extract(mf, "obstype"), covmat = mm.cov.agg[,-1,drop=FALSE], covdata = covdata, misccovdata = misccovdata, hcovdata = hcovdata, icovdata = icovdata, npts = length(unique(model.extract(mf, "subject"))), covlabels = names(attr(mf, "covmeans"))[-1], covmeans = attr(mf, "covmeans")[-1], nobs = if (!is.null(mf.agg)) nrow(mf.agg) else nrow(mf), ntrans = sum(duplicated(model.extract(mf, "subject"))), time = mf[,2], state = mf[,1], subject = model.extract(mf, "subject"), n = nrow(mf), obstype.obs = model.extract(mf, "obstype"), firstobs = c(which(!duplicated(model.extract(mf, "subject"))), nrow(mf)+1), obstrue = model.extract(mf, "obstrue"), pci.imp = model.extract(mf, "pci.imp"), cov = mm[,-1,drop=FALSE], cov.orig = mf[,attr(mf,"covnames")], covlabels.orig = attr(mf,"covnames") ) ret } msm/R/simul.R0000644000176200001440000006765614556753646012574 0ustar liggesusers### FUNCTIONS FOR SIMULATING FROM MULTI-STATE MODELS ### from help(sample) in base R resample <- function(x, size, ...) if(length(x) <= 1) { if(!missing(size) && size == 0) x[FALSE] else x } else sample(x, size, ...) ### General function to simulate one individual's realisation from a continuous-time Markov model ### Produces the exact times of transition #' Simulate one individual trajectory from a continuous-time Markov model #' #' Simulate one realisation from a continuous-time Markov process up to a given #' time. #' #' The effect of time-dependent covariates on the transition intensity matrix #' for an individual is determined by assuming that the covariate is a step #' function which remains constant in between the individual's observation #' times. #' #' @param qmatrix The transition intensity matrix of the Markov process. The #' diagonal of \code{qmatrix} is ignored, and computed as appropriate so that #' the rows sum to zero. For example, a possible \code{qmatrix} for a three #' state illness-death model with recovery is: #' #' \code{rbind( c( 0, 0.1, 0.02 ), c( 0.1, 0, 0.01 ), c( 0, 0, 0 ) )} #' #' @param maxtime Maximum time for the simulated process. #' @param covs Matrix of time-dependent covariates, with one row for each #' observation time and one column for each covariate. #' @param beta Matrix of linear covariate effects on log transition #' intensities. The rows correspond to different covariates, and the columns to #' the transition intensities. The intensities are ordered by reading across #' rows of the intensity matrix, starting with the first, counting the positive #' off-diagonal elements of the matrix. #' @param obstimes Vector of times at which the covariates are observed. #' @param start Starting state of the process. Defaults to 1. #' @param mintime Starting time of the process. Defaults to 0. #' @return A list with components, #' #' \item{states}{Simulated states through which the process moves. This ends #' with either an absorption before \code{obstime}, or a transient state at #' \code{obstime}. } #' #' \item{times}{Exact times at which the process changes to the corresponding #' states} #' #' \item{qmatrix}{The given transition intensity matrix} #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{simmulti.msm}} #' @keywords datagen #' @examples #' #' #' qmatrix <- rbind( #' c(-0.2, 0.1, 0.1 ), #' c(0.5, -0.6, 0.1 ), #' c(0, 0, 0) #' ) #' sim.msm(qmatrix, 30) #' #' @export sim.msm sim.msm <- function(qmatrix, # intensity matrix maxtime, # maximum time for realisations covs=NULL, # covariate matrix, nobs rows, ncovs cols beta=NULL, # matrix of cov effects on qmatrix. ncovs rows, nintens cols. obstimes=0, # times at which time-dependent covariates change start = 1, # starting state mintime = 0 # time to start from ) { ## Keep only times where time-dependent covariates change if (!is.null(covs)) { covs2 <- collapse.covs(covs) covs <- covs2$covs obstimes <- obstimes[covs2$ind] } else {obstimes <- mintime; covs <- beta <- 0} if (is.vector(beta)) beta <- matrix(beta, ncol=length(beta)) nct <- length(obstimes) nstates <- nrow(qmatrix) ## Form an array of qmatrices, one for each covariate change-time qmatrices <- array(rep(t(qmatrix), nct), dim=c(dim(qmatrix), nct)) qmatrices[rep(t(qmatrix)>0, nct)] <- qmatrices[rep(t(qmatrix)>0, nct)] * as.numeric(exp(t(beta)%*%t(covs))) # nintens*nobs for (i in 1:nct) qmatrices[,,i] <- msm.fixdiag.qmatrix(t(qmatrices[,,i])) cur.t <- mintime; cur.st <- next.st <- start; rem.times <- obstimes; t.ind <- 1 nsim <- 0; max.nsim <- 10 simstates <- simtimes <- numeric(max.nsim) ## allocate memory up-front for simulated outcome absorb <- absorbing.msm(qmatrix=qmatrix) ## Simulate up to maxtime or absorption while (cur.t < maxtime) { nsim <- nsim + 1 cur.st <- next.st simstates[nsim] <- cur.st; simtimes[nsim] <- cur.t if (cur.st %in% absorb) break; rate <- -qmatrices[cur.st,cur.st, t.ind:length(obstimes)] nextlag <- rpexp(1, rate, rem.times-rem.times[1]) cur.t <- cur.t + nextlag t.ind <- which.min((cur.t - obstimes)[cur.t - obstimes > 0]) rem.times <- cur.t if (any(obstimes > cur.t)) rem.times <- c(rem.times, obstimes[(t.ind+1): length(obstimes)]) cur.q <- qmatrices[,, t.ind] next.st <- resample((1:nstates)[-cur.st], size=1, prob = cur.q[cur.st, -cur.st]) if (nsim > max.nsim) { ## need more memory for simulated outcome, allocate twice as much simstates <- c(simstates, numeric(max.nsim)) simtimes <- c(simtimes, numeric(max.nsim)) max.nsim <- max.nsim*2 } } ## If process hasn't absorbed by the end, then include a censoring time if (cur.t >= maxtime) { nsim <- nsim+1 simstates[nsim] <- cur.st simtimes[nsim] <- maxtime } list(states = simstates[1:nsim], times = simtimes[1:nsim], qmatrix = qmatrix) } ## Drop rows of a covariate matrix which are identical to previous row ## Similar method to R's unique.data.frame collapse.covs <- function(covs) { if (nrow(covs)==1) list(covs=covs, ind=1) else { pcovs <- apply(covs, 1, function(x) paste(x, collapse="\r")) lpcovs <- c("\r", pcovs[1:(length(pcovs)-1)]) ind <- pcovs!=lpcovs list(covs=covs[ind,,drop=FALSE], ind=which(ind)) } } ### Given a simulated Markov model, get the current state at various observation times ### By default, only keep one observation in the absorbing state getobs.msm <- function(sim, obstimes, death=FALSE, drop.absorb=TRUE) { absorb <- absorbing.msm(qmatrix=sim$qmatrix) # Only keep one observation in the absorbing state if (drop.absorb && any(sim$states %in% absorb)) { if (any(sim$states %in% death)) keep <- which(obstimes < max(sim$times)) else { lo <- c(-Inf, obstimes[1:(length(obstimes)-1)]) keep <- which(lo <= max(sim$times)) } } else keep <- 1 : length(obstimes) obstimes <- obstimes[keep] state <- sim$states[rowSums(outer(obstimes, sim$times, ">="))] time <- obstimes if (any(sim$states %in% death)) { # Keep the exact death time if required state <- c(state, sim$states[sim$states %in% death]) time <- c(time, sim$times[sim$states %in% death]) state <- state[order(time)] time <- time[order(time)] keep <- c(keep, max(keep)+1) } list(state = state, time = time, keep=keep) } ### Simulate a multi-state Markov or hidden Markov model dataset using fixed observation times ### Would it be better to make specification of covariate model consistent with model fitting function? ### e.g. separate hcovariates and covariates formulae, ### plus covinits and hcovinits? #' Simulate multiple trajectories from a multi-state Markov model with #' arbitrary observation times #' #' Simulate a number of individual realisations from a continuous-time Markov #' process. Observations of the process are made at specified arbitrary times #' for each individual, giving panel-observed data. #' #' \code{\link{sim.msm}} is called repeatedly to produce a simulated trajectory #' for each individual. The state at each specified observation time is then #' taken to produce a new column \code{state}. The effect of time-dependent #' covariates on the transition intensity matrix for an individual is #' determined by assuming that the covariate is a step function which remains #' constant in between the individual's observation times. If the subject #' enters an absorbing state, then only the first observation in that state is #' kept in the data frame. Rows corresponding to future observations are #' deleted. The entry times into states given in \code{death} are assumed to #' be known exactly. #' #' @param data A data frame with a mandatory column named \code{time}, #' representing observation times. The optional column named \code{subject}, #' corresponds to subject identification numbers. If not given, all #' observations are assumed to be on the same individual. Observation times #' should be sorted within individuals. The optional column named \code{cens} #' indicates the times at which simulated states should be censored. If #' \code{cens==0} then the state is not censored, and if \code{cens==k}, say, #' then all simulated states at that time which are in the set #' \code{censor.states} are replaced by \code{k}. Other named columns of the #' data frame represent any covariates, which may be time-constant or #' time-dependent. Time-dependent covariates are assumed to be constant #' between the observation times. #' @param qmatrix The transition intensity matrix of the Markov process, with #' any covariates set to zero. The diagonal of \code{qmatrix} is ignored, and #' computed as appropriate so that the rows sum to zero. For example, a #' possible \code{qmatrix} for a three state illness-death model with recovery #' is: #' #' \code{rbind( c( 0, 0.1, 0.02 ), c( 0.1, 0, 0.01 ), c( 0, 0, 0 ) )} #' @param covariates List of linear covariate effects on log transition #' intensities. Each element is a vector of the effects of one covariate on all #' the transition intensities. The intensities are ordered by reading across #' rows of the intensity matrix, starting with the first, counting the positive #' off-diagonal elements of the matrix. #' #' For example, for a multi-state model with three transition intensities, and #' two covariates \code{x} and \code{y} on each intensity, #' #' \code{covariates=list(x = c(-0.3,-0.3,-0.3), y=c(0.1, 0.1, 0.1))} #' @param death Vector of indices of the death states. A death state is an #' absorbing state whose time of entry is known exactly, but the individual is #' assumed to be in an unknown transient state ("alive") at the previous #' instant. This is the usual situation for times of death in chronic disease #' monitoring data. For example, if you specify \code{death = c(4, 5)} then #' states 4 and 5 are assumed to be death states. #' #' \code{death = TRUE} indicates that the final state is a death state, and #' \code{death = FALSE} (the default) indicates that there is no death state. #' @param start A vector with the same number of elements as there are distinct #' subjects in the data, giving the states in which each corresponding #' individual begins. Or a single number, if all of these are the same. #' Defaults to state 1 for each subject. #' @param ematrix An optional misclassification matrix for generating observed #' states conditionally on the simulated true states. As defined in #' \code{\link{msm}}. #' @param misccovariates Covariate effects on misclassification probabilities #' via multinomial logistic regression. Linear effects operate on the log of #' each probability relative to the probability of classification in the #' correct state. In same format as \code{covariates}. #' @param hmodel An optional hidden Markov model for generating observed #' outcomes conditionally on the simulated true states. As defined in #' \code{\link{msm}}. Multivariate outcomes (\code{hmmMV}) are not supported. #' @param hcovariates List of the same length as \code{hmodel}, defining any #' covariates governing the hidden Markov outcome models. Unlike in the #' \code{msm} function, this should also define the values of the covariate #' effects. Each element of the list is a named vector of the initial values #' for each set of covariates for that state. For example, for a three-state #' hidden Markov model with two, one and no covariates on the state 1, 2 and 3 #' outcome models respectively, #' #' \code{ hcovariates = list (c(acute=-8, age=0), c(acute=-8), NULL) } #' @param censor.states Set of simulated states which should be replaced by a #' censoring indicator at censoring times. By default this is all transient #' states (representing alive, with unknown state). #' @param drop.absorb Drop repeated observations in the absorbing state, #' retaining only one. #' @return A data frame with columns, \item{subject}{Subject identification #' indicators} \item{time}{Observation times} \item{state}{Simulated (true) #' state at the corresponding time} \item{obs}{Observed outcome at the #' corresponding time, if \code{ematrix} or \code{hmodel} was supplied} #' \item{keep}{Row numbers of the original data. Useful when #' \code{drop.absorb=TRUE}, to show which rows were not dropped} plus any #' supplied covariates. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{sim.msm}} #' @keywords datagen #' @examples #' #' ### Simulate 100 individuals with common observation times #' sim.df <- data.frame(subject = rep(1:100, rep(13,100)), time = rep(seq(0, 24, 2), 100)) #' qmatrix <- rbind(c(-0.11, 0.1, 0.01 ), #' c(0.05, -0.15, 0.1 ), #' c(0.02, 0.07, -0.09)) #' simmulti.msm(sim.df, qmatrix) #' #' @export simmulti.msm simmulti.msm <- function(data, # data frame with subject, times, covariates... qmatrix, # intensity matrix covariates=NULL, # initial values death = FALSE, # vector of indicators for "death" states, ie absorbing states whose entry time is known exactly, # but with unknown transient state at previous instant start, # starting states of the process, defaults to all 1. ematrix = NULL,# misclassification matrix misccovariates = NULL, # covariates on misclassification probabilities hmodel = NULL, # hidden Markov model formula hcovariates = NULL, # covariate effects on hidden Markov model response distribution censor.states = NULL, drop.absorb = TRUE ) { ### Check consistency of qmatrix and covariate inits nstates <- nrow(qmatrix) msm.check.qmatrix(qmatrix) qmatrix <- msm.fixdiag.qmatrix(qmatrix) ### Subject, time and state if (!("subject" %in% names(data))) data$subject <- rep(1, nrow(data)) if (!("time" %in% names(data))) stop("\"time\" column missing from data") data <- as.data.frame(data) subject <- data[,"subject"] time <- data[,"time"] if (is.unsorted(subject)){ warning("Data are not ordered by subject ID and time - output will be ordered.") data <- data[order(subject, time),] } if (any(duplicated(data[,c("subject", "time")]))){ warning("Data contain duplicated observation times for a subject - removing duplicates.") data <- data[!duplicated(data[,c("subject", "time")]), ] } subject <- data[,"subject"]; time <- data[,"time"]; cens <- if (any(colnames(data)=="cens")) data[,"cens"] else rep(0, length(subject)) msm.check.times(time, subject) times <- split(time, subject) cens <- split(cens, subject) n <- length(unique(subject)) ### Covariates on intensities covnames <- names(covariates) ncovs <- length(covnames) misscovs <- setdiff(covnames, names(data)) if (length(misscovs) > 0) stop("Covariates ", paste(misscovs, collapse=", "), " not found in data") covs <- if (ncovs > 0) lapply(split(data[,covnames], subject), as.matrix) else NULL allcovs <- covnames ### Covariates on misclassification misccovnames <- names(misccovariates) nmisccovs <- length(misccovnames) misscovs <- setdiff(misccovnames, names(data)) if (length(misscovs) > 0) stop("Misclassification covariates ", paste(misscovs, collapse=", "), " not found in data") misccovs <- if (nmisccovs > 0) lapply(split(data[,setdiff(misccovnames,covnames)], subject), as.matrix) else NULL allmisccovs <- misccovnames ### Covariates on HMM if (!is.null(hcovariates)) { if (is.null(hmodel)) stop("hcovariates specified, but no hmodel") hcovnames <- unique(names(unlist(hcovariates))) if (length(hcovariates) != nstates) stop("hcovariates of length ", length(hcovariates), ", expected ", nstates) msm.check.hmodel(hmodel, nstates) misscovs <- setdiff(hcovnames, names(data)) if (length(misscovs) > 0) stop("Covariates ", paste(misscovs, collapse=", "), " not found in data") hcovs <- lapply(split(data[,setdiff(hcovnames, setdiff(misccovnames,covnames))], subject), as.matrix) } else hcovs <- hcovnames <- NULL ### Extra variables to return extravars <- setdiff(names(data), unique(c("subject","time", "cens", covnames, misccovnames, hcovnames))) extradat <- if(length(extravars)>0) split(data[,extravars,drop=FALSE], subject) else NULL ### Starting states if (missing(start)) start <- rep(1, n) else if (length(start) == 1) start <- rep(start, n) else if (length(start) != n) stop("Supplied ", length(start), " starting states, expected 1 or ", n) nq <- length(qmatrix[qmatrix > 0]) misspeccovs <- covnames[sapply(covariates, length) != nq] if (length(misspeccovs) > 0) stop("Initial values for covariates ", paste(misspeccovs, collapse=", "), " should be of length ", nq) beta <- do.call("rbind", as.list(covariates)) ne <- length(ematrix[ematrix > 0]) misspeccovs <- covnames[sapply(misccovariates, length) != ne] if (length(misspeccovs) > 0) stop("Initial values for misclassification covariates ", paste(misspeccovs, collapse=", "), " should be of length ", ne) beta.misc <- do.call("rbind", as.list(misccovariates)) ### Check death argument. Logical values allowed for backwards compatibility ### (TRUE means final state is death, FALSE means no death state) statelist <- if (nstates==2) "1, 2" else if (nstates==3) "1, 2, 3" else paste("1, 2, ... ,",nstates) if (is.logical(death) && death==TRUE) {death <- nstates} else if (is.logical(death) && death==FALSE) {death <- 0} else if (length(setdiff(unique(death), 1:nstates)) > 0) stop(paste("Death states indicator contains states not in",statelist)) ### Simulate a realisation for each person state <- numeric() keep.data <- numeric() subj <- split(subject, subject) subj.num <- match(subject, unique(subject)) for (pt in 1:n) { sim.mod <- sim.msm(qmatrix, max(times[[pt]]), covs[[pt]], beta, times[[pt]], start[pt], min(times[[pt]])) obsd <- getobs.msm(sim.mod, times[[pt]], death, drop.absorb) pt.data <- cbind(subj[[pt]][obsd$keep], obsd$time, obsd$state, cens[[pt]][obsd$keep]) if (!is.null(covnames)) pt.data <- cbind(pt.data, covs[[pt]][obsd$keep,,drop=FALSE]) if (!is.null(misccovnames)) pt.data <- cbind(pt.data, misccovs[[pt]][obsd$keep,,drop=FALSE]) if (!is.null(hcovnames)) pt.data <- cbind(pt.data, hcovs[[pt]][obsd$keep,,drop=FALSE]) if (!is.null(extravars)) pt.data <- cbind(pt.data, extradat[[pt]][obsd$keep,,drop=FALSE]) inds <- which(subj.num==pt) pt.data <- cbind(pt.data, keep=inds[obsd$keep]) keep.data <- rbind(keep.data, pt.data) } colnames(keep.data) <- c("subject","time","state","cens",union(union(covnames,misccovnames),hcovnames),extravars,"keep") keep.data <- as.data.frame(keep.data) ### Simulate some misclassification or a HMM conditionally on the underlying state if (!is.null(ematrix)) { if (!all(dim(ematrix) == dim(qmatrix))) stop("Dimensions of qmatrix and ematrix should be equal") keep.data <- cbind(keep.data, obs=simmisc.msm(keep.data$state, ematrix, beta.misc, keep.data[,misccovnames,drop=FALSE])) } else if (!is.null(hmodel)) keep.data <- cbind(keep.data, obs=simhidden.msm(keep.data$state, hmodel, nstates, hcovariates, keep.data[,hcovnames,drop=FALSE])) ### Replace state at censor times by censoring indicators censor <- unique(keep.data$cens[keep.data$cens != 0]) if (is.null(censor.states)) censor.states <- 1:(nstates-1) if (!is.null(keep.data$obs)) keep.data$obs <- ifelse(keep.data$cens > 0 & keep.data$state %in% censor.states, keep.data$cens, keep.data$obs) else keep.data$state <- ifelse(keep.data$cens > 0 & keep.data$state %in% censor.states, keep.data$cens, keep.data$state) keep.data$cens <- NULL # attr(keep.data, "keep") <- obsd$keep keep.data } ## Simulate misclassification conditionally on an underlying state simmisc.msm <- function(state, ematrix, beta, misccovs) { ostate <- state if (is.null(ematrix)) warning("No misclassification matrix given, assuming no misclassification") else { if (any(ematrix < 0)) stop("Not all elements of ematrix are > 0") if (any(ematrix > 1)) stop("Not all elements of ematrix are < 1") if (nrow(ematrix) != ncol(ematrix)) stop("Number of rows and columns of ematrix are not equal") nstates <- nrow(ematrix) ematrix <- msm.fixdiag.ematrix(ematrix) ostate <- state beta.states <- t(row(ematrix))[t(ematrix) > 0 & !(row(ematrix)==col(ematrix))] for (i in 1:nstates) if (any(state==i)) { n <- length(state[state==i]) if (!is.null(beta)) { # covariates on misclassification probabilities X <- as.matrix(misccovs[state==i,]) b <- beta[,beta.states == i,drop=FALSE] p <- matrix(rep(ematrix[i,], n), nrow=n, byrow=TRUE) mu <- log(p / p[,i]) emu <- array(0, dim=dim(p)) miscstates <- setdiff(which(ematrix[i,] > 0), i) for (j in seq_along(miscstates)) emu[,miscstates[j]] <- exp(mu[,miscstates[j]] + X %*% b[,j]) emu[,i] <- 1 emu[,ematrix[i,]==0] <- 0 p <- emu / rowSums(emu) for (j in 1:n) ostate[state==i][j] <- resample(1:nstates, size=1, prob=p[j,], replace=TRUE) } else ostate[state==i] <- resample(1:nstates, size=n, prob=ematrix[i,], replace=TRUE) } } ostate } ## Simulate HMM outcome conditionally on an underlying state simhidden.msm <- function(state, hmodel, nstates, beta=NULL, x=NULL) { y <- state msm.check.hmodel(hmodel, nstates) for (i in 1:nstates) if (any(state==i)) { if (inherits(hmodel[[i]], "hmmMVdist")) stop("multivariate HMM outcomes not supported for simulation") ## don't change the underlying state if the HMM is the null (identity) model if (!(hmodel[[i]]$label=="identity" && (length(hmodel[[i]]$pars) == 0))) { ## simulate from the sampling function "r" in the HMM object ## transform the location parameter by covariates if necessary rcall <- list(n=length(state[state==i])) if (!is.null(beta[[i]])) { link <- get(hmodel[[i]]$link) invlink <- get(.msm.INVLINK[hmodel[[i]]$link]) locpar <- .msm.LOCPARS[hmodel[[i]]$label] loc <- hmodel[[i]]$pars[locpar] loc <- invlink(link(loc) + as.matrix(x[state==i,names(beta[[i]])]) %*% beta[[i]]) rcall[[paste("r",locpar,sep="")]] <- loc } rfn <- hmodel[[i]]$r y[state==i] <- do.call("rfn", rcall) } } y } ### Simulate data from fitted model with same observation scheme ### Used for parametric bootstrap in pearson.msm #' Simulate from a Markov model fitted using msm #' #' Simulate a dataset from a Markov model fitted using \code{\link{msm}}, using #' the maximum likelihood estimates as parameters, and the same observation #' times as in the original data. #' #' This function is a wrapper around \code{\link{simmulti.msm}}, and only #' simulates panel-observed data. To generate datasets with the exact times of #' transition, use the lower-level \code{\link{sim.msm}}. #' #' Markov models with misclassified states fitted through the \code{ematrix} #' option to \code{\link{msm}} are supported, but not general hidden Markov #' models with \code{hmodel}. For misclassification models, this function #' includes misclassification in the simulated states. #' #' This function is used for parametric bootstrapping to estimate the null #' distribution of the test statistic in \code{\link{pearson.msm}}. #' #' @param x A fitted multi-state model object as returned by \code{\link{msm}}. #' @param drop.absorb Should repeated observations in an absorbing state be #' omitted. Use the default of \code{TRUE} to avoid warnings when using the #' simulated dataset for further \code{\link{msm}} fits. Or set to #' \code{FALSE} if exactly the same number of observations as the original data #' are needed. #' @param drop.pci.imp In time-inhomogeneous models fitted using the \code{pci} #' option to \code{\link{msm}}, censored observations are inserted into the #' data by \code{\link{msm}} at the times where the intensity changes, but #' dropped by default when simulating from the fitted model using this #' function. Set this argument to \code{FALSE} to keep these observations and #' the corresponding indicator variable. #' @return A dataset with variables as described in \code{\link{simmulti.msm}}. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{simmulti.msm}}, \code{\link{sim.msm}}, #' \code{\link{pearson.msm}}, \code{\link{msm}}. #' @keywords models #' @export simfitted.msm simfitted.msm <- function(x, drop.absorb=TRUE, drop.pci.imp=TRUE){ sim.df <- x$data$mf x$data <- expand.data(x) sim.df$"cens" <- ifelse(sim.df$"(state)" %in% 1:x$qmodel$nstates, 0, sim.df$"(state)") # 0 if not censored, cens indicator if censored, so that censoring is retained in simulated data. TODO used in pearson? if (x$qcmodel$ncovs > 0) { sim.df <- cbind(sim.df, x$data$mm.cov) cov.effs <- lapply(x$Qmatrices, function(y)t(y)[t(x$qmodel$imatrix)==1])[x$qcmodel$covlabels] } else cov.effs <- NULL if (x$ecmodel$ncovs > 0) { sim.df <- cbind(sim.df, x$data$mm.mcov) misccov.effs <- lapply(x$Ematrices, function(y)t(y)[t(x$emodel$imatrix)==1])[x$ecmodel$covlabels] } else misccov.effs <- NULL names(sim.df) <- replace(names(sim.df), match(c("(time)","(subject)"), names(sim.df)), c("time","subject")) if (!is.null(sim.df$"(subject.weights)")) names(sim.df)[names(sim.df)=="(subject.weights)"] = "subject.weights" sim.df$state <- NULL # replace observed with simulated state if (any(union(names(cov.effs), names(misccov.effs)) %in% c("state","time","subject","cens"))) stop("Not supported with covariates named \"state\", \"time\", \"subject\" or \"cens\"") # TODO? boot.df <- simmulti.msm(data=sim.df, qmatrix=qmatrix.msm(x, covariates=0, ci="none"), covariates=cov.effs, death=FALSE, ematrix=ematrix.msm(x, covariates=0, ci="none"), misccovariates=misccov.effs, drop.absorb=drop.absorb ) if (drop.pci.imp & !is.null(boot.df$"(pci.imp)")) { boot.df <- boot.df[!boot.df$"(pci.imp)",] boot.df$"(pci.imp)" <- NULL } boot.df } msm/R/internals_doc.R0000644000176200001440000005720614527611051014232 0ustar liggesusers #' Developer documentation: censoring model object #' #' A list giving information about censored states, their labels in the data #' and what true states they represent. #' #' @name cmodel.object #' @return \item{ncens}{The number of distinct values used for censored #' observations in the \code{state} data supplied to \code{\link{msm}}.} #' \item{censor}{A vector of length \code{ncens}, giving the labels used for #' censored states in the data.} \item{states}{A vector obtained by #' \code{unlist()}ing a list with \code{ncens} elements, each giving the set of #' true states that an observation with this label could be.} #' \item{index}{Index into \code{states} for the first state corresponding to #' each \code{censor}, plus an extra \code{length(states)+1}.} #' @seealso \code{\link{msm.object}}. NULL #' Developer documentation: model for covariates on misclassification #' probabilities #' #' A list representing the model for covariates on misclassification #' probabilities. #' #' @name ecmodel.object #' @return \item{npars}{Number of covariate effect parameters. This is defined #' as the number of covariates on misclassification (with factors expanded as #' contrasts) multiplied by the number of allowed misclassifications in the #' model. } \item{ndpars}{Number of distinct covariate effect parameters, as #' \code{npars}, but after any equality constraints have been applied.} #' \item{ncovs}{Number of covariates on misclassification, with factors #' expanded as contrasts.} \item{constr}{List of equality constraints on these #' covariate effects, as supplied in the \code{miscconstraint} argument to #' \code{\link{msm}}.} \item{covlabels}{Names / labels of these covariates in #' the model matrix (see \code{\link{model.matrix.msm}}).} \item{inits}{Initial #' values for these covariate effects, as a vector formed from the #' \code{misccovinits} list supplied to \code{\link{msm}}.} #' \item{covmeans}{Means of these covariates in the data (excluding data not #' required to fit the model, such as observations with missing data in other #' elements or subjects' last observations). This includes means of 0/1 factor #' contrasts as well as continuous covariates (for historic reasons, which may #' not be sensible).} #' @seealso \code{\link{msm.object}}. NULL #' Developer documentation: misclassification model structure object #' #' A list giving information about the misclassifications assumed in a #' multi-state model fitted with the \code{ematrix} argument of #' \code{\link{msm}}. Returned in a fitted \code{\link{msm}} model object. #' This information is converted internally to a \code{hmodel} object (see #' \code{\link{hmodel.object}}) for use in likelihood computations. #' #' @name emodel.object #' @return \item{nstates}{Number of states (same as \code{qmodel$nstates}).} #' \item{npars}{Number of allowed misclassifications, equal to #' \code{sum(imatrix)}.} \item{imatrix}{Indicator matrix for allowed #' misclassifications. This has \eqn{(r,s)} entry 1 if misclassification of #' true state \eqn{r} as observed state \eqn{s} is possible. diagonal entries #' are arbitrarily set to 0.} \item{ematrix}{Matrix of initial values for the #' misclassification probabilities, supplied as the \code{ematrix} argument of #' \code{\link{msm}}.} \item{inits}{Vector of these initial values, reading #' across rows of \code{qmatrix} and excluding the diagonal and disallowed #' transitions.} \item{constr}{Indicators for equality constraints on baseline #' misclassification probabilities, taken from the \code{econstraint} argument #' to \code{\link{msm}}, and mapped if necessary to the set (1,2,3,...)} #' \item{ndpars}{Number of distinct misclassification probabilities, after #' applying equality constraints.} \item{nipars}{Number of initial state #' occupancy probabilities being estimated. This is zero if #' \code{est.initprobs=FALSE}, otherwise equal to the number of states.} #' \item{initprobs}{Initial state occupancy probabilities, as supplied to #' \code{\link{msm}} (initial values before estimation, if #' \code{est.initprobs=TRUE}.)} \item{est.initprobs}{Are initial state #' occupancy probabilities estimated (\code{TRUE} or \code{FALSE}), as supplied #' in the \code{est.initprobs} argument of \code{\link{msm}}.} #' @seealso \code{\link{msm.object}},\code{\link{qmodel.object}}, #' \code{\link{hmodel.object}}. NULL #' Developer documentation: hidden Markov model structure object #' #' A list giving information about the models for the outcome data #' conditionally on the states of a hidden Markov model. Used in internal #' computations, and returned in a fitted \code{\link{msm}} model object. #' #' @name hmodel.object #' @return \item{hidden}{\code{TRUE} for hidden Markov models, \code{FALSE} #' otherwise.} \item{nstates}{Number of states, the same as #' \code{qmodel$nstates}.} \item{fitted}{\code{TRUE} if the parameter values in #' \code{pars} are the maximum likelihood estimates, \code{FALSE} if they are #' the initial values.} \item{models}{The outcome distribution for each hidden #' state. A vector of length \code{nstates} whose \eqn{r}th entry is the index #' of the state \eqn{r} outcome distributions in the vector of supported #' distributions. The vector of supported distributions is given in full by #' \code{msm:::.msm.HMODELS}: the first few are 1 for categorical outcome, 2 #' for identity, 3 for uniform and 4 for normal. } \item{labels}{String #' identifying each distribution in \code{models}.} \item{npars}{Vector of #' length \code{nstates} giving the number of parameters in each outcome #' distribution, excluding covariate effects.} \item{nipars}{Number of initial #' state occupancy probabilities being estimated. This is zero if #' \code{est.initprobs=FALSE}, otherwise equal to the number of states.} #' \item{totpars}{Total number of parameters, equal to \code{sum(npars)}. } #' \item{pars}{A vector of length \code{totpars}, made from concatenating a #' list of length \code{nstates} whose \eqn{r}th component is vector of the #' parameters for the state \eqn{r} outcome distribution. } \item{plabs}{List #' with the names of the parameters in \code{pars}.} \item{parstate}{A vector #' of length \code{totpars}, whose \eqn{i}th element is the state corresponding #' to the \eqn{i}th parameter.} \item{firstpar}{A vector of length #' \code{nstates} giving the index in \code{pars} of the first parameter for #' each state.} \item{locpars}{Index in \code{pars} of parameters which can #' have covariates on them. } \item{initprobs}{Initial state occupancy #' probabilities, as supplied to \code{\link{msm}} (initial values before #' estimation, if \code{est.initprobs=TRUE}.)} \item{est.initprobs}{Are initial #' state occupancy probabilities estimated (\code{TRUE} or \code{FALSE}), as #' supplied in the \code{est.initprobs} argument of \code{\link{msm}}.} #' \item{ncovs}{Number of covariate effects per parameter in \code{pars}, with, #' e.g. factor contrasts expanded.} \item{coveffect}{Vector of covariate #' effects, of length \code{sum(ncovs)}.} \item{covlabels}{Labels of these #' effects.} \item{coveffstate}{Vector indicating state corresponding to each #' element of \code{coveffect}.} \item{ncoveffs}{Number of covariate effects on #' HMM outcomes, equal to \code{sum(ncovs)}.} \item{nicovs}{Vector of length #' \code{nstates-1} giving the number of covariate effects on each initial #' state occupancy probability (log relative to the baseline probability).} #' \item{icoveffect}{Vector of length \code{sum(nicovs)} giving covariate #' effects on initial state occupancy probabilities.} \item{nicoveffs}{Number #' of covariate effects on initial state occupancy probabilities, equal to #' \code{sum(nicovs)}.} \item{constr}{Constraints on (baseline) hidden Markov #' model outcome parameters, as supplied in the \code{hconstraint} argument of #' \code{\link{msm}}, excluding covariate effects, converted to a vector and #' mapped to the set 1,2,3,\ldots{} if necessary.} \item{covconstr}{Vector of #' constraints on covariate effects in hidden Markov outcome models, as #' supplied in the \code{hconstraint} argument of \code{\link{msm}}, excluding #' baseline parameters, converted to a vector and mapped to the set #' 1,2,3,\ldots{} if necessary.} \item{ranges}{Matrix of range restrictions for #' HMM parameters, including those given to the \code{hranges} argument to #' \code{\link{msm}}.} \item{foundse}{\code{TRUE} if standard errors are #' available for the estimates.} \item{initpmat}{Matrix of initial state #' occupancy probabilities with one row for each subject (estimated if #' \code{est.initprobs=TRUE}).} \item{ci}{Confidence intervals for baseline HMM #' outcome parameters.} \item{covci}{Confidence intervals for covariate effects #' in HMM outcome models.} #' @seealso \code{\link{msm.object}},\code{\link{qmodel.object}}, #' \code{\link{emodel.object}}. NULL #' Fitted msm model objects #' #' The \code{\link{msm}} function returns a list with the following components. #' These are intended for developers and confident users. To extract results #' from fitted model objects, functions such as \code{\link{qmatrix.msm}} or #' \code{\link{print.msm}} should be used instead. #' #' @name msm.object #' @return \item{call}{The original call to \code{\link{msm}}, as returned by #' \code{\link{match.call}}.} \item{Qmatrices}{A list of matrices. The first #' component, labelled \code{logbaseline}, is a matrix containing the estimated #' transition intensities on the log scale with any covariates fixed at their #' means in the data (or at zero, if \code{center=FALSE}). The component #' labelled \code{baseline} is the equivalent on the untransformed scale. Each #' remaining component is a matrix giving the linear effects of the labelled #' covariate on the matrix of log intensities. To extract an estimated #' intensity matrix on the natural scale, at an arbitrary combination of #' covariate values, use the function \code{\link{qmatrix.msm}}. } #' \item{QmatricesSE}{The standard error matrices corresponding to #' \code{Qmatrices}. } \item{QmatricesL,QmatricesU}{Corresponding lower and #' upper symmetric confidence limits, of width 0.95 unless specified otherwise #' by the \code{cl} argument. } \item{Ematrices}{A list of matrices. The first #' component, labelled \code{logitbaseline}, is the estimated misclassification #' probability matrix (expressed as as log odds relative to the probability of #' the true state) with any covariates fixed at their means in the data (or at #' zero, if \code{center=FALSE}). The component labelled \code{baseline} is the #' equivalent on the untransformed scale. Each remaining component is a matrix #' giving the linear effects of the labelled covariate on the matrix of logit #' misclassification probabilities. To extract an estimated misclassification #' probability matrix on the natural scale, at an arbitrary combination of #' covariate values, use the function \code{\link{ematrix.msm}}.} #' \item{EmatricesSE}{The standard error matrices corresponding to #' \code{Ematrices}.} \item{EmatricesL,EmatricesU}{Corresponding lower and #' upper symmetric confidence limits, of width 0.95 unless specified otherwise #' by the \code{cl} argument. } #' #' \item{minus2loglik}{Minus twice the maximised log-likelihood.} #' \item{deriv}{Derivatives of the minus twice log-likelihood at its maximum.} #' #' \item{estimates}{Vector of untransformed maximum likelihood estimates #' returned from \code{\link{optim}}. Transition intensities are on the log #' scale and misclassification probabilities are given as log odds relative to #' the probability of the true state.} \item{estimates.t}{Vector of transformed #' maximum likelihood estimates with intensities and probabilities on their #' natural scales.} #' #' \item{fixedpars}{Indices of \code{estimates} which were fixed during the #' maximum likelihood estimation.} \item{center}{Indicator for whether the #' estimation was performed with covariates centered on their means in the #' data.} \item{covmat}{Covariance matrix corresponding to \code{estimates}.} #' \item{ci}{Matrix of confidence intervals corresponding to #' \code{estimates.t}} #' #' \item{opt}{Return value from the optimisation routine (such as #' \code{\link{optim}} or \code{\link{nlm}}), giving information about the #' results of the optimisation.} \item{foundse}{Logical value indicating #' whether the Hessian was positive-definite at the supposed maximum of the #' likelihood. If not, the covariance matrix of the parameters is unavailable. #' In these cases the optimisation has probably not converged to a maximum. } #' \item{data}{A list giving the data used for the model fit, for use in #' post-processing. To extract it, use the methods #' \code{\link{model.frame.msm}} or \code{\link{model.matrix.msm}}. #' #' The format of this element changed in version 1.4 of \pkg{msm}, so that it #' now contains a \code{\link{model.frame}} object \code{mf} with all the #' variables used in the model. The previous format (an ad-hoc list of vectors #' and matrices) can be obtained with the function #' \code{recreate.olddata(msmobject)}, where \code{msmobject} is the object #' returned by \code{msm}. } \item{qmodel}{A list of objects representing the #' transition matrix structure and options for likelihood calculation. See #' \code{\link{qmodel.object}} for documentation of the components.} #' \item{emodel}{A list of objects representing the misclassification model #' structure, for models specified using the \code{ematrix} argument to #' \code{\link{msm}}. See \code{\link{emodel.object}}.} \item{qcmodel}{A list #' of objects representing the model for covariates on transition intensities. #' See \code{\link{qcmodel.object}}.} \item{ecmodel}{A list of objects #' representing the model for covariates on transition intensities. See #' \code{\link{ecmodel.object}}.} \item{hmodel}{A list of objects representing #' the hidden Markov model structure. See \code{\link{hmodel.object}}.} #' \item{cmodel}{A list giving information about censored states. See #' \code{\link{cmodel.object}}. } \item{pci}{Cut points for time-varying #' intensities, as supplied to \code{\link{msm}}, but excluding any that are #' outside the times observed in the data.} \item{paramdata}{A list giving #' information about the parameters of the multi-state model. See #' \code{\link{paramdata.object}}.} \item{cl}{Confidence interval width, as #' supplied to \code{\link{msm}}.} \item{covariates}{Formula for covariates on #' intensities, as supplied to \code{\link{msm}}.} #' \item{misccovariates}{Formula for covariates on misclassification #' probabilities, as supplied to \code{\link{msm}}.} \item{hcovariates}{Formula #' for covariates on hidden Markov model outcomes, as supplied to #' \code{\link{msm}}.} \item{initcovariates}{Formula for covariates on initial #' state occupancy probabilities in hidden Markov models, as supplied to #' \code{\link{msm}}.} \item{sojourn}{ A list as returned by #' \code{\link{sojourn.msm}}, with components: #' #' \code{mean} = estimated mean sojourn times in the transient states, with #' covariates fixed at their means (if center=TRUE) or at zero (if #' center=FALSE). #' #' \code{se} = corresponding standard errors. } NULL #' Developer documentation: internal msm parameters object #' #' An object giving information about the parameters of the multi-state model. #' Used internally during maximum likelihood estimation and arranging results. #' Returned as the \code{paramdata} component of a fitted \code{\link{msm}} #' model object. #' #' @name paramdata.object #' @return \item{inits}{Vector of initial values for distinct parameters which #' are being estimated. These have been transformed to the real line (e.g. by #' log), and exclude parameters being fixed at their initial values, parameters #' defined to be always fixed (e.g. binomial denominators) and parameters #' constrained to equal previous ones.} \item{plabs}{Names of parameters in #' \code{allinits}.} \item{allinits}{Vector of parameter values before #' estimation, including those which are fixed or constrained to equal other #' parameters, and transformed to the real line.} \item{hmmpars}{Indices of #' \code{allinits} which represent baseline parameters of hidden Markov outcome #' models (thus excluding covariate effects in HMMs and initial state occupancy #' probabilities). } \item{fixed}{\code{TRUE} if all parameters are fixed, #' \code{FALSE} otherwise.} \item{fixedpars}{Indices of parameters in #' \code{allinits} which are fixed, either by definition or as requested by the #' user in the \code{fixedpars} argument to \code{\link{msm}}. Excludes #' parameters fixed by constraining to equal other parameters.} #' \item{notfixed}{Indices of parameters which are not fixed by the definition #' of \code{fixedpars}.} \item{optpars}{Indices of parameters in #' \code{allinits} being estimated, thus those included in \code{inits}.} #' \item{auxpars}{Indices of "auxiliary" parameters which are always fixed, for #' example, binomial denominators (\code{\link{hmmBinom}}) and the \code{which} #' parameter in \code{\link{hmmIdent}}.} \item{constr}{Vector of integers, of #' length \code{npars}, indicating which sets of parameters are constrained to #' be equal to each other. If two of these integers are equal the #' corresponding parameters are equal. A negative element indicates that #' parameter is defined to be minus some other parameter (this is used for #' covariate effects on transition intensities).} \item{npars}{Total number of #' parameters, equal to \code{length(allinits)}.} \item{nfix}{Number of fixed #' parameters, equal to \code{length(fixedpars)}. } \item{nopt}{Number of #' parameters being estimated, equal to \code{length(inits)} and #' \code{length(optpars)}.} \item{ndup}{Number of parameters defined as #' duplicates of previous parameters by equality constraints (currently #' unused).} \item{ranges}{Matrix of defined ranges for each parameter on the #' natural scale (e.g. 0 to infinity for rate parameters). } \item{opt}{Object #' returned by the optimisation routine (such as \code{\link{optim}}).} #' \item{foundse}{\code{TRUE} if standard errors are available after #' optimisation. If \code{FALSE} the optimisation probably hasn't converged. } #' \item{lik}{Minus twice the log likelihood at the parameter estimates.} #' \item{deriv}{Derivatives of the minus twice log likelihood at the parameter #' estimates, if available. } \item{information}{Corresponding expected #' information matrix at the parameter estimates, if available.} #' \item{params}{Vector of parameter values after maximum likelihood #' estimation, corresponding to \code{allinits}, still on the real-line #' transformed scale.} \item{covmat}{Covariance matrix corresponding to #' \code{params}.} \item{ci}{Matrix of confidence intervals corresponding to #' \code{params}, with nominal coverage (default 0.95) defined by the \code{cl} #' argument of \code{\link{msm}}. } \item{estimates.t}{Vector of parameter #' estimates, as \code{params} but with parameters on their natural scales.} #' @seealso \code{\link{msm.object}} NULL #' Developer documentation: model for covariates on transition intensities #' #' A list representing the model for covariates on transition intensities #' #' @name qcmodel.object #' @return \item{npars}{Number of covariate effect parameters. This is defined #' as the number of covariates on intensities (with factors expanded as #' contrasts) multiplied by the number of allowed transitions in the model. #' #' Note if \code{\link{msm}} was called with \code{covariates} set to a list of #' different covariates for different intensities, then this will include #' covariate effects that are implicitly defined as zero by this list. The #' information in \code{\link[=paramdata.object]{paramdata}} objects can be #' used to identify wich ones are fixed at zero. #' #' This also includes any \code{timeperiod} covariates in a time-inhomogeneous #' model defined by the \code{pci} option to \code{\link{msm}}. } #' \item{ndpars}{Number of distinct covariate effect parameters, as #' \code{npars}, but after any equality constraints have been applied.} #' \item{ncovs}{Number of covariates on intensities, with factors expanded as #' contrasts.} \item{constr}{List of equality constraints on these covariate #' effects, as supplied in the \code{constraint} argument to #' \code{\link{msm}}.} \item{covlabels}{Names / labels of these covariates in #' the model matrix (see \code{\link{model.matrix.msm}}).} \item{inits}{Initial #' values for these covariate effects, as a vector formed from the #' \code{covinits} list supplied to \code{\link{msm}}.} \item{covmeans}{Means #' of these covariates in the data (excluding data not required to fit the #' model, such as observations with missing data in other elements or subjects' #' last observations). This includes means of 0/1 factor contrasts as well as #' continuous covariates (for historic reasons, which may not be sensible).} #' @seealso \code{\link{msm.object}}. NULL #' Developer documentation: transition model structure object #' #' A list giving information about the structure of states and allowed #' transitions in a multi-state model, and options for likelihood calculation. #' Used in internal computations, and returned in a fitted \code{\link{msm}} #' model object. #' #' @name qmodel.object #' @return \item{nstates}{Number of states} \item{iso}{Label for which basic #' structure the model is isomorphic to in the list of structures for which #' analytic formulae for the transition probabilities are implemented in the #' source file \code{src/analyticp.c}. This list is given by the internal #' object \code{msm:::.msm.graphs} which is defined and documented in the #' source file \code{R/constants.R}. #' #' \code{iso} is 0 if the analytic P matrix is not implemented for this #' structure, or if analytic P matrix calculations are disabled using #' \code{use.analyticp=FALSE} in the call to \code{\link{msm}}. } #' \item{perm}{Permutation required to convert the base isomorphism into the #' structure of this model. A vector of integers whose \eqn{r}th element is the #' state number in the base structure representing state \eqn{r} in the current #' structure. } \item{qperm}{Inverse permutation: vector whose \eqn{r}th #' element is the state number in the current structure representing the #' \eqn{r}th state in the base structure.} \item{npars}{Number of allowed #' instantaneous transitions, equal to \code{sum(imatrix)}.} #' \item{imatrix}{Indicator matrix for allowed instantaneous transitions. This #' has \eqn{(r,s)} entry 1 if the transition from \eqn{r} to \eqn{s} is #' permitted in continuous time, and 0 otherwise. The diagonal entries are #' arbitrarily set to 0.} \item{qmatrix}{Matrix of initial values for the #' transition intensities, supplied as the \code{qmatrix} argument of #' \code{\link{msm}}.} \item{inits}{Vector of these initial values, reading #' across rows of \code{qmatrix} and excluding the diagonal and disallowed #' transitions.} \item{constr}{Indicators for equality constraints on baseline #' intensities, taken from the \code{qconstraint} argument to #' \code{\link{msm}}, and mapped if necessary to the set (1,2,3,...).} #' \item{ndpars}{Number of distinct allowed instantaneous transitions, after #' applying equality constraints.} \item{expm}{Use \pkg{expm} package to #' calculate matrix exponentials for likelihoods, as supplied to the #' \code{use.expm} argument of \code{\link{msm}}. \code{TRUE} or #' \code{FALSE}.} #' @seealso \code{\link{msm.object}},\code{\link{emodel.object}}, #' \code{\link{hmodel.object}}. NULL msm/R/MatrixExp.R0000644000176200001440000001242314654455760013335 0ustar liggesusers#' Matrix exponential #' #' Calculates the exponential of a square matrix. #' #' See the \code{\link[expm]{expm}} documentation for details of the algorithms #' it uses. #' #' Generally the exponential \eqn{E} of a square matrix \eqn{M} can often be #' calculated as #' #' \deqn{E = U \exp(D) U^{-1}}{E = U exp(D) U^{-1}} #' #' where \eqn{D} is a diagonal matrix with the eigenvalues of \eqn{M} on the #' diagonal, \eqn{\exp(D)}{exp(D)} is a diagonal matrix with the exponentiated #' eigenvalues of \eqn{M} on the diagonal, and \eqn{U} is a matrix whose #' columns are the eigenvectors of \eqn{M}. #' #' This method of calculation is used if \code{"pade"} or \code{"series"} is #' supplied but \eqn{M} has distinct eigenvalues. I If \eqn{M} has repeated #' eigenvalues, then its eigenvector matrix may be non-invertible. In this #' case, the matrix exponential is calculated using the Pade approximation #' defined by Moler and van Loan (2003), or the less robust power series #' approximation, #' #' \deqn{\exp(M) = I + M + M^2/2 + M^3 / 3! + M^4 / 4! + ...}{exp(M) = I + M + #' M^2/2 + M^3 / 3! + M^4 / 4! + ...} #' #' For a continuous-time homogeneous Markov process with transition intensity #' matrix \eqn{Q}, the probability of occupying state \eqn{s} at time \eqn{u + #' t} conditional on occupying state \eqn{r} at time \eqn{u} is given by the #' \eqn{(r,s)} entry of the matrix \eqn{\exp(tQ)}{exp(tQ)}. #' #' If \code{mat} is a valid transition intensity matrix for a continuous-time #' Markov model (i.e. diagonal entries non-positive, off-diagonal entries #' non-negative, rows sum to zero), then for certain simpler model structures, #' there are analytic formulae for the individual entries of the exponential of #' \code{mat}. These structures are listed in the PDF manual and the formulae #' are coded in the \pkg{msm} source file \code{src/analyticp.c}. These #' formulae are only used if \code{method="analytic"}. This is more efficient, #' but it is not the default in \code{MatrixExp} because the code is not robust #' to extreme values. However it is the default when calculating likelihoods #' for models fitted by \code{\link{msm}}. #' #' The implementation of the Pade approximation used by \code{method="pade"} #' was taken from JAGS by Martyn Plummer #' (\url{https://mcmc-jags.sourceforge.io}). #' #' @param mat A square matrix #' #' @param t An optional scaling factor for \code{mat}. If a vector is supplied, #' then an array of matrices is returned with different scaling factors. #' #' @param method Under the default of \code{NULL}, this simply wraps the #' \code{\link[expm]{expm}} function from the \pkg{expm} package. This is #' recommended. Options to \code{\link[expm]{expm}} can be supplied to #' \code{\link{MatrixExp}}, including \code{method}. #' #' Otherwise, for backwards compatibility, the following options, which use #' code in the \pkg{msm} package, are available: \code{"pade"} for a Pade #' approximation method, \code{"series"} for the power series approximation, or #' \code{"analytic"} for the analytic formulae for simpler Markov model #' intensity matrices (see below). These options are only used if \code{mat} #' has repeated eigenvalues, thus the usual eigen-decomposition method cannot #' be used. #' @param ... Arguments to pass to \code{\link[expm]{expm}}. #' @return The exponentiated matrix \eqn{\exp(mat)}{exp(mat)}. Or, if \code{t} #' is a vector of length 2 or more, an array of exponentiated matrices. #' @references Cox, D. R. and Miller, H. D. \emph{The theory of stochastic #' processes}, Chapman and Hall, London (1965) #' #' Moler, C and van Loan, C (2003). Nineteen dubious ways to compute the #' exponential of a matrix, twenty-five years later. \emph{SIAM Review} #' \bold{45}, 3--49. #' @keywords math #' @export MatrixExp MatrixExp <- function(mat, t = 1, method=NULL,...){ if (!is.matrix(mat) || (nrow(mat)!= ncol(mat))) stop("\"mat\" must be a square matrix") qmodel <- if (is.qmatrix(mat) && !is.null(method) && method=="analytic") msm.form.qmodel(mat) else list(iso=0, perm=0, qperm=0) if (!is.null(method) && method=="analytic") { if (!is.qmatrix(mat)) warning("Analytic method not available since matrix is not a Markov model intensity matrix. Using \"pade\".") else if (qmodel$iso==0) warning("Analytic method not available for this Markov model structure. Using \"pade\".") } if (length(t) > 1) res <- array(dim=c(dim(mat), length(t))) for (i in seq_along(t)) { if (is.null(method) || !(method %in% c("pade","series","analytic"))) { if (is.null(method)) method <- eval(formals(expm::expm)$method) resi <- expm::expm(t[i]*mat, method=method, ...) } else { ccall <- .C("MatrixExpR", as.double(mat), as.integer(nrow(mat)), res=double(length(mat)), as.double(t[i]), as.integer(match(method, c("pade","series"))), # must match macro constants in pijt.c as.integer(qmodel$iso), as.integer(qmodel$perm), as.integer(qmodel$qperm), as.integer(0), NAOK=TRUE) resi <- matrix(ccall$res, nrow=nrow(mat)) } if (length(t)==1) res <- resi else res[,,i] <- resi } res } msm/R/scoreresid.R0000644000176200001440000000364214534672671013560 0ustar liggesusers#' Score residuals #' #' Score residuals for detecting outlying subjects. #' #' The score residual for a single subject is #' #' \deqn{U(\theta)^T I(\theta)^{-1} U(\theta)}{U(theta)^T I(theta)^{-1} #' U(theta)} #' #' where \eqn{U(\theta)}{U(theta)} is the vector of first derivatives of the #' log-likelihood for that subject at maximum likelihood estimates #' \eqn{\theta}{theta}, and \eqn{I(\theta)}{theta} is the observed Fisher #' information matrix, that is, the matrix of second derivatives of minus the #' log-likelihood for that subject at theta. #' #' Subjects with a higher influence on the maximum likelihood estimates will #' have higher score residuals. #' #' These are only available for models with analytic derivatives (which #' includes all non-hidden and most hidden Markov models). #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param plot If \code{TRUE}, display a simple plot of the residuals in #' subject order, labelled by subject identifiers #' @return Vector of the residuals, named by subject identifiers. #' @author Andrew Titman \email{a.titman@@lancaster.ac.uk} (theory), Chris #' Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} (code) #' @keywords models #' @export scoreresid.msm scoreresid.msm <- function(x, plot=FALSE){ if (!inherits(x, "msm")) stop("expected x to be a msm model") if (!deriv_supported(x$data, x$hmodel, x$cmodel)) stop("Score residuals not available, since analytic derivatives not implemented for this model") derivs <- Ccall.msm(x$paramdata$opt$par, do.what="deriv.subj", expand.data(x), x$qmodel, x$qcmodel, x$cmodel, x$hmodel, x$paramdata) cov <- x$paramdata$covmat[x$paramdata$optpars,x$paramdata$optpars] sres <- colSums(t(derivs) * cov %*% t(derivs)) names(sres) <- unique(x$data$mf$"(subject)") if (plot) { plot(sres, type="n") text(seq_along(sres), sres, names(sres)) } sres } msm/R/draic.R0000644000176200001440000005243414471426252012473 0ustar liggesusers#' Criteria for comparing two multi-state models with nested state spaces #' #' A modification of Akaike's information criterion, and a leave-one-out #' likelihood cross-validation criterion, for comparing the predictive ability #' of two Markov multi-state models with nested state spaces. This is #' evaluated based on the restricted or aggregated data which the models have #' in common. #' #' Note that standard AIC can be computed for one or more fitted \code{msm} #' models \code{x,y,...} using \code{\link{AIC}(x,y,...)}, and this can be used #' to compare models fitted to the same data. \code{draic.msm} and #' \code{drlcv.msm} are designed for models fitted to data with #' differently-aggregated state spaces. #' #' #' The difference in restricted AIC (Liquet and Commenges, 2011), as computed #' by this function, is defined as #' #' \deqn{D_{RAIC} = l(\gamma_n |\mathbf{x}'' ) - l(\theta_n |\mathbf{x}'' ) + #' trace ( J(\theta_n |\mathbf{x}'')J(\theta_n |\mathbf{x})^{-1} - J(\gamma_n #' |\mathbf{x}'' )J(\gamma_n |\mathbf{x}' )^{-1})}{D_RAIC = l(gamma_n |x'' ) - #' l(theta_n |x'' ) + trace ( J(theta_n |x'')J(theta_n |x)^{-1} - J(gamma_n #' |x'' )J(gamma_n |x' )^{-1})} #' #' where \eqn{\gamma}{gamma} and \eqn{\theta}{theta} are the maximum likelihood #' estimates of the smaller and bigger models, fitted to the smaller and bigger #' data, respectively. #' #' \eqn{l(\gamma_n |x'')}{l(gamma_n |x'')} represents the likelihood of the #' simpler model evaluated on the restricted data. #' #' \eqn{l(\theta_n |x'')}{l(theta_n |x'')} represents the likelihood of the #' complex model evaluated on the restricted data. This is a hidden Markov #' model, with a misclassification matrix and initial state occupancy #' probabilities as described by Thom et al (2014). #' #' \eqn{J()} are the corresponding (expected or observed, as specified by the #' user) information matrices. #' #' \eqn{\mathbf{x}}{x} is the expanded data, to which the bigger model was #' originally fitted, and \eqn{\mathbf{x}'}{x'} is the data to which the #' smaller model was originally fitted. \eqn{\mathbf{x}''}{x''} is the #' restricted data which the two models have in common. \eqn{\mathbf{x}'' = #' \mathbf{x}'}{x'' = x} in this implementation, so the models are nested. #' #' The difference in likelihood cross-validatory criteria (Liquet and #' Commenges, 2011) is defined as #' #' \deqn{D_{RLCV} = 1/n \sum_{i=1}^n \log( h_{X''}(x_i'' | \gamma_{-i}) / #' g_{X''}(x_i''| \theta_{-i}))}{D_{RLCV} = 1/n \sum_{i=1}^n log( h_{X''}(x_i'' #' | gamma_{-i}) / g_{X''}(x_i''| theta_{-i}))} #' #' where \eqn{\gamma_{-i}} and \eqn{\theta_{-i}} are the maximum likelihood #' estimates from the smaller and bigger models fitted to datasets with subject #' \eqn{i} left out, \eqn{g()} and \eqn{h()} are the densities of the #' corresponding models, and \eqn{x_i''} is the restricted data from subject #' \eqn{i}. #' #' Tracking intervals are analogous to confidence intervals, but not strictly #' the same, since the quantity which D_RAIC aims to estimate, the difference #' in expected Kullback-Leibler discrepancy for predicting a replicate dataset, #' depends on the sample size. See the references. #' #' Positive values for these criteria indicate the coarse model is preferred, #' while negative values indicate the full model is preferred. #' #' @aliases draic.msm drlcv.msm #' @param msm.full Model on the bigger state space. #' @param msm.coarse Model on the smaller state space. #' #' The two models must both be non-hidden Markov models without censored #' states. #' #' The two models must be fitted to the same datasets, except that the state #' space of the coarse model must be an aggregated version of the state space #' of the full model. That is, every state in the full dataset must correspond #' to a unique state in the coarse dataset. For example, for the full state #' variable \code{c(1,1,2,2,3,4)}, the corresponding coarse states could be #' \code{c(1,1,2,2,2,3)}, but not \code{c(1,2,3,4,4,4)}. #' #' The structure of allowed transitions in the coarse model must also be a #' collapsed version of the big model structure, but no check is currently made #' for this in the code. #' #' To use these functions, all objects which were used in the calls to fit #' \code{msm.full} and \code{msm.coarse} must be in the working environment, #' for example, datasets and definitions of transition matrices. #' @param likelihood.only Don't calculate Hessians and trace term (DRAIC). #' @param information Use observed or expected information in the DRAIC trace #' term. Expected is the default, and much faster, though is only available #' for models fitted to pure panel data (all \code{obstype=1} in the call to #' \code{\link{msm}}, thus not exact transition times or exact death times) #' @param tl Width of symmetric tracking interval, by default 0.95 for a 95\% #' interval. #' @param cores Number of processor cores to use in \code{drlcv} for #' cross-validation by parallel processing. Requires the \pkg{doParallel} #' package to be installed. If not specified, parallel processing is not used. #' If \code{cores} is set to the string \code{"default"}, the default methods #' of \code{\link[parallel]{makeCluster}} (on Windows) or #' \code{\link[doParallel]{registerDoParallel}} (on Unix-like) are used. #' @param verbose Print intermediate results of each iteration of #' cross-validation to the console while running. May not work with parallel #' processing. #' @param outfile Output file to print intermediate results of #' cross-validation. Useful to track execution speed when using parallel #' processing, where output to the console may not work. #' @return A list containing \eqn{D_{RAIC}}{D_RAIC} (\code{draic.msm}) or #' \eqn{D_{RLCV}}{D_RLCV} (\code{drlcv.msm}), its component terms, and tracking #' intervals. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk}, H. H. Z. #' Thom \email{howard.thom@@bristol.ac.uk} #' @seealso \code{\link{logLik.msm}} #' @references Thom, H. and Jackson, C. and Commenges, D. and Sharples, L. #' (2015) State selection in multistate models with application to quality of #' life in psoriatic arthritis. Statistics In Medicine 34(16) 2381 - 2480. #' #' Liquet, B. and Commenges D. (2011) Choice of estimators based on different #' observations: Modified AIC and LCV criteria. Scandinavian Journal of #' Statistics; 38:268-287. #' @keywords models #' @export draic.msm draic.msm <- function(msm.full,msm.coarse, likelihood.only=FALSE, information=c("expected", "observed"), tl=0.95 ) { if (!inherits(msm.full, "msm")) stop("Expected \"msm.full\" to be a msm model") if (!inherits(msm.coarse, "msm")) stop("Expected \"msm.coarse\" to be a msm model") if (msm.full$hmodel$hidden || msm.coarse$hmodel$hidden) stop("Hidden Markov models not supported") if (msm.full$cmodel$ncens > 0 || msm.coarse$cmodel$ncens >0) stop("Models with censoring not supported") ## Reconstruct datasets used to fit each model as dataframes. standard names will be bracketed. msm.full.data <- reconstruct.data(model.frame(msm.full)) msm.coarse.data <- reconstruct.data(model.frame(msm.coarse)) un <- attr(msm.full.data, "usernames") subj <- un["subject"]; st <- un["state"] unc <- attr(msm.coarse.data, "usernames") subjc <- unc["subject"]; stc <- unc["state"] if (nrow(msm.full.data) != nrow(msm.coarse.data)) stop("Full dataset has ",nrow(msm.full.data)," rows, but coarse dataset has ",nrow(msm.coarse.data)," rows, these should be equal.") ## Determine map from full to coarsened data coarsening.ematrix <- matrix(0,nrow=msm.full$qmodel$nstates, ncol=msm.full$qmodel$nstates) map <- unique(cbind(full=msm.full.data[,st], coarse=msm.coarse.data[,stc])) if (!all(tapply(map[,"coarse"], map[,"full"], function(x)length(unique(x)))==1)){ message("Observed the following state mappings in the data:") print(map); stop("Coarse state space not an aggregation of the the full state space") } coarsening.ematrix[map] <- 1 ## Could also check for compatible Q matrices, but would be fiddly, so don't bother ## Initial state occupancy probabilities, assumed equal across possible states initstate <- msm.full.data[,st][!duplicated(msm.full.data[,subj])] init.probs <- prop.table(table(factor(initstate, levels=1:msm.full$qmodel$nstates))) initp <- matrix(0, nrow=attr(msm.full.data,"npts"), ncol=msm.full$qmodel$nstates) for(i in 1:length(initstate)) { j<-coarsening.ematrix[initstate[i],]==1 initp[i,] <- init.probs * coarsening.ematrix[,j] initp[i,] <- initp[i,] / sum(initp[i,]) } ## Log-likelihood of complex model on restricted dataset lh.restricted.obj<-function(pars, by.subject=FALSE, return.model=FALSE) { p <- msm.full$estimates p[msm.full$paramdata$optpars] <- pars p[names(p)=="qbase"] <- exp(p[names(p)=="qbase"]) call <- msm.full$call ## name of state might be different in coarse data, assumes all other names same call$formula <- as.formula(paste(stc, "~", unc["time"])) call$data <- substitute(msm.coarse.data) call$ematrix <- coarsening.ematrix qmat <- t(msm.full$qmodel$imatrix) # Supply parameters as a vector for use in optimHess() qmat[qmat==1] <- p[names(p)=="qbase"] call$qmatrix <- t(qmat) call$covinits <- split(p[names(p)=="qcov"], rep(msm.full$qcmodel$covlabels, each=msm.full$qmodel$npars)) call$fixedpars <- TRUE call$initprobs <- initp res <- eval(call) if (return.model) res else as.numeric(logLik.msm(res, by.subject=by.subject)) } n <- attr(msm.full.data,"npts") mle <- msm.full$estimates[msm.full$paramdata$optpars] # handle models with some parameters fixed lsm <- lh.restricted.obj(mle) # Loglik of complex model on restricted data lmm <- logLik.msm(msm.full) # Complex model on full data lss <- logLik.msm(msm.coarse) # Simple model on restricted data dfit <- (1/n)*(lss - lsm) res.lik <- c("complex"=-lsm, "simple"=-lss, "complex-simple"=-(lsm-lss),"(complex-simple)/n"=dfit) if (!likelihood.only) { information <- match.arg(information) if (!all(msm.full$data$mf$"(obstype)" == 1)) information <- "observed" if (information=="observed") { ## Information matrix of complex model on complex data I.complex <- -0.5*(1/n)*msm.full$opt$hessian ## Information matrix of complex model on restricted data I.restricted <- (1/n)*optimHess(mle, lh.restricted.obj) } else { I.complex <- -0.5*(1/n)*msm.full$paramdata$information res <- lh.restricted.obj(mle, return.model=TRUE) ## simply using I <- res$paramdata$information doesn't work for models with some parameters fixed ## since call producing res unfixes these to produce derivs/info. ## so calculate information separately after keeping these fixed res$paramdata$optpars <- msm.full$paramdata$optpars res$paramdata$fixedpars <- c(msm.full$paramdata$fixedpars, res$paramdata$auxpars) I <- information.msm(res$paramdata$allinits[res$paramdata$optpars], expand.data(res), res$qmodel, res$qcmodel, res$cmodel, res$hmodel, res$paramdata) I.restricted <- -0.5*(1/n)*I } npars.restricted <- sum(diag(I.restricted %*% solve(I.complex))) dcompl <- (1/n)*(npars.restricted - msm.coarse$paramdata$npars) DRAIC <- dfit + dcompl ## Tracking interval. ## Difference in log-likelihoods on restricted data dlh <- lh.restricted.obj(mle, by.subject=TRUE) - logLik.msm(msm.coarse, by.subject=TRUE) omega.sq <- mean(dlh*dlh) - mean(dlh)^2 half.width <- qnorm(1 - 0.5*(1 - tl)) * sqrt(omega.sq / n) prob.DRAIC <- pnorm(-DRAIC / sqrt(omega.sq / n)) res.int <- c("2.5%"=DRAIC-half.width,"97.5%"=DRAIC+half.width,"Prob<0"=prob.DRAIC) if (!isTRUE(all.equal(tl,0.95))) names(res.int)[1:2] <- c("Lower","Upper") liks <- cbind("-LL" = res.lik, npars=c(npars.restricted, msm.coarse$paramdata$npars, npars.restricted - msm.coarse$paramdata$npars, dcompl)) res <- list(lik.restricted = liks, draic = as.numeric(DRAIC), ti=res.int) } else res <- res.lik res } #' @rdname draic.msm #' @export drlcv.msm <- function(msm.full,msm.coarse,tl=0.95,cores=NULL,verbose=TRUE,outfile=NULL) { if (!inherits(msm.full, "msm")) stop("Expected \"msm.full\" to be a msm model") if (!inherits(msm.coarse, "msm")) stop("Expected \"msm.coarse\" to be a msm model") if (msm.full$hmodel$hidden || msm.coarse$hmodel$hidden) stop("Hidden Markov models not supported") if (msm.full$cmodel$ncens > 0 || msm.coarse$cmodel$ncens >0) stop("Models with censoring not supported") ## Reconstruct datasets used to fit each model as dataframes msm.full.data <- reconstruct.data(model.frame(msm.full)) msm.coarse.data <- reconstruct.data(model.frame(msm.coarse)) un <- attr(msm.full.data, "usernames") subj <- un["subject"]; st <- un["state"] unc <- attr(msm.coarse.data, "usernames") subjc <- unc["subject"]; stc <- unc["state"] if (nrow(msm.full.data) != nrow(msm.coarse.data)) stop("Full dataset has ",nrow(msm.full.data)," rows, but coarse dataset has ",nrow(msm.coarse.data)," rows, these should be equal.") ## Determine map from full to coarsened data coarsening.ematrix <- matrix(0,nrow=msm.full$qmodel$nstates, ncol=msm.full$qmodel$nstates) map <- unique(cbind(full=msm.full.data[,st], coarse=msm.coarse.data[,stc])) if (!all(tapply(map[,"coarse"], map[,"full"], function(x)length(unique(x)))==1)){ message("Observed the following state mappings in the data:") print(map); stop("Coarse state space not an aggregation of the the full state space") } coarsening.ematrix[map] <- 1 ## Initial state occupancy probabilities assumed equal across possible states initstate <- msm.full.data[,st][!duplicated(msm.full.data[,subj])] init.probs <- prop.table(table(factor(initstate, levels=1:msm.full$qmodel$nstates))) initp <- matrix(0, nrow=attr(msm.full.data,"npts"), ncol=msm.full$qmodel$nstates) for(i in 1:length(initstate)) { j<-coarsening.ematrix[initstate[i],]==1 initp[i,] <- init.probs * coarsening.ematrix[,j] initp[i,] <- initp[i,] / sum(initp[i,]) } ## Log-likelihood of complex model on restricted dataset call <- msm.full$call ## name of state might be different in coarse data, assumes all other names same call$formula <- as.formula(paste(stc, "~", unc["time"])) call$data <- substitute(msm.coarse.data) call$ematrix <- coarsening.ematrix call$qmatrix <- qmatrix.msm(msm.full, ci="none") # start it at the full MLE to help convergence call$covinits <- lapply(msm.full$Qmatrices[msm.full$qcmodel$covlabels], function(x){t(x)[msm.full$qmodel$imatrix==1]}) call$fixedpars <- TRUE call$initprobs <- initp msm.full.on.restricted <- eval(call) n <- attr(msm.full.data,"npts") lsm <- logLik.msm(msm.full.on.restricted) # Loglik of complex model on restricted data lmm <- logLik.msm(msm.full) # Complex model on full data lss <- logLik.msm(msm.coarse) # Simple model on restricted data ## Cross validation iteration for leaving out ith subject cv.fn <- function(i) { ## Refit small model after leaving one subject out call <- msm.coarse$call call$data <- msm.coarse.data[msm.coarse.data[,subjc] != unique(msm.coarse.data[,subjc])[i],] call$qmatrix <- qmatrix.msm(msm.coarse, ci="none") # start it at the full MLE to help convergence call$covinits <- lapply(msm.coarse$Qmatrices[msm.coarse$qcmodel$covlabels], function(x){t(x)[msm.coarse$qmodel$imatrix==1]}) res.coarse <- try(eval(call)) lssf <- as.numeric(logLik.msm(res.coarse)) ## Loglik of refitted model on left-out subject call$data <- msm.coarse.data[msm.coarse.data[,subjc] == unique(msm.coarse.data[,subjc])[i],] call$qmatrix <- qmatrix.msm(res.coarse, ci="none", covariates=0) call$center <- FALSE call$covinits <- lapply(res.coarse$Qmatrices[res.coarse$qcmodel$covlabels], function(x){t(x)[res.coarse$qmodel$imatrix==1]}) ## Workaround to avoid dropping unused levels and breaking model.matrix when factor() used around an existing factor in the data if (!is.null(call$covariates)){ call$covariates <- as.formula(gsub("factor\\((.+)\\)", "factor(\\1,levels=levels(\\1))", call$covariates)) names(call$covinits) <- gsub("factor\\((.+)\\)", "factor(\\1, levels = levels(\\1))", names(call$covinits)) } if (!is.null(call$constraint)) names(call$constraint) <- gsub("factor\\((.+)\\)", "factor(\\1, levels = levels(\\1))", names(call$constraint)) call$fixedpars <- TRUE res <- suppressWarnings(eval(call)) ## suppress warnings about state vector not containing observations of all states lss <- as.numeric(logLik.msm(res)) ## Refit big model after leaving one subject out. call <- msm.full$call call$data <- msm.full.data[msm.full.data[,subj] != unique(msm.full.data[,subj])[i],] call$qmatrix <- qmatrix.msm(msm.full, ci="none") # start it at the full MLE to help convergence call$covinits <- lapply(msm.full$Qmatrices[msm.full$qcmodel$covlabels], function(x){t(x)[msm.full$qmodel$imatrix==1]}) res.full <- try(eval(call)) lsmf <- as.numeric(logLik.msm(res.full)) ## Loglik of refitted model on left-out subject, using coarsened data call$formula <- as.formula(paste(stc, "~", unc["time"])) call$data <- msm.coarse.data[msm.coarse.data[,subjc] == unique(msm.coarse.data[,subjc])[i],] call$ematrix <- coarsening.ematrix call$qmatrix <- qmatrix.msm(res.full, ci="none", covariates=0) call$center <- FALSE call$covinits <- lapply(res.full$Qmatrices[res.full$qcmodel$covlabels], function(x){t(x)[res.full$qmodel$imatrix==1]}) if (!is.null(call$covariates)){ call$covariates <- as.formula(gsub("factor\\((.+)\\)", "factor(\\1,levels=levels(\\1))", call$covariates)) names(call$covinits) <- gsub("factor\\((.+)\\)", "factor(\\1, levels = levels(\\1))", names(call$covinits)) } if (!is.null(call$constraint)) names(call$constraint) <- gsub("factor\\((.+)\\)", "factor(\\1, levels = levels(\\1))", names(call$constraint)) call$initprobs <- initp[i,,drop=FALSE] call$fixedpars <- TRUE res <- eval(call) lsm <- as.numeric(logLik.msm(res)) conv <- ifelse(res.full$opt$convergence==0, "converged", "NOT CONVERGED") resc <- sprintf("i=%d, smallrest = %.12f, smalli = %.12f, bigrest = %.12f, bigi = %.12f, diff = %.12f, %s\n", i, lssf, lss, lsmf, lsm, lss - lsm, conv) if (verbose) cat(resc) if (!is.null(outfile)) cat(resc, file=outfile, append=TRUE) c(lsm=lsm, lss=lss, lssf=lssf, lsmf=lsmf) } if (is.null(cores) || cores==1) parallel <- FALSE else parallel <- TRUE; if (parallel){ if (!is.null(cores) && cores=="default") cores <- NULL if (requireNamespace("doParallel", quietly = TRUE)){ ### can't get this working separated out into a function like portable.parallel(). Variable exporting / scoping doesnt' work. ### no need to export these? "msm.coarse", "msm.coarse.data", "msm.full", "msm.full.data","coarsening.ematrix", "initp" if (.Platform$OS.type == "windows") { cl <- parallel::makeCluster(cores) doParallel::registerDoParallel(cl) } else doParallel::registerDoParallel(cores=cores) cv <- foreach::"%dopar%"(foreach::foreach(i=1:n, .packages="msm", .export=c(ls(.GlobalEnv))), { cv.fn(i) }) } else stop("\"parallel\" package not available") } else { cv <- vector(mode="list", n) for (i in 1:n){ cv[[i]] <- cv.fn(i) } } LCVi <- sapply(cv, function(x){x["lss"] - x["lsm"]}) DRLCV <- mean(LCVi) dlh <- logLik.msm(msm.full.on.restricted, by.subject=TRUE) - logLik.msm(msm.coarse, by.subject=TRUE) omega.sq <- mean(dlh*dlh) - mean(dlh)^2 half.width <- qnorm(1 - 0.5*(1 - tl)) * sqrt(omega.sq / n) prob.DRLCV <- pnorm(-DRLCV / sqrt(omega.sq / n)) res.int <- c("2.5%"=DRLCV-half.width,"97.5%"=DRLCV+half.width,"Prob<0"=prob.DRLCV) if (!isTRUE(all.equal(tl,0.95))) names(res.int)[1:2] <- c("Lower","Upper") liks <- cbind("-LL" = c(-lsm, -lss, -(lsm-lss), -(lsm-lss)/n)) rownames(liks) <- c("complex","simple","complex-simple","(complex-simple)/n") res <- list(lik.restricted = liks, drlcv = as.numeric(DRLCV), ti=res.int) res } msm/R/prevalence.R0000644000176200001440000006615614660326547013551 0ustar liggesusers ## Enumerate the distinct subject covariate histories in the data ## Works for time homogeneous and inhomogeneous models ## Used to calculate expected prevalences for a population with those covariates get.covhist <- function(x, subset=NULL) { ## Keep only times where the covariate changes, or first or last obs mf <- x$data$mf if (x$qcmodel$ncovs > 0) { if (!is.null(subset)) { subs <- mf$"(subject)" %in% subset mf <- mf[subs,,drop=FALSE] } subj <- match(mf$"(subject)", unique(mf$"(subject)")) n <- length(subj) apaste <- do.call("paste", mf[,attr(mf,"covnames"),drop=FALSE]) first <- !duplicated(subj); last <- rev(!duplicated(rev(subj))) keep <- (c(0, apaste[1:(n-1)]) != apaste) | first | last ## Keep and tabulate unique covariate series covseries <- split(apaste[keep], subj[keep]) # as a list of char vectors covseries <- sapply(covseries, paste, collapse=" , ") # as one char vector, one series per pt. ## also need p matrices for different times as well as different covs. ## but only interested in cov change times if there's more than one ## transition (at least one times change point) change.times <- mf$"(time)"; change.times[first] <- change.times[last] <- 0 change.times <- split(change.times[keep & (!(first|last))], subj[keep & (!(first|last))]) change.times <- sapply(change.times, paste, collapse= " , ") covseries.t <- paste(covseries, change.times, sep="; ") ids <- unique(subj)[!duplicated(covseries.t)] # subj ids, one with each distinct series ncombs <- table(covseries.t)[unique(covseries.t)]# how many per series covmat <- cbind(subject=subj, time=mf$"(time)", mf[,attr(mf,"covnames"),drop=FALSE]) covmat <- covmat[(subj %in% ids) & keep,] list(example=covmat, # rows of the original data sufficient to define the distinct histories hist=covseries.t) # one per subject listing their covariate history as a string } else NULL } ### Estimate observed state occupancies in the data at a series of times ### Assume previous observed state is retained until next observation time ### Assumes times are sorted within patient (they are in data in msm objects) observed.msm <- function(x, times=NULL, interp=c("start","midpoint"), censtime=Inf, subset=NULL) { if (!inherits(x, "msm")) stop("expected x to be a msm model") ## For general HMMs use the Viterbi estimate of the observed state. if (!is.null(x$pci)) { state <- x$data$mf$"(state)"[!x$data$mf$"(pci.imp)"] time <- x$data$mf$"(time)"[!x$data$mf$"(pci.imp)"] subject <- x$data$mf$"(subject)" subject <- subject[!x$data$mf$"(pci.imp)"] } else { if ((x$hmodel$hidden && !x$emodel$misc) || (!x$emodel$misc && x$cmodel$ncens>0) ) state <- viterbi.msm(x)$fitted else if (x$emodel$misc && x$cmodel$ncens>0) { vit <- viterbi.msm(x)$fitted state <- x$data$mf$"(state)" state[state %in% x$cmodel$censor] <- vit[state %in% x$cmodel$censor] ## TODO for misc models with censoring, impute only censored obs states from viterbi } else state <- x$data$mf$"(state)" time <- x$data$mf$"(time)"; subject <- x$data$mf$"(subject)" } if (is.null(subset)) subset <- unique(subject) time <- time[subject %in% subset] state <- state[subject %in% subset] subject <- subject[subject %in% subset] if (is.null(times)) times <- seq(min(time), max(time), (max(time) - min(time))/10) states.expand <- matrix(nrow=length(unique(subject)), ncol=length(times)) pts <- unique(subject) absorb <- absorbing.msm(x) interp <- match.arg(interp) if (!is.numeric(censtime)) stop("censtime should be numeric") if (length(censtime)==1) censtime <- rep(censtime, length(pts)) else if (length(censtime)!=length(pts)) stop("censtime of length ", length(censtime), ", should be 1 or ", length(pts)) for (i in seq_along(pts)){ state.i <- state[(subject==pts[i])] time.i <- time[(subject==pts[i])] j <- 1 while(j <= length(times)) { if (times[j] < time.i[1]) { mtime <- max(which(times-time.i[1] < 0)) states.expand[i, j:mtime] <- NA j <- mtime + 1 next; } else if (times[j] > time.i[length(time.i)]) { if (state.i[length(time.i)] %in% absorb && (times[j] <= censtime[i])) { states.expand[i, j:(length(times))] <- state.i[length(time.i)] } else states.expand[i, j:(length(times))] <- NA break; } else { prevtime.ind <- max(which(time.i <= times[j])) prevtime <- time.i[prevtime.ind] if (interp=="midpoint") { nexttime.ind <- min(which(time.i >= times[j])) nexttime <- time.i[nexttime.ind] midpoint <- (prevtime + nexttime) / 2 states.expand[i,j] <- state.i[if (times[j] <= midpoint) prevtime.ind else nexttime.ind] } else states.expand[i,j] <- state.i[prevtime.ind] } j <- j+1 } } obstab <- t(apply(states.expand, 2, function(y) table(factor(y, levels=seq(length.out=x$qmodel$nstates))))) obsperc <- 100*obstab / rep(rowSums(obstab), ncol(obstab)) dimnames(obstab) <- dimnames(obsperc) <- list(times, paste("State", 1:x$qmodel$nstates)) obstab <- cbind(obstab, Total=rowSums(obstab)) covhist <- get.covhist(x, subset) covcat <- ## distinct covariate history group each subject falls into (ordinal) if (is.null(covhist)) rep(1, length(unique(subject))) else match(covhist$hist, unique(covhist$hist)) risk <- matrix(nrow=length(times), ncol=length(unique(covcat)), dimnames = list(times, unique(covhist$hist))) for (i in seq_along(unique(covcat))) { obst <- t(apply(states.expand[covcat==unique(covcat)[i],,drop=FALSE], 2, function(y) table(factor(y, levels=seq(length.out=x$qmodel$nstates))))) risk[,i] <- rowSums(obst) } list(obstab=obstab, obsperc=obsperc, risk=risk) } expected.msm <- function(x, times=NULL, timezero=NULL, initstates=NULL, covariates="population", misccovariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, risk=NULL, subset=NULL, ci=c("none","normal","bootstrap"), cl = 0.95, B = 1000, cores = NULL ) { if (!inherits(x, "msm")) stop("expected x to be a msm model") time <- model.extract(x$data$mf, "time") if (is.null(times)) times <- seq(min(time), max(time), (max(time) - min(time))/10) if (is.null(timezero)) timezero <- min(time) if (is.null(risk)) risk <- observed.msm(x, times=times, subset=subset)$risk exptab <- matrix(0, nrow=length(times), ncol=x$qmodel$nstates) start <- min(which(times - timezero >= 0)) if (x$emodel$misc) initprobs <- x$emodel$initprobs else { if (is.null(initstates)) initstates <- observed.msm(x, times=timezero)$obstab[1:x$qmodel$nstates] initprobs <- initstates / sum(initstates) } if (length(times) >= start) { for (j in start:length(times)) { if (x$qcmodel$ncovs>0 && isTRUE(covariates=="population")) { covmat <- get.covhist(x, subset=subset)$example for (i in 1:length(unique(covmat$subject))) { ## sum expected prevalences for each covariate history observed in the data subji <- unique(covmat$subject)[i] ni <- sum(covmat$subject==subji) ctimes <- covmat$time[covmat$subject==subji][-c(1,ni)] covs <- covmat[covmat$subject==subji, attr(x$data$mf,"covnames"),drop=FALSE][-ni,,drop=FALSE] ccovs <- list() for (k in 1:nrow(covs)) ccovs[[k]] <- as.list(covs[k,,drop=FALSE]) pmat <- pmatrix.piecewise.msm(x, t1=timezero, t2=times[j], times=ctimes, covariates=ccovs) expji <- risk[j,i] * initprobs %*% pmat if (x$emodel$misc) { # return expected prev of obs (not true) states if (x$ecmodel$ncovs==0) emat <- ematrix.msm(x, ci="none") else { ecovs <- if(length(ctimes)==0) ccovs else ccovs[[length(ccovs)]] emat <- ematrix.msm(x, covariates=ecovs, ci="none") } expji <- expji %*% emat } exptab[j,] <- exptab[j,] + expji } } else { pmat <- if (is.null(piecewise.times)) pmatrix.msm(x, t=times[j] - timezero, t1=timezero, covariates=covariates) else pmatrix.piecewise.msm(x, timezero, times[j], piecewise.times, piecewise.covariates) expj <- rowSums(risk)[j] * initprobs %*% pmat if (x$emodel$misc) # return expected prev of obs (not true) states expj <- expj %*% ematrix.msm(x, covariates=misccovariates, ci="none") exptab[j,] <- expj } } } exptab <- cbind(exptab, apply(exptab, 1, sum)) dimnames(exptab) <- list(times, c(rownames(x$qmodel$qmatrix),"Total")) expperc <- 100*exptab[,1:x$qmodel$nstates] / exptab[, x$qmodel$nstates+1] ci <- match.arg(ci) e.ci <- switch(ci, bootstrap = expected.ci.msm(x, times, timezero, initstates, covariates, misccovariates, piecewise.times, piecewise.covariates, risk, cl, B, cores), normal = expected.normci.msm(x, times, timezero, initstates, covariates, misccovariates, piecewise.times, piecewise.covariates, risk, cl, B), none = NULL) res <- if (ci=="none") list(exptab=exptab, expperc=expperc) else list(exptab=list(estimates=exptab, ci=e.ci[[1]]), expperc=list(estimates=expperc, ci=e.ci[[2]])) names(res) <- c("Expected","Expected percentages") res } ### Table of observed and expected prevalences (works for misclassification and non-misclassification models) #' Tables of observed and expected prevalences #' #' This provides a rough indication of the goodness of fit of a multi-state #' model, by estimating the observed numbers of individuals occupying each #' state at a series of times, and comparing these with forecasts from the #' fitted model. #' #' The fitted transition probability matrix is used to forecast expected #' prevalences from the state occupancy at the initial time. To produce the #' expected number in state \eqn{j} at time \eqn{t} after the start, the number #' of individuals under observation at time \eqn{t} (including those who have #' died, but not those lost to follow-up) is multiplied by the product of the #' proportion of individuals in each state at the initial time and the #' transition probability matrix in the time interval \eqn{t}. The proportion #' of individuals in each state at the "initial" time is estimated, if #' necessary, in the same way as the observed prevalences. #' #' For misclassification models (fitted using an \code{ematrix}), this aims to #' assess the fit of the full model for the \emph{observed} states. That is, #' the combined Markov progression model for the true states and the #' misclassification model. Thus, expected prevalences of \emph{true} states #' are estimated from the assumed proportion occupying each state at the #' initial time using the fitted transition probabiliy matrix. The vector of #' expected prevalences of true states is then multiplied by the fitted #' misclassification probability matrix to obtain the expected prevalences of #' \emph{observed} states. #' #' For general hidden Markov models, the observed state is taken to be the #' predicted underlying state from the Viterbi algorithm #' (\code{\link{viterbi.msm}}). The goodness of fit of these states to the #' underlying Markov model is tested. #' #' In any model, if there are censored states, then these are replaced by #' imputed values of highest probability from the Viterbi algorithm in order to #' calculate the observed state prevalences. #' #' For an example of this approach, see Gentleman \emph{et al.} (1994). #' #' @param x A fitted multi-state model produced by \code{\link{msm}}. #' @param times Series of times at which to compute the observed and expected #' prevalences of states. #' @param timezero Initial time of the Markov process. Expected values are #' forecasted from here. Defaults to the minimum of the observation times given #' in the data. #' @param initstates Optional vector of the same length as the number of #' states. Gives the numbers of individuals occupying each state at the initial #' time, to be used for forecasting expected prevalences. The default is those #' observed in the data. These should add up to the actual number of people in #' the study at the start. #' @param covariates Covariate values for which to forecast expected state #' occupancy. With the default \code{covariates="population"}, expected #' prevalences are produced by summing model predictions over the covariates #' observed in the original data, for a fair comparison with the observed #' prevalences. This may be slow, particularly with continuous covariates. #' #' Predictions for fixed covariates can be obtained by supplying covariate #' values in the standard way, as in \code{\link{qmatrix.msm}}. Therefore if #' \code{covariates="population"} is too slow, using the mean observed values #' through \code{covariates="mean"} may give a reasonable approximation. #' #' This argument is ignored if \code{piecewise.times} is specified. If there #' are a mixture of time-constant and time-dependent covariates, then the #' values for all covariates should be supplied in \code{piecewise.covariates}. #' @param misccovariates (Misclassification models only) Values of covariates #' on the misclassification probability matrix for converting expected true to #' expected misclassified states. Ignored if \code{covariates="population"}, #' otherwise defaults to the mean values of the covariates in the data set. #' @param piecewise.times Times at which piecewise-constant intensities change. #' See \code{\link{pmatrix.piecewise.msm}} for how to specify this. Ignored if #' \code{covariates="population"}. This is only required for #' time-inhomogeneous models specified using explicit time-dependent #' covariates, and should not be used for models specified using "pci". #' @param piecewise.covariates Covariates on which the piecewise-constant #' intensities depend. See \code{\link{pmatrix.piecewise.msm}} for how to #' specify this. Ignored if \code{covariates="population"}. #' @param ci If \code{"normal"}, then calculate a confidence interval for the #' expected prevalences by simulating \code{B} random vectors from the #' asymptotic multivariate normal distribution implied by the maximum #' likelihood estimates (and covariance matrix) of the log transition #' intensities and covariate effects, then calculating the expected prevalences #' for each replicate. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' #' If \code{"none"} (the default) then no confidence interval is calculated. #' @param cl Width of the symmetric confidence interval, relative to 1 #' @param B Number of bootstrap replicates #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' @param interp Suppose an individual was observed in states \eqn{S_{r-1}} and #' \eqn{S_r} at two consecutive times \eqn{t_{r-1}} and \eqn{t_r}, and we want #' to estimate 'observed' prevalences at a time \eqn{t} between \eqn{t_{r-1}} #' and \eqn{t_r}. #' #' If \code{interp="start"}, then individuals are assumed to be in state #' \eqn{S_{r-1}} at time \eqn{t}, the same state as they were at \eqn{t_{r-1}}. #' #' If \code{interp="midpoint"} then if \eqn{t <= (t_{r-1} + t_r) / 2}, the #' midpoint of \eqn{t_{r-1}} and \eqn{t_r}, the state at \eqn{t} is assumed to #' be \eqn{S_{r-1}}, otherwise \eqn{S_{r}}. This is generally more reasonable #' for "progressive" models. #' @param censtime Adjustment to the observed prevalences to account for #' limited follow-up in the data. #' #' If the time is greater than \code{censtime} and the patient has reached an #' absorbing state, then that subject will be removed from the risk set. For #' example, if patients have died but would only have been observed up to this #' time, then this avoids overestimating the proportion of people who are dead #' at later times. #' #' This can be supplied as a single value, or as a vector with one element per #' subject (after any \code{subset} has been taken), in the same order as the #' original data. This vector also only includes subjects with complete data, #' thus it excludes for example subjects with only one observation (thus no #' observed transitions), and subjects for whom every observation has missing #' values. (Note, to help construct this, the complete data used for the model #' fit can be accessed with \code{model.frame(x)}, where \code{x} is the fitted #' model object) #' #' This is ignored if it is less than the subject's maximum observation time. #' @param subset Subset of subjects to calculate observed prevalences for. #' @param plot Generate a plot of observed against expected prevalences. See #' \code{\link{plot.prevalence.msm}} #' @param ... Further arguments to pass to \code{\link{plot.prevalence.msm}}. #' @return A list of matrices, with components: #' #' \item{Observed}{Table of observed numbers of individuals in each state at #' each time} #' #' \item{Observed percentages}{Corresponding percentage of the individuals at #' risk at each time.} #' #' \item{Expected}{Table of corresponding expected numbers.} #' #' \item{Expected percentages}{Corresponding percentage of the individuals at #' risk at each time.} #' #' Or if \code{ci.boot = TRUE}, the component \code{Expected} is a list with #' components \code{estimates} and \code{ci}.\cr \code{estimates} is a matrix #' of the expected prevalences, and \code{ci} is a list of two matrices, #' containing the confidence limits. The component \code{Expected percentages} #' has a similar format. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}}, \code{\link{summary.msm}} #' @references Gentleman, R.C., Lawless, J.F., Lindsey, J.C. and Yan, P. #' Multi-state Markov models for analysing incomplete disease history data with #' illustrations for HIV disease. \emph{Statistics in Medicine} (1994) 13(3): #' 805--821. #' #' Titman, A.C., Sharples, L. D. Model diagnostics for multi-state models. #' \emph{Statistical Methods in Medical Research} (2010) 19(6):621-651. #' @keywords models #' @export prevalence.msm prevalence.msm <- function(x, times=NULL, timezero=NULL, initstates=NULL, covariates="population", misccovariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, ci=c("none","normal","bootstrap"), cl = 0.95, B = 1000, cores = NULL, interp=c("start","midpoint"), censtime=Inf, subset=NULL, plot = FALSE, ... ) { if (!inherits(x, "msm")) stop("expected x to be a msm model") ## Estimate observed state occupancies in the data at a series of times time <- model.extract(x$data$mf, "time") if (is.null(times)) times <- seq(min(time), max(time), (max(time) - min(time))/10) obs <- observed.msm(x, times, interp, censtime, subset) ## Work out expected state occupancies by forecasting from transition probabilities expec <- expected.msm(x, times, timezero, initstates, covariates, misccovariates, piecewise.times, piecewise.covariates, obs$risk, subset, ci, cl, B, cores) res <- list(observed=obs$obstab, expected=expec[[1]], obsperc=obs$obsperc, expperc=expec[[2]]) names(res) <- c("Observed", "Expected", "Observed percentages", "Expected percentages") class(res) <- c("msm.prevalence", class(res)) if (plot) plot.prevalence.msm(x, mintime=min(times), maxtime=max(times), timezero=timezero, initstates=initstates, interp=interp, censtime=censtime, covariates=covariates, misccovariates=misccovariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, ...) res } #' @export print.msm.prevalence <- function(x,...){ print(unclass(x)) } #' Plot of observed and expected prevalences #' #' Provides a rough indication of goodness of fit of a multi-state model, by #' estimating the observed numbers of individuals occupying a state at a series #' of times, and plotting these against forecasts from the fitted model, for #' each state. Observed prevalences are indicated as solid lines, expected #' prevalences as dashed lines. #' #' See \code{\link{prevalence.msm}} for details of the assumptions underlying #' this method. #' #' Observed prevalences are plotted with a solid line, and expected prevalences #' with a dotted line. #' #' @param x A fitted multi-state model produced by \code{\link{msm}}. #' @param mintime Minimum time at which to compute the observed and expected #' prevalences of states. #' @param maxtime Maximum time at which to compute the observed and expected #' prevalences of states. #' @param timezero Initial time of the Markov process. Expected values are #' forecasted from here. Defaults to the minimum of the observation times given #' in the data. #' @param initstates Optional vector of the same length as the number of #' states. Gives the numbers of individuals occupying each state at the initial #' time, to be used for forecasting expected prevalences. The default is those #' observed in the data. These should add up to the actual number of people in #' the study at the start. #' @param interp Interpolation method for observed states, see #' \code{\link{prevalence.msm}}. #' @param censtime Subject-specific maximum follow-up times, see #' \code{\link{prevalence.msm}}. #' @param subset Vector of the subject identifiers to calculated observed #' prevalences for. #' @param covariates Covariate values for which to forecast expected state #' occupancy. See \code{\link{prevalence.msm}} --- if this function runs too #' slowly, as it may if there are continuous covariates, replace #' \code{covariates="population"} with \code{covariates="mean"}. #' @param misccovariates (Misclassification models only) Values of covariates #' on the misclassification probability matrix. See #' \code{\link{prevalence.msm}}. #' @param piecewise.times Times at which piecewise-constant intensities change. #' See \code{\link{prevalence.msm}}. #' @param piecewise.covariates Covariates on which the piecewise-constant #' intensities depend. See \code{\link{prevalence.msm}}. #' @param xlab x axis label. #' @param ylab y axis label. #' @param lwd.obs Line width for observed prevalences. See \code{\link{par}}. #' @param lwd.exp Line width for expected prevalences. See \code{\link{par}}. #' @param lty.obs Line type for observed prevalences. See \code{\link{par}}. #' @param lty.exp Line type for expected prevalences. See \code{\link{par}}. #' @param col.obs Line colour for observed prevalences. See \code{\link{par}}. #' @param col.exp Line colour for expected prevalences. See \code{\link{par}}. #' @param legend.pos Vector of the \eqn{x} and \eqn{y} position, respectively, #' of the legend. #' @param ... Further arguments to be passed to the generic \code{\link{plot}} #' function. #' @seealso \code{\link{prevalence.msm}} #' @references Gentleman, R.C., Lawless, J.F., Lindsey, J.C. and Yan, P. #' Multi-state Markov models for analysing incomplete disease history data with #' illustrations for HIV disease. \emph{Statistics in Medicine} (1994) 13(3): #' 805--821. #' @keywords models #' @export plot.prevalence.msm #' @export plot.prevalence.msm <- function(x, mintime=NULL, maxtime=NULL, timezero=NULL, initstates=NULL, interp=c("start","midpoint"), censtime=Inf, subset=NULL, covariates="population", misccovariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, xlab="Times",ylab="Prevalence (%)", lwd.obs=1, lwd.exp=1, lty.obs=1, lty.exp=2, col.obs="blue", col.exp="red", legend.pos=NULL,...){ if (!inherits(x, "msm")) stop("expected x to be a msm model") time <- model.extract(x$data$mf, "time") if (is.null(mintime)) mintime <- min(time) if (is.null(maxtime)) maxtime <- max(time) t <- seq(mintime, maxtime, length.out=100) obs <- observed.msm(x, t, interp, censtime, subset) expec <- expected.msm(x, t, timezero=timezero, initstates=initstates, covariates=covariates, misccovariates=misccovariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, risk=obs$risk, subset=subset, ci="none")[[2]] states <- seq(length.out=x$qmodel$nstates) S <- length(states) ncols <- ceiling(sqrt(S)) nrows <- if (floor(sqrt(S))^2 < S && S <= floor(sqrt(S))*ceiling(sqrt(S))) floor(sqrt(S)) else ceiling(sqrt(S)) par(mfrow=c(nrows, ncols)) for (i in states) { plot(t, obs$obsperc[,i], type="l", ylim=c(0, 100), xlab=xlab, ylab=ylab, lwd=lwd.obs, lty=lty.obs, col=col.obs, main=rownames(x$qmodel$qmatrix)[i],...) lines(t, expec[,i], lwd=lwd.exp, lty=lty.exp, col=col.exp) } if (!is.numeric(legend.pos) || length(legend.pos) != 2) legend.pos <- c(0.4*maxtime, 40) legend(x=legend.pos[1], y=legend.pos[2], legend=c("Observed","Expected"), lty=c(lty.obs,lty.exp), lwd=c(lwd.obs,lwd.exp), col=c(col.obs,col.exp)) invisible() } msm/R/pexp.R0000644000176200001440000001373114527611762012366 0ustar liggesusers #' Exponential distribution with piecewise-constant rate #' #' Density, distribution function, quantile function and random generation for #' a generalisation of the exponential distribution, in which the rate changes #' at a series of times. #' #' Consider the exponential distribution with rates \eqn{r_1, \ldots, #' }{r1,\dots, rn}\eqn{ r_n}{r1,\dots, rn} changing at times \eqn{t_1, \ldots, #' t_n}{t1, \dots, tn}, with \eqn{t_1 = 0}{t1 = 0}. Suppose \eqn{t_k}{tk} is #' the maximum \eqn{t_i}{ti} such that \eqn{t_i < x}{ti < x}. The density of #' this distribution at \eqn{x > 0} is \eqn{f(x)} for \eqn{k = 1}, and #' \deqn{\prod_{i=1}^k (1 - F(t_{i} - t_{i-1}, r_i)) f(x - t_{k}, #' r_{k})}{\prod{i=1 \dots k} (1 - F(ti - t{i-1}, r{i-1})) f(x - tk, rk)} for k #' > 1. #' #' where \eqn{F()} and \eqn{f()} are the distribution and density functions of #' the standard exponential distribution. #' #' If \code{rate} is of length 1, this is just the standard exponential #' distribution. Therefore, for example, \code{dpexp(x)}, with no other #' arguments, is simply equivalent to \code{dexp(x)}. #' #' Only \code{rpexp} is used in the \code{msm} package, to simulate from Markov #' processes with piecewise-constant intensities depending on time-dependent #' covariates. These functions are merely provided for completion, and are not #' optimized for numerical stability or speed. #' #' @name pexp #' @aliases pexp dpexp ppexp qpexp rpexp #' @param x,q vector of quantiles. #' @param p vector of probabilities. #' @param n number of observations. If \code{length(n) > 1}, the length is #' taken to be the number required. #' @param rate vector of rates. #' @param t vector of the same length as \code{rate}, giving the times at which #' the rate changes. The values of \code{t} should be in increasing order. #' @param log,log.p logical; if TRUE, probabilities p are given as log(p), or #' log density is returned. #' @param lower.tail logical; if TRUE (default), probabilities are P[X <= x], #' otherwise, P[X > x]. #' @param start numeric scalar; delayed entry time. The random deviates will be #' left truncated from this start time. #' @return \code{dpexp} gives the density, \code{ppexp} gives the distribution #' function, \code{qpexp} gives the quantile function, and \code{rpexp} #' generates random deviates. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{dexp}}, \code{\link{sim.msm}}. #' @keywords distribution #' @examples #' #' x <- seq(0.1, 50, by=0.1) #' rate <- c(0.1, 0.2, 0.05, 0.3) #' t <- c(0, 10, 20, 30) #' ## standard exponential distribution #' plot(x, dexp(x, 0.1), type="l") #' ## distribution with piecewise constant rate #' lines(x, dpexp(x, rate, t), type="l", lty=2) #' ## standard exponential distribution #' plot(x, pexp(x, 0.1), type="l") #' ## distribution with piecewise constant rate #' lines(x, ppexp(x, rate, t), type="l", lty=2) #' NULL ## The exponential distribution with piecewise-constant rate. Vector ## of parameters given by rate, change times given by t (first should ## be 0) #' @rdname pexp #' @export dpexp <- function (x, rate = 1, t = 0, log = FALSE) { if (length(t) != length(rate)) stop("length of t must be equal to length of rate") if (!isTRUE(all.equal(0, t[1]))) stop("first element of t should be 0") if (is.unsorted(t)) stop("t should be in increasing order") ind <- rowSums(outer(x, t, ">=")) ret <- dexp(x - t[ind], rate[ind], log) if (length(t) > 1) { dt <- t[-1] - t[-length(t)] if (log) { cs <- c(0, cumsum(pexp(dt, rate[-length(rate)], log.p=TRUE, lower.tail=FALSE))) ret <- cs[ind] + ret } else { cp <- c(1, cumprod(pexp(dt, rate[-length(rate)], lower.tail=FALSE))) ret <- cp[ind] * ret } } ret } #' @rdname pexp #' @export ppexp <- function(q, rate = 1, t = 0, lower.tail = TRUE, log.p = FALSE) { if (length(t) != length(rate)) stop("length of t must be equal to length of rate") if (!isTRUE(all.equal(0, t[1]))) stop("first element of t should be 0") if (is.unsorted(t)) stop("t should be in increasing order") q[q<0] <- 0 ind <- rowSums(outer(q, t, ">=")) ret <- pexp(q - t[ind], rate[ind]) mi <- min(length(t), max(ind)) if (length(t) > 1) { dt <- t[-1] - t[-mi] pe <- pexp(dt, rate[-mi]) cp <- c(1, cumprod(1 - pe)) ret <- c(0, cumsum(cp[-length(cp)]*pe))[ind] + ret*cp[ind] } if (!lower.tail) ret <- 1 - ret if (log.p) ret <- log(ret) ret } #' @rdname pexp #' @export qpexp <- function (p, rate = 1, t = 0, lower.tail = TRUE, log.p = FALSE) { qgeneric(ppexp, p=p, rate=rate, t=t, special=c("rate", "t"), lower.tail=lower.tail, log.p=log.p) } ## Simulate n values from exponential distribution with parameters ## rate changing at t. Simulate from exponentials in turn, simulated ## value is retained if it is less than the next change time. #' @rdname pexp #' @export rpexp <- function(n=1, rate=1, t=0, start=min(t)) { if (length(t) != length(rate)) stop("length of t must be equal to length of rate") if (length(start) > 1) stop("current implementation does not allow for length(start) > 1") if (start < min(t)) stop("start is less then min(t)") if (is.unsorted(t)) stop("t should be in increasing order") if (n == 0) return(numeric(0)) if (length(n) > 1) n <- length(n) if (length(rate) == 1 || start > max(t)) return(start + rexp(n, tail(rate,1))) if (length(start)==1 && start > min(t)) { index <- which(t > start) t <- c(start,t[index]) rate <- rate[c(index[1]-1,index)] } H <- c(0,cumsum(head(rate,-1)*diff(t))) e <- stats::rexp(n) i <- findInterval(e,H) return(t[i]+(e-H[i])/rate[i]) } msm/R/msm.R0000644000176200001440000046711714702712126012210 0ustar liggesusers#' Multi-state Markov and hidden Markov models in continuous time #' #' Fit a continuous-time Markov or hidden Markov multi-state model by maximum #' likelihood. Observations of the process can be made at arbitrary times, or #' the exact times of transition between states can be known. Covariates can #' be fitted to the Markov chain transition intensities or to the hidden Markov #' observation process. #' #' For full details about the methodology behind the \pkg{msm} package, refer #' to the PDF manual \file{msm-manual.pdf} in the \file{doc} subdirectory of #' the package. This includes a tutorial in the typical use of \pkg{msm}. The #' paper by Jackson (2011) in Journal of Statistical Software presents the #' material in this manual in a more concise form. #' #' \pkg{msm} was designed for fitting \emph{continuous-time} Markov models, #' processes where transitions can occur at any time. These models are defined #' by \emph{intensities}, which govern both the time spent in the current state #' and the probabilities of the next state. In \emph{discrete-time models}, #' transitions are known in advance to only occur at multiples of some time #' unit, and the model is purely governed by the probability distributions of #' the state at the next time point, conditionally on the state at the current #' time. These can also be fitted in \pkg{msm}, assuming that there is a #' continuous-time process underlying the data. Then the fitted transition #' probability matrix over one time period, as returned by #' \code{pmatrix.msm(...,t=1)} is equivalent to the matrix that governs the #' discrete-time model. However, these can be fitted more efficiently using #' multinomial logistic regression, for example, using \code{multinom} from the #' R package \pkg{nnet} (Venables and Ripley, 2002). #' #' For simple continuous-time multi-state Markov models, the likelihood is #' calculated in terms of the transition intensity matrix \eqn{Q}. When the #' data consist of observations of the Markov process at arbitrary times, the #' exact transition times are not known. Then the likelihood is calculated #' using the transition probability matrix \eqn{P(t) = \exp(tQ)}{P(t) = #' exp(tQ)}, where \eqn{\exp}{exp} is the matrix exponential. If state \eqn{i} #' is observed at time \eqn{t} and state \eqn{j} is observed at time \eqn{u}, #' then the contribution to the likelihood from this pair of observations is #' the \eqn{i,j} element of \eqn{P(u - t)}. See, for example, Kalbfleisch and #' Lawless (1985), Kay (1986), or Gentleman \emph{et al.} (1994). #' #' For hidden Markov models, the likelihood for an individual with \eqn{k} #' observations is calculated directly by summing over the unknown state at #' each time, producing a product of \eqn{k} matrices. The calculation is a #' generalisation of the method described by Satten and Longini (1996), and #' also by Jackson and Sharples (2002), and Jackson \emph{et al.} (2003). #' #' There must be enough information in the data on each state to estimate each #' transition rate, otherwise the likelihood will be flat and the maximum will #' not be found. It may be appropriate to reduce the number of states in the #' model, the number of allowed transitions, or the number of covariate #' effects, to ensure convergence. Hidden Markov models, and situations where #' the value of the process is only known at a series of snapshots, are #' particularly susceptible to non-identifiability, especially when combined #' with a complex transition matrix. Choosing an appropriate set of initial #' values for the optimisation can also be important. For flat likelihoods, #' 'informative' initial values will often be required. See the PDF manual for #' other tips. #' #' @param formula A formula giving the vectors containing the observed states #' and the corresponding observation times. For example, #' #' \code{state ~ time} #' #' Observed states should be numeric variables in the set \code{1, \dots{}, n}, #' where \code{n} is the number of states. Factors are allowed only if their #' levels are called \code{"1", \dots{}, "n"}. #' #' The times can indicate different types of observation scheme, so be careful #' to choose the correct \code{obstype}. #' #' For hidden Markov models, \code{state} refers to the outcome variable, which #' need not be a discrete state. It may also be a matrix, giving multiple #' observations at each time (see \code{\link{hmmMV}}). #' @param subject Vector of subject identification numbers for the data #' specified by \code{formula}. If missing, then all observations are assumed #' to be on the same subject. These must be sorted so that all observations on #' the same subject are adjacent. #' @param data Optional data frame in which to interpret the variables supplied #' in \code{formula}, \code{subject}, \code{covariates}, \code{misccovariates}, #' \code{hcovariates}, \code{obstype} and \code{obstrue}. #' @param qmatrix Matrix which indicates the allowed transitions in the #' continuous-time Markov chain, and optionally also the initial values of #' those transitions. If an instantaneous transition is not allowed from state #' \eqn{r} to state \eqn{s}, then \code{qmatrix} should have \eqn{(r,s)} entry #' 0, otherwise it should be non-zero. #' #' If supplying initial values yourself, then the non-zero entries should be #' those values. If using \code{gen.inits=TRUE} then the non-zero entries can #' be anything you like (conventionally 1). Any diagonal entry of #' \code{qmatrix} is ignored, as it is constrained to be equal to minus the sum #' of the rest of the row. #' #' For example,\cr #' #' \code{ rbind( c( 0, 0.1, 0.01 ), c( 0.1, 0, 0.2 ), c( 0, 0, 0 ) ) }\cr #' #' represents a 'health - disease - death' model, with initial transition #' intensities 0.1 from health to disease, 0.01 from health to death, 0.1 from #' disease to health, and 0.2 from disease to death. #' #' If the states represent ordered levels of severity of a disease, then this #' matrix should usually only allow transitions between adjacent states. For #' example, if someone was observed in state 1 ("mild") at their first #' observation, followed by state 3 ("severe") at their second observation, #' they are assumed to have passed through state 2 ("moderate") in between, and #' the 1,3 entry of \code{qmatrix} should be zero. #' #' The initial intensities given here are with any covariates set to their #' means in the data (or set to zero, if \code{center = FALSE}). If any #' intensities are constrained to be equal using \code{qconstraint}, then the #' initial value is taken from the first of these (reading across rows). #' @param gen.inits If \code{TRUE}, then initial values for the transition #' intensities are generated automatically using the method in #' \code{\link{crudeinits.msm}}. The non-zero entries of the supplied #' \code{qmatrix} are assumed to indicate the allowed transitions of the model. #' This is not available for hidden Markov models, including models with #' misclassified states. #' @param ematrix If misclassification between states is to be modelled, this #' should be a matrix of initial values for the misclassification #' probabilities. The rows represent underlying states, and the columns #' represent observed states. If an observation of state \eqn{s} is not #' possible when the subject occupies underlying state \eqn{r}, then #' \code{ematrix} should have \eqn{(r,s)} entry 0. Otherwise \code{ematrix} #' should have \eqn{(r,s)} entry corresponding to the probability of observing #' \eqn{s} conditionally on occupying true state \eqn{r}. The diagonal of #' \code{ematrix} is ignored, as rows are constrained to sum to 1. For #' example, \cr #' #' \code{ rbind( c( 0, 0.1, 0 ), c( 0.1, 0, 0.1 ), c( 0, 0.1, 0 ) ) }\cr #' #' represents a model in which misclassifications are only permitted between #' adjacent states. #' #' If any probabilities are constrained to be equal using \code{econstraint}, #' then the initial value is taken from the first of these (reading across #' rows). #' #' For an alternative way of specifying misclassification models, see #' \code{hmodel}. #' @param hmodel Specification of the hidden Markov model (HMM). This should #' be a list of return values from HMM constructor functions. Each element of #' the list corresponds to the outcome model conditionally on the corresponding #' underlying state. Univariate constructors are described in #' the\code{\link{hmm-dists}} help page. These may also be grouped together to #' specify a multivariate HMM with a set of conditionally independent #' univariate outcomes at each time, as described in \code{\link{hmmMV}}. #' #' For example, consider a three-state hidden Markov model. Suppose the #' observations in underlying state 1 are generated from a Normal distribution #' with mean 100 and standard deviation 16, while observations in underlying #' state 2 are Normal with mean 54 and standard deviation 18. Observations in #' state 3, representing death, are exactly observed, and coded as 999 in the #' data. This model is specified as #' #' \code{hmodel = list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), #' hmmIdent(999))} #' #' The mean and standard deviation parameters are estimated starting from these #' initial values. If multiple parameters are constrained to be equal using #' \code{hconstraint}, then the initial value is taken from the value given on #' the first occasion that parameter appears in \code{hmodel}. #' #' See the \code{\link{hmm-dists}} help page for details of the constructor #' functions for each univariate distribution. #' #' A misclassification model, that is, a hidden Markov model where the outcomes #' are misclassified observations of the underlying states, can either be #' specified using a list of \code{\link{hmmCat}} or \code{\link{hmmIdent}} #' objects, or by using an \code{ematrix}. #' #' For example, \cr #' #' \code{ ematrix = rbind( c( 0, 0.1, 0, 0 ), c( 0.1, 0, 0.1, 0 ), c( 0, 0.1, #' 0, 0), c( 0, 0, 0, 0) ) }\cr #' #' is equivalent to \cr #' #' \code{hmodel = list( hmmCat(prob=c(0.9, 0.1, 0, 0)), hmmCat(prob=c(0.1, 0.8, #' 0.1, 0)), hmmCat(prob=c(0, 0.1, 0.9, 0)), hmmIdent()) }\cr #' #' @param obstype A vector specifying the observation scheme for each row of #' the data. This can be included in the data frame \code{data} along with the #' state, time, subject IDs and covariates. Its elements should be either 1, 2 #' or 3, meaning as follows: #' #' \describe{ \item{1}{An observation of the process at an arbitrary time (a #' "snapshot" of the process, or "panel-observed" data). The states are unknown #' between observation times.} \item{2}{An exact transition time, with the #' state at the previous observation retained until the current observation. #' An observation may represent a transition to a different state or a repeated #' observation of the same state (e.g. at the end of follow-up). Note that if #' all transition times are known, more flexible models could be fitted with #' packages other than \pkg{msm} - see the note under \code{exacttimes}. #' #' Note also that if the previous state was censored using \code{censor}, for #' example known only to be state 1 or state 2, then \code{obstype} 2 means #' that either state 1 is retained or state 2 is retained until the current #' observation - this does not allow for a change of state in the middle of the #' observation interval. } \item{3}{An exact transition time, but the state at #' the instant before entering this state is unknown. A common example is death #' times in studies of chronic diseases.} } If \code{obstype} is not specified, #' this defaults to all 1. If \code{obstype} is a single number, all #' observations are assumed to be of this type. The obstype value for the #' first observation from each subject is not used. #' #' This is a generalisation of the \code{deathexact} and \code{exacttimes} #' arguments to allow different schemes per observation. \code{obstype} #' overrides both \code{deathexact} and \code{exacttimes}. #' #' \code{exacttimes=TRUE} specifies that all observations are of obstype 2. #' #' \code{deathexact = death.states} specifies that all observations of #' \code{death.states} are of type 3. \code{deathexact = TRUE} specifies that #' all observations in the final absorbing state are of type 3. #' #' @param obstrue In misclassification models specified with \code{ematrix}, #' \code{obstrue} is a vector of logicals (\code{TRUE} or \code{FALSE}) or #' numerics (1 or 0) specifying which observations (\code{TRUE}, 1) are #' observations of the underlying state without error, and which (\code{FALSE}, #' 0) are realisations of a hidden Markov model. #' #' In HMMs specified with \code{hmodel}, where the hidden state is known at #' some times, if \code{obstrue} is supplied it is assumed to contain the #' actual true state data. Elements of \code{obstrue} at times when the hidden #' state is unknown are set to \code{NA}. This allows the information from HMM #' outcomes generated conditionally on the known state to be included in the #' model, thus improving the estimation of the HMM outcome distributions. #' #' HMMs where the true state is known to be within a specific set at specific #' times can be defined with a combination of \code{censor} and \code{obstrue}. #' In these models, a code is defined for the \code{state} outcome (see #' \code{censor}), and \code{obstrue} is set to 1 for observations where the #' true state is known to be one of the elements of \code{censor.states} at the #' corresponding time. #' #' @param covariates A formula or a list of formulae representing the #' covariates on the transition intensities via a log-linear model. If a single #' formula is supplied, like #' #' \code{covariates = ~ age + sex + treatment} #' #' then these covariates are assumed to apply to all intensities. If a named #' list is supplied, then this defines a potentially different model for each #' named intensity. For example, #' #' \code{covariates = list("1-2" = ~ age, "2-3" = ~ age + treatment)} #' #' specifies an age effect on the state 1 - state 2 transition, additive age #' and treatment effects on the state 2 - state 3 transition, but no covariates #' on any other transitions that are allowed by the \code{qmatrix}. #' #' If covariates are time dependent, they are assumed to be constant in between #' the times they are observed, and the transition probability between a pair #' of times \eqn{(t1, t2)} is assumed to depend on the covariate value at #' \eqn{t1}. #' #' @param covinits Initial values for log-linear effects of covariates on the #' transition intensities. This should be a named list with each element #' corresponding to a covariate. A single element contains the initial values #' for that covariate on each transition intensity, reading across the rows in #' order. For a pair of effects constrained to be equal, the initial value for #' the first of the two effects is used. #' #' For example, for a model with the above \code{qmatrix} and age and sex #' covariates, the following initialises all covariate effects to zero apart #' from the age effect on the 2-1 transition, and the sex effect on the 1-3 #' transition. \code{ covinits = list(sex=c(0, 0, 0.1, 0), age=c(0, 0.1, 0, #' 0))} #' #' For factor covariates, name each level by concatenating the name of the #' covariate with the level name, quoting if necessary. For example, for a #' covariate \code{agegroup} with three levels \code{0-15, 15-60, 60-}, use #' something like #' #' \code{ covinits = list("agegroup15-60"=c(0, 0.1, 0, 0), "agegroup60-"=c(0.1, #' 0.1, 0, 0))} #' #' If not specified or wrongly specified, initial values are assumed to be #' zero. #' #' @param constraint A list of one numeric vector for each named covariate. The #' vector indicates which covariate effects on intensities are constrained to #' be equal. Take, for example, a model with five transition intensities and #' two covariates. Specifying\cr #' #' \code{constraint = list (age = c(1,1,1,2,2), treatment = c(1,2,3,4,5))}\cr #' #' constrains the effect of age to be equal for the first three intensities, #' and equal for the fourth and fifth. The effect of treatment is assumed to be #' different for each intensity. Any vector of increasing numbers can be used #' as indicators. The intensity parameters are assumed to be ordered by reading #' across the rows of the transition matrix, starting at the first row, #' ignoring the diagonals. #' #' Negative elements of the vector can be used to indicate that particular #' covariate effects are constrained to be equal to minus some other effects. #' For example: #' #' \code{constraint = list (age = c(-1,1,1,2,-2), treatment = c(1,2,3,4,5)) #' }\cr #' #' constrains the second and third age effects to be equal, the first effect to #' be minus the second, and the fifth age effect to be minus the fourth. For #' example, it may be realisitic that the effect of a covariate on the #' "reverse" transition rate from state 2 to state 1 is minus the effect on the #' "forward" transition rate, state 1 to state 2. Note that it is not possible #' to specify exactly which of the covariate effects are constrained to be #' positive and which negative. The maximum likelihood estimation chooses the #' combination of signs which has the higher likelihood. #' #' For categorical covariates, defined as factors, specify constraints as #' follows:\cr #' #' \code{list(..., covnameVALUE1 = c(...), covnameVALUE2 = c(...), ...)}\cr #' #' where \code{covname} is the name of the factor, and \code{VALUE1}, #' \code{VALUE2}, ... are the labels of the factor levels (usually excluding #' the baseline, if using the default contrasts). #' #' Make sure the \code{contrasts} option is set appropriately, for example, the #' default #' #' \code{options(contrasts=c(contr.treatment, contr.poly))} #' #' sets the first (baseline) level of unordered factors to zero, then the #' baseline level is ignored in this specification. #' #' To assume no covariate effect on a certain transition, use the #' \code{fixedpars} argument to fix it at its initial value (which is zero by #' default) during the optimisation. #' #' @param misccovariates A formula representing the covariates on the #' misclassification probabilities, analogously to \code{covariates}, via #' multinomial logistic regression. Only used if the model is specified using #' \code{ematrix}, rather than \code{hmodel}. #' #' This must be a single formula - lists are not supported, unlike #' \code{covariates}. If a different model on each probability is required, #' include all covariates in this formula, and use \code{fixedpars} to fix some #' of their effects (for particular probabilities) at their default initial #' values of zero. #' #' @param misccovinits Initial values for the covariates on the #' misclassification probabilities, defined in the same way as \code{covinits}. #' Only used if the model is specified using \code{ematrix}. #' #' @param miscconstraint A list of one vector for each named covariate on #' misclassification probabilities. The vector indicates which covariate #' effects on misclassification probabilities are constrained to be equal, #' analogously to \code{constraint}. Only used if the model is specified using #' \code{ematrix}. #' #' @param hcovariates List of formulae the same length as \code{hmodel}, #' defining any covariates governing the hidden Markov outcome models. The #' covariates operate on a suitably link-transformed linear scale, for example, #' log scale for a Poisson outcome model. If there are no covariates for a #' certain hidden state, then insert a NULL in the corresponding place in the #' list. For example, \code{hcovariates = list(~acute + age, ~acute, NULL).} #' #' @param hcovinits Initial values for the hidden Markov model covariate #' effects. A list of the same length as \code{hcovariates}. Each element is a #' vector with initial values for the effect of each covariate on that state. #' For example, the above \code{hcovariates} can be initialised with #' \code{hcovariates = list(c(-8, 0), -8, NULL)}. Initial values must be given #' for all or no covariates, if none are given these are all set to zero. The #' initial value given in the \code{hmodel} constructor function for the #' corresponding baseline parameter is interpreted as the value of that #' parameter with any covariates fixed to their means in the data. If multiple #' effects are constrained to be equal using \code{hconstraint}, then the #' initial value is taken from the first of the multiple initial values #' supplied. #' #' @param hconstraint A named list. Each element is a vector of constraints on #' the named hidden Markov model parameter. The vector has length equal to the #' number of times that class of parameter appears in the whole model. #' #' For example consider the three-state hidden Markov model described above, #' with normally-distributed outcomes for states 1 and 2. To constrain the #' outcome variance to be equal for states 1 and 2, and to also constrain the #' effect of \code{acute} on the outcome mean to be equal for states 1 and 2, #' specify #' #' \code{hconstraint = list(sd = c(1,1), acute=c(1,1))} #' #' Note this excludes initial state occupancy probabilities and covariate #' effects on those probabilities, which cannot be constrained. #' #' @param hranges Range constraints for hidden Markov model parameters. #' Supplied as a named list, with each element corresponding to the named #' hidden Markov model parameter. This element is itself a list with two #' elements, vectors named "lower" and "upper". These vectors each have length #' equal to the number of times that class of parameter appears in the whole #' model, and give the corresponding mininum amd maximum allowable values for #' that parameter. Maximum likelihood estimation is performed with these #' parameters constrained in these ranges (through a log or logit-type #' transformation). Lower bounds of \code{-Inf} and upper bounds of \code{Inf} #' can be given if the parameter is unbounded above or below. #' #' For example, in the three-state model above, to constrain the mean for state #' 1 to be between 0 and 6, and the mean of state 2 to be between 7 and 12, #' supply #' #' \code{hranges=list(mean=list(lower=c(0, 7), upper=c(6, 12)))} #' #' These default to the natural ranges, e.g. the positive real line for #' variance parameters, and [0,1] for probabilities. Therefore \code{hranges} #' need not be specified for such parameters unless an even stricter constraint #' is desired. If only one limit is supplied for a parameter, only the first #' occurrence of that parameter is constrained. #' #' Initial values should be strictly within any ranges, and not on the range #' boundary, otherwise optimisation will fail with a "non-finite value" error. #' @param qconstraint A vector of indicators specifying which baseline #' transition intensities are equal. For example, #' #' \code{qconstraint = c(1,2,3,3)} #' #' constrains the third and fourth intensities to be equal, in a model with #' four allowed instantaneous transitions. When there are covariates on the #' intensities and \code{center=TRUE} (the default), \code{qconstraint} is #' applied to the intensities with covariates taking the values of the means in #' the data. When \code{center=FALSE}, \code{qconstraint} is applied to the #' intensities with covariates set to zero. #' @param econstraint A similar vector of indicators specifying which baseline #' misclassification probabilities are constrained to be equal. Only used if #' the model is specified using \code{ematrix}, rather than \code{hmodel}. #' @param initprobs Only used in hidden Markov models. Underlying state #' occupancy probabilities at each subject's first observation. Can either be #' a vector of \eqn{nstates} elements with common probabilities to all #' subjects, or a \eqn{nsubjects} by \eqn{nstates} matrix of subject-specific #' probabilities. This refers to observations after missing data and subjects #' with only one observation have been excluded. #' #' If these are estimated (see \code{est.initprobs}), then this represents an #' initial value, and defaults to equal probability for each state. Otherwise #' this defaults to \code{c(1, rep(0, nstates-1))}, that is, in state 1 with a #' probability of 1. Scaled to sum to 1 if necessary. The state 1 occupancy #' probability should be non-zero. #' @param est.initprobs Only used in hidden Markov models. If \code{TRUE}, #' then the underlying state occupancy probabilities at the first observation #' will be estimated, starting from a vector of initial values supplied in the #' \code{initprobs} argument. Structural zeroes are allowed: if any of these #' initial values are zero they will be fixed at zero during optimisation, even #' if \code{est.initprobs=TRUE}, and no covariate effects on them are #' estimated. The exception is state 1, which should have non-zero occupancy #' probability. #' #' Note that the free parameters during this estimation exclude the state 1 #' occupancy probability, which is fixed at one minus the sum of the other #' probabilities. #' @param initcovariates Formula representing covariates on the initial state #' occupancy probabilities, via multinomial logistic regression. The linear #' effects of these covariates, observed at the individual's first observation #' time, operate on the log ratio of the state \eqn{r} occupancy probability to #' the state 1 occupancy probability, for each \eqn{r = 2} to the number of #' states. Thus the state 1 occupancy probability should be non-zero. If #' \code{est.initprobs} is \code{TRUE}, these effects are estimated starting #' from their initial values. If \code{est.initprobs} is \code{FALSE}, these #' effects are fixed at theit initial values. #' @param initcovinits Initial values for the covariate effects #' \code{initcovariates}. A named list with each element corresponding to a #' covariate, as in \code{covinits}. Each element is a vector with (1 - number #' of states) elements, containing the initial values for the linear effect of #' that covariate on the log odds of that state relative to state 1, from state #' 2 to the final state. If \code{initcovinits} is not specified, all #' covariate effects are initialised to zero. #' @param deathexact Vector of indices of absorbing states whose time of entry #' is known exactly, but the individual is assumed to be in an unknown #' transient state ("alive") at the previous instant. This is the usual #' situation for times of death in chronic disease monitoring data. For #' example, if you specify \code{deathexact = c(4, 5)} then states 4 and 5 are #' assumed to be exactly-observed death states. #' #' See the \code{obstype} argument. States of this kind correspond to #' \code{obstype=3}. \code{deathexact = TRUE} indicates that the final #' absorbing state is of this kind, and \code{deathexact = FALSE} or #' \code{deathexact = NULL} (the default) indicates that there is no state of #' this kind. #' #' The \code{deathexact} argument is overridden by \code{obstype} or #' \code{exacttimes}. #' #' Note that you do not always supply a \code{deathexact} argument, even if #' there are states that correspond to deaths, because they do not necessarily #' have \code{obstype=3}. If the state is known between the time of death and #' the previous observation, then you should specify \code{obstype=2} for the #' death times, or \code{exacttimes=TRUE} if the state is known at all times, #' and the \code{deathexact} argument is ignored. #' #' @param death Old name for the \code{deathexact} argument. Overridden by #' \code{deathexact} if both are supplied. Deprecated. #' #' @param censor A state, or vector of states, which indicates censoring. #' Censoring means that the observed state is known only to be one of a #' particular set of states. For example, \code{censor=999} indicates that all #' observations of \code{999} in the vector of observed states are censored #' states. By default, this means that the true state could have been any of #' the transient (non-absorbing) states. To specify corresponding true states #' explicitly, use a \code{censor.states} argument. #' #' Note that in contrast to the usual terminology of survival analysis, here it #' is the \emph{state} which is considered to be censored, rather than the #' \emph{event time}. If at the end of a study, an individual has not died, #' but their true state is \emph{known}, then \code{censor} is unnecessary, #' since the standard multi-state model likelihood is applicable. Also a #' "censored" state here can be at any time, not just at the end. #' #' For hidden Markov models, censoring may indicate either a set of possible #' observed states, or a set of (hidden) true states. The later case is #' specified by setting the relevant elements of \code{obstrue} to 1 (and #' \code{NA} otherwise). #' #' Note in particular that general time-inhomogeneous Markov models with #' piecewise constant transition intensities can be constructed using the #' \code{censor} facility. If the true state is unknown on occasions when a #' piecewise constant covariate is known to change, then censored states can be #' inserted in the data on those occasions. The covariate may represent time #' itself, in which case the \code{pci} option to msm can be used to perform #' this trick automatically, or some other time-dependent variable. #' #' Not supported for multivariate hidden Markov models specified with #' \code{\link{hmmMV}}. #' #' @param censor.states Specifies the underlying states which censored #' observations can represent. If \code{censor} is a single number (the #' default) this can be a vector, or a list with one element. If \code{censor} #' is a vector with more than one element, this should be a list, with each #' element a vector corresponding to the equivalent element of \code{censor}. #' For example #' #' \code{censor = c(99, 999), censor.states = list(c(2,3), c(3,4))} #' #' means that observations coded 99 represent either state 2 or state 3, while #' observations coded 999 are really either state 3 or state 4. #' @param pci Model for piecewise-constant intensities. Vector of cut points #' defining the times, since the start of the process, at which intensities #' change for all subjects. For example #' #' \code{pci = c(5, 10)} #' #' specifies that the intensity changes at time points 5 and 10. This will #' automatically construct a model with a categorical (factor) covariate called #' \code{timeperiod}, with levels \code{"[-Inf,5)"}, \code{"[5,10)"} and #' \code{"[10,Inf)"}, where the first level is the baseline. This covariate #' defines the time period in which the observation was made. Initial values #' and constraints on covariate effects are specified the same way as for a #' model with a covariate of this name, for example, #' #' \code{covinits = list("timeperiod[5,10)"=c(0.1,0.1), #' "timeperiod[10,Inf)"=c(0.1,0.1))} #' #' Thus if \code{pci} is supplied, you cannot have a previously-existing #' variable called \code{timeperiod} as a covariate in any part of a \code{msm} #' model. #' #' To assume piecewise constant intensities for some transitions but not others #' with \code{pci}, use the \code{fixedpars} argument to fix the appropriate #' covariate effects at their default initial values of zero. #' #' Internally, this works by inserting censored observations in the data at #' times when the intensity changes but the state is not observed. #' #' If the supplied times are outside the range of the time variable in the #' data, \code{pci} is ignored and a time-homogeneous model is fitted. #' #' After fitting a time-inhomogeneous model, \code{\link{qmatrix.msm}} can be #' used to obtain the fitted intensity matrices for each time period, for #' example, #' #' \code{qmatrix.msm(example.msm, covariates=list(timeperiod="[5,Inf)"))} #' #' This facility does not support interactions between time and other #' covariates. Such models need to be specified "by hand", using a state #' variable with censored observations inserted. Note that the \code{data} #' component of the \code{msm} object returned from a call to \code{msm} with #' \code{pci} supplied contains the states with inserted censored observations #' and time period indicators. These can be used to construct such models. #' #' Note that you do not need to use \code{pci} in order to model the effect of #' a time-dependent covariate in the data. \code{msm} will automatically #' assume that covariates are piecewise-constant and change at the times when #' they are observed. \code{pci} is for when you want all intensities to #' change at the same pre-specified times for all subjects. #' #' \code{pci} is not supported for multivariate hidden Markov models specified with #' \code{\link{hmmMV}}. An approximate equivalent can be constructed by #' creating a variable in the data to represent the time period, and treating #' that as a covariate using the \code{covariates} argument to \code{msm}. #' This will assume that the value of this variable is constant between #' observations. #' #' @param phase.states Indices of states which have a two-phase sojourn #' distribution. This defines a semi-Markov model, in which the hazard of an #' onward transition depends on the time spent in the state. #' #' This uses the technique described by Titman and Sharples (2009). A hidden #' Markov model is automatically constructed on an expanded state space, where #' the phases correspond to the hidden states. The "tau" proportionality #' constraint described in this paper is currently not supported. #' #' Covariates, constraints, \code{deathexact} and \code{censor} are expressed #' with respect to the expanded state space. If not supplied by hand, #' \code{initprobs} is defined automatically so that subjects are assumed to #' begin in the first of the two phases. #' #' Hidden Markov models can additionally be given phased states. The user #' supplies an outcome distribution for each original state using #' \code{hmodel}, which is expanded internally so that it is assumed to be the #' same within each of the phased states. \code{initprobs} is interpreted on #' the expanded state space. Misclassification models defined using #' \code{ematrix} are not supported, and these must be defined using #' \code{hmmCat} or \code{hmmIdent} constructors, as described in the #' \code{hmodel} section of this help page. Or the HMM on the expanded state #' space can be defined by hand. #' #' Output functions are presented as it were a hidden Markov model on the #' expanded state space, for example, transition probabilities between states, #' covariate effects on transition rates, or prevalence counts, are not #' aggregated over the hidden phases. #' #' Numerical estimation will be unstable when there is weak evidence for a #' two-phase sojourn distribution, that is, if the model is close to Markov. #' #' See \code{\link{d2phase}} for the definition of the two-phase distribution #' and the interpretation of its parameters. #' #' This is an experimental feature, and some functions are not implemented. #' Please report any experiences of using this feature to the author! #' @param phase.inits Initial values for phase-type models. A list with one #' component for each "two-phased" state. Each component is itself a list of #' two elements. The first of these elements is a scalar defining the #' transition intensity from phase 1 to phase 2. The second element is a #' matrix, with one row for each potential destination state from the #' two-phased state, and two columns. The first column is the transition rate #' from phase 1 to the destination state, and the second column is the #' transition rate from phase 2 to the destination state. If there is only one #' destination state, then this may be supplied as a vector. #' #' In phase type models, the initial values for transition rates out of #' non-phased states are taken from the \code{qmatrix} supplied to msm, and #' entries of this matrix corresponding to transitions out of phased states are #' ignored. #' @param exacttimes By default, the transitions of the Markov process are #' assumed to take place at unknown occasions in between the observation times. #' If \code{exacttimes} is set to \code{TRUE}, then the observation times are #' assumed to represent the exact times of transition of the process. The #' subject is assumed to be in the same state between these times. An #' observation may represent a transition to a different state or a repeated #' observation of the same state (e.g. at the end of follow-up). This is #' equivalent to every row of the data having \code{obstype = 2}. See the #' \code{obstype} argument. If both \code{obstype} and \code{exacttimes} are #' specified then \code{exacttimes} is ignored. #' #' Note that the complete history of the multi-state process is known with this #' type of data. The models which \pkg{msm} fits have the strong assumption of #' constant (or piecewise-constant) transition rates. Knowing the exact #' transition times allows more realistic models to be fitted with other #' packages. For example parametric models with sojourn distributions more #' flexible than the exponential can be fitted with the \pkg{flexsurv} package, #' or semi-parametric models can be implemented with \pkg{survival} in #' conjunction with \pkg{mstate}. #' #' @param subject.weights Name of a variable in the data (unquoted) giving #' weights to apply to each subject in the data #' when calculating the log-likelihood as a weighted sum over #' subjects. These are taken from the first observation for each #' subject, and any weights supplied for subsequent observations are #' not used. #' #' Weights at the observation level are not supported. #' #' @param cl Width of symmetric confidence intervals for maximum likelihood #' estimates, by default 0.95. #' @param fixedpars Vector of indices of parameters whose values will be fixed #' at their initial values during the optimisation. These are given in the #' order: transition intensities (reading across rows of the transition #' matrix), covariates on intensities (ordered by intensities within #' covariates), hidden Markov model parameters, including misclassification #' probabilities or parameters of HMM outcome distributions (ordered by #' parameters within states), hidden Markov model covariate parameters (ordered #' by covariates within parameters within states), initial state occupancy #' probabilities (excluding the first probability, which is fixed at one minus #' the sum of the others). #' #' If there are equality constraints on certain parameters, then #' \code{fixedpars} indexes the set of unique parameters, excluding those which #' are constrained to be equal to previous parameters. #' #' To fix all parameters, specify \code{fixedpars = TRUE}. #' #' This can be useful for profiling likelihoods, and building complex models #' stage by stage. #' @param center If \code{TRUE} (the default, unless \code{fixedpars=TRUE}) #' then covariates are centered at their means during the maximum likelihood #' estimation. This usually improves stability of the numerical optimisation. #' @param opt.method If "optim", "nlm" or "bobyqa", then the corresponding R #' function will be used for maximum likelihood estimation. #' \code{\link{optim}} is the default. "bobyqa" requires the package #' \pkg{minqa} to be installed. See the help of these functions for further #' details. Advanced users can also add their own optimisation methods, see #' the source for \code{optim.R} in msm for some examples. #' #' If "fisher", then a specialised Fisher scoring method is used (Kalbfleisch #' and Lawless, 1985) which can be faster than the generic methods, though less #' robust. This is only available for Markov models with panel data #' (\code{obstype=1}), that is, not for models with censored states, hidden #' Markov models, exact observation or exact death times (\code{obstype=2,3}). #' @param hessian If \code{TRUE} then standard errors and confidence intervals #' are obtained from a numerical estimate of the Hessian (the observed #' information matrix). This is the default when maximum likelihood estimation #' is performed. If all parameters are fixed at their initial values and no #' optimisation is performed, then this defaults to \code{FALSE}. If #' requested, the actual Hessian is returned in \code{x$paramdata$opt$hessian}, #' where \code{x} is the fitted model object. #' #' If \code{hessian} is set to \code{FALSE}, then standard errors and #' confidence intervals are obtained from the Fisher (expected) information #' matrix, if this is available. This may be preferable if the numerical #' estimation of the Hessian is computationally intensive, or if the resulting #' estimate is non-invertible or not positive definite. #' @param use.deriv If \code{TRUE} then analytic first derivatives are used in #' the optimisation of the likelihood, where available and an appropriate #' quasi-Newton optimisation method, such as BFGS, is being used. Analytic #' derivatives are not available for all models. #' @param use.expm If \code{TRUE} then any matrix exponentiation needed to #' calculate the likelihood is done using the \pkg{expm} package. Otherwise #' the original routines used in \pkg{msm} 1.2.4 and earlier are used. Set to #' \code{FALSE} for backward compatibility, and let the package maintainer know #' if this gives any substantive differences. #' @param analyticp By default, the likelihood for certain simpler 3, 4 and 5 #' state models is calculated using an analytic expression for the transition #' probability (P) matrix. For all other models, matrix exponentiation is used #' to obtain P. To revert to the original method of using the matrix #' exponential for all models, specify \code{analyticp=FALSE}. See the PDF #' manual for a list of the models for which analytic P matrices are #' implemented. #' @param na.action What to do with missing data: either \code{na.omit} to drop #' it and carry on, or \code{na.fail} to stop with an error. Missing data #' includes all NAs in the states, times, \code{subject} or \code{obstrue}, all #' NAs at the first observation for a subject for covariates in #' \code{initcovariates}, all NAs in other covariates (excluding the last #' observation for a subject), all NAs in \code{obstype} (excluding the first #' observation for a subject), and any subjects with only one observation (thus #' no observed transitions). #' @param ... Optional arguments to the general-purpose optimisation routine, #' \code{\link{optim}} by default. For example \code{method="Nelder-Mead"} to #' change the optimisation algorithm from the \code{"BFGS"} method that msm #' calls by default. #' #' It is often worthwhile to normalize the optimisation using #' \code{control=list(fnscale = a)}, where \code{a} is the a number of the #' order of magnitude of the -2 log likelihood. #' #' If 'false' convergence is reported and the standard errors cannot be #' calculated due to a non-positive-definite Hessian, then consider tightening #' the tolerance criteria for convergence. If the optimisation takes a long #' time, intermediate steps can be printed using the \code{trace} argument of #' the control list. See \code{\link{optim}} for details. #' #' For the Fisher scoring method, a \code{control} list can be supplied in the #' same way, but the only supported options are \code{reltol}, \code{trace} and #' \code{damp}. The first two are used in the same way as for #' \code{\link{optim}}. If the algorithm fails with a singular information #' matrix, adjust \code{damp} from the default of zero (to, e.g. 1). This adds #' a constant identity matrix multiplied by \code{damp} to the information #' matrix during optimisation. #' @return To obtain summary information from models fitted by the #' \code{\link{msm}} function, it is recommended to use extractor functions #' such as \code{\link{qmatrix.msm}}, \code{\link{pmatrix.msm}}, #' \code{\link{sojourn.msm}}, \code{\link{msm.form.qoutput}}. These provide #' estimates and confidence intervals for quantities such as transition #' probabilities for given covariate values. #' #' For advanced use, it may be necessary to directly use information stored in #' the object returned by \code{\link{msm}}. This is documented in the help #' page \code{\link{msm.object}}. #' #' Printing a \code{msm} object by typing the object's name at the command line #' implicitly invokes \code{\link{print.msm}}. This formats and prints the #' important information in the model fit, and also returns that information in #' an R object. This includes estimates and confidence intervals for the #' transition intensities and (log) hazard ratios for the corresponding #' covariates. When there is a hidden Markov model, the chief information in #' the \code{hmodel} component is also formatted and printed. This includes #' estimates and confidence intervals for each parameter. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{simmulti.msm}}, \code{\link{plot.msm}}, #' \code{\link{summary.msm}}, \code{\link{qmatrix.msm}}, #' \code{\link{pmatrix.msm}}, \code{\link{sojourn.msm}}. #' @references Jackson, C.H. (2011). Multi-State Models for Panel Data: The msm #' Package for R., Journal of Statistical Software, 38(8), 1-29. URL #' http://www.jstatsoft.org/v38/i08/. #' #' Kalbfleisch, J., Lawless, J.F., The analysis of panel data under a Markov #' assumption \emph{Journal of the Americal Statistical Association} (1985) #' 80(392): 863--871. #' #' Kay, R. A Markov model for analysing cancer markers and disease states in #' survival studies. \emph{Biometrics} (1986) 42: 855--865. #' #' Gentleman, R.C., Lawless, J.F., Lindsey, J.C. and Yan, P. Multi-state #' Markov models for analysing incomplete disease history data with #' illustrations for HIV disease. \emph{Statistics in Medicine} (1994) 13(3): #' 805--821. #' #' Satten, G.A. and Longini, I.M. Markov chains with measurement error: #' estimating the 'true' course of a marker of the progression of human #' immunodeficiency virus disease (with discussion) \emph{Applied Statistics} #' 45(3): 275-309 (1996) #' #' Jackson, C.H. and Sharples, L.D. Hidden Markov models for the onset and #' progression of bronchiolitis obliterans syndrome in lung transplant #' recipients \emph{Statistics in Medicine}, 21(1): 113--128 (2002). #' #' Jackson, C.H., Sharples, L.D., Thompson, S.G. and Duffy, S.W. and Couto, E. #' Multi-state Markov models for disease progression with classification error. #' \emph{The Statistician}, 52(2): 193--209 (2003) #' #' Titman, A.C. and Sharples, L.D. Semi-Markov models with phase-type sojourn #' distributions. \emph{Biometrics} 66, 742-752 (2009). #' #' Venables, W.N. and Ripley, B.D. (2002) \emph{Modern Applied Statistics with #' S}, second edition. Springer. #' @keywords models #' @examples #' #' ### Heart transplant data #' ### For further details and background to this example, see #' ### Jackson (2011) or the PDF manual in the doc directory. #' print(cav[1:10,]) #' twoway4.q <- rbind(c(-0.5, 0.25, 0, 0.25), c(0.166, -0.498, 0.166, 0.166), #' c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)) #' statetable.msm(state, PTNUM, data=cav) #' crudeinits.msm(state ~ years, PTNUM, data=cav, qmatrix=twoway4.q) #' cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, #' qmatrix = twoway4.q, deathexact = 4, #' control = list ( trace = 2, REPORT = 1 ) ) #' cav.msm #' qmatrix.msm(cav.msm) #' pmatrix.msm(cav.msm, t=10) #' sojourn.msm(cav.msm) #' #' @export msm <- function(formula, subject=NULL, data=list(), qmatrix, gen.inits=FALSE, ematrix=NULL, hmodel=NULL, obstype=NULL, obstrue=NULL, covariates = NULL, covinits = NULL, constraint = NULL, misccovariates = NULL, misccovinits = NULL, miscconstraint = NULL, hcovariates = NULL, hcovinits = NULL, hconstraint = NULL, hranges=NULL, qconstraint=NULL, econstraint=NULL, initprobs = NULL, est.initprobs=FALSE, initcovariates = NULL, initcovinits = NULL, deathexact = NULL, death = NULL, exacttimes = FALSE, censor=NULL, censor.states=NULL, pci=NULL, phase.states=NULL, phase.inits = NULL, # TODO merge with inits eventually subject.weights = NULL, cl = 0.95, fixedpars = NULL, center=TRUE, opt.method="optim", hessian=NULL, use.deriv=TRUE, use.expm=TRUE, analyticp=TRUE, na.action=na.omit, ...) { call <- match.call() if (missing(formula)) stop("state ~ time formula not given") if (missing(data)) data <- environment(formula) ### MODEL FOR TRANSITION INTENSITIES if (gen.inits) { if (is.null(hmodel) && is.null(ematrix)) { subj <- eval(substitute(subject), data, parent.frame()) qmatrix <- crudeinits.msm(formula, subj, qmatrix, data, censor, censor.states) } else warning("gen.inits not supported for hidden Markov models, ignoring") } qmodel <- qmodel.orig <- msm.form.qmodel(qmatrix, qconstraint, analyticp, use.expm, phase.states) if (!is.null(phase.states)) { qmodel <- msm.phase2qmodel(qmodel, phase.states, phase.inits, qconstraint, analyticp, use.expm) } ### MISCLASSIFICATION MODEL if (!is.null(ematrix)) { msm.check.ematrix(ematrix, qmodel.orig$nstates) if (!is.null(phase.states)){ stop("phase-type models with additional misclassification must be specified through \"hmodel\" with hmmCat() or hmmIdent() constructors, or as HMMs by hand") } emodel <- msm.form.emodel(ematrix, econstraint, initprobs, est.initprobs, qmodel) } else emodel <- list(misc=FALSE, npars=0, ndpars=0) ### GENERAL HIDDEN MARKOV MODEL if (!is.null(hmodel)) { msm.check.hmodel(hmodel, qmodel.orig$nstates) if (!is.null(phase.states)){ hmodel.orig <- hmodel hmodel <- rep(hmodel, qmodel$phase.reps) } hmodel <- msm.form.hmodel(hmodel, hconstraint, initprobs, est.initprobs) } else { if (!is.null(hcovariates)) stop("hcovariates have been specified, but no hmodel") if (!is.null(phase.states)){ hmodel <- msm.phase2hmodel(qmodel, hmodel) } else hmodel <- list(hidden=FALSE, models=rep(0, qmodel$nstates), nipars=0, nicoveffs=0, totpars=0, ncoveffs=0, mv=FALSE) # might change later if misc } ### CONVERT OLD STYLE MISCLASSIFICATION MODEL TO NEW GENERAL HIDDEN MARKOV MODEL if (emodel$misc) { hmodel <- msm.emodel2hmodel(emodel, qmodel) } else { emodel <- list(misc=FALSE, npars=0, ndpars=0, nipars=0, nicoveffs=0) hmodel$ematrix <- FALSE } ### EXACT DEATH TIMES. Logical values allowed for backwards compatibility (TRUE means final state has exact death time, FALSE means no states with exact death times) if (!is.null(deathexact)) death <- deathexact dmodel <- msm.form.dmodel(death, qmodel, hmodel) # returns death, ndeath, if (dmodel$ndeath > 0 && exacttimes) warning("Ignoring death argument, as all states have exact entry times") ### CENSORING MODEL cmodel <- msm.form.cmodel(censor, censor.states, qmodel$qmatrix, hmodel) ### SOME CHECKS if (!inherits(formula, "formula")) stop("formula is not a formula") if (!is.null(covariates) && (!(is.list(covariates) || inherits(covariates, "formula")))) stop(deparse(substitute(covariates)), " should be a formula or list of formulae") if (!is.null(misccovariates) && (!inherits(misccovariates, "formula"))) stop(deparse(substitute(misccovariates)), " should be a formula") if (is.list(covariates)) { # different covariates on each intensity covlist <- covariates msm.check.covlist(covlist, qmodel) ter <- lapply(covlist, function(x)attr(terms(x),"term.labels")) covariates <- reformulate(unique(unlist(ter))) # merge the formulae into one } else covlist <- NULL # parameters will be constrained later, see msm.form.cri if (is.null(covariates)) covariates <- ~1 if (emodel$misc && is.null(misccovariates)) misccovariates <- ~1 if (hmodel$hidden && !is.null(hcovariates)) msm.check.hcovariates(hcovariates, qmodel) ### BUILD MODEL FRAME containing all data required for model fit, ### using all variables found in formulae. ## Names include factor() around covariate names, and interactions, ## if specified. Need to build and evaluate a call, instead of ## running model.frame() directly, to find subject and other ## extras. Not sure why. indx <- match(c("data", "subject", "subject.weights", "obstrue"), names(call), nomatch = 0) temp <- call[c(1, indx)] temp[[1]] <- as.name("model.frame") temp[["state"]] <- as.name(all.vars(formula[[2]])) temp[["time"]] <- as.name(all.vars(formula[[3]])) varnames <- function(x){if(is.null(x)) NULL else attr(terms(x), "term.labels")} forms <- c(covariates, misccovariates, hcovariates, initcovariates) covnames <- unique(unlist(lapply(forms, varnames))) temp[["formula"]] <- if (length(covnames) > 0) reformulate(covnames) else ~1 temp[["na.action"]] <- na.pass # run na.action later so we can pass aux info to it temp[["data"]] <- data mf <- eval(temp, parent.frame()) ## remember user-specified names for later (e.g. bootstrap/cross validation) usernames <- c(state=all.vars(formula[[2]]), time=all.vars(formula[[3]]), subject=as.character(temp$subject), subject.weights=as.character(temp$subject.weights), obstype=as.character(substitute(obstype)), obstrue=as.character(temp$obstrue)) attr(mf, "usernames") <- usernames ## handle matrices in state outcome constructed in formula with cbind() indx <- match(c("formula", "data"), names(call), nomatch = 0) temp <- call[c(1, indx)] temp[[1]] <- as.name("model.frame") temp$na.action <- na.pass mfst <- eval(temp, parent.frame()) if (is.matrix(mfst[[1]]) && !is.matrix(mf$"(state)")) mf$"(state)" <- mfst[[1]] if (is.factor(mf$"(state)")){ if (!all(grepl("^[[:digit:]]+$", as.character(mf$"(state)")))) stop("state variable should be numeric or a factor with ordinal numbers as levels") else mf$"(state)" <- as.numeric(as.character(mf$"(state)")) } else if (is.character(mf$"(state)")) stop("state variable is character, should be numeric") msm.check.state(qmodel$nstates, mf$"(state)", cmodel$censor, hmodel) if (is.null(mf$"(subject)")) mf$"(subject)" <- rep(1, nrow(mf)) msm.check.times(mf$"(time)", mf$"(subject)", mf$"(state)", hmodel$hidden) obstype <- if (missing(obstype)) NULL else eval(substitute(obstype), data, parent.frame()) # handle separately to allow passing a scalar (1, 2 or 3) mf$"(obstype)" <- msm.form.obstype(mf, obstype, dmodel, exacttimes) mf$"(obstrue)" <- msm.form.obstrue(mf, hmodel, cmodel) mf$"(obs)" <- seq_len(nrow(mf)) # row numbers before NAs omitted, for reporting in msm.check.* basenames <- c("(state)","(time)","(subject)","(obstype)","(obstrue)","(obs)","(subject.weights)") attr(mf, "covnames") <- setdiff(names(mf), basenames) attr(mf, "covnames.q") <- rownames(attr(terms(covariates), "factors")) # names as in data, plus factor() if user if (emodel$misc) attr(mf, "covnames.e") <- rownames(attr(terms(misccovariates), "factors")) attr(mf, "ncovs") <- length(attr(mf, "covnames")) ### HANDLE MISSING DATA ## Find which cols of model frame correspond to covs which appear only on initprobs ## Pass through to na.action as attribute ic <- all.vars(initcovariates) others <- c(covariates,misccovariates,hcovariates) oic <- ic[!ic %in% unlist(lapply(others, all.vars))] attr(mf, "icovi") <- match(oic, colnames(mf)) if (missing(na.action) || identical(na.action, na.omit) || (identical(na.action,"na.omit"))) mf <- na.omit.msmdata(mf, hidden=hmodel$hidden, misc=emodel$misc) else if (identical(na.action, na.fail) || (identical(na.action,"na.fail"))) mf <- na.fail.msmdata(mf, hidden=hmodel$hidden, misc=emodel$misc) else stop ("na.action should be \"na.omit\" or \"na.fail\"") attr(mf, "npts") <- length(unique(mf$"(subject)")) attr(mf, "ntrans") <- nrow(mf) - attr(mf, "npts") ### UTILITY FOR PIECEWISE-CONSTANT INTENSITIES. Insert censored ## observations into the model frame, add a factor "timeperiod" to ## the data, and add the corresponding term to the formula. ## NOTE pci kept pre-imputed data as msmdata.obs.orig if (!is.null(pci)) { if (isTRUE(hmodel$mv)) stop("`pci` not supported for multivariate hidden Markov models. As an approximation, create a variable in your data representing the time period, and treat it as a covariate") tdmodel <- msm.pci(pci, mf, qmodel, cmodel, covariates) if (!is.null(tdmodel)) { mf <- tdmodel$mf; covariates <- tdmodel$covariates; cmodel <- tdmodel$cmodel pci <- tdmodel$tcut # was returned in msm object } else {pci <- NULL; mf$"(pci.imp)" <- 0} } else tdmodel <- NULL ### CALCULATE COVARIATE MEANS from data by transition, including means of 0/1 contrasts. forms <- c(covariates, misccovariates, hcovariates, initcovariates) # covariates may have been updated to include timeperiod for pci covnames <- unique(unlist(lapply(forms, varnames))) if (length(covnames) > 0) { mm.mean <- model.matrix(reformulate(covnames), mf) cm <- colMeans(mm.mean[duplicated(mf$"(subject)",fromLast=TRUE),,drop=FALSE]) cm["(Intercept)"] <- 0 } else cm <- NULL attr(mf, "covmeans") <- cm ### MAKE AGGREGATE DATA for computing likelihood of non-hidden models efficiently ### This can also be used externally to extract aggregate data from model frame in msm object mf.agg <- msm.form.mf.agg(list(data=list(mf=mf), qmodel=qmodel, hmodel=hmodel, cmodel=cmodel)) ### Make indicator for which distinct P matrix each observation corresponds to. Only used in HMMs. mf$"(pcomb)" <- msm.form.hmm.agg(mf); ### CONVERT misclassification covariate formula to hidden covariate formula if (inherits(misccovariates, "formula")){ if (!emodel$misc) stop("misccovariates supplied but no ematrix") hcovariates <- lapply(ifelse(rowSums(emodel$imatrix)>0, deparse(misccovariates), deparse(~1)), as.formula) } ### FORM DESIGN MATRICES FOR COVARIATE MODELS ### These can also be used externally to extract design matrices from model frame in msm object mm.cov <- msm.form.mm.cov(list(data=list(mf=mf), covariates=covariates, center=center)) mm.cov.agg <- msm.form.mm.cov.agg(list(data=list(mf.agg=mf.agg), covariates=covariates, hmodel=hmodel, cmodel=cmodel, center=center)) mm.mcov <- msm.form.mm.mcov(list(data=list(mf=mf), misccovariates=misccovariates, emodel=emodel, center=center)) mm.hcov <- msm.form.mm.hcov(list(data=list(mf=mf), hcovariates=hcovariates, qmodel=qmodel, hmodel=hmodel, center=center)) mm.icov <- msm.form.mm.icov(list(data=list(mf=mf), initcovariates=initcovariates, hmodel=hmodel, center=center)) ### MODEL FOR COVARIATES ON INTENSITIES if (!is.null(covlist)) { cri <- msm.form.cri(covlist, qmodel, mf, mm.cov, tdmodel) } else cri <- NULL qcmodel <- if (ncol(mm.cov) > 1) msm.form.covmodel(mf, mm.cov, constraint, covinits, cm, qmodel$npars, cri) else { if (!is.null(constraint)) warning("constraint specified but no covariates") list(npars=0, ncovs=0, ndpars=0) } ### MODEL FOR COVARIATES ON MISCLASSIFICATION PROBABILITIES if (!emodel$misc || is.null(misccovariates)) ecmodel <- list(npars=0, ncovs=0) if (!is.null(misccovariates)) { if (!emodel$misc) { warning("misccovariates have been specified, but misc is FALSE. Ignoring misccovariates.") } else { ecmodel <- msm.form.covmodel(mf, mm.mcov, miscconstraint, misccovinits, cm, emodel$npars, cri=NULL) hcovariates <- msm.misccov2hcov(misccovariates, emodel) hcovinits <- msm.misccovinits2hcovinits(misccovinits, hcovariates, emodel, ecmodel) } } ### MODEL FOR COVARIATES ON GENERAL HIDDEN PARAMETERS if (!is.null(hcovariates)) { if (hmodel$mv) stop("hcovariates not supported for multivariate hidden Markov models") hmodel <- msm.form.hcmodel(hmodel, mm.hcov, hcovinits, hconstraint) if (emodel$misc) hmodel$covconstr <- msm.form.hcovconstraint(miscconstraint, hmodel) } else if (hmodel$hidden) { npars <- if(hmodel$mv) colSums(hmodel$npars) else hmodel$npars hmodel <- c(hmodel, list(ncovs=rep(rep(0, hmodel$nstates), npars), ncoveffs=0)) class(hmodel) <- "hmodel" } if (!is.null(initcovariates)) { if (hmodel$hidden) hmodel <- msm.form.icmodel(hmodel, mm.icov, initcovinits) else warning("initprobs and initcovariates ignored for non-hidden Markov models") } else if (hmodel$hidden) { hmodel <- c(hmodel, list(nicovs=rep(0, hmodel$nstates-1), nicoveffs=0, cri=ecmodel$cri)) class(hmodel) <- "hmodel" } if (hmodel$hidden && !emodel$misc) { hmodel$constr <- msm.form.hconstraint(hconstraint, hmodel) hmodel$covconstr <- msm.form.hcovconstraint(hconstraint, hmodel) } if (hmodel$hidden) hmodel$ranges <- msm.form.hranges(hranges, hmodel) ### INITIAL STATE OCCUPANCY PROBABILITIES IN HMMS if (hmodel$hidden) hmodel <- msm.form.initprobs(hmodel, initprobs, mf) ### FORM LIST OF INITIAL PARAMETERS, MATCHING PROVIDED INITS WITH SPECIFIED MODEL, FIXING SOME PARS IF REQUIRED p <- msm.form.params(qmodel, qcmodel, emodel, hmodel, fixedpars) subject.weights <- msm.form.subject.weights(mf) msmdata <- list(mf=mf, mf.agg=mf.agg, mm.cov=mm.cov, mm.cov.agg=mm.cov.agg, mm.mcov=mm.mcov, mm.hcov=mm.hcov, mm.icov=mm.icov, subject.weights = subject.weights) ### CALCULATE LIKELIHOOD AT INITIAL VALUES OR DO OPTIMISATION (see optim.R) if (p$fixed) opt.method <- "fixed" if (is.null(hessian)) hessian <- !p$fixed p <- msm.optim(opt.method, p, hessian, use.deriv, msmdata, qmodel, qcmodel, cmodel, hmodel, ...) if (p$fixed) { p$foundse <- FALSE p$covmat <- NULL } else { p$params <- msm.rep.constraints(p$params, p, hmodel) hess <- if (hessian) p$opt$hessian else p$information if (!is.null(hess) && all(!is.na(hess)) && all(!is.nan(hess)) && all(is.finite(hess)) && all(eigen(hess)$values > 0)) { p$foundse <- TRUE p$covmat <- matrix(0, nrow=p$npars, ncol=p$npars) p$covmat[p$optpars,p$optpars] <- solve(0.5 * hess) p$covmat <- p$covmat[!duplicated(abs(p$constr)),!duplicated(abs(p$constr)), drop=FALSE][abs(p$constr),abs(p$constr), drop=FALSE] p$ci <- cbind(p$params - qnorm(1 - 0.5*(1-cl))*sqrt(diag(p$covmat)), p$params + qnorm(1 - 0.5*(1-cl))*sqrt(diag(p$covmat))) p$ci[p$fixedpars,] <- NA for (i in 1:2) p$ci[,i] <- gexpit(p$ci[,i], p$ranges[,"lower",drop=FALSE], p$ranges[,"upper",drop=FALSE]) } else { p$foundse <- FALSE p$covmat <- p$ci <- NULL if (!is.null(hess)) warning("Optimisation has probably not converged to the maximum likelihood - Hessian is not positive definite.") } } p$estimates.t <- p$params # Calculate estimates and CIs on natural scale p$estimates.t <- msm.inv.transform(p$params, hmodel, p$ranges) ## calculate CIs for misclassification probabilities (needs multivariate transform and delta method) if (any(p$plabs=="p") && p$foundse){ p.se <- p.se.msm(x=list(data=msmdata,qmodel=qmodel,emodel=emodel,hmodel=hmodel, qcmodel=qcmodel,ecmodel=ecmodel,paramdata=p,center=center), covariates = if(center) "mean" else 0) p$ci[p$plabs %in% c("p","pbase"),] <- as.numeric(unlist(p.se[,c("LCL","UCL")])) } ## calculate CIs for initial state probabilities in HMMs (using normal simulation method) if (p$foundse && any(p$plabs=="initp")) p <- initp.ci.msm(p, cl) ### FORM A MSM OBJECT FROM THE RESULTS msmobject <- list ( call = match.call(), minus2loglik = p$lik, deriv = p$deriv, estimates = p$params, estimates.t = p$estimates.t, fixedpars = p$fixedpars, center = center, covmat = p$covmat, ci = p$ci, opt = p$opt, foundse = p$foundse, data = msmdata, qmodel = qmodel, emodel = emodel, qcmodel = qcmodel, ecmodel = ecmodel, hmodel = hmodel, cmodel = cmodel, pci = pci, paramdata=p, cl=cl, covariates=covariates, misccovariates=misccovariates, hcovariates=hcovariates, initcovariates=initcovariates ) attr(msmobject, "fixed") <- p$fixed class(msmobject) <- "msm" ### Form lists of matrices from parameter estimates msmobject <- msm.form.output(msmobject, "intens") ### Include intensity and misclassification matrices on natural scales q <- qmatrix.msm(msmobject, covariates=(if(center) "mean" else 0)) msmobject$Qmatrices$baseline <- q$estimates msmobject$QmatricesSE$baseline <- q$SE msmobject$QmatricesL$baseline <- q$L msmobject$QmatricesU$baseline <- q$U if (hmodel$hidden) { msmobject$hmodel <- msm.form.houtput(hmodel, p, msmdata, cmodel) } if (emodel$misc) { msmobject <- msm.form.output(msmobject, "misc") e <- ematrix.msm(msmobject, covariates=(if(center) "mean" else 0)) msmobject$Ematrices$baseline <- e$estimates msmobject$EmatricesSE$baseline <- e$SE msmobject$EmatricesL$baseline <- e$L msmobject$EmatricesU$baseline <- e$U } msmobject$msmdata[!names(msmobject$msmdata)=="mf"] <- NULL # only keep model frame in returned data. drop at last minute, as might be needed in msm.form.houtput. ### Include mean sojourn times msmobject$sojourn <- sojourn.msm(msmobject, covariates=(if(center) "mean" else 0)) msmobject } msm.check.qmatrix <- function(qmatrix) { if (!is.numeric(qmatrix) || ! is.matrix(qmatrix)) stop("qmatrix should be a numeric matrix") if (nrow(qmatrix) != ncol(qmatrix)) stop("Number of rows and columns of qmatrix should be equal") q2 <- qmatrix; diag(q2) <- 0 if (any(q2 < 0)) stop("off-diagonal entries of qmatrix should not be negative") invisible() } msm.fixdiag.qmatrix <- function(qmatrix) { diag(qmatrix) <- 0 diag(qmatrix) <- - rowSums(qmatrix) qmatrix } msm.fixdiag.ematrix <- function(ematrix) { diag(ematrix) <- 0 diag(ematrix) <- 1 - rowSums(ematrix) ematrix } msm.form.qmodel <- function(qmatrix, qconstraint=NULL, analyticp=TRUE, use.expm=FALSE, phase.states=NULL) { msm.check.qmatrix(qmatrix) nstates <- dim(qmatrix)[1] qmatrix <- msm.fixdiag.qmatrix(qmatrix) if (is.null(rownames(qmatrix))) rownames(qmatrix) <- colnames(qmatrix) <- paste("State", seq(nstates)) else if (is.null(colnames(qmatrix))) colnames(qmatrix) <- rownames(qmatrix) imatrix <- ifelse(qmatrix > 0, 1, 0) inits <- t(qmatrix)[t(imatrix)==1] npars <- sum(imatrix) if (npars==0) stop("qmatrix contains all zeroes off the diagonal, so no transitions are permitted in the model") ## for phase-type models, leave processing qconstraint until after phased Q matrix has been formed in msm.phase2qmodel if (!is.null(qconstraint) && is.null(phase.states)) { if (!is.numeric(qconstraint)) stop("qconstraint should be numeric") if (length(qconstraint) != npars) stop("baseline intensity constraint of length " ,length(qconstraint), ", should be ", npars) constr <- match(qconstraint, unique(qconstraint)) } else constr <- 1:npars ndpars <- max(constr) ipars <- t(imatrix)[t(lower.tri(imatrix) | upper.tri(imatrix))] graphid <- paste(which(ipars==1), collapse="-") if (analyticp && graphid %in% names(.msm.graphs[[paste(nstates)]])) { ## analytic P matrix is implemented for this particular intensity matrix iso <- .msm.graphs[[paste(nstates)]][[graphid]]$iso perm <- .msm.graphs[[paste(nstates)]][[graphid]]$perm qperm <- order(perm) # diff def in 1.2.3, indexes q matrices not vectors } else { iso <- 0 perm <- qperm <- NA } qmodel <- list(nstates=nstates, iso=iso, perm=perm, qperm=qperm, npars=npars, imatrix=imatrix, qmatrix=qmatrix, inits=inits, constr=constr, ndpars=ndpars, expm=as.numeric(use.expm)) class(qmodel) <- "msmqmodel" qmodel } msm.check.ematrix <- function(ematrix, nstates) { if (!is.numeric(ematrix) || ! is.matrix(ematrix)) stop("ematrix should be a numeric matrix") if (nrow(ematrix) != ncol(ematrix)) stop("Number of rows and columns of ematrix should be equal") if (!all(dim(ematrix) == nstates)) stop("Dimensions of qmatrix and ematrix should be the same") if (!all ( ematrix >= 0 | ematrix <= 1) ) stop("Not all elements of ematrix are between 0 and 1") invisible() } msm.form.emodel <- function(ematrix, econstraint=NULL, initprobs=NULL, est.initprobs, qmodel) { diag(ematrix) <- 0 imatrix <- ifelse(ematrix > 0 & ematrix < 1, 1, 0) # don't count as parameters if perfect misclassification (1.4.2 bug fix) diag(ematrix) <- 1 - rowSums(ematrix) if (is.null(rownames(ematrix))) rownames(ematrix) <- colnames(ematrix) <- paste("State", seq(qmodel$nstates)) else if (is.null(colnames(ematrix))) colnames(ematrix) <- rownames(ematrix) dimnames(imatrix) <- dimnames(ematrix) npars <- sum(imatrix) nstates <- nrow(ematrix) inits <- t(ematrix)[t(imatrix)==1] if (is.null(initprobs)) { initprobs <- if (est.initprobs) rep(1/qmodel$nstates, qmodel$nstates) else c(1, rep(0, qmodel$nstates-1)) } else { if (!is.numeric(initprobs)) stop("initprobs should be numeric") if (is.matrix(initprobs)) { if (ncol(initprobs) != qmodel$nstates) stop("initprobs matrix has ", ncol(initprobs), " columns, should be number of states = ", qmodel$nstates) if (est.initprobs) { warning("Not estimating initial state occupancy probabilities since supplied as a matrix") } initprobs <- initprobs / rowSums(initprobs) est.initprobs <- FALSE } else { if (length(initprobs) != qmodel$nstates) stop("initprobs vector of length ", length(initprobs), ", should be vector of length ", qmodel$nstates, " or a matrix") initprobs <- initprobs / sum(initprobs) if (est.initprobs && any(initprobs==1)) { est.initprobs <- FALSE warning("Not estimating initial state occupancy probabilities, since some are fixed to 1") } } } nipars <- if (est.initprobs) qmodel$nstates else 0 if (!is.null(econstraint)) { if (!is.numeric(econstraint)) stop("econstraint should be numeric") if (length(econstraint) != npars) stop("baseline misclassification constraint of length " ,length(econstraint), ", should be ", npars) constr <- match(econstraint, unique(econstraint)) } else constr <- seq(length.out=npars) ndpars <- if(npars>0) max(constr) else 0 nomisc <- isTRUE(all.equal(as.vector(diag(ematrix)),rep(1,nrow(ematrix)))) # degenerate ematrix with no misclassification: all 1 on diagonal if (nomisc) emodel <- list(misc=FALSE, npars=0, ndpars=0) else emodel <- list(misc=TRUE, npars=npars, nstates=nstates, imatrix=imatrix, ematrix=ematrix, inits=inits, constr=constr, ndpars=ndpars, nipars=nipars, initprobs=initprobs, est.initprobs=est.initprobs) class(emodel) <- "msmemodel" emodel } ### Check elements of state vector. For simple models and misc models specified with ematrix ### Only check performed for hidden models is that data and model dimensions match msm.check.state <- function(nstates, state, censor, hmodel) { if (hmodel$hidden){ if (!is.null(ncol(state))) { pl1 <- if (ncol(state) > 1) "s" else "" pl2 <- if (max(hmodel$nout) > 1) "s" else "" if ((ncol(state) != max(hmodel$nout)) && (max(hmodel$nout) > 1)) stop(sprintf("outcome matrix in data has %d column%s, but outcome models have a maximum of %d dimension%s", ncol(state), pl1, max(hmodel$nout), pl2)) } else { if (max(hmodel$nout) > 1) { stop("Only one column in state outcome data, but multivariate hidden model supplied") } } } else { states <- c(1:nstates, censor) state <- na.omit(state) # NOTE added in 1.4 if (!is.null(ncol(state)) && ncol(state) > 1) stop("Matrix outcomes only allowed for hidden Markov models") if (!is.null(state)) { statelist <- if (nstates==2) "1, 2" else if (nstates==3) "1, 2, 3" else paste("1, 2, ... ,",nstates) if (length(setdiff(unique(state), states)) > 0) stop("State vector contains elements not in ",statelist) miss.state <- setdiff(states, unique(state)) ## Don't do this for misclassification models: it's OK to have particular state not observed by chance if (length(miss.state) > 0 && (!hmodel$hidden || !hmodel$ematrix)) warning("State vector doesn't contain observations of ",paste(miss.state, collapse=",")) } } invisible() } msm.check.times <- function(time, subject, state=NULL, hidden=FALSE) { final.rows <- !is.na(subject) & !is.na(time) if (!is.null(state)) { nas <- if (is.matrix(state)) apply(state, 1, function(x)all(is.na(x))) else is.na(state) final.rows <- final.rows & !nas state <- if (is.matrix(state)) state[final.rows, ,drop=FALSE] else state[final.rows] } final.rows <- which(final.rows) time <- time[final.rows]; subject <- subject[final.rows] ### Check if any individuals have only one observation (after excluding missing data) ### Note this shouldn't happen after 1.2 subj.num <- match(subject,unique(subject)) # avoid problems with factor subjects with empty levels nobspt <- table(subj.num) if (any (nobspt == 1)) { badsubjs <- unique(subject)[ nobspt == 1 ] andothers <- if (length(badsubjs)>3) " and others" else "" if (length(badsubjs)>3) badsubjs <- badsubjs[1:3] badlist <- paste(badsubjs, collapse=", ") plural <- if (length(badsubjs)==1) "" else "s" has <- if (length(badsubjs)==1) "has" else "have" if (!hidden) warning ("Subject", plural, " ", badlist, andothers, " only ", has, " one complete observation, which doesn't give any information") } ### Check if observations within a subject are adjacent ind <- tapply(seq_along(subj.num), subj.num, length) imin <- tapply(seq_along(subj.num), subj.num, min) imax <- tapply(seq_along(subj.num), subj.num, max) adjacent <- (ind == imax-imin+1) if (any (!adjacent)) { badsubjs <- unique(subject)[ !adjacent ] andothers <- if (length(badsubjs)>3) " and others" else "" if (length(badsubjs)>3) badsubjs <- badsubjs[1:3] badlist <- paste(badsubjs, collapse=", ") plural <- if (length(badsubjs)==1) "" else "s" stop ("Observations within subject", plural, " ", badlist, andothers, " are not adjacent in the data") } ### Check if observations are ordered in time within subject orderedpt <- ! tapply(time, subj.num, is.unsorted) if (any (!orderedpt)) { badsubjs <- unique(subject)[ !orderedpt ] andothers <- if (length(badsubjs)>3) " and others" else "" if (length(badsubjs)>3) badsubjs <- badsubjs[1:3] badlist <- paste(badsubjs, collapse=", ") plural <- if (length(badsubjs)==1) "" else "s" stop ("Observations within subject", plural, " ", badlist, andothers, " are not ordered by time") } ### Check if any consecutive observations are made at the same time, but with different states if (!is.null(state)){ if (is.matrix(state)) state <- apply(state, 1, paste, collapse=",") prevsubj <- c(-Inf, subj.num[seq_along(subj.num)-1]) prevtime <- c(-Inf, time[1:length(time)-1]) prevstate <- c(-Inf, state[1:length(state)-1]) sametime <- final.rows[subj.num==prevsubj & prevtime==time & prevstate!=state] badlist <- paste(paste(sametime-1, sametime, sep=" and "), collapse=", ") if (any(sametime)) warning("Different states observed at the same time on the same subject at observations ", badlist) } invisible() } msm.form.obstype <- function(mf, obstype, dmodel, exacttimes) { if (!is.null(obstype)) { if (!is.numeric(obstype)) stop("obstype should be numeric") if (length(obstype) == 1) obstype <- rep(obstype, nrow(mf)) else if (length(obstype)!=nrow(mf)) stop("obstype of length ", length(obstype), ", should be length 1 or ",nrow(mf)) if (any(! obstype[duplicated(mf$"(subject)")] %in% 1:3)) stop("elements of obstype should be 1, 2, or 3") # ignore obstypes at subject's first observation } else if (!is.null(exacttimes) && exacttimes) obstype <- rep(2, nrow(mf)) else { obstype <- rep(1, nrow(mf)) if (dmodel$ndeath > 0){ dobs <- if (is.matrix(mf$"(state)")) apply(mf$"(state)", 1, function(x) any(x %in% dmodel$obs)) else (mf$"(state)" %in% dmodel$obs) obstype[dobs] <- 3 } } obstype } ### On exit, obstrue will contain the true state (if known) or 0 (if unknown) ### Any NAs should be replaced by 0 - logically if you don't know whether the state is known or not, that means you don't know the state ### If "obstrue" and "censor" both specified, obstrue=1 specifies that the true state is within "censor.states", and we have no other outcome generated conditionally on that true state at that time. In HMMs with "censor" where obstrue not specified, then it is the observed state which is assumed to be within "censor.states. msm.form.obstrue <- function(mf, hmodel, cmodel) { obstrue <- mf$"(obstrue)" if (!is.null(obstrue)) { if (!hmodel$hidden) { warning("Specified obstrue for a non-hidden model, ignoring.") obstrue <- rep(1, nrow(mf)) } else if (!is.numeric(obstrue) && !is.logical(obstrue)) stop("obstrue should be logical or numeric") else { if (is.logical(obstrue) || (all(na.omit(obstrue) %in% 0:1) && !any(is.na(obstrue)))){ ## obstrue is an indicator. Actual state should then be supplied in the outcome vector ## (typically misclassification models) ## interpret presence of NAs as indicating true state supplied here if (!is.null(ncol(mf$"(state)")) && ncol(mf$"(state)") > 1) stop("obstrue must contain NA or the true state for a multiple outcome HMM, not an 0/1 indicator") obstrue <- ifelse(obstrue, mf$"(state)", 0) } else { ## obstrue contains the actual state (used when we have another outcome conditionally on this) if (!all(na.omit(obstrue) %in% 0:hmodel$nstates)){ stop("Interpreting \"obstrue\" as containing true states, but it contains values not in 0,1,...,", hmodel$nstates) } obstrue[is.na(obstrue)] <- 0 # true state assumed unknown if NA ## If misclassification model specified through "ematrix", interpret the state data as the true state. ## If specified through hmodel (including hmmCat), interpret the state as a misclassified/HMM outcome generated conditionally on the true state. } } } else if (hmodel$hidden) obstrue <- rep(0, nrow(mf)) else obstrue <- mf$"(state)" if (cmodel$ncens > 0){ ## If censoring and obstrue, put the first of the possible states into obstrue ## Used in Viterbi for (i in seq_along(cmodel$censor)) obstrue[obstrue==cmodel$censor[i] & obstrue > 0] <- cmodel$states[cmodel$index[i]] } obstrue } ## Replace censored states by state with highest probability that they ## could represent. Used in msm.check.model to check consistency of ## data with transition parameters msm.impute.censored <- function(fromstate, tostate, Pmat, cmodel) { ## e.g. cmodel$censor 99,999; cmodel$states 1,2,1,2,3; cmodel$index 1, 3, 6 ## Both from and to are censored wb <- which ( fromstate %in% cmodel$censor & tostate %in% cmodel$censor) for (i in wb) { si <- which(cmodel$censor==fromstate[i]) fc <- cmodel$states[(cmodel$index[si]) : (cmodel$index[si+1]-1)] ti <- which(cmodel$censor==tostate[i]) tc <- cmodel$states[(cmodel$index[ti]) : (cmodel$index[ti+1]-1)] mp <- which.max(Pmat[fc, tc]) fromstate[i] <- fc[row(Pmat[fc, tc])[mp]] tostate[i] <- tc[col(Pmat[fc, tc])[mp]] } ## Only from is censored wb <- which(fromstate %in% cmodel$censor) for (i in wb) { si <- which(cmodel$censor==fromstate[i]) fc <- cmodel$states[(cmodel$index[si]) : (cmodel$index[si+1]-1)] fromstate[i] <- fc[which.max(Pmat[fc, tostate[i]])] } ## Only to is censored wb <- which(tostate %in% cmodel$censor) for (i in wb) { si <- which(cmodel$censor==tostate[i]) tc <- cmodel$states[(cmodel$index[si]) : (cmodel$index[si+1]-1)] tostate[i] <- tc[which.max(Pmat[fromstate[i], tc])] } list(fromstate=fromstate, tostate=tostate) } ### CHECK THAT TRANSITION PROBABILITIES FOR DATA ARE ALL NON-ZERO ### (e.g. check for backwards transitions when the model is irreversible) ### obstype 1 must have unitprob > 0 ### obstype 2 must have qunit != 0, and unitprob > 0. ### obstype 3 must have unitprob > 0 msm.check.model <- function(fromstate, tostate, obs, subject, obstype=NULL, qmatrix, cmodel) { n <- length(fromstate) qmatrix <- qmatrix / mean(qmatrix[qmatrix>0]) # rescale to avoid false warnings with small rates Pmat <- MatrixExp(qmatrix) Pmat[Pmat < .Machine$double.eps] <- 0 imputed <- msm.impute.censored(fromstate, tostate, Pmat, cmodel) fs <- imputed$fromstate; ts <- imputed$tostate unitprob <- apply(cbind(fs, ts), 1, function(x) { Pmat[x[1], x[2]] } ) qunit <- apply(cbind(fs, ts), 1, function(x) { qmatrix[x[1], x[2]] } ) if (identical(all.equal(min(unitprob, na.rm=TRUE), 0), TRUE)) { badobs <- which.min(unitprob) warning ("Data may be inconsistent with transition matrix for model without misclassification:\n", "individual ", if(is.null(subject)) "" else subject[badobs], " moves from state ", fromstate[badobs], " to state ", tostate[badobs], " at observation ", obs[badobs], "\n") } if (any(qunit[obstype==2]==0)) { badobs <- min (obs[qunit==0 & obstype==2], na.rm = TRUE) warning ("Data may be inconsistent with intensity matrix for observations with exact transition times and no misclassification:\n", "individual ", if(is.null(subject)) "" else subject[obs==badobs], " moves from state ", fromstate[obs==badobs], " to state ", tostate[obs==badobs], " at observation ", badobs) } absorbing <- absorbing.msm(qmatrix=qmatrix) absabs <- (fromstate %in% absorbing) & (tostate %in% absorbing) if (any(absabs)) { badobs <- min( obs[absabs] ) warning("Absorbing - absorbing transition at observation ", badobs) } invisible() } msm.check.constraint <- function(constraint, mm){ if (is.null(constraint)) return(invisible()) covlabels <- colnames(mm)[-1] if (!is.list(constraint)) stop(deparse(substitute(constraint)), " should be a list") if (!all(sapply(constraint, is.numeric))) stop(deparse(substitute(constraint)), " should be a list of numeric vectors") ## check and parse the list of constraints on covariates for (i in names(constraint)) if (!(is.element(i, covlabels))){ factor.warn <- if (i %in% names(attr(mm,"contrasts"))) "\n\tFor factor covariates, specify constraints using covnameCOVVALUE = c(...)" else "" stop("Covariate \"", i, "\" in constraint statement not in model.", factor.warn) } } msm.check.covinits <- function(covinits, covlabels){ if (!is.list(covinits)) warning(deparse(substitute(covinits)), " should be a list") else if (!all(sapply(covinits, is.numeric))) warning(deparse(substitute(covinits)), " should be a list of numeric vectors") else { notin <- setdiff(names(covinits), covlabels) if (length(notin) > 0){ plural <- if (length(notin) > 1) "s " else " " warning("covariate", plural, paste(notin, collapse=", "), " in ", deparse(substitute(covinits)), " unknown") } } } ### Process covariates constraints, in preparation for being passed to the likelihood optimiser ### This function is called for both sets of covariates (transition rates and the misclassification probs) msm.form.covmodel <- function(mf, mm, constraint, covinits, covmeans, nmatrix, # number of transition intensities / misclassification probs cri ) { if (!is.null(cri)) return(msm.form.covmodel.byrate(mf, mm, constraint, covinits, covmeans, nmatrix, cri)) ncovs <- ncol(mm) - 1 covlabels <- colnames(mm)[-1] if (is.null(constraint)) { constraint <- rep(list(1:nmatrix), ncovs) names(constraint) <- covlabels constr <- 1:(nmatrix*ncovs) } else { msm.check.constraint(constraint, mm) constr <- inits <- numeric() maxc <- 0 for (i in seq_along(covlabels)){ ## build complete vectorised list of constraints for covariates in covariates statement ## so. e.g. constraints = (x1=c(3,3,4,4,5), x2 = (0.1,0.2,0.3,0.4,0.4)) ## turns into constr = c(1,1,2,2,3,4,5,6,7,7) with seven distinct covariate effects ## Allow constraints such as: some elements are minus others. Use negative elements of constr to do this. ## e.g. constr = c(1,1,-1,-1,2,3,4,5) ## obtained by match(abs(x), unique(abs(x))) * sign(x) if (is.element(covlabels[i], names(constraint))) { if (length(constraint[[covlabels[i]]]) != nmatrix) stop("\"",covlabels[i],"\" constraint of length ", length(constraint[[covlabels[i]]]),", should be ",nmatrix) } else constraint[[covlabels[i]]] <- seq(nmatrix) constr <- c(constr, (maxc + match(abs(constraint[[covlabels[i]]]), unique(abs(constraint[[covlabels[i]]]))))*sign(constraint[[covlabels[i]]]) ) maxc <- max(abs(constr)) } } inits <- numeric() if (!is.null(covinits)) msm.check.covinits(covinits, covlabels) for (i in seq_along(covlabels)) { if (!is.null(covinits) && is.element(covlabels[i], names(covinits))) { thisinit <- covinits[[covlabels[i]]] if (!is.numeric(thisinit)) { warning("initial values for covariates should be numeric, ignoring") thisinit <- rep(0, nmatrix) } if (length(thisinit) != nmatrix) { warning("\"", covlabels[i], "\" initial values of length ", length(thisinit), ", should be ", nmatrix, ", ignoring") thisinit <- rep(0, nmatrix) } inits <- c(inits, thisinit) } else { inits <- c(inits, rep(0, nmatrix)) } } npars <- ncovs*nmatrix ndpars <- max(unique(abs(constr))) list(npars=npars, ndpars=ndpars, # number of distinct covariate effect parameters ncovs=ncovs, constr=constr, covlabels=covlabels, # factors as separate contrasts inits = inits, covmeans = attr(mm, "means") ) } ## Process constraints and initial values for covariates supplied as a ## list of transition-specific formulae. Convert to form needed for a ## single covariates formula common to all transitions, which can be ## processed with msm.form.covmodel. msm.form.covmodel.byrate <- function(mf, mm, constraint, # as supplied by user covinits, # as supplied by user covmeans, nmatrix, cri ){ covs <- colnames(mm)[-1] ## Convert short form constraints to long form msm.check.constraint(constraint, mm) constr <- inits <- numeric() for (i in seq_along(covs)){ if (covs[i] %in% names(constraint)){ if (length(constraint[[covs[i]]]) != sum(cri[,i])) stop("\"",covs[i],"\" constraint of length ", length(constraint[[covs[i]]]),", should be ",sum(cri[,i])) con <- match(constraint[[covs[i]]], unique(constraint[[covs[i]]])) + 1 constraint[[covs[i]]] <- rep(1, nmatrix) constraint[[covs[i]]][cri[,i]==1] <- con } else constraint[[covs[i]]] <- seq(length=nmatrix) } ## convert short to long initial values in the same way if (!is.null(covinits)) msm.check.covinits(covinits, covs) for (i in seq_along(covs)) { if (!is.null(covinits) && (covs[i] %in% names(covinits))) { if (!is.numeric(covinits[[covs[i]]])) { warning("initial values for covariates should be numeric, ignoring") covinits[[covs[i]]] <- rep(0, nmatrix) } thisinit <- rep(0, nmatrix) if (length(covinits[[covs[i]]]) != sum(cri[,i])) { warning("\"", covs[i], "\" initial values of length ", length(covinits[[covs[i]]]), ", should be ", sum(cri[,i]), ", ignoring") covinits[[covs[i]]] <- rep(0, nmatrix) } else thisinit[cri[,i]==1] <- covinits[[covs[i]]] covinits[[covs[i]]] <- thisinit } } qcmodel <- msm.form.covmodel(mf, mm, constraint, covinits, covmeans, nmatrix, cri=NULL) qcmodel$cri <- cri qcmodel } msm.form.dmodel <- function(death, qmodel, hmodel) { nstates <- qmodel$nstates statelist <- if (nstates==2) "1, 2" else if (nstates==3) "1, 2, 3" else paste("1, 2, ... ,",nstates) if (is.null(death)) death <- FALSE if (is.logical(death) && death==TRUE) states <- nstates else if (is.logical(death) && death==FALSE) states <- numeric(0) ## Will be changed to -1 when passing to C else if (!is.numeric(death)) stop("Exact death states indicator must be numeric") else if (length(setdiff(death, 1:nstates)) > 0) stop("Exact death states indicator contains states not in ",statelist) else states <- death ndeath <- length(states) if (hmodel$hidden) { ## Form death state info from hmmIdent parameters. ## Special observations in outcome data which denote death states ## are given as the parameter to hmmIdent() mods <- if(is.matrix(hmodel$models)) hmodel$models[1,] else hmodel$models if (!all(mods[states] == match("identity", .msm.HMODELS))) stop("States specified in \"deathexact\" should have the identity hidden distribution hmmIdent()") obs <- ifelse(hmodel$npars[states]>0, hmodel$pars[hmodel$parstate %in% states], states) } else obs <- states if (any (states %in% transient.msm(qmatrix=qmodel$qmatrix))) stop("Not all the states specified in \"deathexact\" are absorbing") list(ndeath=ndeath, states=states, obs=obs) } msm.form.cmodel <- function(censor=NULL, censor.states=NULL, qmatrix, hmodel=NULL) { if (is.null(censor)) { ncens <- 0 if (!is.null(censor.states)) warning("censor.states supplied but censor not supplied") } else { if (isTRUE(hmodel$mv)) stop("`censor` not supported with multivariate hidden Markov models") if (!is.numeric(censor)) stop("censor must be numeric") if (any(censor %in% 1:nrow(qmatrix))) warning("some censoring indicators are the same as actual states") ncens <- length(censor) if (is.null(censor.states)) { if (ncens > 1) { warning("more than one type of censoring given, but censor.states not supplied. Assuming only one type of censoring") ncens <- 1; censor <- censor[1] } censor.states <- transient.msm(qmatrix=qmatrix) states.index <- c(1, length(censor.states)+1) states_list <- list(censor.states) } else { if (ncens == 1) { if (!is.vector(censor.states) || (is.list(censor.states) && (length(censor.states) > 1)) ) stop("if one type of censoring, censor.states should be a vector, or a list with one vector element") if (!is.numeric(unlist(censor.states))) stop("censor.states should be all numeric") states.index <- c(1, length(unlist(censor.states))+1) } else { if (!is.list(censor.states)) stop("censor.states should be a list") if (length(censor.states) != ncens) stop("expected ", ncens, " elements in censor.states list, found ", length(censor.states)) states.index <- cumsum(c(0, lapply(censor.states, length))) + 1 } states_list <- censor.states censor.states <- unlist(states_list) } names(states_list) <- censor } if (ncens==0) censor <- censor.states <- states_list <- states.index <- NULL ## Censoring information to be passed to C list(ncens = ncens, # number of censoring states censor = censor, # vector of their labels in the data states = censor.states, # possible true states that the censoring represents (in unlisted form, for C) states_list = states_list, # (same in list form, for R) index = states.index # index into censor.states for the start of each true-state set, including an extra length(censor.states)+1. For C ) } ### Transform set of sets of probs {prs} to {log(prs/pr1)} msm.mnlogit.transform <- function(pars, hmodel){ res <- pars plabs <- hmodel$plabs states <- hmodel$parstate outcomes <- hmodel$parout if (any(plabs=="p")) { for (i in unique(states)) { for (j in unique(outcomes)) { pfree <- which(plabs=="p" & states==i & outcomes==j) pbase <- which(plabs=="pbase" & states==i & outcomes==j) ## recalculate baseline prob if necessary, e.g. if constraints applied res[pbase] <- 1 - sum(res[pfree]) res[pfree] <- log(res[pfree] / res[pbase]) } } } res } ### Transform set of sets of murs = {log(prs/pr1)} to probs {prs} ### ie psum = sum(exp(mus)), pr1 = 1 / (1 + psum), prs = exp(mus) / (1 + psum) msm.mninvlogit.transform <- function(pars, hmodel) { res <- pars plabs <- hmodel$plabs states <- hmodel$parstate outcomes <- hmodel$parout if (any(plabs=="p")) { # p's are unconstrained probabilities ## indicator for which p's belong to which state whichst <- match(states[plabs=="p"], unique(states[plabs=="p"])) ## indicator for which p's belong to which outcome in multivariate HMMs whichout <- match(outcomes[plabs=="p"], unique(outcomes[plabs=="p"])) for (i in unique(whichst)) { for (j in unique(whichout)) { pfree <- which(plabs=="p")[whichst==i & whichout==j] pbase <- which(plabs=="pbase" & states==i & outcomes==j) if (is.matrix(pars)) {# will be used when applying covariates psum <- colSums(exp(pars[pfree,,drop=FALSE])) res[pbase,] <- 1 / (1 + psum) res[pfree,] <- exp(pars[pfree,,drop=FALSE]) / rep(1 + psum, each=sum(whichst==i & whichout==j)) } else { psum <- sum(exp(pars[pfree])) res[pbase] <- 1 / (1 + psum) res[pfree] <- exp(pars[pfree]) / (1 + psum) } } } } res } ## transform parameters from natural scale to real-line optimisation scale msm.transform <- function(pars, hmodel, ranges){ labs <- names(pars) pars <- glogit(pars, ranges[,"lower"], ranges[,"upper"]) hpinds <- which(!(labs %in% c("qbase","qcov","hcov","initpbase","initp","initp0","initpcov"))) hpars <- pars[hpinds] hpars <- msm.mnlogit.transform(hpars, hmodel) pars[hpinds] <- hpars pars[labs=="initp"] <- log(pars[labs=="initp"] / pars[labs=="initpbase"]) pars } ## transform parameters from real-line optimisation scale to natural scale msm.inv.transform <- function(pars, hmodel, ranges){ labs <- names(pars) pars <- gexpit(pars, ranges[,"lower"], ranges[,"upper"]) hpinds <- which(!(labs %in% c("qbase","qcov","hcov","initp","initp0","initpcov"))) hpars <- pars[hpinds] hpars <- msm.mninvlogit.transform(hpars, hmodel) pars[hpinds] <- hpars ep <- exp(pars[labs=="initp"]) pars[labs=="initp"] <- ep / (1 + sum(ep)) pars[labs=="initpbase"] <- 1 / (1 + sum(ep)) pars } ## Collect all model parameters together ready for optimisation ## Handle parameters fixed at initial values or constrained to equal other parameters msm.form.params <- function(qmodel, qcmodel, emodel, hmodel, fixedpars) { ## Transition intensities ni <- qmodel$npars ## Covariates on transition intensities nc <- qcmodel$npars ## HMM response parameters nh <- sum(hmodel$npars) ## Covariates on HMM response distribution nhc <- sum(hmodel$ncoveffs) ## Initial state occupancy probabilities in HMM nip <- hmodel$nipars ## Covariates on initial state occupancy probabilities. nipc <- hmodel$nicoveffs npars <- ni + nc + nh + nhc + nip + nipc inits <- as.numeric(c(qmodel$inits, qcmodel$inits, hmodel$pars, unlist(hmodel$coveffect))) plabs <- c(rep("qbase",ni), rep("qcov", nc), hmodel$plabs, rep("hcov", nhc)) if (nip > 0) { inits <- c(inits, hmodel$initprobs) initplabs <- c("initpbase", rep("initp",nip-1)) initplabs[hmodel$initprobs==0] <- "initp0" # those initialised to zero will be fixed at zero plabs <- c(plabs, initplabs) if (nipc > 0) { inits <- c(inits, unlist(hmodel$icoveffect)) plabs <- c(plabs, rep("initpcov",nipc)) } } ## store indicator for which parameters are HMM location parameters (not HMM cov effects or initial state probs) hmmpars <- which(!(plabs %in% c("qbase","qcov","hcov","initpbase","initp","initp0","initpcov"))) hmmparscov <- which(!(plabs %in% c("qbase","qcov","initpbase","initp","initp0","initpcov"))) names(inits) <- plabs ranges <- .msm.PARRANGES[plabs,,drop=FALSE] if (!is.null(hmodel$ranges)) ranges[hmmparscov,] <- hmodel$ranges inits <- msm.transform(inits, hmodel, ranges) ## Form constraint vector for complete set of parameters ## No constraints allowed on initprobs and their covs for the moment constr <- c(qmodel$constr, if(is.null(qcmodel$constr)) NULL else (ni + abs(qcmodel$constr))*sign(qcmodel$constr), ni + nc + hmodel$constr, ni + nc + nh + hmodel$covconstr, ni + nc + nh + nhc + seq(length.out=nip), ni + nc + nh + nhc + nip + seq(length.out=nipc)) constr <- match(abs(constr), unique(abs(constr)))*sign(constr) ## parameters which are always fixed and not included in user-supplied fixedpars auxpars <- which(plabs %in% .msm.AUXPARS) duppars <- which(duplicated(abs(constr))) realpars <- setdiff(seq(npars), union(auxpars, duppars)) nrealpars <- npars - length(auxpars) - length(duppars) ## if transition-specific covariates, then fixedpars indices generally smaller nshortpars <- nrealpars - sum(qcmodel$cri[!duplicated(qcmodel$constr)]==0) if (is.logical(fixedpars)) fixedpars <- if (fixedpars == TRUE) seq(nshortpars) else numeric() if (any(! (fixedpars %in% seq(length.out=nshortpars)))) stop ( "Elements of fixedpars should be in 1, ..., ", nshortpars) if (!is.null(qcmodel$cri)) { ## Convert user-supplied fixedpars indexing transition-specific covariates ## to fixedpars indexing transition-common covariates inds <- rep(1, nrealpars) inds[qmodel$ndpars + qcmodel$constr[!duplicated(qcmodel$constr)]] <- qcmodel$cri[!duplicated(qcmodel$constr)] inds[inds==1] <- seq(length.out=nshortpars) fixedpars <- match(fixedpars, inds) ## fix covariate effects not included in model to zero fixedpars <- sort(c(fixedpars, which(inds==0))) } notfixed <- realpars[setdiff(seq_along(realpars),fixedpars)] fixedpars <- sort(c(realpars[fixedpars], auxpars)) # change fixedpars to index unconstrained pars allinits <- inits optpars <- intersect(notfixed, which(!duplicated(abs(constr)))) inits <- inits[optpars] fixed <- (length(fixedpars) + length(duppars) == npars) # TRUE if all parameters are fixed, then no optimisation needed, just evaluate likelihood names(allinits) <- plabs; names(fixedpars) <- plabs[fixedpars]; names(plabs) <- NULL paramdata <- list(inits=inits, plabs=plabs, allinits=allinits, hmmpars=hmmpars, fixed=fixed, fixedpars=fixedpars, optpars=optpars, auxpars=auxpars, constr=constr, npars=npars, duppars=duppars, nfix=length(fixedpars), nopt=length(optpars), ndup=length(duppars), ranges=ranges) paramdata } ## Unfix all fixed parameters in a paramdata object p (as ## returned by msm.form.params). Used for calculating deriv / ## information over all parameters for models with fixed parameters. ## Don't unfix auxiliary pars such as binomial denominators ## Don't unconstrain constraints msm.unfixallparams <- function(p) { npars <- length(p$allinits) p$fixed <- FALSE p$optpars <- setdiff(1:npars, union(p$auxpars,p$duppars)) p$fixedpars <- p$auxpars p$nopt <- length(p$optpars) p$nfix <- npars - length(p$optpars) p$inits <- p$allinits[p$optpars] p } msm.rep.constraints <- function(pars, # transformed pars paramdata, hmodel){ plabs <- names(pars) p <- paramdata ## Handle constraints on misclassification probs / HMM cat probs separately ## This is fiddly. First replicate within states, on log(pr/pbase) scale if (any(hmodel$plabs=="p")) { for (i in 1:hmodel$nstates){ inds <- (hmodel$parstate==i & hmodel$plabs=="p") hpc <- hmodel$constr[inds] pars[p$hmmpars][inds] <- pars[p$hmmpars][inds][match(hpc, unique(hpc))] } } ## ...then replicate them between states, on pr scale, so that constraint applies ## to pr not log(pr/pbase). After, transform back pars[p$hmmpars] <- msm.mninvlogit.transform(pars[p$hmmpars], hmodel) plabs <- plabs[!duplicated(abs(p$constr))][abs(p$constr)] pars <- pars[!duplicated(abs(p$constr))][abs(p$constr)]*sign(p$constr) pars[p$hmmpars] <- msm.mnlogit.transform(pars[p$hmmpars], hmodel) names(pars) <- plabs pars } ## Apply covariates to transition intensities. Parameters enter this ## function already log transformed and replicated, and exit on ## natural scale. msm.add.qcovs <- function(qmodel, pars, mm){ labs <- names(pars) beta <- rbind(pars[labs=="qbase"], matrix(pars[labs=="qcov"], ncol=qmodel$npars, byrow=TRUE)) qvec <- exp(mm %*% beta) imat <- t(qmodel$imatrix); row <- col(imat)[imat==1]; col <- row(imat)[imat==1] qmat <- array(0, dim=c(qmodel$nstates, qmodel$nstates, nrow(mm))) for (i in 1:qmodel$npars) { qmat[row[i],col[i],] <- qvec[,i] } for (i in 1:qmodel$nstates) ## qmat[i,i,] <- -apply(qmat[i,,,drop=FALSE], 3, sum) qmat[i,i,] <- -colSums(qmat[i,,,drop=FALSE], , 2) qmat } ## Derivatives of intensity matrix Q wrt unique log q and beta, after ## applying constraints. By observation with covariates applied. ## e.g. qmodel$constr 1 1 2, qcmodel$constr 1 -1 2 3 3 -3 ## returns derivs w.r.t pars named p1 p2 p3 p4 p5 ## i.e. with baseline q on the log scale ## qo = exp(p1 + p3x1 + p5x2) ## q1 = exp(p1 + -p3x1 + p5x2) ## q2 = exp(p2 + p4x1 - p5x2) msm.form.dq <- function(qmodel, qcmodel, pars, paramdata, mm){ labs <- names(pars) q0 <- pars[labs=="qbase"] beta <- rbind(q0, matrix(pars[labs=="qcov"], ncol=qmodel$npars, byrow=TRUE)) qvec <- exp(mm %*% beta) covs <- mm[,-1,drop=FALSE] qrvec <- exp(covs %*% beta[-1,,drop=FALSE]) nopt <- qmodel$ndpars + qcmodel$ndpars # after constraint but before omitting fixed dqvec <- array(pars[labs=="qbase"], dim=c(nrow(mm), qmodel$npars, nopt)) for (i in seq_len(qmodel$npars)) { ind <- rep(0, qmodel$ndpars); ind[qmodel$constr[i]] <- 1 cind <- 1:qmodel$ndpars # dqvec[,i,cind] = qrvec[,i] * rep(ind, each=nrow(mm)) dqvec[,i,cind] = qrvec[,i] * rep(ind, each=nrow(mm)) * exp(q0[i]) if (qcmodel$npars > 0) for (k in 1:qcmodel$ncovs) { con <- qcmodel$constr[(k-1)*qmodel$npars + 1:qmodel$npars] ucon <- match(abs(con), unique(abs(con))) ind <- rep(0, max(ucon)); ind[ucon[i]] <- sign(con[i]) cind <- max(cind) + unique(ucon) dqvec[,i,cind] <- covs[,k] * qvec[,i] * rep(ind, each=nrow(mm)) } } dqmat <- array(0, dim=c(qmodel$nstates, qmodel$nstates, nopt, nrow(mm))) imat <- t(qmodel$imatrix); row <- col(imat)[imat==1]; col <- row(imat)[imat==1] for (i in 1:qmodel$npars) dqmat[row[i],col[i],,] <- t(dqvec[,i,]) for (i in 1:qmodel$nstates) ## dqmat[i,i,,] <- -apply(dqmat[i,,,,drop=FALSE], c(3,4), sum) dqmat[i,i,,] <- -colSums(dqmat[i,,,,drop=FALSE], , 2) p <- paramdata # leave fixed parameters out fixed <- p$fixedpars[p$plabs[p$fixedpars] %in% c("qbase","qcov")] con <- abs(p$constr[p$plabs %in% c("qbase","qcov")]) ## FIXME if (any(fixed)) dqmat <- dqmat[,,-con[fixed],,drop=FALSE] dqmat } ## Apply covariates to HMM location parameters ## Parameters enter transformed, and exit on natural scale msm.add.hmmcovs <- function(hmodel, pars, mml){ labs <- names(pars) hpinds <- which(!(labs %in% c("qbase","qcov","hcov","initpbase","initp","initp0","initpcov"))) n <- nrow(mml[[1]]) hpars <- matrix(rep(pars[hpinds], n), ncol=n, dimnames=list(labs[hpinds], NULL)) ito <- 0 for (i in which(hmodel$ncovs > 0)) { mm <- mml[[hmodel$parstate[i]]] ## TODO is this cleaner with hmodel$coveffstate ? ## TODO is this correct for misc covs: two matrices ifrom <- ito + 1; ito <- ito + hmodel$ncovs[i] beta <- pars[names(pars)=="hcov"][ifrom:ito] hpars[i,] <- hpars[i,] + mm[,-1,drop=FALSE] %*% beta } for (i in seq_along(hpinds)){ hpars[i,] <- gexpit(hpars[i,], hmodel$ranges[i,"lower"], hmodel$ranges[i,"upper"]) } hpars <- msm.mninvlogit.transform(hpars, hmodel) hpars } ### Derivatives of HMM pars w.r.t HMM baseline pars (on transformed, ### e.g. log, scale) and covariate effects ## Account for parameter constraints, e.g. ## hmodel$constr 1 2 3 2 4, hmodel$covconstr 1 2 1 3 ## mu0 = g(p1 + p5x1 + p6x2); g is id for mean, g'(p)=1, or exp for sigma ## sd0 = g(p2) ## mu1 = g(p3 + p5x1 + p7x2) ## sd1 = g(p2) ## id1 = g(p4) ## want deriv wrt p1,p2,...,p7 msm.form.dh <- function(hmodel, pars, # before adding covariates, and on transformed scale newpars, # after adding covariates, and on natural scale paramdata, mml){ labs <- names(pars) hpinds <- which(!(labs %in% c("qbase","qcov","hcov","initpbase","initp","initp0","initpcov"))) # baseline HMM parameters n <- nrow(mml[[1]]) hpars <- matrix(rep(pars[hpinds], n), ncol=n, dimnames=list(labs[hpinds], NULL)) nh <- sum(hmodel$npars) nopt <- length(unique(hmodel$constr)) + length(unique(hmodel$covconstr)) # TODO store in hmodel dh <- array(0, dim=c(nh, nopt, n)) for (i in 1:nh){ ind <- rep(0, length(unique(hmodel$constr))) ind[hmodel$constr[i]] <- 1 cind <- 1:length(unique(hmodel$constr)) if (labs[hpinds][i] != "p") { a <- hmodel$ranges[i,"lower"]; b <- hmodel$ranges[i,"upper"] gdash <- dgexpit(glogit(newpars[i,], a, b), a, b) dh[i,cind,] <- rep(ind, n)*rep(gdash, each=length(cind)) if (hmodel$ncovs[i] > 0) { mm <- mml[[hmodel$parstate[i]]][,-1,drop=FALSE] con <- hmodel$covconstr[hmodel$coveffstate == hmodel$parstate[i]] cind <- max(cind) + unique(con) dh[i,cind,] <- t(mm) * rep(gdash, each=length(cind)) } } } dh <- msm.dmninvlogit(hmodel, hpars, mml, pars[names(pars)=="hcov"], dh) p <- paramdata # leave fixed parameters out dhinds <- which(!(labs %in% c("qbase","qcov","initpbase","initp","initp0","initpcov"))) fixed <- intersect(p$fixedpars, dhinds) # index into full par vec fixed <- match(fixed, setdiff(dhinds, p$duppars)) # index into constrained hmm par vec if (any(fixed)) dh <- dh[,-fixed,,drop=FALSE] dh } ### Derivatives of outcome probabilities w.r.t baseline log odds and covariate effects ### in a HMM categorical outcome distribution ### Constraints on probabilities not supported, seems too fiddly. ### Could generalize for use in est.initprobs, if ever support derivatives for that ### log(p_r/pbase) = lp_r + beta_r ' x ### p_r / pbase = exp(lp_r + beta_r'x) ### (p1 +...+ pR) / pbase = 1/pbase = sum_allR(exp()), so ### pbase = 1/sum_allR(exp()) ### p_r = exp(lp_r + beta_r'x) / sum_all(exp(lp_s + beta_s'x)), where pars 0 for s=pbase ### d/dlp_s pbase = -exp(lp_s + beta_s'x)/ (sum_all())^2 ### d/dbeta_sk pbase = (-x_sk * exp(lp_s + beta_s'x)/ (sum_all())^2 ### for r!=s, d/dlp_s p_r = exp(lp_r + beta_r'x) * -exp(lp_s + beta_s'x)/ (sum_all())^2 ### for r=s, d/dlp_s p_r = exp(lp_r + beta_r'x) / sum_all() + ### exp(lp_r + beta_r'x) * -exp(lp_r + beta_r'x)/ (sum_all())^2 ### for r!=s, d/dbeta_sk p_r = exp(lp_r + beta_r'x) * (-x_sk * exp(lp_s + beta_s'x)/ (sum_all())^2 ### for r=s, d/dbeta_sk p_r = x_sk exp(lp_r + beta_r'x) / sum_all() + ### exp(lp_r + beta_r'x) * (-x_sk * exp(lp_r + beta_r'x)/ (sum_all())^2 ### if no covs: p_r = exp(lp_r) / sum_all(exp(lp_s)). lp_r = log(p_r/pbase) ### d/dlp_s p_r = ### for r!=s, exp(lp_r) * (-exp(lp_s)/ (sum_all())^2 ### for r=s, d/dlp_s p_r = exp(lp_r) / sum_all() - exp(lp_r)^2 / (sum_all())^2 msm.dmninvlogit <- function(hmodel, pars, mml, hcov, dh){ plabs <- hmodel$plabs states <- hmodel$parstate n <- nrow(mml[[1]]) nh <- sum(hmodel$npars) if (any(plabs=="p")) { whichst <- match(states[plabs=="p"], unique(states[plabs=="p"])) for (i in unique(whichst)) { labsi <- plabs[states==i] ppars <- which(labsi %in% c("p","pbase","p0")) lp <- matrix(pars[states==i ,1][ppars], nrow=n, ncol=length(ppars), byrow=TRUE, dimnames=list(NULL,labsi[ppars])) ncovs <- hmodel$ncovs[states==i][ppars] beta <- hcov[hmodel$coveffstate==i] X <- mml[[states[i]]][,-1,drop=FALSE] ito <- 0 for (j in which(ncovs > 0)){ ifrom <- ito + 1; ito <- ito + ncovs[j] betaj <- beta[ifrom:ito] lp[,j] <- lp[,j] + X %*% betaj } elp <- lp elp[,labsi[ppars]=="p"] <- exp(elp[,labsi[ppars]=="p"]) psum <- 1 + rowSums(elp[,labsi[ppars]=="p",drop=FALSE]) pil <- which(states==i & plabs=="p") pis <- which(colnames(elp) == "p") for (r in seq_along(pil)){ ito <- 0 for (s in seq_along(pil)){ dh[pil[r],pil[s],] <- if (r == s) elp[,pis[r]] / psum * (1 - elp[,pis[r]] / psum) else - elp[,pis[r]] * elp[,pis[s]] / psum^2 if (ncovs[pis[s]] > 0){ ifrom <- ito + 1; ito <- ito + ncovs[pis[s]] bil <- nh + which(hmodel$coveffstate==i)[ifrom:ito] for (k in seq_along(bil)) dh[pil[r],bil[k],] <- if (r == s) X[,k] * elp[,pis[r]] / psum * (1 - elp[,pis[r]] / psum) else - X[,k] * elp[,pis[r]] * elp[,pis[s]] / psum^2 } } } pib <- which(states==i & plabs=="pbase") ito <- 0 for (s in seq_along(pil)){ dh[pib,pil[s],] <- - elp[,pis[s]] / psum^2 if (ncovs[pis[s]] > 0){ ifrom <- ito + 1; ito <- ito + ncovs[pis[s]] bil <- nh + which(hmodel$coveffstate==i)[ifrom:ito] for (k in seq_along(bil)) dh[pib,bil[k],] <- - X[,k] * elp[,pis[s]] / psum^2 } } } } dh } msm.initprobs2mat <- function(hmodel, pars, mm, mf, cmodel){ npts <- attr(mf, "npts") ## Convert vector initial state occupancy probs to matrix by patient if (!hmodel$hidden) return(0) if (hmodel$est.initprobs) { initp <- pars[names(pars) %in% c("initpbase","initp","initp0")] initp <- matrix(rep(initp, each=npts), nrow=npts, dimnames=list(NULL, names(pars)[names(pars) %in% c("initpbase","initp","initp0")])) ## Multiply baselines (entering on mnlogit scale) by current covariate ## effects, giving matrix of patient-specific initprobs est <- which(colnames(initp)=="initp") ip <- initp[,est,drop=FALSE] if (hmodel$nicoveffs > 0) { ## cov effs ordered by states (excluding state 1) within covariates coveffs <- pars[names(pars)=="initpcov"] coveffs <- matrix(coveffs, nrow=max(hmodel$nicovs), byrow=TRUE) ip <- ip + as.matrix(mm[,-1,drop=FALSE]) %*% coveffs } initp[,est] <- exp(ip) / (1 + rowSums(exp(ip))) initp[,"initpbase"] <- 1 / (1 + rowSums(exp(ip))) } else if (!is.matrix(hmodel$initprobs)) initp <- matrix(rep(hmodel$initprobs,each=npts),nrow=npts) else initp <- hmodel$initprobs ## If the initial state is fully or partially known for some people but not others ## can specify this by setting both "censor" and "obstrue" at those times ## Adjust initprobs in those cases so it is zero for states outside the censor set ## and reweight other entries to sum to 1. initstate <- mf$"(state)"[!duplicated(mf$"(subject)")] initobstrue <- mf$"(obstrue)"[!duplicated(mf$"(subject)")] initknown <- (initstate %in% cmodel$censor) & (initobstrue != 0) if (cmodel$ncens > 0 && any(initknown)) { for (i in 1:npts) { if (initknown[i]){ cs <- cmodel$states_list[[as.character(initstate[i])]] ip <- initp[i,cs] initp[i,] <- 0 initp[i,cs] <- ip / sum(ip) } } } initp } ## Entry point to C code for calculating the likelihood and related quantities Ccall.msm <- function(params, do.what="lik", msmdata, qmodel, qcmodel, cmodel, hmodel, paramdata) { p <- paramdata pars <- p$allinits pars[p$optpars] <- params pars <- msm.rep.constraints(pars, paramdata, hmodel) agg <- if (!hmodel$hidden && cmodel$ncens==0 && do.what %in% c("lik","deriv","info")) TRUE else FALSE # data as aggregate transition counts, as opposed to individual observations ## Add covariates to hpars and q here. Inverse-transformed to natural scale on exit mm.cov <- if (agg) msmdata$mm.cov.agg else msmdata$mm.cov Q <- msm.add.qcovs(qmodel, pars, mm.cov) DQ <- if (do.what %in% c("deriv","info","deriv.subj","dpmat")) msm.form.dq(qmodel, qcmodel, pars, p, mm.cov) else NULL H <- if (hmodel$hidden) msm.add.hmmcovs(hmodel, pars, msmdata$mm.hcov) else NULL DH <- if (hmodel$hidden && (do.what %in% c("deriv","info","deriv.subj"))) msm.form.dh(hmodel, pars, H, paramdata, msmdata$mm.hcov) else NULL initprobs <- msm.initprobs2mat(hmodel, pars, msmdata$mm.icov, msmdata$mf, cmodel) mf <- msmdata$mf; mf.agg <- msmdata$mf.agg if (is.data.frame(mf.agg)) { nagg <- nrow(mf.agg) mf.agg$"(fromstate)" <- mf.agg$"(fromstate)" - 1 mf.agg$"(tostate)" <- mf.agg$"(tostate)" - 1 } else { nagg <- 0 } ## In R, ordinal variables indexed from 1. In C, these are indexed from 0. firstobs <- c(which(!duplicated(model.extract(mf, "subject"))), nrow(mf)+1) - 1 mf$"(subject)" <- match(mf$"(subject)", unique(mf$"(subject)")) ntrans <- sum(duplicated(model.extract(mf, "subject"))) hmodel$models <- hmodel$models - 1 mf$"(pcomb)" <- mf$"(pcomb)" - 1 npcombs <- length(unique(na.omit(model.extract(mf, "pcomb")))) qmodel$nopt <- if (is.null(DQ)) 0 else dim(DQ)[3] hmodel$nopt <- if (is.null(DH)) 0 else dim(DH)[2] nopt <- qmodel$nopt + hmodel$nopt ## coerce types here to avoid PROTECT faff with doing this in C mfac <- list("(fromstate)" = as.integer(mf.agg$"(fromstate)"), "(tostate)" = as.integer(mf.agg$"(tostate)"), "(timelag)" = as.double(mf.agg$"(timelag)"), "(nocc)" = as.integer(mf.agg$"(nocc)"), "(noccsum)" = as.integer(mf.agg$"(noccsum)"), "(whicha)" = as.integer(mf.agg$"(whicha)"), "(obstype)" = as.integer(mf.agg$"(obstype)")) mfc <- list("(subject)" = as.integer(mf$"(subject)"), "(time)" = as.double(mf$"(time)"), ## supply matrix outcomes to C by row so multivariate outcomes are together ## Also, state data for misclassification HMMs are indexed from 1 not 0 in C "(state)" = as.double(t(mf$"(state)")), "(obstype)" = as.integer(mf$"(obstype)"), "(obstrue)" = as.integer(mf$"(obstrue)"), "(pcomb)" = as.integer(mf$"(pcomb)")) auxdata <- list(nagg=as.integer(nagg),n=as.integer(nrow(mf)),npts=as.integer(attr(mf,"npts")), ntrans=as.integer(ntrans), npcombs=as.integer(npcombs), nout = as.integer(if(is.null(ncol(mf$"(state)"))) 1 else ncol(mf$"(state)")), nliks=as.integer(get("nliks",msm.globals)),firstobs=as.integer(firstobs)) qmodel <- list(nstates=as.integer(qmodel$nstates), npars=as.integer(qmodel$npars), nopt=as.integer(qmodel$nopt), iso=as.integer(qmodel$iso), perm=as.integer(qmodel$perm), qperm=as.integer(qmodel$qperm), expm=as.integer(qmodel$expm)) cmodel <- list(ncens=as.integer(cmodel$ncens), censor=as.integer(cmodel$censor), states=as.integer(cmodel$states), index=as.integer(cmodel$index - 1)) hmodel <- list(hidden=as.integer(hmodel$hidden), mv=as.integer(hmodel$mv), models=as.integer(hmodel$models), totpars=as.integer(hmodel$totpars), firstpar=as.integer(hmodel$firstpar), npars=as.integer(hmodel$npars), nopt=as.integer(hmodel$nopt), ematrix=as.integer(hmodel$ematrix)) pars <- list(Q=as.double(Q),DQ=as.double(DQ),H=as.double(H),DH=as.double(DH), initprobs=as.double(initprobs),nopt=as.integer(nopt)) .Call("msmCEntry", as.integer(match(do.what, .msm.CTASKS) - 1), mfac, mfc, auxdata, qmodel, cmodel, hmodel, pars, PACKAGE="msm") } lik.msm <- function(params, ...) { ## number of likelihood evaluations so far including this one ## used for error message for iffy initial values in HMMs assign("nliks", get("nliks",msm.globals) + 1, envir=msm.globals) args <- list(...) w <- args$msmdata$subject.weights if (!is.null(w)){ lik <- Ccall.msm(params, do.what="lik.subj", ...) sum(w * lik) } else Ccall.msm(params, do.what="lik", ...) } grad.msm <- function(params, ...) { w <- list(...)$msmdata$subject.weights if (!is.null(w)){ deriv <- Ccall.msm(params, do.what="deriv.subj", ...) # npts x npar apply(w * deriv, 2, sum) } else Ccall.msm(params, do.what="deriv", ...) } information.msm <- function(params, ...) { Ccall.msm(params, do.what="info", ...) } ## Convert vector of MLEs into matrices and append them to the model object msm.form.output <- function(x, whichp) { model <- if (whichp=="intens") x$qmodel else x$emodel cmodel <- if (whichp=="intens") x$qcmodel else x$ecmodel p <- x$paramdata Matrices <- MatricesSE <- MatricesL <- MatricesU <- MatricesFixed <- list() basename <- if (whichp=="intens") "logbaseline" else "logitbaseline" fixedpars.logical <- p$constr %in% p$constr[p$fixedpars] covlabels <- make.unique(c("baseline", "logbaseline", cmodel$covlabels))[-(1:2)] for (i in 0:cmodel$ncovs) { matrixname <- if (i==0) basename else covlabels[i] # name of the current output matrix. mat <- t(model$imatrix) # state matrices filled by row, while R fills them by column. if (whichp=="intens") parinds <- if (i==0) which(p$plabs=="qbase") else which(p$plabs=="qcov")[(i-1)*model$npars + 1:model$npars] if (whichp=="misc") parinds <- if (i==0) which(p$plabs=="p") else which(p$plabs=="hcov")[i + cmodel$ncovs*(1:model$npars - 1)] if (any(parinds)) mat[t(model$imatrix)==1] <- p$params[parinds] else mat[mat==1] <- Inf ## if no parinds are "p", then there are off-diag 1s in ematrix mat <- t(mat) dimnames(mat) <- dimnames(model$imatrix) fixed <- array(FALSE, dim=dim(model$imatrix)) if (p$foundse && !p$fixed){ intenscov <- p$covmat[parinds, parinds] intensse <- sqrt(diag(as.matrix(intenscov))) semat <- lmat <- umat <- t(model$imatrix) if (any(parinds)){ semat[t(model$imatrix)==1] <- intensse lmat[t(model$imatrix)==1] <- p$ci[parinds,1] umat[t(model$imatrix)==1] <- p$ci[parinds,2] fixed[t(model$imatrix)==1] <- fixedpars.logical[parinds] } else semat[semat==1] <- lmat[lmat==1] <- umat[umat==1] <- Inf semat <- t(semat); lmat <- t(lmat); umat <- t(umat); fixed <- t(fixed) diag(semat) <- diag(lmat) <- diag(umat) <- 0 for (i in 1:nrow(fixed)){ foff <- fixed[i,-i][model$imatrix[i,-i]==1] fixed[i,i] <- (length(foff)>1) && all(foff) } if (whichp=="misc") fixed[which(x$hmodel$model==match("identity", .msm.HMODELS)),] <- TRUE dimnames(semat) <- dimnames(mat) } else { semat <- lmat <- umat <- NULL } Matrices[[matrixname]] <- mat MatricesSE[[matrixname]] <- semat MatricesL[[matrixname]] <- lmat MatricesU[[matrixname]] <- umat MatricesFixed[[matrixname]] <- fixed } attr(Matrices, "covlabels") <- covlabels attr(Matrices, "covlabels.orig") <- cmodel$covlabels nam <- if(whichp=="intens") "Qmatrices" else "Ematrices" x[[nam]] <- Matrices; x[[paste0(nam, "SE")]] <- MatricesSE; x[[paste0(nam, "L")]] <- MatricesL x[[paste0(nam, "U")]] <- MatricesU; x[[paste0(nam, "Fixed")]] <- MatricesFixed x } ## Format hidden Markov model estimates and CIs msm.form.houtput <- function(hmodel, p, msmdata, cmodel) { hmodel$pars <- p$estimates.t[!(p$plabs %in% c("qbase","qcov","hcov","initp","initpbase","initp0","initpcov"))] hmodel$coveffect <- p$estimates.t[p$plabs == "hcov"] hmodel$fitted <- !p$fixed hmodel$foundse <- p$foundse if (hmodel$nip > 0) { iplabs <- p$plabs[p$plabs %in% c("initp","initp0")] whichst <- which(iplabs == "initp") + 1 # init probs for which states have covs on them (not the zero probs) if (hmodel$foundse) { hmodel$initprobs <- rbind(cbind(p$estimates.t[p$plabs %in% c("initpbase","initp","initp0")], p$ci[p$plabs %in% c("initpbase","initp","initp0"),,drop=FALSE])) rownames(hmodel$initprobs) <- paste("State",1:hmodel$nstates) colnames(hmodel$initprobs) <- c("Estimate", "LCL", "UCL") if (any(hmodel$nicovs > 0)) { covnames <- names(hmodel$icoveffect) hmodel$icoveffect <- cbind(p$estimates.t[p$plabs == "initpcov"], p$ci[p$plabs == "initpcov",,drop=FALSE]) rownames(hmodel$icoveffect) <- paste(covnames, paste("State",whichst), sep=", ") colnames(hmodel$icoveffect) <- c("Estimate", "LCL", "UCL") } } else { hmodel$initprobs <- c(1 - sum(p$estimates.t[p$plabs == "initp"]), p$estimates.t[p$plabs %in% c("initp","initp0")]) names(hmodel$initprobs) <- paste("State", 1:hmodel$nstates) if (any(hmodel$nicovs > 0)) { covnames <- names(hmodel$icoveffect) hmodel$icoveffect <- p$estimates.t[p$plabs == "initpcov"] # names(hmodel$icoveffect) <- paste(covnames, paste("State",2:hmodel$nstates), sep=", ") names(hmodel$icoveffect) <- paste(covnames, paste("State",whichst), sep=", ") } } } hmodel$initpmat <- msm.initprobs2mat(hmodel, p$estimates, msmdata$mm.icov, msmdata$mf, cmodel) if (hmodel$foundse) { hmodel$ci <- p$ci[!(p$plabs %in% c("qbase","qcov","hcov","initpbase","initp","initp0","initpcov")), , drop=FALSE] hmodel$covci <- p$ci[p$plabs %in% c("hcov"), ] } names(hmodel$pars) <- hmodel$plabs hmodel } ## Table of 'transitions': previous state versus current state #' Table of transitions #' #' Calculates a frequency table counting the number of times each pair of #' states were observed in successive observation times. This can be a useful #' way of summarising multi-state data. #' #' If the data are intermittently observed (panel data) this table should not #' be used to decide what transitions should be allowed in the \eqn{Q} matrix, #' which works in continuous time. This function counts the transitions #' between states over a time interval, not in real time. There can be #' observed transitions between state \eqn{r} and \eqn{s} over an interval even #' if \eqn{q_{rs}=0}, because the process may have passed through one or more #' intermediate states in the middle of the interval. #' #' @param state Observed states, assumed to be ordered by time within each #' subject. #' @param subject Subject identification numbers corresponding to \code{state}. #' If not given, all observations are assumed to be on the same subject. #' @param data An optional data frame in which the variables represented by #' \code{subject} and \code{state} can be found. #' @return A frequency table with starting states as rows and finishing states #' as columns. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{crudeinits.msm}} #' @keywords models #' @examples #' #' ## Heart transplant data #' data(cav) #' #' ## 148 deaths from state 1, 48 from state 2 and 55 from state 3. #' statetable.msm(state, PTNUM, data=cav) #' #' #' @export statetable.msm <- function(state, subject, data=NULL) { if(!is.null(data)) { data <- as.data.frame(data) state <- eval(substitute(state), data, parent.frame()) } n <- length(state) if (!is.null(data)) subject <- if(missing(subject)) rep(1,n) else eval(substitute(subject), data, parent.frame()) subject <- match(subject, unique(subject)) prevsubj <- c(NA, subject[1:(n-1)]) previous <- c(NA, state[1:(n-1)]) previous[prevsubj!=subject] <- NA ntrans <- table(previous, state) # or simpler as # ntrans <- table(state[duplicated(subject,fromLast=TRUE)], state[duplicated(subject)]) names(dimnames(ntrans)) <- c("from", "to") ntrans } ## Calculate crude initial values for transition intensities by assuming observations represent the exact transition times #' Calculate crude initial values for transition intensities #' #' Calculates crude initial values for transition intensities by assuming that #' the data represent the exact transition times of the Markov process. #' #' #' Suppose we want a crude estimate of the transition intensity #' \eqn{q_{rs}}{q_rs} from state \eqn{r} to state \eqn{s}. If we observe #' \eqn{n_{rs}}{n_rs} transitions from state \eqn{r} to state \eqn{s}, and a #' total of \eqn{n_r} transitions from state \eqn{r}, then \eqn{q_{rs} / }{q_rs #' / q_rr}\eqn{ q_{rr}}{q_rs / q_rr} can be estimated by \eqn{n_{rs} / #' n_r}{n_rs / n_r}. Then, given a total of \eqn{T_r} years spent in state #' \eqn{r}, the mean sojourn time \eqn{1 / q_{rr}}{1 / q_rr} can be estimated #' as \eqn{T_r / n_r}. Thus, \eqn{n_{rs} / T_r}{n_rs / T_r} is a crude #' estimate of \eqn{q_{rs}}{q_rs}. #' #' If the data do represent the exact transition times of the Markov process, #' then these are the exact maximum likelihood estimates. #' #' Observed transitions which are incompatible with the given \code{qmatrix} #' are ignored. Censored states are ignored. #' #' @param formula A formula giving the vectors containing the observed states #' and the corresponding observation times. For example, #' #' \code{state ~ time} #' #' Observed states should be in the set \code{1, \dots{}, n}, where \code{n} is #' the number of states. Note hidden Markov models are not supported by this #' function. #' @param subject Vector of subject identification numbers for the data #' specified by \code{formula}. If missing, then all observations are assumed #' to be on the same subject. These must be sorted so that all observations on #' the same subject are adjacent. #' @param qmatrix Matrix of indicators for the allowed transitions. An initial #' value will be estimated for each value of qmatrix that is greater than zero. #' Transitions are taken as disallowed for each entry of \code{qmatrix} that is #' 0. #' @param data An optional data frame in which the variables represented by #' \code{subject} and \code{state} can be found. #' @param censor A state, or vector of states, which indicates censoring. See #' \code{\link{msm}}. #' @param censor.states Specifies the underlying states which censored #' observations can represent. See \code{\link{msm}}. #' @return The estimated transition intensity matrix. This can be used as the #' \code{qmatrix} argument to \code{\link{msm}}. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{statetable.msm}} #' @keywords models #' @examples #' #' data(cav) #' twoway4.q <- rbind(c(-0.5, 0.25, 0, 0.25), c(0.166, -0.498, 0.166, 0.166), #' c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)) #' statetable.msm(state, PTNUM, data=cav) #' crudeinits.msm(state ~ years, PTNUM, data=cav, qmatrix=twoway4.q) #' #' @export crudeinits.msm <- function(formula, subject, qmatrix, data=NULL, censor=NULL, censor.states=NULL) { cens <- msm.form.cmodel(censor, censor.states, qmatrix) mf <- model.frame(formula, data=data, na.action=NULL) state <- mf[,1] if (is.factor(state)) state <- as.numeric(as.character(state)) time <- mf[,2] n <- length(state) if (missing(subject)) subject <- rep(1, n) else if (!is.null(data)) subject <- eval(substitute(subject), as.list(data), parent.frame()) if (is.null(subject)) subject <- rep(1, n) notna <- !is.na(subject) & !is.na(time) & !is.na(state) subject <- subject[notna]; time <- time[notna]; state <- state[notna] msm.check.qmatrix(qmatrix) msm.check.state(nrow(qmatrix), state, cens$censor, list(hidden=FALSE)) msm.check.times(time, subject, state) nocens <- (! (state %in% cens$censor) ) state <- state[nocens]; subject <- subject[nocens]; time <- time[nocens] n <- length(state) lastsubj <- !duplicated(subject, fromLast=TRUE) timecontrib <- ifelse(lastsubj, NA, c(time[2:n], 0) - time) tottime <- tapply(timecontrib[!lastsubj], state[!lastsubj], sum) # total time spent in each state ntrans <- statetable.msm(state, subject, data=NULL) # table of transitions nst <- nrow(qmatrix) estmat <- matrix(0, nst, nst) rownames(estmat) <- colnames(estmat) <- paste(1:nst) tab <- sweep(ntrans, 1, tottime, "/") for (i in 1:nst) for (j in 1:nst) if ((paste(i) %in% rownames(tab)) && (paste(j) %in% colnames(tab))) estmat[paste(i), paste(j)] <- tab[paste(i),paste(j)]# ## If no observed transitions but transition is permitted, ## set initial value to small number relative to other initial values estmat[estmat == 0 & qmatrix==1] <- mean(tab[tab>0]) / 100 # estmat[qmatrix == 0] <- 0 # estmat <- msm.fixdiag.qmatrix(estmat) rownames(estmat) <- rownames(qmatrix) colnames(estmat) <- colnames(qmatrix) estmat } ### Construct a model with time-dependent transition intensities. ### Form a new dataset with censored states and extra covariate, and ### form a new censor model, given change times in tcut msm.pci <- function(tcut, mf, qmodel, cmodel, covariates) { if (!is.numeric(tcut)) stop("Expected \"tcut\" to be a numeric vector of change points") ## Make new dataset with censored observations at time cut points ntcut <- length(tcut) npts <- length(unique(model.extract(mf, "subject"))) nextra <- ntcut*npts basenames <- c("(state)","(time)","(subject)","(obstype)","(obstrue)","(obs)","(pci.imp)") covnames <- setdiff(colnames(mf), basenames) extra <- mf[rep(1,nextra),] extra$"(state)" = rep(NA, nextra) extra$"(time)" = rep(tcut, npts) extra$"(subject)" <- rep(unique(model.extract(mf, "subject")), each=ntcut) extra$"(obstype)" = rep(1, nextra) extra$"(obstrue)" = rep(TRUE, nextra) extra$"(obs)" <- NA extra$"(pci.imp)" = 1 extra[, covnames] <- NA mf$"(pci.imp)" <- 0 ## Merge new and old observations new <- rbind(mf, extra) new <- new[order(new$"(subject)", new$"(time)"),] label <- if (cmodel$ncens > 0) max(cmodel$censor)*2 else qmodel$nstates + 1 new$"(state)"[is.na(new$"(state)")] <- label ## Only keep cutpoints within range of each patient's followup mintime <- tapply(mf$"(time)", mf$"(subject)", min) maxtime <- tapply(mf$"(time)", mf$"(subject)", max) ptminmax <- data.frame(subject = names(mintime), mintime, maxtime) new$"(mintime)" <- ptminmax$mintime[match(new$`(subject)`, ptminmax$subject)] new$"(maxtime)" <- ptminmax$maxtime[match(new$`(subject)`, ptminmax$subject)] new <- new[new$"(time)" >= new$"(mintime)" & new$"(time)" <= new$"(maxtime)", ] prevsubj <- c(NA,new$"(subject)"[1:(nrow(new)-1)]); nextsubj <- c(new$"(subject)"[2:nrow(new)], NA) prevtime <- c(NA,new$"(time)"[1:(nrow(new)-1)]); nexttime <- c(new$"(time)"[2:nrow(new)], NA) prevstate <- c(NA,new$"(state)"[1:(nrow(new)-1)]); nextstate <- c(new$"(state)"[2:nrow(new)], NA) ## Don't label imputed states as censored if the next observation has obstype=2, ## because we know the state at the imputed time is the same as the previous observation nextobstype <- c(new$"(obstype)"[2:nrow(new)], NA) ot2 <- new$"(pci.imp)"==1 & nextobstype==2 new$"(state)"[ot2] <- prevstate[ot2] ## Drop imputed observations at times when there was already an observation ## assumes there wasn't already duplicated obs times new <- new[!((new$"(subject)"==prevsubj & new$"(time)"==prevtime & new$"(state)"==label & prevstate!=label) | (new$"(subject)"==nextsubj & new$"(time)"==nexttime & new$"(state)"==label & nextstate!=label)) ,] ## Carry last value forward for other covariates if (length(covnames) > 0) { eind <- which(is.na(new[,covnames[1]]) & new$"(pci.imp)"==1) while(length(eind) > 0){ new[eind,covnames] <- new[eind - 1, covnames] eind <- which(is.na(new[,covnames[1]])) } } ## Check range of cut points if (any(tcut <= min(mf$"(time)"))) warning("Time cut point", if (sum(tcut <= min(mf$"(time)")) > 1) "s " else " ", paste(tcut[tcut<=min(mf$"(time)")],collapse=","), " less than or equal to minimum observed time of ",min(mf$"(time)")) if (any(tcut >= max(mf$"(time)"))) warning("Time cut point", if (sum(tcut >= max(mf$"(time)")) > 1) "s " else " ", paste(tcut[tcut>=max(mf$"(time)")],collapse=","), " greater than or equal to maximum observed time of ",max(mf$"(time)")) tcut <- tcut[tcut > min(mf$"(time)") & tcut < max(mf$"(time)")] ntcut <- length(tcut) if (ntcut==0) res <- NULL # no cut points in range of data, continue with no time-dependent model else { ## Insert new covariate in data representing time period tcovlabel <- "timeperiod" if (any(covnames=="timeperiod")) stop("Cannot have a covariate called \"timeperiod\" if \"pci\" is supplied") tcov <- factor(cut(new$"(time)", c(-Inf,tcut,Inf), right=FALSE)) levs <- levels(tcov) levels(tcov) <- gsub(" ","", levs) # get rid of spaces in e.g. [10, Inf) levels assign(tcovlabel, tcov) new[,tcovlabel] <- tcov ## Add "+ timeperiod" to the Q covariates formula. current.covs <- if(attr(mf,"ncovs")>0) attr(terms(covariates), "term.labels") else NULL covariates <- reformulate(c(current.covs, tcovlabel)) attr(new, "covnames") <- c(attr(mf, "covnames"), "timeperiod") attr(new, "covnames.q") <- c(attr(mf, "covnames.q"), "timeperiod") attr(new, "ncovs") <- attr(mf, "ncovs") + 1 ## New censoring model cmodel$ncens <- cmodel$ncens + 1 cmodel$censor <- c(cmodel$censor, label) cmodel$states <- c(cmodel$states, transient.msm(qmatrix=qmodel$imatrix)) cmodel$index <- if (is.null(cmodel$index)) 1 else cmodel$index cmodel$index <- c(cmodel$index, length(cmodel$states) + 1) res <- list(mf=new, covariates=covariates, cmodel=cmodel, tcut=tcut) } res } msm.check.covlist <- function(covlist, qemodel) { check.numnum <- function(str) length(grep("^[0-9]+-[0-9]+$", str)) == length(str) num <- sapply(names(covlist), check.numnum) if (!all(num)) { badnums <- which(!num) plural1 <- if (length(badnums)>1) "s" else ""; plural2 <- if (length(badnums)>1) "e" else ""; badnames <- paste(paste("\"",names(covlist)[badnums],"\"",sep=""), collapse=",") badnums <- paste(badnums, collapse=",") stop("Name", plural1, " ", badnames, " of \"covariates\" formula", plural2, " ", badnums, " not in format \"number-number\"") } for (i in seq_along(covlist)) if (!inherits(covlist[[i]], "formula")) stop("\"covariates\" should be a formula or list of formulae") trans <- sapply(strsplit(names(covlist), "-"), as.numeric) tm <- if(inherits(qemodel,"msmqmodel")) "transition" else "misclassification" qe <- if(inherits(qemodel,"msmqmodel")) "qmatrix" else "ematrix" imat <- qemodel$imatrix for (i in seq(length.out=ncol(trans))){ if (imat[trans[1,i],trans[2,i]] != 1) stop("covariates on ", names(covlist)[i], " ", tm, " requested, but this is not permitted by the ", qe, ".") } } ## Form indicator matrix for effects that will be fixed to zero when ## "covariates" specified as a list of transition-specific formulae msm.form.cri <- function(covlist, qmodel, mf, mm, tdmodel) { imat <- t(qmodel$imatrix) # order named transitions / misclassifications by row tnames <- paste(col(imat)[imat==1],row(imat)[imat==1],sep="-") covlabs <- colnames(mm)[-1] npars <- qmodel$npars cri <- matrix(0, nrow=npars, ncol=length(covlabs), dimnames = list(tnames, covlabs)) ## time effects specified through "pci" will always be applied to all transitions if (!is.null(tdmodel)){ grep("timeperiod\\[.+,.+\\)", covlabs) tdcovs <- grep("timeperiod\\[.+,.+\\)", covlabs) cri[,tdcovs] <- 1 } sorti <- function(x) { ## converts, e.g. c("b:a:c","d:f","f:e") to c("a:b:c", "d:f", "e:f") sapply(lapply(strsplit(x, ":"), sort), paste, collapse=":") } for (i in 1:npars) { if (tnames[i] %in% names(covlist)) { covlabsi <- colnames(model.matrix(covlist[[tnames[i]]], data=mf))[-1] cri[i, match(sorti(covlabsi), sorti(covlabs))] <- 1 } } cri } ## adapted from stats:::na.omit.data.frame. ignore handling of ## non-atomic, matrix within df #' @noRd na.omit.msmdata <- function(object, hidden=FALSE, misc=FALSE, ...) { omit <- na.find.msmdata(object, hidden=hidden, misc=misc) xx <- object[!omit, , drop = FALSE] if (any(omit > 0L)) { temp <- setNames(seq(omit)[omit], attr(object, "row.names")[omit]) attr(temp, "class") <- "omit" attr(xx, "na.action") <- temp } xx } #' @noRd na.fail.msmdata <- function(object, hidden=FALSE, misc=FALSE, ...) { omit <- na.find.msmdata(object, hidden=hidden, misc=misc) if (any(omit)) stop("Missing values or subjects with only one observation in data") else object } #' @noRd na.find.msmdata <- function(object, hidden=FALSE, misc=FALSE, ...) { subj <- as.character(object[,"(subject)"]) firstobs <- !duplicated(subj) lastobs <- !duplicated(subj, fromLast=TRUE) if (misc) obstrue <- object[,"(obstrue)"] else if (hidden) obstrue <- !is.na(object[,"(obstrue)"]) nm <- names(object) omit <- FALSE for (j in seq_along(object)) { if (is.matrix(object[[j]]) && ncol(object[[j]])==1) object[[j]] <- as.vector(object[[j]]) ## Drop all NAs in time, subject as usual if (nm[j] %in% c("(time)", "(subject)")) omit <- omit | is.na(object[[j]]) if (nm[j] == "(state)") { ## Indicator for missing outcome ## For matrix HMM outcomes ("states"), only drop a row if all columns are NA nas <- if (is.matrix(object[[j]])) apply(object[[j]], 1, function(x)all(is.na(x))) else is.na(object[[j]]) ## Don't drop missing outcomes in HMMs at first obs or if true state known ## since there is information then if (hidden) nas[obstrue | firstobs] <- FALSE omit <- omit | nas } ## Don't drop NAs in obstype at first observation for a subject else if (nm[j]=="(obstype)") omit <- omit | (is.na(object[[j]]) & !firstobs) ## covariates on initial state probs - only drop if NA at initial observation else if (j %in% attr(object, "icovi")) omit <- omit | (is.na(object[[j]]) & firstobs) ## Don't drop NAs in covariates at last observation for a subject ## Note NAs in obstrue should have previously been replaced by zeros in msm.form.obstrue, so could assert for this here. else if (nm[j]!="(obstrue)") omit <- omit | (is.na(object[[j]]) & !lastobs) } ## Drop obs with only one subject remaining after NAs have been omitted if (!hidden){ nobspt <- table(subj[!omit])[subj] omit <- omit | (nobspt==1) } omit } msm.form.mf.agg <- function(x){ mf <- x$data$mf; qmodel <- x$qmodel; hmodel <- x$hmodel; cmodel <- x$cmodel if (!hmodel$hidden && cmodel$ncens==0){ mf.trans <- msm.obs.to.fromto(mf) msm.check.model(mf.trans$"(fromstate)", mf.trans$"(tostate)", mf.trans$"(obs)", mf.trans$"(subject)", mf.trans$"(obstype)", qmodel$qmatrix, cmodel) ## Aggregate over unique from/to/timelag/cov/obstype mf.agg <- msm.aggregate.data(mf.trans) } else mf.agg <- NULL mf.agg } msm.obs.to.fromto <- function(mf) { n <- nrow(mf) subj <- model.extract(mf, "subject") time <- model.extract(mf, "time") state <- model.extract(mf, "state") firstsubj <- !duplicated(subj) lastsubj <- !duplicated(subj, fromLast=TRUE) mf.trans <- mf[!lastsubj,,drop=FALSE] ## retains all covs corresp to the start of the transition names(mf.trans)[names(mf.trans)=="(state)"] <- "(fromstate)" mf.trans$"(tostate)" <- if(is.matrix(state)) state[!firstsubj,,drop=FALSE] else state[!firstsubj] mf.trans$"(obstype)" <- model.extract(mf, "obstype")[!firstsubj] # obstype matched with end of transition mf.trans$"(obs)" <- model.extract(mf, "obs")[!firstsubj] mf.trans$"(timelag)" <- diff(time)[!firstsubj[-1]] ## NOTE not kept constants npts, ncovs, covlabels, covdata, hcovdata, covmeans ## NOTE: orig returned dat$time, dat$obstype.obs of orig length, assume not needed ## NOTE: firstsubj in old only used in msm.aggregate.hmmdata, which is not used mf.trans } ### Aggregate the data by distinct values of time lag, covariate values, from state, to state, observation type ### Result is passed to the C likelihood function (for non-hidden multi-state models) msm.aggregate.data <- function(mf.trans) { n <- nrow(mf.trans) apaste <- do.call("paste", mf.trans[,c("(fromstate)","(tostate)","(timelag)","(obstype)", attr(mf.trans, "covnames"))]) ma <- mf.trans[!duplicated(apaste),] ma <- ma[order(unique(apaste)),] ma$"(nocc)" <- as.numeric(table(apaste)) apaste2 <- ma[,"(timelag)"] if (attr(ma, "ncovs") > 0) apaste2 <- paste(apaste2, do.call("paste", ma[,attr(ma, "covnames"),drop=FALSE])) ## which unique timelag/cov combination each row of aggregated data corresponds to ## lik.c needs this to know when to recalculate the P matrix. ma$"(whicha)" <- match(apaste2, sort(unique(apaste2))) ## for Fisher information: number of obs over timelag/covs starting in ## fromstate, replicated for all tostates. apaste3 <- paste(ma$"(fromstate)", apaste2) ma$"(noccsum)" <- unname(tapply(ma$"(nocc)", apaste2, sum)[apaste3]) ma <- ma[order(apaste2,ma$"(fromstate)",ma$"(tostate)"),] ## NOTE not kept covdata, hcovdata, npts, covlabels, covmeans, nobs, ntrans ma } ### Form indicator for which unique timelag/obstype/cov each observation belongs to ### Used in HMMs/censoring to calculate P matrices efficiently in C msm.form.hmm.agg <- function(mf){ mf.trans <- msm.obs.to.fromto(mf) mf.trans$"(apaste)" <- do.call("paste", mf.trans[,c("(timelag)","(obstype)",attr(mf.trans,"covnames"))]) mf.trans$"(pcomb)" <- match(mf.trans$"(apaste)", unique(mf.trans$"(apaste)")) mf$"(pcomb)" <- NA mf$"(pcomb)"[duplicated(model.extract(mf,"subject"))] <- mf.trans$"(pcomb)" mf$"(pcomb)" } ### FORM DESIGN MATRICES FOR COVARIATE MODELS. msm.form.mm.cov <- function(x){ mm.cov <- model_matrix_wrap(x$covariates, x$data$mf) msm.center.covs(mm.cov, attr(x$data$mf,"covmeans"), x$center) } msm.form.mm.cov.agg <- function(x){ mm.cov.agg <- if (x$hmodel$hidden || (x$cmodel$ncens > 0)) NULL else model.matrix(x$covariates, x$data$mf.agg) msm.center.covs(mm.cov.agg, attr(x$data$mf.agg,"covmeans"), x$center) } msm.form.mm.mcov <- function(x){ mm.mcov <- if (x$emodel$misc) model_matrix_wrap(x$misccovariates, x$data$mf) else NULL msm.center.covs(mm.mcov, attr(x$data$mf,"covmeans"), x$center) } msm.form.mm.hcov <- function(x){ hcov <- x$hcovariates nst <- x$qmodel$nstates if (x$hmodel$hidden) { mm.hcov <- vector(mode="list", length=nst) if (is.null(hcov)) hcov <- rep(list(~1), nst) for (i in seq_len(nst)){ if (is.null(hcov[[i]])) hcov[[i]] <- ~1 mm.hcov[[i]] <- model_matrix_wrap(hcov[[i]], x$data$mf) mm.hcov[[i]] <- msm.center.covs(mm.hcov[[i]], attr(x$data$mf,"covmeans"), x$center) } } else mm.hcov <- NULL mm.hcov } msm.form.mm.icov <- function(x){ if (x$hmodel$hidden) { if (is.null(x$initcovariates)) x$initcovariates <- ~1 mm.icov <- model_matrix_wrap(x$initcovariates, x$data$mf[!duplicated(x$data$mf$"(subject)"),]) } else mm.icov <- NULL msm.center.covs(mm.icov, attr(x$data$mf,"covmeans"), x$center) } model_matrix_wrap <- function(formula, data){ mm <- model.matrix(formula, data) polys <- unlist(attr(mm, "contrasts") == "contr.poly") covlist <- paste(names(polys),collapse=",") if (any(polys)) warning(sprintf("Polynomial factor contrasts (found for covariates \"%s\") not supported in msm output functions. Use treatment contrasts for ordered factors", covlist)) mm } msm.center.covs <- function(covmat, cm, center=TRUE){ if (is.null(covmat)||is.null(cm)) return(covmat) means <- cm[colnames(covmat)] attr(covmat, "means") <- means[-1] if (center) covmat <- sweep(covmat, 2, means) covmat } expand.data <- function(x){ x$data$mf.agg <- msm.form.mf.agg(x) x$data$mm.cov <- msm.form.mm.cov(x) x$data$mm.cov.agg <- msm.form.mm.cov.agg(x) x$data$mm.mcov <- msm.form.mm.mcov(x) x$data$mm.hcov <- msm.form.mm.hcov(x) x$data$mm.icov <- msm.form.mm.icov(x) x$data } msm.form.subject.weights <- function(mf){ subjw <- mf$"(subject.weights)" subj <- mf$"(subject)" if (!is.null(subjw)){ if (!is.numeric(subjw)) stop("`subject.weights` must be numeric") ndistinct <- tapply(subjw, subj, function(x)length(unique(na.omit(x)))) badsubj <- unique(subj)[ndistinct > 1] if (length(badsubj) > 0){ warning(sprintf("subject %s (and perhaps others) has non-unique weights. Using the weight from their first observation", badsubj[1])) } ## form short vector w <- subjw[!duplicated(subj)] } else w <- NULL w } #' Extract original data from \code{msm} objects. #' #' Extract the data from a multi-state model fitted with \code{msm}. #' #' #' @aliases model.frame.msm model.matrix.msm #' @param formula A fitted multi-state model object, as returned by #' \code{\link{msm}}. #' @param agg Return the model frame in the efficient aggregated form used to #' calculate the likelihood internally for non-hidden Markov models. This has #' one row for each unique combination of from-state, to-state, time lag, #' covariate value and observation type. The variable named \code{"(nocc)"} #' counts how many observations of that combination there are in the original #' data. #' @param object A fitted multi-state model object, as returned by #' \code{\link{msm}}. #' @param model \code{"intens"} to return the design matrix for covariates on #' intensities, \code{"misc"} for misclassification probabilities, \code{"hmm"} #' for a general hidden Markov model, and \code{"inits"} for initial state #' probabilities in hidden Markov models. #' @param state State corresponding to the required covariate design matrix in #' a hidden Markov model. #' @param ... Further arguments (not used). #' @return \code{model.frame} returns a data frame with all the original #' variables used for the model fit, with any missing data removed (see #' \code{na.action} in \code{\link{msm}}). The state, time, subject, #' \code{obstype} and \code{obstrue} variables are named \code{"(state)"}, #' \code{"(time)"}, \code{"(subject)"}, \code{"(obstype)"} and #' \code{"(obstrue)"} respectively (note the brackets). A variable called #' \code{"(obs)"} is the observation number from the original data before any #' missing data were dropped. The variable \code{"(pcomb)"} is used for #' computing the likelihood for hidden Markov models, and identifies which #' distinct time difference, \code{obstype} and covariate values (thus which #' distinct interval transition probability matrix) each observation #' corresponds to. #' #' The model frame object has some other useful attributes, including #' \code{"usernames"} giving the user's original names for these variables #' (used for model refitting, e.g. in bootstrapping or cross validation) and #' \code{"covnames"} identifying which ones are covariates. #' #' \code{model.matrix} returns a design matrix for a part of the model that #' includes covariates. The required part is indicated by the \code{"model"} #' argument. #' #' For time-inhomogeneous models fitted with \code{"pci"}, these datasets will #' have imputed observations at each time change point, indicated where the #' variable \code{"(pci.imp)"} in the model frame is 1. The model matrix for #' intensities will have factor contrasts for the \code{timeperiod} covariate. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}}, \code{\link{model.frame}}, #' \code{\link{model.matrix}}. #' @keywords models #' @export model.frame.msm <- function(formula, agg=FALSE, ...){ x <- formula if (agg) x$data$mf.agg else x$data$mf } #' @rdname model.frame.msm #' @export model.matrix.msm <- function(object, model="intens", state=1, ...){ switch(model, intens=msm.form.mm.cov(object), misc=msm.form.mm.mcov(object), hmm=msm.form.mm.hcov(object)[[state]], init=msm.form.mm.icov(object)) } .onLoad <- function(libname, pkgname) { assign("msm.globals", new.env(), envir=parent.env(environment())) assign("nliks", 0, envir=msm.globals) } msm/R/hmm.R0000644000176200001440000004745514527470723012205 0ustar liggesusers### FUNCTIONS FOR HIDDEN MARKOV MODELS IN CONTINUOUS TIME ### WITH ARBITRARY RESPONSE DISTRIBUTION #' @export print.hmmMVdist <- function(x, ...) { cat(sprintf("Multivariate hidden Markov model with %d outcomes:\n", length(x))) for (i in x) print(i) } #' @export print.hmmdist <- function(x, ...) { cat("Hidden Markov model", x$label, "distribution\n\n") pnames <- if(x$label=="categorical") paste("P(",seq(x$pars[1]),")",sep="") else names(x$pars) pars <- if(x$label=="categorical") x$pars[3:(2+x$pars[1])] else x$pars cat("Parameters: ", paste(paste(pnames, pars, sep=" = "), collapse=", ")) cat("\n") } msm.check.hmodel <- function(hmodel, nstates) { if (!is.list(hmodel)) stop("Hidden model should be a list") if (length(hmodel) != nstates) stop("hmodel of length ", length(hmodel), ", expected ", nstates) for (i in hmodel) { if (!inherits(i, "hmmdist")) stop("hmodel should be a list of HMM distribution objects") } } msm.check.hcovariates <- function(hcovariates, qmodel) { if (!is.list(hcovariates)) stop("hcovariates should be a list") if (length(hcovariates) != qmodel$nstates) stop("hcovariates of length ", length(hcovariates), ", expected ", qmodel$nstates) for (i in hcovariates) { if (!is.null(i) ) if (!inherits(i, "formula")) stop("hcovariates should be a list of formulae or NULLs") } } msm.form.hmodel <- function(hmodel, hconstraint=NULL, initprobs=NULL, est.initprobs) { nst <- length(hmodel) if (is.null(initprobs)) initprobs <- if (est.initprobs) rep(1/nst, nst) else c(1, rep(0, nst-1)) else { if (!is.numeric(initprobs)) stop("initprobs should be numeric") if (is.matrix(initprobs)) { if (ncol(initprobs) != nst) stop("initprobs matrix has ", ncol(initprobs), " columns, should be number of states = ", nst) if (est.initprobs) { warning("Not estimating initial state occupancy probabilities since supplied as a matrix") } initprobs <- initprobs / rowSums(initprobs) est.initprobs <- FALSE } else { if (length(initprobs) != nst) stop("initprobs of length ", length(initprobs), ", should be ", nst) initprobs <- initprobs / sum(initprobs) if (est.initprobs && any(initprobs==1)) { est.initprobs <- FALSE warning("Not estimating initial state occupancy probabilities, since some are fixed to 1") } } } nipars <- if (est.initprobs) nst else 0 if (any(sapply(hmodel, inherits, "hmmMVdist"))){ hmod <- msm.form.mvhmodel(hmodel) } else hmod <- msm.form.univhmodel(hmodel) hmod <- c(list(hidden=TRUE, nstates=nst, fitted=FALSE, nipars=nipars, initprobs=initprobs, est.initprobs=est.initprobs, ematrix=FALSE), hmod) class(hmod) <- "hmodel" hmod } msm.form.univhmodel <- function(hmodel){ nst <- length(hmodel) labels <- sapply(hmodel, function(x) x$label) models <- match(labels, .msm.HMODELS) pars <- lapply(hmodel, function(x) x$pars) plabs <- lapply(hmodel, function(x) names(x$pars)) ## where non-misclassified outcome for hmmIdent distribution is not specified, this is ## just the state pars[labels=="identity"][sapply(pars[labels=="identity"], length) == 0] <- which(labels=="identity") plabs[labels=="identity"] <- "which" names(plabs) <- paste("state", 1:nst, sep=".") npars <- sapply(pars, length) parstate <- rep(1:nst, npars) firstpar <- c(0, cumsum(npars)[-nst]) pars <- as.numeric(unlist(pars)) plabs <- unlist(plabs) locpars <- which(plabs == rep(.msm.LOCPARS[labels], npars)) names(pars) <- plabs list(models=models, labels=labels, npars=npars, nout=rep(1, nst), mv=FALSE, parout=rep(1, sum(npars)), totpars=sum(npars), pars=pars, plabs=plabs, parstate=parstate, firstpar=firstpar, locpars=locpars) } ### CHANGES FROM UNIVARIATE TO MULTIVARIATE OUTCOME HMMS ### models should be matrix instead of vector, new dim given by nout (same for labels) ### npars was vector with one for each state. now matrix ### pars was ragged array, mapped to states with parstate. should still be. (same for plabs) ### need new vector parout to map pars to outcomes. ### firstpar, used in C to point to first parameters for a univariate model. was one for each state. now needs to be a matrix msm.form.mvhmodel <- function(hmodel){ nst <- length(hmodel) for (i in seq_along(hmodel)) if (!inherits(hmodel[[i]], "hmmMVdist")) hmodel[[i]] <- list(hmodel[[i]]) nout <- sapply(hmodel, length) models <- labels <- firstpar <- matrix(nrow=max(nout), ncol=nst) npars <- matrix(0, nrow=max(nout), ncol=nst) pars <- plabs <- parstate <- parout <- vector(nst, mode="list") for (i in 1:nst){ labels[1:nout[i],i] <- sapply(hmodel[[i]], function(x) x$label) models[1:nout[i],i] <- match(labels[1:nout[i],i], .msm.HMODELS) pars[[i]] <- lapply(hmodel[[i]], function(x)x$pars) npars[1:nout[i],i] <- sapply(pars[[i]], length) pars[[i]][labels[,i]=="identity" & npars[,i]==0] <- i # TESTME - hmmIdent with no arg: par is the state plabs[[i]][labels[,i]=="identity" & npars[,i]==0] <- "which" plabs[[i]] <- lapply(hmodel[[i]], function(x)names(x$pars)) parstate[[i]] <- rep(i, sum(npars[,i])) parout[[i]] <- rep(1:nout[i], npars[1:nout[i],i]) } firstpar <- matrix(c(0, cumsum(npars)[-length(npars)]), nrow=max(nout), ncol=nst) firstpar[npars==0] <- NA pars <- unlist(pars); plabs <- unlist(plabs); parout <- unlist(parout); parstate <- unlist(parstate) locpars <- which(plabs == rep(.msm.LOCPARS[labels], npars)) names(pars) <- plabs list(models=models, labels=labels, npars=npars, nout=nout, mv=TRUE, totpars=sum(npars), pars=pars, plabs=plabs, parstate=parstate, parout=parout, firstpar=firstpar, locpars=locpars) } ## NOTE removed whichcovh, whichcovh.orig msm.form.hcmodel <- function(hmodel, mm, hcovinits, hconstraint) { nst <- hmodel$nstates ncovs <- if (is.null(mm)) rep(0, nst) else sapply(mm, function(x) {ncol(x)-1}) ncovs2 <- rep(rep(0, nst), hmodel$npars) ncovs2[hmodel$locpars] <- ncovs[hmodel$parstate[hmodel$locpars]] coveffstate <- rep(1:nst, tapply(ncovs2, hmodel$parstate, sum)) if (is.null(hcovinits)){ coveffect <- rep(0, sum(ncovs2)) } else { if (!(sum(ncovs2) == length(unlist(hcovinits)))) { warning("Initial values for hidden covariate effects do not match numbers of covariates, ignoring") coveffect <- rep(0, sum(ncovs2)) } else coveffect <- unlist(hcovinits) if (!is.numeric(coveffect)) { warning("hcovinits should be numeric") coveffect <- rep(0, sum(ncovs2)) } } covlabels <- lapply(mm, function(x) colnames(x)[-1]) covlabels <- unlist(covlabels[hmodel$parstate[hmodel$locpars]]) names(coveffect) <- covlabels hcmod <- list(ncovs=ncovs2, coveffect=coveffect, covlabels=covlabels, coveffstate=coveffstate, ncoveffs=length(coveffect)) hmodel <- c(hmodel, hcmod) hmodel$plabs[hmodel$plabs=="hcov"] <- paste("hcov.",covlabels,sep="") class(hmodel) <- "hmodel" hmodel } ### NOTE whichcovi removed msm.form.icmodel <- function(hmodel, mm, icovinits) { nst <- hmodel$nstates nicovs <- ncol(mm) - 1 nicovs <- rep(nicovs, nst-1) if (!is.matrix(hmodel$initprobs)) nicovs[hmodel$initprobs[-1] == 0] <- 0 # don't estimate cov effects on probs which are fixed to zero if (is.null(icovinits)) icoveffect <- rep(0, sum(nicovs)) else { icoveffect <- unlist(icovinits) if (!(length(icoveffect) == sum(nicovs))) { warning("Initial values for initial state covariate effects do not match numbers of covariates, ignoring") icoveffect <- rep(0, sum(nicovs)) } else if (!is.numeric(icoveffect)) { warning("icovinits should be numeric") icoveffect <- rep(0, sum(nicovs)) } } names(icoveffect) <- rep(colnames(mm)[-1], each=sum(nicovs>0)) icmod <- list(nicovs=nicovs, icoveffect=icoveffect, nicoveffs=length(icoveffect)) hmodel <- c(hmodel, icmod) class(hmodel) <- "hmodel" hmodel } ## Convert old-style misclassification model specification to a new-style HMM with categorical response msm.emodel2hmodel <- function(emodel, qmodel) { nst <- qmodel$nstates if (emodel$misc) { hidden <- TRUE nepars <- rowSums(emodel$imatrix) models <- ifelse(apply(emodel$ematrix,1,function(x)any(x==1)), 2, 1) npars <- ifelse(models==1, 2 + nst, 1) pars <- plabs <- vector(nst, mode="list") parstate <- rep(1:nst, npars) names(pars) <- names(plabs) <- paste("state", 1:nst, sep=".") for (i in seq(nst)) { if (models[i]==1) { ppars <- emodel$ematrix[i,] plab <- rep("p", nst) plab[ppars==0] <- "p0" plab[i] <- "pbase" plabs[[i]] <- c("ncats", "basecat", plab) ## Baseline category is the probability of no misclassification (diagonal of ematrix) pars[[i]] <- c(nst, i, ppars) } else { plabs[[i]] <- "which" pars[[i]] <- which(emodel$ematrix[i,]==1) } } firstpar <- c(0, cumsum(npars)[-qmodel$nstates]) pars <- unlist(pars) plabs <- unlist(plabs) names(pars) <- plabs labels <- .msm.HMODELS[models] locpars <- which(plabs == rep(.msm.LOCPARS[labels], npars)) hmod <- list(hidden=TRUE, fitted=FALSE, nstates=nst, models=models, labels=labels, ematrix=TRUE, ## remember if obtained from ematrix, since could change meaning of obstrue nout=rep(1, nst), mv=FALSE, npars=npars, totpars=sum(npars), locpars=locpars, pars=pars, plabs=plabs, parstate=parstate, parout=rep(1,sum(npars)), firstpar=firstpar, nipars=emodel$nipars, initprobs=emodel$initprobs, est.initprobs=emodel$est.initprobs) hmod$constr <- msm.econstr2hconstr(emodel$constr, hmod) } else { hmod <- list(hidden=FALSE, fitted=FALSE, ematrix=FALSE, models=rep(0, qmodel$nstates), npars=0, ndpars=0) } class(hmod) <- "hmodel" hmod } msm.misccov2hcov <- function(misccovariates, emodel) { nst <- nrow(emodel$imatrix) whichst <- rep(1:nst, rowSums(emodel$imatrix)) hcov <- vector(nst, mode="list") for (i in 1:nst) { if (!any(whichst==i)) hcov[[i]] <- ~ 1 else hcov[[i]] <- misccovariates } hcov } msm.misccovinits2hcovinits <- function(misccovinits, hcovariates, emodel, ecmodel) { nst <- nrow(emodel$imatrix) whichst <- rep(1:nst, rowSums(emodel$imatrix)) hcovinits <- vector(nst, mode="list") for (i in 1:nst) { if (is.null(misccovinits)) hcovinits[[i]] <- rep(0, ecmodel$ncovs * rowSums(emodel$imatrix)[i]) else if (!any(whichst==i)) hcovinits[[i]] <- numeric(0) else hcovinits[[i]] <- as.vector(t(sapply(misccovinits, function(x)x[whichst==i]))) } hcovinits } msm.econstr2hconstr <- function(econstr, hmodel) { constr <- seq(length.out=hmodel$totpars) for (i in unique(econstr)) { constr[hmodel$plabs == "p"][econstr == i] <- min(constr[hmodel$plabs == "p"][econstr == i]) } match(constr, unique(constr)) } #' @export print.hmodel <- function(x, ...) { ci <- (x$fitted && x$foundse) cols <- if (ci) c("Estimate","LCL","UCL") else ("") if (!x$hidden) cat("Non-hidden Markov model\n") else { cat("Hidden Markov model, ") nst <- x$nstates cat(nst, "states\n") if (x$est.initprobs){ cat("Initial state occupancy probabilities: ") if (x$nipars > 0) { cat("\n") print(x$initprobs) cat("\n") if (any(x$nicovs > 0)) { cat("Covariates on log odds of initial states relative to state 1\n") print(x$icoveffect) } cat("\n") } else cat(paste(x$initprobs, collapse=","), "\n\n") } for (i in 1:nst) { if (x$mv){ cat("State", i, "\n") for (j in 1:x$nout[i]){ cat("Outcome", j, "-", x$labels[j,i], "distribution\n") if (x$labels[j,i]=="categorical") pars <- print_hmmcat(x, i, j, mv=TRUE) ## TESTME else { inds <- x$parstate==i & x$parout==j pars <- as.matrix(x$pars[inds]) if (ci) pars <- cbind(pars, matrix(x$ci[inds,], ncol=2)) dimnames(pars) <- list(x$plabs[inds], cols) } ## covs not supported for the moment print(pars) cat("\n") } } else { cat("State", i, "-", x$labels[i], "distribution\n") cat("Parameters: \n") if (x$label[i]=="categorical") pars <- print_hmmcat(x, i) else { pars <- as.matrix(x$pars[x$parstate==i]) if (ci) pars <- cbind(pars, matrix(x$ci[x$parstate==i ,], ncol=2)) dimnames(pars) <- list(x$plabs[x$parstate==i], cols) } if (any(x$ncovs[x$parstate==i] > 0)){ coveffs <- as.matrix(x$coveffect[x$coveffstate==i]) if (ci) coveffs <- cbind(coveffs, matrix(x$covci[x$coveffstate==i,], ncol=2)) rownames(coveffs) <- x$covlabels[x$coveffstate==i] pars <- rbind(pars, coveffs) } print(pars) cat("\n") } } } } print_hmmcat <- function(x, i, j=NULL, mv=FALSE) { inds <- if (mv) x$parstate==i & x$parout==j else x$parstate==i pars <- x$pars[inds] res <- matrix(pars[3:(2+pars[1])], ncol=1) rownames(res) <- paste("P(",seq(length.out=pars[1]),")",sep="") if (x$fitted && x$foundse) { ci <- matrix(x$ci[inds,], ncol=2) res <- cbind(res, ci[3:(2+pars[1]),]) colnames(res) <- c("Estimate","LCL","UCL") } else colnames(res) <- "prob" res } msm.form.hconstraint <- function(constraint, hmodel) { constr <- seq(length=hmodel$totpars) for (con in names(constraint)) { if ( ! (con %in% c(hmodel$plabs, hmodel$covlabels))) stop("parameter \"", con, "\" in hconstraint unknown") if (con %in% hmodel$plabs) { tc <- constraint[[con]] np <- length(tc) if (np != sum(hmodel$plabs==con)) stop("constraint for \"", con, "\" of length ", np, ", should be ", sum(hmodel$plabs==con)) for (i in unique(tc)) constr[hmodel$plabs == con][tc == i] <- min(constr[hmodel$plabs == con][tc == i]) } } match(constr, unique(constr)) } msm.form.hcovconstraint <- function(constraint, hmodel) { constr <- seq(length.out=hmodel$ncoveffs) for (con in names(constraint)) { if ( ! (con %in% c(hmodel$plabs, hmodel$covlabels))) stop("parameter \"", con, "\" in hconstraint unknown") if (con %in% hmodel$covlabels) { tc <- constraint[[con]] np <- length(tc) if (np != sum(hmodel$covlabels==con)) stop("constraint for \"", con, "\" of length ", np, ", should be ", sum(hmodel$covlabels==con)) for (i in unique(tc)) constr[hmodel$covlabels == con][tc == i] <- min(constr[hmodel$covlabels == con][tc == i]) } } match(constr, unique(constr)) } ## User-supplied range constraints on HMM parameters. msm.form.hranges <- function(ranges, hmodel) { hranges <- .msm.PARRANGES[hmodel$plabs,] if (hmodel$ncoveffs>0) { hcovranges <- matrix(rep(c(-Inf, Inf), hmodel$ncoveffs), nrow=hmodel$ncoveffs, byrow=TRUE) rownames(hcovranges) <- hmodel$covlabels hranges <- rbind(hranges, hcovranges) } if (!is.null(ranges)) { if (!is.list(ranges)) stop("expected \"hranges\" to be a list") for (i in names(ranges)) { if ( ! (i %in% c(hmodel$plabs, hmodel$covlabels))) stop("parameter \"", i, "\" in \"hranges\" unknown") ran.default <- hranges[rownames(hranges)==i,,drop=FALSE] ran.user <- do.call("cbind", ranges[[i]]) for (j in seq_len(nrow(ran.user))) { if (ran.user[j,1] < ran.default[j,1]) { warning("User-supplied lower bound of ",ran.user[j,1]," for ", i, " less than theoretical minimum of ", ran.default[j,1], ", ignoring") ran.user[j,1] <- ran.default[j,1] } if (ran.user[j,2] > ran.default[j,2]) { warning("User-supplied upper bound of ",ran.user[j,2]," for ", i, " less than theoretical maximum of ", ran.default[j,2], ", ignoring") ran.user[j,2] <- ran.default[j,2] } hranges[which(rownames(hranges)==i)[j],] <- ran.user[j,] } } } ## ideally should be strict here if estimated, but allow inits on Inf boundary if not estimated. for (i in seq_along(hmodel$pars)){ if (!in.range(hmodel$pars[i], hranges[i,], strict=FALSE)) stop("Initial value ", hmodel$pars[i], " of parameter \"", hmodel$plabs[i], "\" outside allowed range ", "[", paste(hranges[i,], collapse=","), "]") } hranges } in.range <- function(x, interval, strict=FALSE) { if (!is.numeric(interval) || length(interval)!=2) stop("interval should be a numeric vector of length 2") if (!is.numeric(x)) stop("x should be numeric") if (strict) ( (x > interval[1]) & (x < interval[2]) ) else ( (x >= interval[1]) & (x <= interval[2]) ) } msm.form.initprobs <- function(hmodel, initprobs, mf){ npts <- attr(mf,"npts") if (!is.null(hmodel$phase.states) && is.null(initprobs)) { hmodel$initprobs <- matrix(0, nrow=npts, ncol=hmodel$nstates) initstate <- mf$"(state)"[!duplicated(mf$"(subject)")] hmodel$initprobs[cbind(1:npts, match(initstate, hmodel$pars))] <- 1 if (hmodel$est.initprobs) warning("Not estimating initial state occupancy probabilities: assuming everyone starts at first phase") hmodel$est.initprobs <- FALSE } if (!hmodel$est.initprobs) { if (is.matrix(hmodel$initprobs)) { if (nrow(hmodel$initprobs) != npts) stop("initial state occupancy probability should have ", npts, " (number of subjects) rows if supplied as a matrix, found ",nrow(hmodel$initprobs)) } } hmodel } msm/R/tidy.R0000644000176200001440000003622314654466561012372 0ustar liggesusers##' Tidy the parameter estimates from an msm model ##' ##' @param x Object returned by \code{\link{msm}}, representing a fitted ##' multi-state model. ##' ##' @param ... Other arguments (currently unused). ##' ##' @return A "tibble", with one row for each parameter and the following ##' columns describing the parameter. ##' ##' * `parclass`: Class of parameters: `intens` (transition intensities), `hr` ##' (hazard ratios representing effects of covariates on intensities), and ##' their transformed versions `logintens` (log intensities) and `loghr` (log ##' hazard ratios). ##' ##' For "misclassification" models fitted with the `ematrix` argument to `msm`, ##' other classes of parameters include `misc` (misclassification ##' probabilities), `logitmisc` (misclassification log odds), `or_misc` and ##' `logor_misc` (effects of covariates on misclassification probabilities, as ##' odds ratios or log odds ratios, with the first state as the reference ##' category). ##' ##' For hidden Markov models fitted with the `hmodel` argument to `msm`, the ##' parameter class called `hmm` comprises the parameters of the distributions ##' of the outcome conditionally on the hidden state. Covariates on the ##' location parameter of these distributions are included in class `hmmcov`. ##' If initial state occupancy probabilities are estimated, these are included ##' in class `initp` (or `initlogodds` for the log odds transforms of these), ##' and any covariates on these probabilities are included in class `initpcov`. ##' ##' * `state`: Starting state of the transition for transition intensities, and ##' true state for misclassification probabilities or hidden Markov model parameters. ##' ##' * `tostate`: Ending state of the transition for transition intensities, and ##' observed state for misclassification probabilities ##' ##' * `term`: Name of the covariate for covariate effects, or "baseline" for the ##' baseline intensity or analogous parameter value. ##' Note that the "baseline" parameters are the parameters with covariates ##' set to their mean values in the data (stored in e.g. `x$qcmodel$covmeans`), ##' unless `msm` was called with `center=FALSE`. ##' ##' * `estimate`, `std.error`, `conf.low`, `conf.high`: Parameter estimate, ##' standard error, and lower and upper confidence limits. ##' ##' * `statistic`, `p.value`: For covariate effects, the Z-test statistic and p-value ##' for a test of the null hypothesis that the covariate effect is zero, based ##' on the estimate and standard error. ##' ##' @md ##' @importFrom generics tidy ##' @importFrom tibble tibble ##' ##' @export tidy.msm <- function(x, ...){ tidynames <- c("parclass","state","tostate","term","estimate") tidycinames <- c("std.error","conf.low","conf.high") qkeep <- which(x$qmodel$imatrix==1, arr.ind=TRUE) res <- tidy_mats(x$Qmatrices, qkeep) res$parclass <- ifelse(res$term=="baseline", "intens", ifelse(res$term=="logbaseline", "logintens", "loghr")) ## workaround if any covariates named "baseline" res$term <- map_covnames(res$term, from=attr(x$Qmatrices,"covlabels"), to=attr(x$Qmatrices,"covlabels.orig")) if (x$foundse){ xnames <- c("QmatricesSE", "QmatricesL", "QmatricesU") for (i in seq_along(xnames)){ res[[tidycinames[i]]] <- tidy_mats(x[[xnames[i]]], qkeep)$estimate } tidynames <- c(tidynames, tidycinames) } ## convert log hazard ratios to hazard ratios coveffs <- res[res$parclass == "loghr",] if (nrow(coveffs) > 0){ coveffs$parclass <- "hr" coveffs$std.error <- exp(coveffs$estimate) * coveffs$std.error coveffs$estimate <- exp(coveffs$estimate) if (x$foundse){ for (i in c("conf.low","conf.high")) coveffs[[i]] <- exp(coveffs[[i]]) } res <- rbind(res, coveffs) } if (x$emodel$misc){ qkeep <- which(x$emodel$imatrix==1, arr.ind=TRUE) rese <- tidy_mats(x$Ematrices, qkeep) rese$parclass <- ifelse(rese$term=="baseline", "misc", ifelse(rese$term=="logbaseline", "logitmisc", "logor_misc")) rese$term <- map_covnames(rese$term, from=attr(x$Ematrices,"covlabels"), to=attr(x$Ematrices,"covlabels.orig")) if (x$foundse){ xnames <- c("EmatricesSE", "EmatricesL", "EmatricesU") for (i in seq_along(xnames)){ rese[[tidycinames[i]]] <- tidy_mats(x[[xnames[i]]], qkeep)$estimate } } ## convert log odds ratios to odds ratios coveffs <- rese[rese$parclass == "logor_misc",] if (nrow(coveffs) > 0){ coveffs$parclass <- "or_misc" coveffs$estimate <- exp(coveffs$estimate) if (x$foundse){ coveffs$std.error <- coveffs$estimate * coveffs$std.error for (i in c("conf.low","conf.high")) coveffs[[i]] <- exp(coveffs[[i]]) } rese <- rbind(rese, coveffs) } res <- rbind(res, rese) } res$term[res$term=="logbaseline"] <- "baseline" if (x$hmodel$hidden && !x$emodel$misc) { resh <- tidy.hmodel(x) resh$tostate <- NA res <- rbind(res, resh[,colnames(res)]) } res <- tibble::tibble(res)[tidynames] ## test statistics and p-values covs <- which(res$parclass %in% c("loghr","logor_misc","hmmcov","initpcov")) if (length(covs) > 0 && x$foundse){ res$statistic <- res$p.value <- NA res$statistic[covs] <- res$estimate[covs] / res$std.error[covs] res$p.value[covs] <- 2 * pnorm(-abs(res$statistic[covs])) res$statistic[res$parclass %in% c("hr","or_misc")] <- res$statistic[res$parclass %in% c("loghr","logor_misc")] res$p.value[res$parclass %in% c("hr","or_misc")] <- res$p.value[res$parclass %in% c("loghr","logor_misc")] } res # perhaps this could be an argument # statenames <- rownames(x$qmodel$imatrix) # if (!is.null(statenames)){ # res$fromname <- statenames[res$from] # res$toname <- statenames[res$to] # res$state <- statenames[res$state] # } } map_covnames <- function(x, from, to){ if (!is.null(from)){ for (i in seq_along(from)){ x[x==from[i]] <- to[i] } } x } ## Tidier for a list of matrices with one component for the baseline intensity ## matrix and further components for covariate effects on this tidy_mats <- function(x, qkeep=NULL){ if (is.null(qkeep)){ qkeep <- which(x$estimates > 0, arr.ind=TRUE) } colnames(qkeep) <- c("state","tostate") resq <- lapply(x, function(y){ cbind(data.frame(res=unclass(y)[qkeep]), qkeep) }) for (i in seq_along(resq)){ resq[[i]]$term <- names(resq)[i] } resq <- do.call("rbind", resq) rownames(resq) <- NULL names(resq)[names(resq)=="res"] <- "estimate" resq } ##' Tidy the output of pmatrix.msm and similar functions ##' ##' This is the method for the generic `tidy` function that is ##' used for tidying the output of \code{\link{qmatrix.msm}}, \code{\link{pmatrix.msm}}, ##' \code{\link{ematrix.msm}}, \code{\link{pnext.msm}} or \code{\link{ppass.msm}}. ##' This should be called as ##' \code{tidy()}, not \code{tidy.msm.est()} or \code{tidy.qmatrix()} or anything else. ##' ##' @param x Output of \code{\link{qmatrix.msm}}, \code{\link{pmatrix.msm}}, ##' \code{\link{ematrix.msm}}, \code{\link{pnext.msm}} or \code{\link{ppass.msm}}, ##' which all return objects of class \code{"msm.est"}. ##' ##' @param ... Further arguments (unused). ##' ##' @export tidy.msm.est <- function(x, ...){ if (is.matrix(x)) x <- list(estimates=x) # no CIs available tm <- tidy_mats(x) oldnames <- c("estimates","SE","L","U") tidynames <- c("estimate","std.error","conf.low","conf.high") for (i in seq_along(oldnames)){ tm$term[tm$term==oldnames[i]] <- tidynames[i] } res <- reshape(tm, direction="wide", idvar=c("state","tostate"), timevar="term") names(res) <- gsub("estimate\\.","",names(res)) statenames <- rownames(x$estimates) if (!is.null(statenames)){ res$statename <- statenames[res$state] res$tostatename <- statenames[res$tostate] } tibble::tibble(res) } ## Tidier for a "hmodel" object, which is one of the components of a "msm" object ## for a hidden Markov model. #' @noRd tidy.hmodel <- function(x, ...){ xh <- x$hmodel p <- x$paramdata res <- data.frame(parclass = "hmm", state = xh$parstate, term = xh$plabs, estimate = xh$pars) if (x$foundse){ hbasepars <- which(!p$plabs %in% c("qbase","qcov","hcov","initpbase","initp","initp0","initpcov")) hse <- sqrt(diag(x$covmat[hbasepars,hbasepars])) np <- length(hbasepars) hse <- dgexpit(p$params[hbasepars], # delta method xh$ranges[1:np,"lower"], xh$ranges[1:np,"upper"]) * hse res$std.error <- hse cis <- setNames(as.data.frame(xh$ci), c("conf.low","conf.high")) res <- cbind(res, cis) } hcovpars <- which(p$plabs == "hcov") if (length(hcovpars) > 0){ ce <- data.frame(parclass = "hmmcov", state = xh$coveffstate, term = xh$covlabels, estimate = xh$coveffect) if (x$foundse){ hcovse <- sqrt(diag(x$covmat[hcovpars,hcovpars])) ce$std.error <- hcovse cis <- setNames(as.data.frame(xh$covci), c("conf.low","conf.high")) ce <- cbind(ce, cis) } res <- rbind(res, ce) } if (xh$est.initprobs){ est <- if (x$foundse) xh$initprobs[,"Estimate"] else xh$initprobs initp <- data.frame(parclass = "initp", state = 1:x$hmodel$nstates, term = "baseline", estimate = est) iloest <- p$params[p$plabs=="initp"] ilose <- sqrt(diag(p$covmat))[p$plabs=="initp"] initlo <- data.frame(parclass = "initlogodds", state = 2:x$hmodel$nstates, term = "baseline", estimate = iloest) if (x$foundse){ initp <- cbind(initp, data.frame( std.error = NA, conf.low = xh$initprobs[,"LCL"], conf.high = xh$initprobs[,"UCL"])) initlo <- cbind(initlo, data.frame( std.error = ilose, conf.low = iloest - qnorm(0.975) * ilose, conf.high = iloest + qnorm(0.975) * ilose)) } res <- rbind(res, initp, initlo) if (xh$nicoveffs > 0){ icest <- if (x$foundse) xh$icoveffect[,"Estimate"] else xh$icoveffect icovlabels <- names(icest) ic <- data.frame(parclass = "initpcov", state = 2:xh$nstates, term = icovlabels, estimate = icest) if (x$foundse){ cis <- data.frame( std.error = (xh$icoveffect[,"UCL"] - xh$icoveffect[,"LCL"])/(2*qnorm(0.975)), conf.low = xh$icoveffect[,"LCL"], conf.high = xh$icoveffect[,"UCL"]) ic <- cbind(ic, cis) } res <- rbind(res, ic) } } if (x$foundse) res$std.error[is.na(res$conf.low)] <- NA tibble::tibble(res) } #' Tidy the output of prevalence.msm #' #' Note this should be called as \code{tidy()} not \code{tidy.msm.prevalence()} or anything else, as this is #' a method for the generic \code{tidy()} function. #' #' @param x Output of \code{\link{prevalence.msm}}. #' #' @return A tibble with one row per combination of output type (count or percentage) #' and state, and columns for observed value, expected value and confidence #' limits for the expected value (if available). #' #' @param ... Further arguments (unused). #' #' @export tidy.msm.prevalence <- function(x, ...){ if (is.list(x$Expected)) tidy_msm_prevalence_ci(x,...) else tidy_msm_prevalence_noci(x,...) } tidy_msm_prevalence_noci <- function(x,...){ for (i in c("Observed percentages","Expected percentages")){ x[[i]] <- cbind(x[[i]], "Total" = 100) } for (i in seq_along(x)) { x[[i]] <- cbind(output = names(x[i]), time = as.numeric(rownames(x[[i]])), as.data.frame(x[[i]])) } x <- do.call(rbind, x) x$Total <- NULL x <- reshape(x, direction="long", varying=3:ncol(x), v.names="prevalence", timevar="state", idvar=c("output","time")) tx <- tibble::tibble(x) txobs <- tx[tx$output %in% c("Observed","Observed percentages"),] txexp <- tx[tx$output %in% c("Expected","Expected percentages"),] tx <- txobs names(tx)[names(tx)=="prevalence"] <- "observed" tx$expected <- txexp$prevalence tx$output[tx$output=="Observed"] <- "count" tx$output[tx$output=="Observed percentages"] <- "percentage" tx } tidy_msm_prevalence_ci <- function(x,...){ nt <- dim(x$Expected$ci)[2] nst <- ncol(x$Expected$estimates)-1 ecis <- rbind(cbind(summary="observed", unname(as.data.frame(x$Observed[,-nt]))), cbind(summary="expected", unname(as.data.frame(x$Expected$estimates[,-nt]))), cbind(summary="conf.low", unname(as.data.frame(x$Expected$ci[,-nt,1]))), cbind(summary="conf.high", unname(as.data.frame(x$Expected$ci[,-nt,2])))) ecis$output <- "count" epcis <- rbind(cbind(summary="observed", unname(as.data.frame(x$Observed[,-nt]))), cbind(summary="expected", unname(as.data.frame(x$`Expected percentages`$estimates[,-nt]))), cbind(summary="conf.lower", unname(as.data.frame(x$`Expected percentages`$ci[,,1]))), cbind(summary="conf.high", unname(as.data.frame(x$`Expected percentages`$ci[,,2])))) epcis$output <- "percentage" ecis <- rbind(ecis, epcis) ecis$time <- as.numeric(rownames(x$Expected$estimates)) cilong <- reshape(ecis, direction="long", varying=1 + 1:nst, v.names="est", timevar="state", idvar=c("output","time","summary")) ciwide <- reshape(cilong, direction="wide", idvar=c("output","time","state"), timevar="summary", v.names="est") rownames(ciwide) <- NULL names(ciwide)[4:7] <- gsub("est.","", names(ciwide)[4:7]) tibble::tibble(ciwide) } #' Tidy the output of totlos.msm and similar functions #' #' Note this should be called as \code{tidy()} not \code{tidy.msm.totlos()} or anything else, as this is #' a method for the generic \code{tidy()} function. #' #' @param x Output of \code{\link{totlos.msm}}, \code{\link{envisits.msm}} #' or \code{\link{efpt.msm}}, which return objects of class \code{"msm.estbystate"}. #' #' @return A tibble with one row per state, and columns for the estimate, and #' confidence intervals if available. #' #' @param ... Further arguments (unused). #' #' @export tidy.msm.estbystate <- function(x, ...){ if (!is.matrix(x)) x <- matrix(x, nrow=1) x <- as.data.frame(t(x)) names(x) <- if(ncol(x)==1) "estimate" else c("estimate","conf.low","conf.high") x <- cbind(state = 1:nrow(x), x) tibble::tibble(x) } msm/R/utils.R0000644000176200001440000000532014534425544012544 0ustar liggesusers### msm PACKAGE ### USEFUL FUNCTIONS NOT SPECIFIC TO MULTI-STATE MODELS ## Tests for a valid continuous-time Markov model transition intensity matrix is.qmatrix <- function(Q) { Q <- unclass(Q) Q2 <- Q; diag(Q2) <- 0 isTRUE(all.equal(-diag(Q), rowSums(Q2))) && isTRUE(all(diag(Q)<=0)) && isTRUE(all(Q2>=0)) } ## Transform vector of parameters constrained on [a, b] to real line. ## Vectorised. a=-Inf or b=Inf represent unbounded below or above. glogit <- function(x, a, b) { if (is.null(a)) a <- -Inf if (is.null(b)) b <- Inf ret <- numeric(length(x)) attributes(ret) <- attributes(x) nn <- is.infinite(a) & is.infinite(b) nb <- is.infinite(a) & is.finite(b) an <- is.finite(a) & is.infinite(b) ab <- is.finite(a) & is.finite(b) ret[nn] <- x[nn] ret[nb] <- log(b[nb] - x[nb]) ret[an] <- log(x[an] - a[an]) ret[ab] <- log((x[ab] - a[ab]) / (b[ab] - x[ab])) ret } dglogit <- function(x, a, b) { if (is.null(a)) a <- -Inf if (is.null(b)) b <- Inf ret <- numeric(length(x)) attributes(ret) <- attributes(x) nn <- is.infinite(a) & is.infinite(b) nb <- is.infinite(a) & is.finite(b) an <- is.finite(a) & is.infinite(b) ab <- is.finite(a) & is.finite(b) ret[nn] <- 1 ret[nb] <- -1 / (b[nb] - x[nb]) ret[an] <- 1 / (x[an] - a[an]) ret[ab] <- 1/(x[ab] - a[ab]) + 1/(b[ab] - x[ab]) ret } # d/dx log( (x-a)/(b-x) ) = (b-x)/(x-a) * (1/(b-x) + (x-a)/(b-x)^2) # = 1/(x-a) + 1/(b-x) # = d/dx log(x-a) - log(b-x) ## Inverse transform vector of parameters constrained on [a, b]: back ## from real line to constrained scale. Vectorised. a=-Inf or b=Inf ## represent unbounded below or above. gexpit <- function(x, a, b) { if (is.null(a)) a <- -Inf if (is.null(b)) b <- Inf ret <- numeric(length(x)) attributes(ret) <- attributes(x) nn <- is.infinite(a) & is.infinite(b) nb <- is.infinite(a) & is.finite(b) an <- is.finite(a) & is.infinite(b) ab <- is.finite(a) & is.finite(b) ret[nn] <- x[nn] ret[nb] <- b[nb] - exp(x[nb]) ret[an] <- exp(x[an]) + a[an] ret[ab] <- (b[ab]*exp(x[ab]) + a[ab]) / (1 + exp(x[ab])) ret } ## Derivative of gexpit w.r.t. x dgexpit <- function(x, a, b) { if (is.null(a)) a <- -Inf if (is.null(b)) b <- Inf ret <- numeric(length(x)) attributes(ret) <- attributes(x) nn <- is.infinite(a) & is.infinite(b) nb <- is.infinite(a) & is.finite(b) an <- is.finite(a) & is.infinite(b) ab <- is.finite(a) & is.finite(b) ret[nn] <- 1 ret[nb] <- - exp(x[nb]) ret[an] <- exp(x[an]) ret[ab] <- (b[ab] - a[ab])*exp(x[ab]) / (1 + exp(x[ab]))^2 ret } msm/R/phase.R0000644000176200001440000004071514565426115012512 0ustar liggesusersmsm.phase2qmodel <- function(qmodel, phase.states, inits, qconstraint, analyticp, use.expm){ if (any(!(phase.states %in% 1:qmodel$nstates))) stop("phase.states should be in 1,...,",qmodel$nstates) markov.states <- setdiff(1:qmodel$nstates, phase.states) nst <- 2*length(phase.states) + length(markov.states) reps <- rep(1, qmodel$nstates) reps[phase.states] <- 2 pars <- rep(1:qmodel$nstates, reps) # index of each new state in old states if (!is.null(inits)){ if (!is.list(inits)) stop("phase.inits should be a list") if (!length(inits)==length(phase.states)) stop(sprintf("phase.inits of length %d, but there are %d phased states", length(inits), length(phase.states))) for (i in seq_along(inits)){ if (!length(inits[[i]])==2) stop(sprintf("phase.inits[[%d]] list of length %d, should be 2", i, length(inits[[i]]))) if (is.null(names(inits[[i]]))) names(inits[[i]]) <- c("trans","exit") if (is.vector(inits[[i]]$trans)) inits[[i]]$trans <- matrix(inits[[i]]$trans, nrow=1) if (is.vector(inits[[i]]$exit)) inits[[i]]$exit <- matrix(inits[[i]]$exit, nrow=1) if (length(inits[[i]]$trans)!=1) stop(sprintf("phase.inits[[%d]]$trans of length %d, should be 1", i, length(inits[[i]]$trans))) if (ncol(inits[[i]]$exit)!=2) stop(sprintf("phase.inits[[%d]]$exit has %d columns, should be 2", i, length(inits[[i]]$exit))) } } ## TODO warn for identical exit rates ## Form new transition intensity matrix qmatrix.new <- matrix(0, nrow=nst, ncol=nst) rn <- rownames(qmodel$qmatrix)[pars]; cn <- colnames(qmodel$qmatrix)[pars] pp <- pars %in% phase.states rn[pp] <- paste(rn[pp], " [P", rep(1:2, length(phase.states)), "]", sep="") cn[pp] <- paste(cn[pp], " [P", rep(1:2, length(phase.states)), "]", sep="") ## also form short state names here (used in viterbi) sn <- pars; sn[pp] <- paste0(sn[pp], rep(c("P1","P2"), length(phase.states))) dimnames(qmatrix.new) <- list(rn, cn) ## Transition rates between non-phased states mpars <- which(pars %in% markov.states) qmatrix.new[mpars,mpars] <- qmodel$qmatrix[markov.states,markov.states,drop=FALSE] ## Phase entry transition rates phase1 <- which(pars%in%phase.states & !duplicated(pars)) qmatrix.new[mpars,phase1] <- qmodel$qmatrix[markov.states,phase.states,drop=FALSE] ## Unsure if we need to keep all of these. TODO document them qaux <- list(phase.states=phase.states, markov.states=markov.states, phase.reps=reps, phase.pars=pars, oldstates=pars, phase.labs=sn, imatrix.orig=qmodel$imatrix, qmatrix.orig=qmodel$qmatrix, pdests=list(), pdests.orig=list(), phase1.ind=numeric(), phase2.ind=numeric()) for (i in seq_along(phase.states)){ ## possible destination states from current phase state in ## original and expanded model respectively dests <- which(qmodel$imatrix[phase.states[i],]==1) dests.new <- which(pars %in% dests & !duplicated(pars)) erates <- qmodel$qmatrix[phase.states[i],dests] if (is.null(inits)) { ## Phase exit transition rates erates1 <- erates*0.8 erates2 <- erates*1.2 } else { if (nrow(inits[[i]]$exit) != length(dests)){ plural <- if (nrow(inits[[i]]$exit) > 1) "s" else "" stop(sprintf("phase.inits[[%d]]$exit has %d row%s, but there are %d exit states from this state", i, nrow(inits[[i]]$exit), plural, length(dests))) } erates1 <- inits[[i]]$exit[,1]; erates2 <- inits[[i]]$exit[,2] } phase1 <- which(pars==phase.states[i])[1] phase2 <- which(pars==phase.states[i])[2] qmatrix.new[phase1,dests.new] <- erates1 qmatrix.new[phase2,dests.new] <- erates2 ## default to 0.5 for p2 if (is.null(inits)) { trans <- 0.5/sum(erates1) } else trans <- inits[[i]]$trans qmatrix.new[phase1,phase2] <- trans qaux$pdests.orig[[i]] <- dests; qaux$pdests[[i]] <- dests.new qaux$phase1.ind[i] <- phase1; qaux$phase2.ind[i] <- phase2 } q.new <- msm.form.qmodel(qmatrix=qmatrix.new, qconstraint=qconstraint, analyticp=analyticp, use.expm=use.expm, phase.states=NULL) q.new <- c(q.new, qaux) q.new } msm.phase2hmodel <- function(qmodel, hmodel){ if (is.null(hmodel)) { hmodel <- vector(qmodel$nstates, mode="list") for (i in 1:qmodel$nstates) hmodel[[i]] <- hmmIdent(qmodel$phase.pars[i]) } ## dummy initprobs here: actually defined later in msm.form.initprobs, since needs knowledge of the data hmodel <- c(msm.form.hmodel(hmodel=hmodel, initprobs=c(1,rep(0,qmodel$nstates-1)), est.initprobs=FALSE), list(phase.states=qmodel$phase.states)) hmodel } ## Convert parameters of fitted phase-type model to mixture representation #' Parameters of phase-type models in mixture form #' #' Parameters of fitted two-phase models, in mixture model parameterisation. #' #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param covariates Covariate values, see \code{\link{qmatrix.msm}}. #' @param ci If \code{"none"} (the default) no confidence intervals are #' calculated. Otherwise \code{"normal"}, or \code{"boot"} as described by #' \code{\link{qmatrix.msm}}. #' @param cl Width of the symmetric confidence interval, relative to 1. #' @param B Number of bootstrap replicates, or number of normal simulations #' from the distribution of the MLEs. #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' @return Matrix with one row for each state that has a two-phase #' distribution, and three columns: the short-stay mean, long-stay mean and #' long-stay probability. These are functions of the transition intensities of #' the expanded hidden Markov model, defined in \code{\link{d2phase}}. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{d2phase}}. #' @keywords models #' @export phasemeans.msm phasemeans.msm <- function(x, covariates="mean", ci=c("none","normal","bootstrap"), cl=0.95, B=1000, cores=NULL){ ps <- x$qmodel$phase.states Q <- qmatrix.msm(x, ci="none", covariates=covariates) res <- matrix(nrow=length(ps), ncol=3) pnames <- c("Short stay mean", "Long stay mean", "Long stay probability") rownames(res) <- rownames(x$qmodel$imatrix.orig)[x$qmodel$phase.states] colnames(res) <- pnames for (i in seq_along(ps)){ p1 <- x$qmodel$phase1.ind[i]; p2 <- x$qmodel$phase2.ind[i] lam1 <- Q[p1, p2] mu1 <- sum(Q[p1, -c(p1, p2)]) mu2 <- sum(Q[p2, -p2]) mean1 <- 1/(lam1 + mu1) mean2 <- mean1 + 1/mu2 prob2 <- lam1*mean1 res[i,] <- c(mean1, mean2, prob2) } ci <- match.arg(ci) p.ci <- switch(ci, normal = phasemeans.normci.msm(x=x, covariates=covariates, cl=cl, B=B), bootstrap = phasemeans.ci.msm(x=x, covariates=covariates, cl=cl, B=B, cores=cores), none = NULL) res <- if (ci=="none") res else list(estimates = res, L=p.ci[,,1], U=p.ci[,,2]) class(res) <- "msm.est" res } #' Coxian phase-type distribution with two phases #' #' Density, distribution, quantile functions and other utilities for the Coxian #' phase-type distribution with two phases. #' #' This is the distribution of the time to reach state 3 in a continuous-time #' Markov model with three states and transitions permitted from state 1 to #' state 2 (with intensity \eqn{\lambda_1}{lambda1}) state 1 to state 3 #' (intensity \eqn{\mu_1}{mu1}) and state 2 to state 3 (intensity #' \eqn{\mu_2}{mu2}). States 1 and 2 are the two "phases" and state 3 is the #' "exit" state. #' #' The density is #' #' \deqn{f(t | \lambda_1, \mu_1) = e^{-(\lambda_1+\mu_1)t}(\mu_1 + #' (\lambda_1+\mu_1)\lambda_1 t)}{f(t | l1, mu1) = exp(-(l1+mu1)*t)*(mu1 + #' (l1+mu1)*l1*t)} #' #' if \eqn{\lambda_1 + \mu_1 = \mu_2}{l1 + mu1 = mu2}, and #' #' \deqn{f(t | \lambda_1, \mu_1, \mu_2) = #' \frac{(\lambda_1+\mu_1)e^{-(\lambda_1+\mu_1)t}(\mu_2-\mu_1) + #' \mu_2\lambda_1e^{-\mu_2t}}{\lambda_1+\mu_1-\mu_2}}{f(t | l1, mu1, mu2) = #' ((l1+mu1)*exp(-(l1+mu1)*t)*(mu2-mu1) + mu2*l1*exp(-mu2*t))/(l1+mu1-mu2)} #' #' otherwise. The distribution function is #' #' \deqn{F(t | \lambda_1, \mu_1) = 1 - e^{-(\lambda_1+\mu_1) t} (1 + \lambda_1 #' t)}{F(t | l1, mu1) = 1 - exp(-(l1+mu1)*t)*(1 + l1*t)} #' #' if \eqn{\lambda_1 + \mu_1 = \mu_2}{l1 + mu1 = mu2}, and #' #' \deqn{F(t | \lambda_1, \mu_1, \mu_2) = #' 1 - \frac{e^{-(\lambda_1 + \mu_1)t} (\mu_2 - \mu_1) + \lambda_1 e^{-\mu_2 t}}{ #' \lambda_1 + \mu_1 - \mu_2}}{F(t | l1, mu1, mu2) = 1 - (exp(-(l1+mu1)*t)*(-mu1+mu2) + #' l1*exp(-mu2*t))/(l1+mu1-mu2)} #' #' otherwise. Quantiles are calculated by numerically inverting the #' distribution function. #' #' The mean is \eqn{(1 + \lambda_1/\mu_2) / (\lambda_1 + \mu_1)}{(1 + l1/mu2) / #' (l1 + mu1)}. #' #' The variance is \eqn{(2 + 2\lambda_1(\lambda_1+\mu_1+ \mu_2)/\mu_2^2 - (1 + #' \lambda_1/\mu_2)^2)/(\lambda_1+\mu_1)^2}{(2 + 2*l1*(l1+mu1+ mu2)/mu2^2 - (1 #' + l1/mu2)^2)/(l1+mu1)^2}. #' #' If \eqn{\mu_1=\mu_2}{mu1=mu2} it reduces to an exponential distribution with #' rate \eqn{\mu_1}{mu1}, and the parameter \eqn{\lambda_1}{l1} is redundant. #' Or also if \eqn{\lambda_1=0}{l1=0}. #' #' The hazard at \eqn{x=0} is \eqn{\mu_1}, and smoothly increasing if #' \eqn{\mu_1<\mu_2}{mu1= mu2} it increases to an asymptote of \eqn{\mu_2}{mu2}, and if #' \eqn{\lambda_1 + \mu_1 \leq \mu_2}{l1 + mu1 <= mu2} it increases to an #' asymptote of \eqn{\lambda_1 + \mu_1}{l1 + mu1}. The hazard is decreasing if #' \eqn{\mu_1>\mu_2}{mu1>mu2}, to an asymptote of \eqn{\mu_2}{mu2}. #' #' @name twophase #' @aliases d2phase p2phase q2phase r2phase h2phase #' @param x,q vector of quantiles. #' @param p vector of probabilities. #' @param n number of observations. If \code{length(n) > 1}, the length is #' taken to be the number required. #' @param l1 Intensity for transition between phase 1 and phase 2. #' @param mu1 Intensity for transition from phase 1 to exit. #' @param mu2 Intensity for transition from phase 2 to exit. #' @param log logical; if TRUE, return log density or log hazard. #' @param log.p logical; if TRUE, probabilities p are given as log(p). #' @param lower.tail logical; if TRUE (default), probabilities are P[X <= x], #' otherwise, P[X > x]. #' @return \code{d2phase} gives the density, \code{p2phase} gives the #' distribution function, \code{q2phase} gives the quantile function, #' \code{r2phase} generates random deviates, and \code{h2phase} gives the #' hazard. #' @section Alternative parameterisation: An individual following this #' distribution can be seen as coming from a mixture of two populations: #' #' 1) "short stayers" whose mean sojourn time is \eqn{M_1 = }{M1 = #' 1/(l1+mu1)}\eqn{ 1/(\lambda_1+\mu_1)}{M1 = 1/(l1+mu1)} and sojourn #' distribution is exponential with rate \eqn{\lambda_1 + \mu_1}{l1+mu1}. #' #' 2) "long stayers" whose mean sojourn time \eqn{M_2 = }{1/(l1+mu1) + #' 1/mu2}\eqn{ 1/(\lambda_1+\mu_1) + 1/\mu_2}{1/(l1+mu1) + 1/mu2} and sojourn #' distribution is the sum of two exponentials with rate \eqn{\lambda_1 + #' }{l1+mu1}\eqn{ \mu_1}{l1+mu1} and \eqn{\mu_2}{mu2} respectively. The #' individual is a "long stayer" with probability \eqn{p=\lambda_1/(\lambda_1 + #' \mu_1)}. #' #' Thus a two-phase distribution can be more intuitively parameterised by the #' short and long stay means \eqn{M_1 < M_2} and the long stay probability #' \eqn{p}. Given these parameters, the transition intensities are #' \eqn{\lambda_1=p/M_1}{l1=p/M1}, \eqn{\mu_1=(1-p)/M_1}{mu1=(1-p)/M1}, and #' \eqn{\mu_2=1/(M_2-M_1)}{mu2 = 1/(M2 - M1)}. This can be useful for choosing #' intuitively reasonable initial values for procedures to fit these models to #' data. #' #' The hazard is increasing at least if \eqn{M_2 < 2M_1}{M2 < 2M1}, and also #' only if \eqn{(M_2 - 2M_1)/(M_2 - M_1) < p}{(M2 - 2M1)/(M2 - M1) < p}. #' #' For increasing hazards with \eqn{\lambda_1 + \mu_1 \leq \mu_2}{l1 + mu1 <= #' mu2}, the maximum hazard ratio between any time \eqn{t} and time 0 is #' \eqn{1/(1-p)}. #' #' For increasing hazards with \eqn{\lambda_1 + \mu_1 \geq \mu_2}{l1 + mu1 >= #' mu2}, the maximum hazard ratio is \eqn{M_1/((1-p)(M_2 - M_1))}{M1/((1-p)(M2 - #' M1))}\eqn{ M_1))}{M1/((1-p)(M2 - M1))}. This is the minimum hazard ratio for #' decreasing hazards. #' #' % Illustration of hazard ratio at short mean and long mean. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @references C. Dutang, V. Goulet and M. Pigeon (2008). actuar: An R Package #' for Actuarial Science. Journal of Statistical Software, vol. 25, no. 7, #' 1-37. URL http://www.jstatsoft.org/v25/i07 #' @keywords distribution NULL #' @rdname twophase #' @export d2phase <- function(x, l1, mu1, mu2, log=FALSE){ t <- x ret <- numeric(length(t)) ret[t<0] <- 0 ret[l1<0 | mu1<0 | mu2<0] <- NaN ind <- (l1>=0 & mu1>=0 & mu2>=0 & t>=0) l1 <- rep(l1, length=length(t)); mu1 <- rep(mu1, length=length(t)); mu2 <- rep(mu2, length=length(t)); if(any(ind)) { ## same as MatrixExp(Q*t)[1,] %*% c(mu1, mu2, 0) if (log) { tmp <- ifelse(l1+mu1==mu2, -(l1+mu1)*t + log(mu1 + (l1+mu1)*l1*t), log((-(l1+mu1)*exp(-(l1+mu1)*t)*(-mu1+mu2) + mu2*l1*exp(-mu2*t))/(l1+mu1-mu2))) } else { tmp <- ifelse(l1+mu1==mu2, exp(-(l1+mu1)*t)*(mu1 + (l1+mu1)*l1*t), (-(l1+mu1)*exp(-(l1+mu1)*t)*(-mu1+mu2) + mu2*l1*exp(-mu2*t))/(l1+mu1-mu2)) } ret[ind] <- tmp[ind] } ret } #' @rdname twophase #' @export p2phase <- function(q, l1, mu1, mu2, lower.tail=TRUE, log.p=FALSE){ t <- q ret <- numeric(length(t)) ret[t<0] <- 0 ret[l1<0 | mu1<0 | mu2<0] <- NaN ind <- (l1>=0 & mu1>=0 & mu2>=0 & t>=0) if(any(ind)) { if (l1+mu1==mu2) { if (!lower.tail && log.p) tmp <- -(l1+mu1)*t + log(1 + l1*t) else { tmp <- 1 - exp(-(l1+mu1)*t)*(1 + l1*t) if (!lower.tail) tmp <- 1 - tmp if (log.p) tmp <- log(tmp) } } else { ## same as MatrixExp(Q*t)[1,3] tmp <- 1 + exp(-(l1+mu1)*t)*(-mu1+mu2)/(l1+mu1-mu2) - l1*exp(-mu2*t)/(l1+mu1-mu2) if (!lower.tail) tmp <- 1 - tmp if (log.p) tmp <- log(tmp) } ret[ind] <- tmp[ind] } ret } #' @rdname twophase #' @export q2phase <- function(p, l1, mu1, mu2, lower.tail=TRUE, log.p=FALSE){ qgeneric(p2phase, p=p, l1=l1, mu1=mu1, mu2=mu2, lower.tail=lower.tail, log.p=log.p) } #' @rdname twophase #' @export r2phase <- function(n, l1, mu1, mu2){ if (length(n) > 1) n <- length(n) ret <- numeric(n) l1 <- rep(l1, length.out=n) mu1 <- rep(mu1, length.out=n) mu2 <- rep(mu2, length.out=n) ret[l1<0 | mu1<0 | mu2<0] <- NaN ind <- (l1>=0 & mu1>=0 & mu2>=0) if(any(ind)) { l1 <- rep(l1, length=n); mu1 <- rep(mu1, length=n); mu2 <- rep(mu2, length=n) l1 <- l1[ind]; mu1 <- mu1[ind]; mu2 <- mu2[ind]; n <- sum(ind) ptrans <- l1/(l1+mu1) ret[ind] <- rexp(n,l1+mu1) + rbinom(n, 1, ptrans)*rexp(n, mu2) } ret } #' @rdname twophase #' @export h2phase <- function(x, l1, mu1, mu2, log=FALSE) { t <- x ret <- numeric(length(x)) ret[t<0] <- 0 ret[l1<0 | mu1<0 | mu2<0] <- NaN ind <- (l1>=0 & mu1>=0 & mu2>=0 & t>=0) if(any(ind)) { if (l1+mu1==mu2) { tmp <- (mu1 + (l1+mu1)*l1*t) / (1 + l1*t) # clearer formula if (log) tmp <- log(tmp) } else { if (log) tmp <- d2phase(t,l1,mu1,mu2,log=TRUE) - p2phase(t,l1,mu1,mu2,lower.tail=FALSE,log.p=TRUE) else tmp <- d2phase(t,l1,mu1,mu2) / p2phase(t,l1,mu1,mu2,lower.tail=FALSE) } ret[ind] <- tmp[ind] } ret } msm/R/optim.R0000644000176200001440000003040414556436067012543 0ustar liggesusersderiv_supported <- function(msmdata, hmodel, cmodel){ single_outcome <- (is.null(ncol(msmdata$mf$"(state)")) || (ncol(msmdata$mf$"(state)")==1)) (!hmodel$hidden || (hmodel$hidden && ## Models where derivatives not supported: ## multiple outcomes where any outcome is categorical (single_outcome || (!any(na.omit(as.vector(hmodel$labels)) == "categorical"))) && ## unknown initial state probs !hmodel$est.initprobs && ## constraints on misclassification / categorical outcome probabilities (!any(duplicated(hmodel$constr[hmodel$plabs=="p"]))) && (!any(duplicated(hmodel$covconstr[.msm.HMODELS[hmodel$models[hmodel$coveffstate]]=="categorical"]))) && all(.msm.HMODELS[hmodel$models %in% .msm.HMODELS.DERIV]) )) } info_supported <- function(msmdata, hmodel, cmodel){ ## only panel data and either non-hidden or misclassification models deriv_supported(msmdata, hmodel, cmodel) && all(msmdata$mf$"(obstype)"==1) && (!hmodel$hidden || (hmodel$hidden && all(.msm.HMODELS[hmodel$models] %in% .msm.HMODELS.INFO))) } ### GENERIC OPTIMISATION FUNCTION msm.optim <- function(opt.method, p, hessian, use.deriv, msmdata, qmodel, qcmodel, cmodel, hmodel, ...){ p$params <- p$allinits gr <- if (deriv_supported(msmdata,hmodel,cmodel) && use.deriv) grad.msm else NULL optfn <- paste("msm.optim", opt.method, sep=".") if (!exists(optfn)) stop("Unknown optimisation method \"", opt.method, "\"") assign("nliks", 0, envir=msm.globals) args <- c(list(p=p, gr=gr, hessian=hessian, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel), list(...)) p <- do.call(optfn, args) assign("nliks", 0, envir=msm.globals) if (isTRUE(getOption("msm.test.analytic.derivatives"))){ if (!deriv_supported(msmdata,hmodel,cmodel)) warning("Analytic derivatives not available for this model") else p$deriv_test <- deriv_test(msmdata, qmodel, qcmodel, cmodel, hmodel, msm.unfixallparams(p)) } ## Attach derivative and information matrix at the MLE. ## If all parameters fixed, do this at the initial values for all. pp <- if (opt.method=="fixed") msm.unfixallparams(p) else p pi <- pp$params[pp$optpars] if (deriv_supported(msmdata,hmodel,cmodel)) { p$deriv <- grad.msm(pi, msmdata, qmodel, qcmodel, cmodel, hmodel, pp) if (info_supported(msmdata,hmodel,cmodel)) { p$information <- information.msm(pi, msmdata, qmodel, qcmodel, cmodel, hmodel, pp) } } p } ## SPECIFIC OPTIMISATION METHODS ## All should take same arguments ## All should add $lik, $params, $opt terms to "paramdata" object "p" ### This allows the user to just drop in a new method without touching the rest of the msm package code ## Trivial one where all the parameters are fixed at their initial values msm.optim.fixed <- function(p, gr, hessian, msmdata, qmodel, qcmodel, cmodel, hmodel, ...) { p$lik <- lik.msm(p$inits, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) p$opt <- list(par = p$allinits[!duplicated(abs(p$constr))]) p$params <- msm.rep.constraints(p$params, p, hmodel) p$allinits[!duplicated(abs(p$constr))][abs(p$constr)]*sign(p$constr) p.unfix <- msm.unfixallparams(p) if (hessian) p$opt$hessian <- optimHess(par=p.unfix$inits, fn=lik.msm, gr=gr, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p.unfix) p } msm.optim.optim <- function(p, gr, hessian, msmdata, qmodel, qcmodel, cmodel, hmodel, ...) { optim.args <- list(...) if (is.null(optim.args$method)) optim.args$method <- if (deriv_supported(msmdata, hmodel, cmodel) || (length(p$inits)==1)) "BFGS" else "Nelder-Mead" if (is.null(optim.args$control)) optim.args$control <- list() # this might cause more trouble than it solves. # * R/optim.R: Pass fnscale to optim() automatically, if not already # provided, using the likelihood at the initial values. Wastes a # likelihood calculation but should improve convergence. # if (is.null(optim.args$control$fnscale)) # optim.args$control$fnscale <- lik.msm(p$inits, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, # cmodel=cmodel, hmodel=hmodel, paramdata=p) optim.args <- c(optim.args, list(par=p$inits, fn=lik.msm, hessian=hessian, gr=gr, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p)) opt <- do.call("optim", optim.args) if (opt$convergence==1) warning("Iteration limit in optim() reached without convergence. Reported estimates are not the maximum likelihood. Increase \"maxit\" or change optimisation method - see help(optim) and help(msm).") else if (opt$convergence==10) warning("Not converged: Nelder-Mead simplex is degenerate. Reported estimates are not the maximum likelihood.") else if (opt$convergence %in% 51:52) warning("Not converged: error in L-BFGS-B, see help(optim). Reported estimates are not the maximum likelihood.") ctrace <- !is.null(optim.args$control$trace) && optim.args$control$trace > 0 if (ctrace){ cat("Used", opt$counts[1], "function and", opt$counts[2], "gradient evaluations\n") } if (!is.null(opt$message)) warning("optim() returned a message: ",opt$message) p$lik <- opt$value p$params[p$optpars] <- opt$par p$opt <- opt p } msm.optim.nlm <- function(p, gr, hessian, msmdata, qmodel, qcmodel, cmodel, hmodel, ...) { nlmfn <- function(par) { ret <- lik.msm(par, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) if (!is.null(gr)) attr(ret, "gradient") <- grad.msm(par, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) ret } optim.args <- c(list(...), list(f=nlmfn, p=p$inits, hessian=hessian)) ## suspect this check is excessively precise if (!is.null(optim.args$check.analyticals)) warning("Forcing check.analyticals=FALSE in \"nlm\"") optim.args$check.analyticals <- FALSE opt <- do.call("nlm", optim.args) if (opt$code==4) warning("Iteration limit in nlm() reached without convergence. Reported estimates are not the maximum likelihood. Increase \"iterlim\" or change optimisation method - see help(nlm) and help(msm).") else if (opt$code==3) warning("Not converged: local minimum or step size too small. Reported estimates are not the maximum likelihood. See help(nlm)") else if (opt$code==5) warning("Not converged: maximum step size exceeded five consecutive times. Reported estimates are not the maximum likelihood. See help(nlm)") ctrace <- !is.null(list(...)$print.level) && list(...)$print.level > 0 if (ctrace) cat("Used", opt$iterations, "iterations\n") p$lik <- opt$minimum p$params[p$optpars] <- opt$estimate p$opt <- opt p$opt$par <- opt$estimate p } msm.optim.fisher <- function(p, gr, hessian, msmdata, qmodel, qcmodel, cmodel, hmodel, ...) { if (hmodel$hidden) stop("Fisher scoring not supported for hidden Markov models or censored states") if (cmodel$ncens > 0) stop("Fisher scoring not supported with censored states") if (any(msmdata$mf$"(obstype)"==2)) stop("Fisher scoring not supported with exact transition times") if (any(msmdata$mf$"(obstype)"==3)) stop("Fisher scoring not supported with exact death times") optim.args <- list(...) if (is.null(optim.args$control$reltol)) reltol <- sqrt(.Machine$double.eps) damp <- if (is.null(optim.args$control$damp)) 0 else optim.args$control$damp theta <- p$inits lik.old <- -lik.msm(theta, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) converged <- FALSE iterations <- 1 ctrace <- !is.null(optim.args$control$trace) && optim.args$control$trace > 0 while(!converged) { if (ctrace) cat("-2loglik=",-lik.old,", pars=",theta,"\n") Info <- information.msm(theta, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) V <- -grad.msm(theta, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) Info <- Info + diag(damp, nrow(Info)) theta <- theta + solve(Info, V) lik.new <- -lik.msm(theta, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) iterations <- iterations + 1 if (abs(lik.old - lik.new) < reltol*(abs(lik.old) + reltol)) converged <- TRUE else lik.old <- lik.new } if (ctrace) cat("Used", iterations, "evaluations of likelihood and information\n") p$lik <- -lik.new p$params[p$optpars] <- theta opt <- list(minimum=-lik.new, estimate=theta, value=-lik.new, par=theta, iterations=iterations) if (hessian) opt$hessian <- optimHess(par=theta, fn=lik.msm, gr=gr, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) p$opt <- opt p } msm.optim.bobyqa <- function(p, gr, hessian, msmdata, qmodel, qcmodel, cmodel, hmodel, ...) { optim.args <- list(...) optim.args <- c(optim.args, list(par=p$inits, fn=lik.msm, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p)) if (requireNamespace("minqa", quietly = TRUE)){ opt <- do.call("bobyqa", optim.args) } else stop("\"minqa\" package not available") if (opt$ierr %in% 1:5) warning(opt$msg, ". Reported estimates are not the maximum likelihood. See help(bobyqa) and help(msm).") if (hessian) opt$hessian <- optimHess(par=opt$par, fn=lik.msm, gr=gr, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) ctrace <- !is.null(optim.args$control$iprint) && optim.args$control$iprint > 0 if (ctrace) cat("Used", opt$feval, "function evaluations\n") p$lik <- opt$fval p$params[p$optpars] <- opt$par p$opt <- opt p } ### Test analytic against numeric derivatives deriv_test <- function(msmdata, qmodel, qcmodel, cmodel, hmodel, p){ an.d <- grad.msm(p$inits, msmdata, qmodel, qcmodel, cmodel, hmodel, p) # if (0){ ## fiddly method using stats::numericDeriv likwrap <- function(x, ...){ pars <- list(unlist(list(...))) do.call("lik.msm", c(pars, x)) } myenv <- new.env() assign("x", list(msmdata, qmodel, qcmodel, cmodel, hmodel, p), envir = myenv) for (i in 1:p$nopt) assign(paste("p", i, sep=""), p$inits[i], envir = myenv) pvec <- paste("p",1:p$nopt,sep="") foo <- numericDeriv(as.call(lapply(as.list(c("likwrap", "x", pvec)), as.name)), pvec, myenv) num.d <- attr(foo,"gradient") err <- mean(abs(an.d - num.d)) #} # err <- num.d <- NULL ## much cleaner method. appears to be more accurate as well if (requireNamespace("numDeriv", quietly = TRUE)) numd2 <- numDeriv::grad(lik.msm, p$inits, msmdata=msmdata, qmodel=qmodel, qcmodel=qcmodel, cmodel=cmodel, hmodel=hmodel, paramdata=p) else stop("\"numDeriv\" package not available") err2 <- mean(abs(an.d - numd2)) res <- cbind(analytic=an.d, numeric.base=as.vector(num.d), numeric.nd=numd2) rownames(res) <- names(p$inits) list(res=res, error=c(base=err, nd=err2)) } msm/R/summary.R0000644000176200001440000000544714556436067013121 0ustar liggesusers#' Summarise a fitted multi-state model #' #' Summary method for fitted \code{\link{msm}} models. This is simply a wrapper #' around \code{\link{prevalence.msm}} which produces a table of observed and #' expected state prevalences for each time, and for models with covariates, #' \code{\link{hazard.msm}} to print hazard ratios with 95\% confidence #' intervals for covariate effects. #' #' @name summary.msm #' @aliases summary.msm print.summary.msm #' @param object A fitted multi-state model object, as returned by #' \code{\link{msm}}. #' @param hazard.scale Vector with same elements as number of covariates on #' transition rates. Corresponds to the increase in each covariate used to #' calculate its hazard ratio. Defaults to all 1. #' @param ... Further arguments passed to \code{\link{prevalence.msm}}. #' @return A list of class \code{summary.msm}, with components: #' #' \item{prevalences}{Output from \code{\link{prevalence.msm}}.} #' #' \item{hazard}{Output from \code{\link{hazard.msm}}.} #' #' \item{hazard.scale}{Value of the \code{hazard.scale} argument.} #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}},\code{\link{prevalence.msm}}, #' \code{\link{hazard.msm}} #' @keywords models #' @export summary.msm <- function(object, # fitted model hazard.scale = 1, ... ) { if (!inherits(object, "msm")) stop("expected object to be a msm model") prevalences <- prevalence.msm(object, ...) if (object$qcmodel$ncovs > 0) { if (missing (hazard.scale)) hazard.scale <- rep(1, object$qcmodel$ncovs) hazard <- hazard.msm(object) } else {hazard <- hazard.scale <- NULL} ret <- list(prevalences=prevalences, hazard=hazard, hazard.scale=hazard.scale) class(ret) <- "summary.msm" ret } #' @export print.summary.msm <- function(x,...) { if (!is.null(x$prevalences)) { cat("\nObserved numbers of individuals occupying states at each time\n\n") print(x$prevalences$Observed) cat("\nExpected numbers of individuals occupying states at each time\n\n") print(x$prevalences$Expected) cat("\nObserved prevalences of states (percentages of population at risk)\n\n") print(x$prevalences$"Observed percentages") cat("\nExpected prevalences of states (percentages of population at risk)\n\n") print(x$prevalences$"Expected percentages") } i <- 1 for (cov in names(x$hazard)) { cat ("\nTransition hazard ratios corresponding to covariate effects\n\n" ) cat (cov, " ( unit of",x$hazard.scale[i],")\n") print(round(x$hazard[[cov]], 2)) i <- i+1 } invisible() } msm/R/viterbi.R0000644000176200001440000001134114563100551013036 0ustar liggesusers#' Calculate the probabilities of underlying states and the most likely path #' through them #' #' For a fitted hidden Markov model, or a model with censored state #' observations, the Viterbi algorithm recursively constructs the path with the #' highest probability through the underlying states. The probability of each #' hidden state is also computed for hidden Markov models, using the #' forward-backward algorithm. #' #' #' @param x A fitted hidden Markov multi-state model, or a model with censored #' state observations, as produced by \code{\link{msm}} #' @param normboot If \code{TRUE}, then before running the algorithm, the #' maximum likelihood estimates of the model parameters are replaced by an #' alternative set of parameters drawn randomly from the asymptotic #' multivariate normal distribution of the MLEs. #' @param newdata An optional data frame containing observations on which to #' construct the Viterbi path and forward-backward probabilities. It must be in #' the same format as the data frame used to fit \code{x}. If \code{NULL}, the #' data frame used to fit \code{x} is used. #' @return A data frame with columns: #' #' \code{subject} = subject identification numbers #' #' \code{time} = times of observations #' #' \code{observed} = corresponding observed states #' #' \code{fitted} = corresponding fitted states found by Viterbi recursion. If #' the model is not a hidden Markov model, and there are no censored state #' observations, this is just the observed states. #' #' For hidden Markov models, an additional matrix \code{pstate} is also #' returned inside the data frame, giving the probability of each hidden state #' at each point, conditionally on all the data. This is computed by the #' forward/backward algorithm. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}} #' @references Durbin, R., Eddy, S., Krogh, A. and Mitchison, G. #' \emph{Biological sequence analysis}, Cambridge University Press, 1998. #' @keywords models #' @export viterbi.msm viterbi.msm <- function(x, normboot=FALSE, newdata=NULL) { if (!inherits(x, "msm")) stop("expected x to be a msm model") if (!is.null(newdata)){ ## initialise msm with new data but do not fit (hence fixedpars = TRUE) newcall <- x$call newcall$data <- substitute(newdata) newcall$fixedpars <- TRUE xnew <- try(eval(newcall)) } else { xnew <- x } xdata <- expand.data(xnew) if (x$cmodel$ncens > 0 && !x$hmodel$hidden) { ## If censoring but not HMM, then define an identity HMM with ## true state known at every time except censoring times hmod <- vector(x$qmodel$nstates, mode="list") for (i in 1:x$qmodel$nstates) hmod[[i]] <- hmmIdent(i) x$hmodel <- msm.form.hmodel(hmod, est.initprobs=FALSE) x$hmodel <- c(x$hmodel, list(ncovs=rep(rep(0,x$hmodel$nstates),x$hmodel$npars), ncoveffs=0, nicovs=rep(0,x$hmodel$nstates-1), nicoveffs=0)) xdata$mf$"(obstrue)" <- ifelse(xdata$mf$"(state)" %in% x$cmodel$censor, 0, (xdata$mf$"(state)")) xdata$mm.hcov <- vector(mode="list", length=x$hmodel$nstates) # reqd by msm.add.hmmcovs for (i in seq_len(x$hmodel$nstates)) xdata$mm.hcov[[i]] <- model.matrix(~1, xdata$mf) x$paramdata$allinits <- c(x$paramdata$allinits,x$hmodel$pars) x$paramdata$constr <- c(x$paramdata$constr,max(x$paramdata$constr)+seq_along(x$hmodel$pars)) npts <- attr(xdata$mf, "npts") initstate <- xdata$mf$"(state)"[!duplicated(xdata$mf$"(subject)")] initp <- matrix(0,nrow=npts,ncol=x$hmodel$nstates) for (i in 1:npts){ if (initstate[i] %in% x$cmodel$censor) { cs <- x$cmodel$states_list[[as.character(initstate[i])]] initp[i,cs] <- 1/length(cs) } else initp[i,initstate[i]] <- 1 } x$hmodel$initprobs <- initp } if (x$hmodel$hidden) { if (normboot) params <- rmvnorm(1, x$paramdata$opt$par, x$covmat[x$paramdata$optpars,x$paramdata$optpars]) else params <- x$paramdata$opt$par ret <- Ccall.msm(params, do.what="viterbi", xdata, x$qmodel, x$qcmodel, x$cmodel, x$hmodel, x$paramdata ) fitted <- ret[[1]] pstate <- ret[[2]] fitted <- fitted + 1 } else { fitted <- xdata$mf$"(state)" pstate <- NULL } if (!is.null(x$qmodel$phase.states)){ fitted <- x$qmodel$phase.labs[fitted] } ret <- data.frame( subject = xdata$mf$"(subject)", time = xdata$mf$"(time)", observed = xdata$mf$"(state)", fitted = fitted ) if (!is.null(pstate)) ret$pstate <- pstate ret } msm/R/medists.R0000644000176200001440000002006714527611745013063 0ustar liggesusers #' Measurement error distributions #' #' Truncated Normal and Uniform distributions, where the response is also #' subject to a Normally distributed measurement error. #' #' The normal distribution with measurement error has density #' #' \deqn{ #' \frac{\Phi(u, \mu_2, \sigma_3) - \Phi(l, \mu_2, \sigma_3)}{\Phi(u, \mu_2, \sigma_3) - #' \Phi(l, \mu_2, \sigma_3)} \phi(x, \mu_0 + \mu_\epsilon, \sigma_2)}{(Phi(upper, mu2, sigma3) - Phi(lower, mu2, sigma3)) / (Phi(upper, #' mean, sd) - Phi(lower, mean, sd)) * phi(x, mean + meanerr, sigma2)} #' #' where #' #' \deqn{\sigma_2^2 = \sigma_0^2 + \sigma_\epsilon^2,}{sigma2*sigma2 = sd*sd + #' sderr*sderr,} #' #' \deqn{\sigma_3 = \sigma_0 \sigma_\epsilon / \sigma_2,}{sigma3 #' = sd*sderr / sigma2,} #' #' \deqn{\mu_2 = (x - \mu_\epsilon) \sigma_0^2 + \mu_0 \sigma_\epsilon^2, #' }{mu2 = (x - meanerr)*sd*sd + mean*sderr*sderr,} #' #' \eqn{\mu_0}{mean} is the mean of the original Normal distribution before #' truncation, \cr \eqn{\sigma_0}{sd} is the corresponding standard deviation, #' \cr \eqn{u} is the upper truncation point, \cr \eqn{l} is the lower #' truncation point, \cr \eqn{\sigma_\epsilon}{sderr} is the standard deviation #' of the additional measurement error, \cr \eqn{\mu_\epsilon}{meanerr} is the #' mean of the measurement error (usually 0). \cr \eqn{\phi(x)}{phi(x)} is the #' density of the corresponding normal distribution, and \cr #' \eqn{\Phi(x)}{Phi(x)} is the distribution function of the corresponding #' normal distribution. #' #' The uniform distribution with measurement error has density #' #' \deqn{(\Phi(x, \mu_\epsilon+l, \sigma_\epsilon) - \Phi(x, \mu_\epsilon+u, #' \sigma_\epsilon)) }{(Phi(x, meanerr+l, sderr) - Phi(x, meanerr+u, sderr)) / #' (upper - lower)}\deqn{ / (u - l)}{(Phi(x, meanerr+l, sderr) - Phi(x, #' meanerr+u, sderr)) / (upper - lower)} #' #' These are calculated from the original truncated Normal or Uniform density #' functions \eqn{f(. | \mu, \sigma, l, u)}{f(. | mu, sd)} as #' #' \deqn{ \int f(y | \mu, \sigma, l, u) \phi(x, y + \mu_\epsilon, \sigma_\epsilon) dy }{ #' \int f(y | mu, sd, l, u) \phi(x, y + meanerr, sderr) dy } #' #' If \code{sderr} and \code{meanerr} are not specified they assume the default #' values of 0, representing no measurement error variance, and no constant #' shift in the measurement error, respectively. #' #' Therefore, for example with no other arguments, \code{dmenorm(x)}, is simply #' equivalent to \code{dtnorm(x)}, which in turn is equivalent to #' \code{dnorm(x)}. #' #' These distributions were used by Satten and Longini (1996) for CD4 cell #' counts conditionally on hidden Markov states of HIV infection, and later by #' Jackson and Sharples (2002) for FEV1 measurements conditionally on states of #' chronic lung transplant rejection. #' #' These distribution functions are just provided for convenience, and are not #' optimised for numerical accuracy or speed. To fit a hidden Markov model #' with these response distributions, use a \code{\link{hmmMETNorm}} or #' \code{\link{hmmMEUnif}} constructor. See the \code{\link{hmm-dists}} help #' page for further details. #' #' @name medists #' @aliases medists dmenorm pmenorm qmenorm rmenorm dmeunif pmeunif qmeunif #' rmeunif #' @param x,q vector of quantiles. #' @param p vector of probabilities. #' @param n number of observations. If \code{length(n) > 1}, the length is #' taken to be the number required. #' @param mean vector of means. #' @param sd vector of standard deviations. #' @param lower lower truncation point. #' @param upper upper truncation point. #' @param sderr Standard deviation of measurement error distribution. #' @param meanerr Optional shift for the measurement error distribution. #' @param log,log.p logical; if TRUE, probabilities \eqn{p} are given as #' \eqn{\log(p)}{log(p)}, or log density is returned. #' @param lower.tail logical; if TRUE (default), probabilities are \eqn{P[X <= #' x]}, otherwise, \eqn{P[X > x]}. #' @return \code{dmenorm}, \code{dmeunif} give the density, \code{pmenorm}, #' \code{pmeunif} give the distribution function, \code{qmenorm}, #' \code{qmeunif} give the quantile function, and \code{rmenorm}, #' \code{rmeunif} generate random deviates, for the Normal and Uniform versions #' respectively. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{dnorm}}, \code{\link{dunif}}, \code{\link{dtnorm}} #' @references Satten, G.A. and Longini, I.M. Markov chains with measurement #' error: estimating the 'true' course of a marker of the progression of human #' immunodeficiency virus disease (with discussion) \emph{Applied Statistics} #' 45(3): 275-309 (1996) #' #' Jackson, C.H. and Sharples, L.D. Hidden Markov models for the onset and #' progression of bronchiolitis obliterans syndrome in lung transplant #' recipients \emph{Statistics in Medicine}, 21(1): 113--128 (2002). #' @keywords distribution #' @examples #' #' ## what does the distribution look like? #' x <- seq(50, 90, by=1) #' plot(x, dnorm(x, 70, 10), type="l", ylim=c(0,0.06)) ## standard Normal #' lines(x, dtnorm(x, 70, 10, 60, 80), type="l") ## truncated Normal #' ## truncated Normal with small measurement error #' lines(x, dmenorm(x, 70, 10, 60, 80, sderr=3), type="l") #' NULL #' @rdname medists #' @export dmenorm <- function(x, mean=0, sd=1, lower=-Inf, upper=Inf, sderr=0, meanerr=0, log = FALSE) { sumsq <- sd*sd + sderr*sderr sigtmp <- sd*sderr / sqrt(sumsq) mutmp <- ((x - meanerr)*sd*sd + mean*sderr*sderr) / sumsq nc <- 1/(pnorm(upper, mean, sd) - pnorm(lower, mean, sd)) nctmp <- pnorm(upper, mutmp, sigtmp) - pnorm(lower, mutmp, sigtmp) if (log) log(nc) + log(nctmp) + log(dnorm(x, meanerr + mean, sqrt(sumsq), 0)) else nc * nctmp * dnorm(x, meanerr + mean, sqrt(sumsq), 0) } #' @rdname medists #' @export pmenorm <- function(q, mean=0, sd=1, lower=-Inf, upper=Inf, sderr=0, meanerr=0, lower.tail = TRUE, log.p = FALSE) { ret <- numeric(length(q)) dmenorm2 <- function(x)dmenorm(x, mean=mean, sd=sd, lower=lower, upper=upper, sderr=sderr, meanerr=meanerr) for (i in 1:length(q)) { ret[i] <- integrate(dmenorm2, -Inf, q[i])$value } if (!lower.tail) ret <- 1 - ret if (log.p) ret <- log(ret) ret[upper < lower] <- NaN ret } #' @rdname medists #' @export qmenorm <- function(p, mean=0, sd=1, lower=-Inf, upper=Inf, sderr=0, meanerr=0, lower.tail=TRUE, log.p=FALSE) { qgeneric(pmenorm, p=p, mean=mean, sd=sd, lower=lower, upper=upper, sderr=sderr, meanerr=meanerr, lbound=lower, ubound=upper, lower.tail=lower.tail, log.p=log.p) } #' @rdname medists #' @export rmenorm <- function(n, mean=0, sd=1, lower=-Inf, upper=Inf, sderr=0, meanerr=0) { rnorm(n, meanerr + rtnorm(n, mean, sd, lower, upper), sderr) } ### Uniform distribution with measurement error #' @rdname medists #' @export dmeunif <- function(x, lower=0, upper=1, sderr=0, meanerr=0, log = FALSE) { if (log) log( pnorm(x, meanerr + lower, sderr) - pnorm(x, meanerr + upper, sderr) ) - log(upper - lower) else ( pnorm(x, meanerr + lower, sderr) - pnorm(x, meanerr + upper, sderr) ) / (upper - lower) } #' @rdname medists #' @export pmeunif <- function(q, lower=0, upper=1, sderr=0, meanerr=0, lower.tail = TRUE, log.p = FALSE) { ret <- numeric(length(q)) dmeunif2 <- function(x)dmeunif(x, lower=lower, upper=upper, sderr=sderr, meanerr=meanerr) for (i in 1:length(q)) { ret[i] <- integrate(dmeunif2, -Inf, q[i])$value } if (!lower.tail) ret <- 1 - ret if (log.p) ret <- log(ret) ret } #' @rdname medists #' @export qmeunif <- function(p, lower=0, upper=1, sderr=0, meanerr=0, lower.tail=TRUE, log.p=FALSE) { qgeneric(pmeunif, p=p, lower=lower, upper=upper, sderr=sderr, meanerr=meanerr, lbound=lower, ubound=upper, lower.tail=lower.tail, log.p=log.p) } #' @rdname medists #' @export rmeunif <- function(n, lower=0, upper=1, sderr=0, meanerr=0) { rnorm(n, meanerr + runif(n, lower, upper), sderr) } msm/R/efpt.R0000644000176200001440000002101514660326705012340 0ustar liggesusers# Could also get CDF simply by making tostate absorbing and calculating pmatrix. # TODO time-dependent covariates?. Unclear if the expectation has a solution for piecewise-constant rate. #' Expected first passage time #' #' Expected time until first reaching a particular state or set of states in a #' Markov model. #' #' The expected first passage times from each of a set of states #' \eqn{\mathbf{i}}{i} to to the remaining set of states #' \eqn{\overline{\mathbf{i}}}{ibar} in the state space, for a model with #' transition intensity matrix \eqn{Q}, are #' #' \deqn{-Q_{\mathbf{i},\mathbf{i}}^{-1} \mathbf{1}}{-Q_{i,i}^{-1} 1} #' #' where \eqn{\mathbf{1}}{1} is a vector of ones, and #' \eqn{Q_{\mathbf{i},\mathbf{i}}}{Q_{i,i}} is the square subset of \eqn{Q} #' pertaining to states \eqn{\mathbf{i}}{i}. #' #' It is equal to the sum of mean sojourn times for all states between the #' "from" and "to" states in a unidirectional model. If there is non-zero #' chance of reaching an absorbing state before reaching \code{tostate}, then #' it is infinite. It is trivially zero if the "from" state equals #' \code{tostate}. #' #' This function currently only handles time-homogeneous Markov models. For #' time-inhomogeneous models it will assume that \eqn{Q} equals the average #' intensity matrix over all times and observed covariates. Simulation might #' be used to handle time dependence. #' #' Note this is the \emph{expectation} of first passage time, and the #' confidence intervals are CIs for this mean, not predictive intervals for the #' first passage time. The full distribution of the first passage time to a #' set of states can be obtained by setting the rows of the intensity matrix #' \eqn{Q} corresponding to that set of states to zero to make a model where #' those states are absorbing. The corresponding transition probability matrix #' \eqn{Exp(Qt)} then gives the probabilities of having hit or passed that #' state by a time \eqn{t} (see the example below). This is implemented in #' \code{\link{ppass.msm}}. #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param qmatrix Instead of \code{x}, you can simply supply a transition #' intensity matrix in \code{qmatrix}. #' @param tostate State, or set of states supplied as a vector, for which to #' estimate the first passage time into. Can be integer, or character matched #' to the row names of the Q matrix. #' @param start Starting state (integer). By default (\code{start="all"}), #' this will return a vector of expected passage times from each state in turn. #' #' Alternatively, this can be used to obtain the expected first passage time #' from a \emph{set} of states, rather than single states. To achieve this, #' \code{state} is set to a vector of weights, with length equal to the number #' of states in the model. These weights should be proportional to the #' probability of starting in each of the states in the desired set, so that #' weights of zero are supplied for other states. The function will calculate #' the weighted average of the expected passage times from each of the #' corresponding states. #' @param covariates Covariate values defining the intensity matrix for the #' fitted model \code{x}, as supplied to \code{\link{qmatrix.msm}}. #' @param ci If \code{"normal"}, then calculate a confidence interval by #' simulating \code{B} random vectors from the asymptotic multivariate normal #' distribution implied by the maximum likelihood estimates (and covariance #' matrix) of the log transition intensities and covariate effects. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' #' If \code{"none"} (the default) then no confidence interval is calculated. #' @param cl Width of the symmetric confidence interval, relative to 1. #' @param B Number of bootstrap replicates. #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' @param ... Arguments to pass to \code{\link{MatrixExp}}. #' @return A vector of expected first passage times, or "hitting times", from #' each state to the desired state. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{sojourn.msm}}, \code{\link{totlos.msm}}, #' \code{\link{boot.msm}}. #' @references Norris, J. R. (1997) Markov Chains. Cambridge University Press. #' @keywords models #' @examples #' #' twoway4.q <- rbind(c(-0.5, 0.25, 0, 0.25), c(0.166, -0.498, 0.166, 0.166), #' c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)) #' efpt.msm(qmatrix=twoway4.q, tostate=3) #' # given in state 1, expected time to reaching state 3 is infinite #' # since may die (state 4) before entering state 3 #' #' # If we remove the death state from the model, EFPTs become finite #' Q <- twoway4.q[1:3,1:3]; diag(Q) <- 0; diag(Q) <- -rowSums(Q) #' efpt.msm(qmatrix=Q, tostate=3) #' #' # Suppose we cannot die or regress while in state 2, can only go to state 3 #' Q <- twoway4.q; Q[2,4] <- Q[2,1] <- 0; diag(Q) <- 0; diag(Q) <- -rowSums(Q) #' efpt.msm(qmatrix=Q, tostate=3) #' # The expected time from 2 to 3 now equals the mean sojourn time in 2. #' -1/Q[2,2] #' #' # Calculate cumulative distribution of the first passage time #' # into state 3 for the following three-state model #' Q <- twoway4.q[1:3,1:3]; diag(Q) <- 0; diag(Q) <- -rowSums(Q) #' # Firstly form a model where the desired hitting state is absorbing #' Q[3,] <- 0 #' MatrixExp(Q, t=10)[,3] #' ppass.msm(qmatrix=Q, tot=10) #' # Given in state 1 at time 0, P(hit 3 by time 10) = 0.479 #' MatrixExp(Q, t=50)[,3] # P(hit 3 by time 50) = 0.98 #' ppass.msm(qmatrix=Q, tot=50) #' #' #' @export efpt.msm efpt.msm <- function(x=NULL, qmatrix=NULL, tostate, start="all", covariates="mean", ci=c("none","normal","bootstrap"), cl = 0.95, B = 1000, cores=NULL, ...) { ci <- match.arg(ci) if (!is.null(x)) { if (!inherits(x, "msm")) stop("expected x to be a msm model") qmatrix <- qmatrix.msm(x, covariates=covariates, ci="none") } else if (!is.null(qmatrix)) { if (!is.matrix(qmatrix) || (nrow(qmatrix) != ncol(qmatrix))) stop("expected qmatrix to be a square matrix") if (ci != "none") {warning("No fitted model supplied: not calculating confidence intervals."); ci <- "none"} } if (is.character(tostate)) { if (!tostate %in% rownames(qmatrix)) stop(sprintf("state \"%s\" unknown", tostate)) tostate <- match(tostate, rownames(qmatrix)) } est <- rep(NA, nrow(qmatrix)) ## EFPT is zero if we're already in tostate est[tostate] <- 0 abstate <- absorbing.msm(qmatrix=qmatrix) ## EFPT is infinite for other absorbing states est[setdiff(abstate,tostate)] <- Inf fromstate <- setdiff(1:nrow(qmatrix), union(abstate,tostate)) ## EFPT is infinite if any chance of absorbing elsewhere before ## hitting tostate. To calculate this, form Q matrix with tostate ## made absorbing, and look at P matrix in unit time. Qred <- qmatrix; Qred[tostate,] <- 0 Pmat <- MatrixExp(Qred, ...) Pmat[Pmat < 1e-16] <- 0 p.abs <- rowSums(Pmat[fromstate,setdiff(abstate,tostate),drop=FALSE]) est[fromstate][p.abs>0] <- Inf ## Any states left from which EFPT to tostate is nonzero and finite. ## Use standard linear equation solution ## see, e.g. equation (3) of Harrison and Knottenbelt (2001) if (any(is.na(est))){ fromstate <- which(is.na(est)) Q <- as.matrix(qmatrix[fromstate, fromstate]) est[fromstate] <- solve(-Q, rep(1,nrow(Q))) } if (!is.character(start)) { if (!is.numeric(start) || (length(start)!=nrow(qmatrix))) stop("Expected \"start\" to be \"all\" or a numeric vector of length ", nrow(qmatrix)) start <- start / sum(start) est <- est %*% start } else if (any(start!="all")) stop("Expected \"start\" to be \"all\" or a numeric vector of length ", nrow(qmatrix)) e.ci <- switch(ci, bootstrap = efpt.ci.msm(x=x, qmatrix=qmatrix, tostate=tostate, start=start, covariates=covariates, cl=cl, B=B, cores=cores), normal = efpt.normci.msm(x=x, qmatrix=qmatrix, tostate=tostate, start=start, covariates=covariates, cl=cl, B=B), none = NULL) res <- if (ci=="none") est else rbind(est, e.ci) class(res) <- c("msm.estbystate", class(res)) res } msm/R/outputs.R0000644000176200001440000025720614660335245013141 0ustar liggesusers### Functions related to extracting intensity and probability matrices from msm models #' Transition intensity matrix #' #' Extract the estimated transition intensity matrix, and the corresponding #' standard errors, from a fitted multi-state model at a given set of covariate #' values. #' #' Transition intensities and covariate effects are estimated on the log scale #' by \code{\link{msm}}. A covariance matrix is estimated from the Hessian of #' the maximised log-likelihood. #' #' A more practically meaningful parameterisation of a continuous-time Markov #' model with transition intensities \eqn{q_{rs}} is in terms of the mean #' sojourn times \eqn{-1 / q_{rr}} in each state \eqn{r} and the probabilities #' that the next move of the process when in state \eqn{r} is to state \eqn{s}, #' \eqn{-q_{rs} / q_{rr}}. #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param covariates The covariate values at which to estimate the intensity #' matrix. This can either be:\cr #' #' the string \code{"mean"}, denoting the means of the covariates in the data #' (this is the default),\cr #' #' the number \code{0}, indicating that all the covariates should be set to #' zero,\cr #' #' or a list of values, with optional names. For example #' #' \code{list (60, 1)} #' #' where the order of the list follows the order of the covariates originally #' given in the model formula. Or more clearly, a named list, #' #' \code{list (age = 60, sex = 1)} #' #' If some covariates are specified but not others, the missing ones default to #' zero. #' #' With \code{covariates="mean"}, for factor / categorical variables, the mean #' of the 0/1 dummy variable for each factor level is used, representing an #' average over all values in the data, rather than a specific factor level. #' @param sojourn Set to TRUE if the estimated sojourn times and their standard #' errors should also be returned. #' @param ci If \code{"delta"} (the default) then confidence intervals are #' calculated by the delta method, or by simple transformation of the Hessian #' in the very simplest cases. Normality on the log scale is assumed. #' #' If \code{"normal"}, then calculate a confidence interval by simulating #' \code{B} random vectors from the asymptotic multivariate normal distribution #' implied by the maximum likelihood estimates (and covariance matrix) of the #' log transition intensities and covariate effects, then transforming. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' @param cl Width of the symmetric confidence interval to present. Defaults #' to 0.95. #' @param B Number of bootstrap replicates, or number of normal simulations #' from the distribution of the MLEs. #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' @return A list with components: #' #' \item{estimate}{Estimated transition intensity matrix.} #' #' \item{SE}{Corresponding approximate standard errors.} #' #' \item{L}{Lower confidence limits} #' #' \item{U}{Upper confidence limits} #' #' Or if \code{ci="none"}, then \code{qmatrix.msm} just returns the estimated #' transition intensity matrix. #' #' If \code{sojourn} is \code{TRUE}, extra components called \code{sojourn}, #' \code{sojournSE}, \code{sojournL} and \code{sojournU} are included, #' containing the estimates, standard errors and confidence limits, #' respectively, of the mean sojourn times in each transient state. #' #' The default print method for objects returned by \code{\link{qmatrix.msm}} #' presents estimates and confidence limits. To present estimates and standard #' errors, do something like #' #' \code{qmatrix.msm(x)[c("estimates","SE")]} #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{pmatrix.msm}}, \code{\link{sojourn.msm}}, #' \code{\link{deltamethod}}, \code{\link{ematrix.msm}} #' @keywords models #' @export qmatrix.msm qmatrix.msm <- function(x, covariates="mean", sojourn=FALSE, ci=c("delta","normal","bootstrap","none"), cl=0.95, B=1000, cores=NULL) { if (!inherits(x, "msm")) stop("expected x to be a msm model") nst <- x$qmodel$nstates ni <- x$qmodel$npars covlist <- msm.parse.covariates(x, covariates, x$qcmodel) nc <- length(covlist) # number of effects we need to adjust baseline for if ((cl < 0) || (cl > 1)) stop("expected cl in [0,1]") se <- lse <- fixed <- numeric(ni) logest <- x$Qmatrices$logbaseline if (is.null(x$QmatricesFixed)) x <- msm.form.output(x, "intens") # for back-compat with pre 1.4.1 model objects fixed <- x$QmatricesFixed$logbaseline for (i in seq_len(nc)) { logest <- logest + x$Qmatrices[[i+1]] * covlist[[i]] fixed <- fixed & x$QmatricesFixed[[i+1]] # Only true if all coefficients contributing to the estimate are fixed. Used in print functions } mat <- exp(logest) mat[x$qmodel$imatrix == 0] <- 0 mat <- msm.fixdiag.qmatrix(mat) if (sojourn) soj = -1 / diag(mat) ci <- match.arg(ci) if (x$foundse && (ci!="none")) { if (ci == "delta") { ## Work out standard errors. ## Transformation for delta method is (intensities) ## exp (x1 + x2 (cov1 - covmean1) + x3 (cov2 - covmean2) + ... ) ## expit(sum covs) / (1 + expit(sum(covs))) or 1 / (1 + expit(sum(covs))) ## Use delta method to find approximate SE of the transform on log scale ## Work out a CI for this by assuming normal and transforming back coefs <- as.numeric(c(1, covlist)) semat <- lsemat <- lmat <- umat <- matrix(0, nst, nst) form <- as.formula(paste("~", expsum(seq(nc + 1), coefs))) lform <- as.formula(paste("~", lsum(seq(nc + 1), coefs))) ## indices into estimates vector of all intens/miscs, intens covs / misc covs inds <- seq(length.out=x$qmodel$npars + x$qcmodel$npars) for (i in 1 : ni){ ## indices into estimates vector of all intens/miscs, intens covs / misc covs for that particular fromstate-tostate. parinds <- inds[seq(i, (nc * ni + i), ni)] ests <- x$estimates[parinds] cov <- x$covmat[parinds, parinds] se[i] <- deltamethod(form, ests, cov) lse[i] <- deltamethod(lform, ests, cov) } ivector <- as.numeric(t(x$qmodel$imatrix)) semat[ivector == 1] <- se; semat <- t(semat) lsemat[ivector == 1] <- lse; lsemat <- t(lsemat) lmat <- exp(logest - qnorm(1 - 0.5*(1 - cl))*lsemat) umat <- exp(logest + qnorm(1 - 0.5*(1 - cl))*lsemat) imatrix <- x$qmodel$imatrix lmat[imatrix == 0] <- umat[imatrix == 0] <- 0 ## SEs of diagonal entries diagse <- qmatrix.diagse.msm(x, covlist, sojourn, ni, ivector, nc) diag(semat) <- diagse$diagse diag(lmat) <- sign(diag(mat)) * (exp(log(abs(diag(mat))) - sign(diag(mat)) * qnorm(1 - 0.5*(1 - cl))*diagse$diaglse)) diag(umat) <- sign(diag(mat)) * (exp(log(abs(diag(mat))) + sign(diag(mat)) * qnorm(1 - 0.5*(1 - cl))*diagse$diaglse)) if (sojourn) { sojse <- diagse$sojse sojl <- exp(log(soj) - qnorm(1 - 0.5*(1 - cl))*diagse$sojlse) soju <- exp(log(soj) + qnorm(1 - 0.5*(1 - cl))*diagse$sojlse) } } else if (ci %in% c("normal","bootstrap")) { q.ci <- if (ci=="normal") qmatrix.normci.msm(x, covariates, sojourn, cl, B) else qmatrix.ci.msm(x, covariates, sojourn, cl, B, cores) if (sojourn) { soj.ci <- q.ci$soj q.ci <- q.ci$q sojl <- soj.ci[1,]; soju <- soj.ci[2,]; sojse <- soj.ci[3,] } lmat <- q.ci[,,1]; umat <- q.ci[,,2]; semat <- q.ci[,,3] } dimnames(semat) <- dimnames(lmat) <- dimnames(umat) <- dimnames(x$qmodel$qmatrix) } else semat <- lmat <- umat <- sojse <- sojl <- soju <- NULL dimnames(mat) <- dimnames(x$qmodel$qmatrix) if (ci=="none"){ if (sojourn) res <- soj else { res <- mat class(res) <- "msm.est" } } else { if (sojourn) res <- list(estimates=mat, SE=semat, L=lmat, U=umat, fixed=fixed, sojourn=soj, sojournSE=sojse, sojournL=sojl, sojournU=soju) else res <- list(estimates=mat, SE=semat, L=lmat, U=umat, fixed=fixed) class(res) <- "msm.est" } res } #' Misclassification probability matrix #' #' Extract the estimated misclassification probability matrix, and #' corresponding confidence intervals, from a fitted multi-state model at a #' given set of covariate values. #' #' Misclassification probabilities and covariate effects are estimated on the #' multinomial-logit scale by \code{\link{msm}}. A covariance matrix is #' estimated from the Hessian of the maximised log-likelihood. From these, the #' delta method can be used to obtain standard errors of the probabilities on #' the natural scale at arbitrary covariate values. Confidence intervals are #' estimated by assuming normality on the multinomial-logit scale. #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}} #' @param covariates #' #' The covariate values for which to estimate the misclassification probability #' matrix. This can either be:\cr #' #' the string \code{"mean"}, denoting the means of the covariates in the data #' (this is the default),\cr #' #' the number \code{0}, indicating that all the covariates should be set to #' zero,\cr #' #' or a list of values, with optional names. For example #' #' \code{list (60, 1)} #' #' where the order of the list follows the order of the covariates originally #' given in the model formula, or a named list, #' #' \code{list (age = 60, sex = 1)} #' @param ci If \code{"delta"} (the default) then confidence intervals are #' calculated by the delta method, or by simple transformation of the Hessian #' in the very simplest cases. #' #' If \code{"normal"}, then calculate a confidence interval by simulating #' \code{B} random vectors from the asymptotic multivariate normal distribution #' implied by the maximum likelihood estimates (and covariance matrix) of the #' multinomial-logit-transformed misclassification probabilities and covariate #' effects, then transforming back. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' @param cl Width of the symmetric confidence interval to present. Defaults #' to 0.95. #' @param B Number of bootstrap replicates, or number of normal simulations #' from the distribution of the MLEs #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' @return A list with components: #' #' \item{estimate}{Estimated misclassification probability matrix. The rows #' correspond to true states, and columns observed states.} #' \item{SE}{Corresponding approximate standard errors.} \item{L}{Lower #' confidence limits.} \item{U}{Upper confidence limits.} #' #' Or if \code{ci="none"}, then \code{ematrix.msm} just returns the estimated #' misclassification probability matrix. #' #' The default print method for objects returned by \code{\link{ematrix.msm}} #' presents estimates and confidence limits. To present estimates and standard #' errors, do something like #' #' \code{ematrix.msm(x)[c("estimates","SE")]} #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{qmatrix.msm}} #' @keywords models #' @export ematrix.msm <- function(x, covariates="mean", ci=c("delta","normal","bootstrap","none"), cl=0.95, B=1000, cores=NULL) { if (!inherits(x, "msm")) stop("expected x to be a msm model") if (!x$emodel$misc) return(NULL) nst <- x$qmodel$nstates ni <- x$emodel$npars covlist <- msm.parse.covariates(x, covariates, x$ecmodel) nc <- length(covlist) if ((cl < 0) || (cl > 1)) stop("expected cl in [0,1]") se <- lse <- numeric(ni) logest <- x$Ematrices$logitbaseline if (is.null(x$EmatricesFixed)) x <- msm.form.output(x, "misc") # for back-compat with pre 1.4.1 model objects fixed <- x$EmatricesFixed$logitbaseline for (i in seq_len(nc)) { logest <- logest + x$Ematrices[[i+1]] * covlist[[i]] fixed <- fixed & x$EmatricesFixed[[i+1]] # Only true if all coefficients contributing to the estimate are fixed. Used in print functions } plabs <- x$emodel$imatrix plabs[x$emodel$imatrix==1] <- "p" diag(plabs)[rowSums(x$emodel$imatrix)>0] <- "pbase" hmodeltmp <- list(plabs = as.vector(t(plabs)), parstate = rep(1:nst, each=nst), parout = rep(1, length(plabs))) mat <- matrix(msm.mninvlogit.transform(as.vector(t(logest)), hmodeltmp), nrow=nst, byrow=TRUE) ## true states with no misclassification or perfect misclassification mat[cbind(which(x$hmodel$model==match("identity", .msm.HMODELS)), x$hmodel$pars[names(x$hmodel$pars)=="which"])] <- 1 ci <- match.arg(ci) if (x$foundse && (ci!="none")) { if (ci == "delta") { ## Work out standard errors. ## Transformation for delta method is ## expit(sum covs) / (1 + expit(sum(covs))) or 1 / (1 + expit(sum(covs))) semat <- lmat <- umat <- matrix(0, nst, nst) p.se <- p.se.msm(x, covariates) ivector <- as.numeric(t(x$emodel$imatrix)) if (any(p.se$lab %in% c("p","pbase"))){ semat[ivector==1] <- p.se$se[p.se$lab=="p"]; semat <- t(semat) lmat[ivector==1] <- p.se$LCL[p.se$lab=="p"]; lmat <- t(lmat) umat[ivector==1] <- p.se$UCL[p.se$lab=="p"]; umat <- t(umat) diag(semat)[rowSums(x$emodel$imatrix)>0] <- p.se$se[p.se$lab=="pbase"] diag(lmat)[rowSums(x$emodel$imatrix)>0] <- p.se$LCL[p.se$lab=="pbase"] diag(umat)[rowSums(x$emodel$imatrix)>0] <- p.se$UCL[p.se$lab=="pbase"] } lmat[mat==1] <- umat[mat==1] <- 1 } else if (ci=="normal") { e.ci <- ematrix.normci.msm(x, covariates, cl, B) lmat <- e.ci[,,1]; umat <- e.ci[,,2]; semat <- e.ci[,,3] } else if (ci=="bootstrap") { e.ci <- ematrix.ci.msm(x, covariates, cl, B, cores) lmat <- e.ci[,,1]; umat <- e.ci[,,2]; semat <- e.ci[,,3] } dimnames(semat) <- dimnames(lmat) <- dimnames(umat) <- dimnames(x$qmodel$qmatrix) } else semat <- lmat <- umat <- NULL dimnames(mat) <- dimnames(x$qmodel$qmatrix) if (ci=="none") res <- mat else { res <- list(estimates=mat, SE=semat, L=lmat, U=umat, fixed=fixed) } class(res) <- "msm.est" res } ## Convert "covariates" argument supplied in output function (like ## qmatrix.msm) to a list of values, one per covariate effect ## (e.g. one per factor contrast). Handle special arguments 0 and ## "mean". msm.parse.covariates <- function(x, covariates, mod, consider.center=TRUE){ nc <- mod$ncovs if (nc == 0){ if (is.list(covariates) && (length(covariates) > 0)) warning("Ignoring covariates - no covariates in this part of the model") return(list()) } if (consider.center) { ## no adjustment needed: baseline is what we want if (!is.list(covariates) && ((covariates==0 && !x$center) || (covariates=="mean" && x$center))) return(list()) } if (!is.list(covariates)) { covlist <- list() if (covariates == 0) { for (i in 1:nc) covlist[[mod$covlabels[i]]] <- 0 } else if (covariates == "mean") { for (i in 1:nc) covlist[[mod$covlabels[i]]] <- mod$covmeans[i] } else stop("covariates argument must be 0, \"mean\", or a list of values for each named covariate") } else { ## Check supplied list of covariate values, convert factors to numeric contrasts, expand interactions, set unknown values to zero. covlist <- factorcov2numeric.msm(covariates, x, mod) } if (x$center && consider.center) for (i in 1:nc) covlist[[mod$covlabels[i]]] <- covlist[[mod$covlabels[i]]] - mod$covmeans[i] covlist } ### Given a "covariates" argument of an extractor function containing ### factor covariates, convert the factor covariates to numeric ### contrasts. For example, for a categorical covariate "smoke" with ### three levels "NON","CURRENT","EX", with baseline level "NON", ### convert list(smoke="CURRENT") to list(smokeCURRENT=1, smokeEX=0) ### Any unspecified covariate values are set to zero. ### Any unknown covariates are dropped with a warning. factorcov2numeric.msm <- function(covariates, x, mod=NULL) { if (is.null(mod)) mod <- x$qcmodel covdata.mf <- x$data$mf[attr(x$data$mf,"covnames")] covnames.mm <- mod$covlabels covfactor <- sapply(covdata.mf, is.factor) covfactorlevels <- lapply(covdata.mf, levels) covnames <- names(covdata.mf) if (is.null(names(covariates))) { if (length(covariates)!=length(covnames)) stop("Expected covariate list of length ",length(covnames)) names(covariates) <- covnames } all.covnames <- union(covnames.mm,covnames) # including both factor and contrast names miss.covs <- ! names(covariates) %in% all.covnames if (any(miss.covs)){ plural <- if(sum(miss.covs)>1) "s" else "" warning("Covariate",plural," \"", paste(names(covariates)[which(!names(covariates) %in% all.covnames)], collapse=", "), "\" unknown, ignoring") } cfac <- covariates[names(covariates) %in% covnames[which(covfactor)]] cnum <- covariates[! names(covariates) %in% covnames[which(covfactor)]] cfac.new <- list() for (i in seq_along(cfac)) { levs.i <- covfactorlevels[[names(cfac)[[i]]]] cfac.i <- rep(0, length(levs.i)) if (! cfac[[i]] %in% levs.i) stop("Level \"", cfac[[i]], "\" of covariate ", names(cfac)[[i]], " unknown") cfac.i[match(cfac[[i]], levs.i)] <- 1 names(cfac.i) <- paste(names(cfac)[[i]], levs.i, sep="") cfac.i <- as.list(cfac.i[-1]) cfac.new <- c(cfac.new, cfac.i) } covlabels.noint <- covnames.mm[setdiff(seq_along(covnames.mm), grep(":", covnames.mm))] covs.out <- as.list(numeric(length(covlabels.noint))) names(covs.out) <- covlabels.noint covs.out[names(cnum)] <- cnum covs.out[names(cfac.new)] <- cfac.new ## fixme when called from bootstrap, hasn't worked. ## is it because covfactor is all false? is covdata.mf wrong? yes both numeric covs.out <- expand.interactions.msm(covs.out, covnames.mm) covs.out } ### Work out SE and CIs of misclassification probabilities for given covariate values. ### Know SEs of beta_rs, use delta method to calculate. ### SE of p_rs = exp(beta_rs x) / (1 + sum(exp(beta_rs x))) (non-baseline p) or 1 / (1 + sum(exp(beta_rs x))) (baseline p). ### To calculate symmetric CI for resulting p_rs, assume logit(p_rs) normal, and use SE(logit(p_rs)) calculated by delta method. p.se.msm <- function(x, covariates) { qmodel <- x$qmodel; emodel <- x$emodel; hmodel <- x$hmodel; qcmodel <- x$qcmodel; ecmodel <- x$ecmodel; paramdata <- x$paramdata nst <- qmodel$nstates inds <- (qmodel$npars + qcmodel$npars + 1) : (qmodel$npars + qcmodel$npars + sum(hmodel$npars) + hmodel$ncoveffs) ni <- emodel$npars covlist <- msm.parse.covariates(x, covariates, ecmodel) nc <- length(covlist) coefs <- as.numeric(c(1, covlist)) ppars <- hmodel$plabs %in% c("p","pbase") res <- data.frame(lab=hmodel$plabs[ppars]) hmmallpars <- !(paramdata$plabs %in% c("qbase","qcov","initp","initp0","initpcov")) res$est <- msm.mninvlogit.transform(paramdata$params[paramdata$hmmpars], hmodel)[ppars] res$parstate <- hmodel$parstate[ppars] if (any(ppars)) res$se <- res$lse <- res$LCL <- res$UCL <- res$inds <- res$strs <- 0 cur.i <- 1 for (i in unique(res$parstate)) { nir <- sum(hmodel$parstate[hmodel$plabs=="p"] == i) # number of independent misc probs for current state if (nir > 0){ # might be perfect misclassification p.inds <- which(hmodel$plabs=="p" & hmodel$parstate==i) # indices into HMM parameter vector of logit baseline p for that state cov.inds <- sum(hmodel$npars) + (cur.i-1)*nc + seq(length.out=(nc*nir)) # indices into HMM parameter vector of corresp cov effects parinds <- numeric(); formstr <- character(nir) for (j in 1:nir) { formstr[j] <- expsum(1:((nc+1)*nir), coefs) # string of form exp(1*x1+beta1*x2*beta2*x3), exp(x4+beta*x5+...) parinds <- c(parinds, p.inds[j], cov.inds[(j-1)*nc + seq(length.out=nc)]) # indices into HMM par vector corresp to x1,x2,x3,... } sumstr <- paste(formstr, collapse = " + ") # "parinds" are formstr <- paste("1 / (1 + ", sumstr, ")") form <- as.formula(paste("~ ",formstr)) lform <- as.formula(paste("~ log( (", formstr, ") / (1 - ", formstr, "))")) ests <- paramdata$params[hmmallpars][parinds] cov <- paramdata$covmat[hmmallpars,hmmallpars][parinds, parinds] res$se[res$parstate==i & res$lab=="pbase"] <- deltamethod(form, ests, cov) res$lse[res$parstate==i & res$lab=="pbase"] <- deltamethod(lform, ests, cov) res$strs[res$parstate==i & res$lab=="pbase"] <- paste(as.character(form),collapse="") res$inds[res$parstate==i & res$lab=="pbase"] <- paste(parinds,collapse=",") for (j in 1:nir){ istr <- expsum(((j-1)*(nc+1)+1):(j*(nc+1)), coefs) formstr <- paste(istr, "/ (1 + ", sumstr, ")") form <- as.formula(paste("~ ",formstr)) lform <- as.formula(paste("~ log( (", formstr, ") / (1 - ", formstr, "))")) res$se[res$parstate==i & res$lab=="p"][j] <- deltamethod(form, ests, cov) res$lse[res$parstate==i & res$lab=="p"][j] <- deltamethod(lform, ests, cov) res$strs[res$parstate==i & res$lab=="p"][j] <- paste(as.character(form), collapse="") res$inds[res$parstate==i & res$lab=="p"][j] <- paste(parinds,collapse=",") } cur.i <- cur.i + nir } } res$LCL <- plogis(qlogis(res$est) - qnorm(0.975)*res$lse) res$UCL <- plogis(qlogis(res$est) + qnorm(0.975)*res$lse) res } ### Work out standard error of a ratio of intensities using delta method ### Uuugh. What a fuss for one little number. qratio.se.msm <- function(x, ind1, ind2, covariates, cl=0.95) { nst <- x$qmodel$nstates ni <- x$qmodel$npars covlist <- msm.parse.covariates(x, covariates, x$qcmodel) nc <- length(covlist) indmat <- t(x$qmodel$imatrix) indmat[indmat == 1] <- seq(length.out = x$qmodel$npars) indmat <- t(indmat) # matrix of indices of estimate vector inds <- seq(length.out = x$qmodel$npars+x$qcmodel$npars) # identifiers for q and beta parameters coefs <- as.numeric(c(1, unlist(covlist))) parinds <- numeric() indmatrow.n <- indmat[ind1[1],-ind1[1]] nir.n <- sum(indmatrow.n > 0) indmatrow.d <- indmat[ind2[1],-ind2[1]] nir.d <- sum(indmatrow.d > 0) formstr.n <- character(nir.n) formstr.d <- character(nir.d) if (ind1[1]!=ind1[2] && ind2[1]!=ind2[2]) { # both intensities are off-diagonal parinds <- c(inds[indmat[ind1[1],ind1[2]] - 1 + seq(1, (nc * ni + 1), ni)], inds[indmat[ind2[1],ind2[2]] - 1 + seq(1, (nc * ni + 1), ni)]) parinds2 <- sort(unique(parinds)) xinds <- rank(parinds2)[match(parinds, parinds2)] formstr.n <- expsum(xinds[1:(nc+1)], coefs) formstr.d <- expsum(xinds[1:(nc+1) + nc+1] , coefs) } else if (ind1[1]!=ind1[2] && ind2[1]==ind2[2]) { # numerator off-diagonal, denom diagonal parinds <- inds[indmat[ind1[1],ind1[2]] - 1 + seq(1, (nc * ni + 1), ni)] cur.i <- min(indmatrow.d[indmatrow.d>0]) for (j in 1:nir.d) parinds <- c(parinds, inds[cur.i - 1 + seq(j, (nc * ni + j), ni)]) parinds2 <- sort(unique(parinds)) xinds <- rank(parinds2)[match(parinds, parinds2)] formstr.n <- expsum(xinds[1:(nc+1)], coefs) for (j in 1:nir.d) formstr.d[j] <- expsum(xinds[1:(nc+1) + j*(nc+1)], coefs) } else if (ind1[1]==ind1[2] && ind2[1]!=ind2[2]) { # numerator diagonal, denom off-diagonal cur.i <- min(indmatrow.n[indmatrow.n>0]) for (j in 1:nir.n) parinds <- c(parinds, inds[cur.i - 1 + seq(j, (nc * ni + j), ni)]) parinds <- c(parinds, inds[indmat[ind2[1],ind2[2]] - 1 + seq(1, (nc * ni + 1), ni)]) parinds2 <- sort(unique(parinds)) xinds <- rank(parinds2)[match(parinds, parinds2)] for (j in 1:nir.n) formstr.n[j] <- expsum(xinds[1:(nc+1) + (j-1)*(nc+1)], coefs) formstr.d <- expsum(xinds[nir.n*(nc+1) + 1:(nc+1)], coefs) } else if (ind1[1]==ind1[2] && ind2[1]==ind2[2]) { # both intensities diagonal cur.i <- min(indmatrow.n[indmatrow.n>0]) for (j in 1:nir.n) parinds <- c(parinds, inds[cur.i - 1 + seq(j, (nc * ni + j), ni)]) cur.i <- min(indmatrow.d[indmatrow.d>0]) for (j in 1:nir.d) parinds <- c(parinds, inds[cur.i - 1 + seq(j, (nc * ni + j), ni)]) parinds2 <- sort(unique(parinds)) xinds <- rank(parinds2)[match(parinds, parinds2)] for (j in 1:nir.n) formstr.n[j] <- expsum(xinds[1:(nc+1) + (j-1)*(nc+1)], coefs) for (j in 1:nir.d) formstr.d[j] <- expsum(xinds[nir.n*(nc+1) + 1:(nc+1) + (j-1)*(nc+1)], coefs) } num <- paste(formstr.n, collapse = " + ") denom <- paste(formstr.d, collapse = " + ") form <- as.formula(paste("~", "(", num, ") / (", denom, ")")) lform <- as.formula(paste("~ ", "log (", num, ") - log (", denom, ")")) ests <- x$estimates[parinds2] cov <- x$covmat[parinds2,parinds2] se <- deltamethod(form, ests, cov) lse <- deltamethod(lform, ests, cov) list(se=se, lse=lse) } ### Work out standard errors of diagonal entries of intensity matrix, or sojourn times, using delta method qmatrix.diagse.msm <- function(x, covlist, sojourn, ni, ivector, nc) { nst <- x$qmodel$nstates diagse <- diaglse <- sojse <- sojlse <- numeric(nst) indmat <- matrix(ivector, nst, nst) indmat[indmat==1] <- seq(length.out = ni) indmat <- t(indmat) # matrix of indices of estimate vector inds <- seq(length.out = ni + ni*nc) cur.i <- 1 coefs <- as.numeric(c(1, unlist(covlist))) for (i in 1:nst){ ## Transformation for delta method is ## exp(x1 + x2 (cov1 - covmean1) + x3 (cov2 - covmean2) + ... ) + ## exp(x4 + x5 (cov1 - covmean1) + x6 (cov2 - covmean2) + ... ) + (or expit(...)) nir <- sum(indmat[i,-i] > 0) # number of intens/misc for current state if (nir > 0) { qf <- expsum.formstr(nir, inds, cur.i, ni, nc, coefs) form <- as.formula(paste("~", paste(qf$formstr, collapse = " + "))) lform <- as.formula(paste("~ log (", paste(qf$formstr, collapse = " + "), ")")) ests <- x$estimates[qf$parinds2] cov <- x$covmat[qf$parinds2, qf$parinds2] diagse[i] <- deltamethod(form, ests, cov) diaglse[i] <- deltamethod(lform, ests, cov) if (sojourn){ ## Mean sojourn times are -1 / diagonal entries of q matrix. Calculate their SEs and CIs. form <- as.formula(paste("~ 1 / (", paste(qf$formstr, collapse = " + "), ")")) lform <- as.formula(paste("~ log ( 1 / (", paste(qf$formstr, collapse = " + "), ")", ")")) sojse[i] <- deltamethod(form, ests, cov) sojlse[i] <- deltamethod(lform, ests, cov) } cur.i <- cur.i + nir } else diagse[i] <- 0 } list(diagse=diagse, diaglse=diaglse, sojse=sojse, sojlse=sojlse) } ### Make a list of covariate lists to supply to pmatrix.piecewise.msm for models with "pci" time-dependent intensities. ### One for each time period, with time constant covariates replicated. ### For use in model assessment functions ### Returns factor covariates as contrasts, not factor levels. msm.fill.pci.covs <- function(x, covariates="mean"){ nc <- x$qcmodel$ncovs ## indices of covariates representing time periods ti <- grep("timeperiod\\[.+\\)", x$qcmodel$covlabels) ni <- setdiff(1:nc, ti) # indices of other covariates covlist <- msm.parse.covariates(x, covariates, x$qcmodel, consider.center=FALSE) for (i in names(covariates)) if (length(grep("^timeperiod",i))==0) { if (i %in% union(attr(x$data$mf, "covnames"),x$qcmodel$covlabels)) covlist[[i]] <- covariates[[i]] else warning("Covariate ",i," unknown") } for (i in ti) covlist[[i]] <- 0 ## set contrasts for each successive time period to 1 ncut <- length(x$pci) covlistlist <- vector(ncut+1, mode="list") names(covlistlist) <- levels(x$data$mf$timeperiod) covlistlist[[1]] <- covlist for (i in seq(length.out=ncut)){ covlistlist[[i+1]] <- covlist covlistlist[[i+1]][[ti[i]]] <- 1 } covlistlist } ### Given a "covariates" argument of an extractor function containing ### covariates which interact in the model, form the corresponding ### "covariates" argument with the interactions expanded. expand.interactions.msm <- function(covariates, covlabels){ cn.nointer <- names(covariates) elist <- strsplit(covlabels, ":") elist <- lapply(elist, function(x)covariates[x]) elist <- lapply(elist, function(x)prod(unlist(x))) names(elist) <- covlabels elist } #' @export print.msm.est <- function(x, digits=NULL, ...) { if (is.list(x)) print_ci(x$estimates, x$L, x$U, x$fixed, digits=digits) else print(unclass(x), digits=digits) } #' @export "[.msm.est" <- function(x, i, j, drop=FALSE){ Narg <- nargs() - (!missing(drop)) # number of args including x, excluding drop if ((missing(i) && missing(j))) res <- x else if (!is.list(x)){ res <- unclass(x) if (missing(j) && (Narg==2)) res <- res[i] else res <- res[i,j] } else { if (missing(j) && (Narg==2)) stop("Two dimensions must be supplied, found only one") if ("SE" %in% names(x)) { x <- array(unlist(x), dim=c(dim(x[[1]]),4)) dimnames(x) <- list(rownames(x[[1]]), colnames(x[[1]]), c("estimate","SE","lower","upper")) } else { x <- array(unlist(x), dim=c(dim(x[[1]]),3)) dimnames(x) <- list(rownames(x[[1]]), colnames(x[[1]]), c("estimate","lower","upper")) } res <- x[i,j,] } res } #' @noRd format.ci <- function(x, l, u, noci=NULL, digits=NULL, ...) { if (is.null(noci)) noci <- rep(FALSE, length(x)) noci[is.na(noci)] <- FALSE if (is.null(digits)) digits <- 4 ## note format() aligns nicely on point, unlike formatC est <- format(x, digits=digits, ...) res <- est if (!is.null(l)) { low <- format(l[!noci], digits=digits, ...) upp <- format(u[!noci], digits=digits, ...) res[!noci] <- paste(res[!noci], " (", low, ",", upp, ")", sep="") res[x==0] <- 0 } else res <- est dim(res) <- dim(x) dimnames(res) <- dimnames(x) names(res) <- names(x) res } print_ci <- function(x, l, u, fixed=NULL, digits=NULL){ res <- format.ci(x, l, u, fixed, digits) print(res, quote=FALSE) } ### Work out CIs of initial state occupancy probabilities using normal simulation method initp.ci.msm <- function(paramdata, cl=0.95){ p <- paramdata Sig <- p$covmat[p$plabs%in%c("initp"),p$plabs%in%c("initp"),drop=FALSE] mu <- p$params[p$plabs%in%c("initp")] rr <- rmvnorm(10000, mu, Sig) initp.rep <- exp(rr) / (1 + rowSums(exp(rr))) p$ci[p$plabs=="initp",] <- t(apply(initp.rep, 2, quantile, c(0.5*(1-cl), 1 - 0.5*(1-cl)), na.rm=TRUE)) initp.rep <- 1 / (1 + rowSums(exp(rr))) p$ci[p$plabs=="initpbase",] <- quantile(initp.rep, c(0.5*(1-cl), 1 - 0.5*(1-cl))) p$ci[p$plabs=="initp0"] <- 0 p } ## Form a string, exp ( x1 1 + x2 (cov1 - covmean1) + x3 (cov2 - covmean2) + ... ) ## to be made into a formula for deltamethod. ## Also return indices of estimates and covariance matrix output from optim() to use ## to inform deltamethod expsum.formstr <- function(nir, inds, cur.i, ni, nc, coefs) { formstr <- character(nir) parinds <- numeric() for (j in (cur.i : (cur.i + nir - 1))) { indj <- seq(j, (nc * ni + j), ni) parinds <- c(parinds, inds[indj]) # first 1 5 7, then 2 5 7 } ## e.g. parinds = 1 5 7 2 5 7 becomes xinds = 1 3 4 2 3 4 parinds2 <- sort(unique(parinds)) xinds <- rank(parinds2)[match(parinds, parinds2)] for (j in 1:nir) formstr[j] <- expsum(xinds[1:(nc+1) + (j-1)*(nc+1)], coefs) list(formstr=formstr, parinds=parinds, parinds2=parinds2) } ## Form a string, exp ( x1 1 + x2 (cov1 - covmean1) + x3 (cov2 - covmean2) + ... ) ## to be made into a formula for deltamethod expsum <- function(inds, coefs) { xseq <- paste("x", inds, sep="") inprod <- paste(paste(coefs, xseq, sep="*"), collapse=" + ") paste("exp(", inprod, ")", sep="") } lsum <- function(inds, coefs) { xseq <- paste("x", inds, sep="") paste(paste(coefs, xseq, sep="*"), collapse=" + ") } #' Estimated ratio of transition intensities #' #' Compute the estimate and approximate standard error of the ratio of two #' estimated transition intensities from a fitted multi-state model at a given #' set of covariate values. #' #' #' For example, we might want to compute the ratio of the progression rate and #' recovery rate for a fitted model \code{disease.msm} with a health state #' (state 1) and a disease state (state 2). In this case, the progression rate #' is the (1,2) entry of the intensity matrix, and the recovery rate is the #' (2,1) entry. Thus to compute this ratio with covariates set to their means, #' we call #' #' \code{qratio.msm(disease.msm, c(1,2), c(2,1))} . #' #' Standard errors are estimated by the delta method. Confidence limits are #' estimated by assuming normality on the log scale. #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param ind1 Pair of numbers giving the indices in the intensity matrix of #' the numerator of the ratio, for example, \code{c(1,2)}. #' @param ind2 Pair of numbers giving the indices in the intensity matrix of #' the denominator of the ratio, for example, \code{c(2,1)}. #' @param covariates The covariate values at which to estimate the intensities. #' This can either be:\cr #' #' the string \code{"mean"}, denoting the means of the covariates in the data #' (this is the default),\cr #' #' the number \code{0}, indicating that all the covariates should be set to #' zero,\cr #' #' or a list of values, with optional names. For example #' #' \code{list (60, 1)} #' #' where the order of the list follows the order of the covariates originally #' given in the model formula, or a named list, #' #' \code{list (age = 60, sex = 1)} #' @param ci If \code{"delta"} (the default) then confidence intervals are #' calculated by the delta method. #' #' If \code{"normal"}, then calculate a confidence interval by simulating #' \code{B} random vectors from the asymptotic multivariate normal distribution #' implied by the maximum likelihood estimates (and covariance matrix) of the #' log transition intensities and covariate effects, then transforming. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' @param cl Width of the symmetric confidence interval to present. Defaults #' to 0.95. #' @param B Number of bootstrap replicates, or number of normal simulations #' from the distribution of the MLEs #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' @return A named vector with elements \code{estimate}, \code{se}, \code{L} #' and \code{U} containing the estimate, standard error, lower and upper #' confidence limits, respectively, of the ratio of intensities. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{qmatrix.msm}} #' @keywords models #' @export qratio.msm <- function(x, ind1, ind2, covariates = "mean", ci=c("delta","normal","bootstrap","none"), cl=0.95, B=1000, cores=NULL) { q <- qmatrix.msm(x, covariates, ci="none") if (!is.numeric(ind1) || length(ind1) != 2 || !is.numeric(ind2) || length(ind2) != 2) stop("ind1 and ind2 must be numeric vectors of length 2") if (any (! (ind1 %in% 1 : x$qmodel$nstates)) | any (! (ind2 %in% 1 : x$qmodel$nstates) ) ) stop("ind1 and ind2 must be pairs of states in 1, ..., ", x$qmodel$nstates) if ((cl < 0) || (cl > 1)) stop("expected cl in [0,1]") if (q[ind2[1], ind2[2]] == 0) stop (paste("Denominator q[",ind2[1],",",ind2[2],"", "] is zero\n", sep="")) else if (q[ind1[1], ind1[2]] == 0) { warning(paste ("Numerator q[",ind1[1],",",ind1[2],"", "] is zero\n", sep="")) estimate <- se <- 0 } else { estimate <- q[ind1[1], ind1[2]] / q[ind2[1], ind2[2]] ci <- match.arg(ci) if (x$foundse && (ci != "none")) { if (ci == "delta") { se <- qratio.se.msm(x, ind1, ind2, covariates, cl)$se lse <- qratio.se.msm(x, ind1, ind2, covariates, cl)$lse L <- exp ( log(abs(estimate)) - sign(estimate)*qnorm(1 - 0.5*(1 - cl)) * lse ) * sign(estimate) U <- exp ( log(abs(estimate)) + sign(estimate)*qnorm(1 - 0.5*(1 - cl)) * lse ) * sign(estimate) } else if (ci=="normal") { q.ci <- qratio.normci.msm(x, ind1, ind2, covariates, cl, B) L <- q.ci[1]; U <- q.ci[2]; se=q.ci[3] } else if (ci=="bootstrap") { q.ci <- qratio.ci.msm(x, ind1, ind2, covariates, cl, B, cores) L <- q.ci[1]; U <- q.ci[2]; se=q.ci[3] } } else {se <- L <- U <- NULL} } c(estimate=estimate, se=se, L=L, U=U) } #' Transition probability matrix #' #' Extract the estimated transition probability matrix from a fitted #' continuous-time multi-state model for a given time interval, at a given set #' of covariate values. #' #' For a continuous-time homogeneous Markov process with transition intensity #' matrix \eqn{Q}, the probability of occupying state \eqn{s} at time \eqn{u + #' t} conditionally on occupying state \eqn{r} at time \eqn{u} is given by the #' \eqn{(r,s)} entry of the matrix \eqn{P(t) = \exp(tQ)}{P(t) = exp(tQ)}, where #' \eqn{\exp()}{exp()} is the matrix exponential. #' #' For non-homogeneous processes, where covariates and hence the transition #' intensity matrix \eqn{Q} are piecewise-constant in time, the transition #' probability matrix is calculated as a product of matrices over a series of #' intervals, as explained in \code{\link{pmatrix.piecewise.msm}}. #' #' The \code{\link{pmatrix.piecewise.msm}} function is only necessary for #' models fitted using a time-dependent covariate in the \code{covariates} #' argument to \code{\link{msm}}. For time-inhomogeneous models fitted using #' "pci", \code{pmatrix.msm} can be used, with arguments \code{t} and #' \code{t1}, to calculate transition probabilities over any time period. #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param t The time interval to estimate the transition probabilities for, by #' default one unit. #' @param t1 The starting time of the interval. Used for models \code{x} with #' piecewise-constant intensities fitted using the \code{pci} option to #' \code{\link{msm}}. The probabilities will be computed on the interval [t1, #' t1+t]. #' @param covariates The covariate values at which to estimate the transition #' probabilities. This can either be:\cr #' #' the string \code{"mean"}, denoting the means of the covariates in the data #' (this is the default),\cr #' #' the number \code{0}, indicating that all the covariates should be set to #' zero,\cr #' #' or a list of values, with optional names. For example #' #' \code{list (60, 1)} #' #' where the order of the list follows the order of the covariates originally #' given in the model formula, or a named list, #' #' \code{list (age = 60, sex = 1)} #' #' If some covariates are specified but not others, the missing ones default to #' zero. #' #' For time-inhomogeneous models fitted using the \code{pci} option to #' \code{\link{msm}}, "covariates" here include only those specified using the #' \code{covariates} argument to \code{\link{msm}}, and exclude the artificial #' covariates representing the time period. #' #' For time-inhomogeneous models fitted "by hand" by using a time-dependent #' covariate in the \code{covariates} argument to \code{\link{msm}}, the #' function \code{\link{pmatrix.piecewise.msm}} should be used to to calculate #' transition probabilities. #' @param ci If \code{"normal"}, then calculate a confidence interval for the #' transition probabilities by simulating \code{B} random vectors from the #' asymptotic multivariate normal distribution implied by the maximum #' likelihood estimates (and covariance matrix) of the log transition #' intensities and covariate effects, then calculating the resulting transition #' probability matrix for each replicate. See, e.g. Mandel (2013) for a #' discussion of this approach. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' #' If \code{"none"} (the default) then no confidence interval is calculated. #' @param cl Width of the symmetric confidence interval, relative to 1. #' @param B Number of bootstrap replicates, or number of normal simulations #' from the distribution of the MLEs #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' @param qmatrix A transition intensity matrix. Either this or a fitted model #' \code{x} must be supplied. No confidence intervals are available if #' \code{qmatrix} is supplied. #' @param ... Optional arguments to be passed to \code{\link{MatrixExp}} to #' control the method of computing the matrix exponential. #' @return The matrix of estimated transition probabilities \eqn{P(t)} in the #' given time. Rows correspond to "from-state" and columns to "to-state". #' #' Or if \code{ci="normal"} or \code{ci="bootstrap"}, \code{pmatrix.msm} #' returns a list with components \code{estimates} and \code{ci}, where #' \code{estimates} is the matrix of estimated transition probabilities, and #' \code{ci} is a list of two matrices containing the upper and lower #' confidence limits. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk}. #' @seealso \code{\link{qmatrix.msm}}, \code{\link{pmatrix.piecewise.msm}}, #' \code{\link{boot.msm}} #' @references Mandel, M. (2013). "Simulation based confidence intervals for #' functions with complicated derivatives." The American Statistician #' 67(2):76-81 #' @keywords models #' @export pmatrix.msm <- function(x=NULL, # fitted msm model t = 1, # time interval t1 = 0, # start time for pci models covariates = "mean", # covariate values to calculate transition matrix for ci=c("none","normal","bootstrap"), # calculate a confidence interval # using either simulation from asymptotic normal dist of MLEs, or bootstrap cl = 0.95, # width of symmetric confidence interval B = 1000, # number of bootstrap replicates or normal simulations cores=NULL, qmatrix=NULL, ... ) { if (!is.numeric(t) || (t < 0)) stop("t must be a positive number") if (!is.null(x)) { if (!inherits(x, "msm")) stop("expected x to be a msm model") if (is.null(x$pci)) { q <- qmatrix.msm(x, covariates, ci="none") p <- MatrixExp(q, t, ...) colnames(p) <- rownames(p) <- rownames(q) ci <- match.arg(ci) p.ci <- switch(ci, bootstrap = pmatrix.ci.msm(x=x, t=t, t1=t1, covariates=covariates, cl=cl, B=B, cores=cores), normal = pmatrix.normci.msm(x=x, t=t, t1=t1, covariates=covariates, cl=cl, B=B), none = NULL) res <- if (ci=="none") p else list(estimates = p, L=p.ci[,,1], U=p.ci[,,2]) } else { piecewise.covariates <- msm.fill.pci.covs(x, covariates) res <- pmatrix.piecewise.msm(x, t1, t1 + t, x$pci, piecewise.covariates, ci, cl, B, ...) } } else if (!is.null(qmatrix)){ res <- MatrixExp(qmatrix, t, ...) } else stop("Neither a fitted model nor a qmatrix supplied") class(res) <- "msm.est" res } #' Transition probability matrix for processes with piecewise-constant #' intensities #' #' Extract the estimated transition probability matrix from a fitted #' non-time-homogeneous multi-state model for a given time interval. This is a #' generalisation of \code{\link{pmatrix.msm}} to models with time-dependent #' covariates. Note that \code{\link{pmatrix.msm}} is sufficient to calculate #' transition probabilities for time-inhomogeneous models fitted using the #' \code{pci} argument to \code{\link{msm}}. #' #' Suppose a multi-state model has been fitted, in which the transition #' intensity matrix \eqn{Q(x(t))} is modelled in terms of time-dependent #' covariates \eqn{x(t)}. The transition probability matrix \eqn{P(t_1, #' t_n)}{P(t1, tn)} for the time interval \eqn{(t_1, }{(t1, tn)}\eqn{ #' t_n)}{(t1, tn)} cannot be calculated from the estimated intensity matrix as #' \eqn{\exp((t_n - t_1) Q)}{exp((tn - t1) Q)}, because \eqn{Q} varies within #' the interval \eqn{t_1, t_n}{t1, tn}. However, if the covariates are #' piecewise-constant, or can be approximated as piecewise-constant, then we #' can calculate \eqn{P(t_1, t_n)}{P(t1, tn)} by multiplying together #' individual matrices \eqn{P(t_i, }{P(t_i, t_{i+1}) = exp((t_{i+1} - t_i) #' Q)}\eqn{ t_{i+1}) = \exp((t_{i+1} - t_i) Q)}{P(t_i, t_{i+1}) = exp((t_{i+1} #' - t_i) Q)}, calculated over intervals where Q is constant: #' #' \deqn{P(t_1, t_n) = P(t_1, t_2) P(t_2, t_3)\ldots P(t_{n-1}, }{P(t1, tn) = #' P(t1, t2) P(t2, t3)\ldotsP(tn-1, tn)}\deqn{ t_n)}{P(t1, tn) = P(t1, t2) #' P(t2, t3)\ldotsP(tn-1, tn)} #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. This #' should be a non-homogeneous model, whose transition intensity matrix depends #' on a time-dependent covariate. #' #' @param t1 The start of the time interval to estimate the transition #' probabilities for. #' #' @param t2 The end of the time interval to estimate the transition #' probabilities for. #' #' @param times Cut points at which the transition intensity matrix changes. #' #' @param covariates A list with number of components one greater than the #' length of \code{times}. Each component of the list is specified in the same #' way as the \code{covariates} argument to \code{\link{pmatrix.msm}}. The #' components correspond to the covariate values in the intervals #' #' \code{(t1, times[1]], (times[1], times[2]], ..., (times[length(times)], t2]} #' #' (assuming that all elements of \code{times} are in the interval \code{(t1, #' t2)}). #' #' @param ci If \code{"normal"}, then calculate a confidence interval for the #' transition probabilities by simulating \code{B} random vectors from the #' asymptotic multivariate normal distribution implied by the maximum #' likelihood estimates (and covariance matrix) of the log transition #' intensities and covariate effects, then calculating the resulting transition #' probability matrix for each replicate. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' #' If \code{"none"} (the default) then no confidence interval is calculated. #' #' @param cl Width of the symmetric confidence interval, relative to 1. #' #' @param B Number of bootstrap replicates, or number of normal simulations #' from the distribution of the MLEs #' #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' #' @param qlist A list of transition intensity matrices, of length one greater #' than the length of \code{times}. Either this or a fitted model \code{x} #' must be supplied. No confidence intervals are available if (just) #' \code{qlist} is supplied. #' #' @param ... Optional arguments to be passed to \code{\link{MatrixExp}} to #' control the method of computing the matrix exponential. #' #' @return The matrix of estimated transition probabilities \eqn{P(t)} for the #' time interval \code{[t1, tn]}. That is, the probabilities of occupying #' state \eqn{s} at time \eqn{t_n}{tn} conditionally on occupying state \eqn{r} #' at time \eqn{t_1}{t1}. Rows correspond to "from-state" and columns to #' "to-state". #' #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' #' @seealso \code{\link{pmatrix.msm}} #' #' @keywords models #' #' @examples #' #' \dontrun{ #' ## In a clinical study, suppose patients are given a placebo in the #' ## first 5 weeks, then they begin treatment 1 at 5 weeks, and #' ## a combination of treatments 1 and 2 from 10 weeks. #' ## Suppose a multi-state model x has been fitted for the patients' #' ## progress, with treat1 and treat2 as time dependent covariates. #' #' ## Cut points for when treatment covariate changes #' times <- c(0, 5, 10) #' #' ## Indicators for which treatments are active in the four intervals #' ## defined by the three cut points #' covariates <- list( list (treat1=0, treat2=0), list (treat1=0, treat2=0), list(treat1=1, treat2=0), #' list(treat1=1, treat2=1) ) #' #' ## Calculate transition probabilities from the start of the study to 15 weeks #' pmatrix.piecewise.msm(x, 0, 15, times, covariates) #' } #' #' @export pmatrix.piecewise.msm <- function(x=NULL, # fitted msm model t1, # start time t2, # stop time times, # vector of cut points covariates=NULL, # list of lists of covariates, for (, times1], (times1, times2], ... # of length one greater than times ci=c("none","normal","bootstrap"), cl = 0.95, # width of symmetric confidence interval B = 1000, # number of bootstrap replicates or normal simulations cores=NULL, qlist=NULL, ... # arguments to pass to MatrixExp ) { if (!is.null(x)) { if (!inherits(x, "msm")) stop("expected x to be a msm model") } if (is.null(x) && is.null(qlist)) stop("Neither a fitted model nor a list of Q matrices have been supplied") x$pci <- NULL # to avoid infinite recursion when calling pmatrix.msm ## Input checks if (t2 < t1) stop("Stop time t2 should be greater than or equal to start time t1") if (is.null(qlist)) validate_piecewise(times, covariates) if (length(times)==0) return(pmatrix.msm(x=x, t=t2-t1, t1=t1, covariates=covariates[[1]], ci=ci, cl=cl, B=B, qmatrix=qlist[[1]], ...)) ## Locate which intervals t1 and t2 fall in, as indices ind1, ind2 into "times". if (t1 <= times[1]) ind1 <- 1 else if (length(times)==1) ind1 <- 2 else { for (i in 2:length(times)) if ((t1 > times[i-1]) && (t1 <= times[i])) {ind1 <- i; break} if (t1 > times[i]) ind1 <- i+1 } if (t2 <= times[1]) ind2 <- 1 else if (length(times)==1) ind2 <- 2 else { for (i in 2:length(times)) if ((t2 > times[i-1]) && (t2 <= times[i])) {ind2 <- i; break} if (t2 > times[i]) ind2 <- i+1 } ## Calculate accumulated pmatrix ## Three cases: ind1, ind2 in the same interval if (ind1 == ind2) { P <- pmatrix.msm(x=x, t = t2 - t1, covariates=covariates[[ind1]], qmatrix=qlist[[ind1]], ...) } ## ind1, ind2 in successive intervals else if (ind2 == ind1 + 1) { P.start <- pmatrix.msm(x=x, t = times[ind1] - t1 , covariates=covariates[[ind1]], qmatrix=qlist[[ind1]], ...) P.end <- pmatrix.msm(x=x, t = t2 - times[ind2-1], covariates=covariates[[ind2]], qmatrix=qlist[[ind2]], ...) P <- P.start %*% P.end } ## ind1, ind2 separated by one or more whole intervals else { P.start <- pmatrix.msm(x=x, t = times[ind1] - t1, covariates=covariates[[ind1]], qmatrix=qlist[[ind1]], ...) P.end <- pmatrix.msm(x=x, t = t2 - times[ind2-1], covariates=covariates[[ind2]], qmatrix=qlist[[ind2]], ...) P.middle <- if (!is.null(x)) diag(x$qmodel$nstates) else diag(ncol(qlist[[1]])) for (i in (ind1+1):(ind2-1)) { P.middle <- P.middle %*% pmatrix.msm(x=x, t = times[i] - times[i-1], covariates=covariates[[i]], qmatrix=qlist[[i]], ...) } P <- P.start %*% P.middle %*% P.end } ci <- if (!is.null(x)) match.arg(ci) else "none" P.ci <- switch(ci, bootstrap = pmatrix.piecewise.ci.msm(x=x, t1=t1, t2=t2, times=times, covariates=covariates, cl=cl, B=B, cores=cores), normal = pmatrix.piecewise.normci.msm(x=x, t1=t1, t2=t2, times=times, covariates=covariates, cl=cl, B=B), none = NULL) res <- if (ci=="none") P else list(estimates = P, L=P.ci[,,1], U=P.ci[,,2]) res } validate_piecewise <- function(times, covariates){ if (!is.numeric(times) || is.unsorted(times)) stop("times should be a vector of numbers in increasing order") if ((length(covariates) != length(times) + 1)) stop("Number of covariate lists must be one greater than the number of cut points") } #' Mean sojourn times from a multi-state model #' #' Estimate the mean sojourn times in the transient states of a multi-state #' model and their confidence limits. #' #' The mean sojourn time in a transient state \eqn{r} is estimated by \eqn{- 1 #' / q_{rr}}, where \eqn{q_{rr}} is the \eqn{r}th entry on the diagonal of the #' estimated transition intensity matrix. #' #' A continuous-time Markov model is fully specified by the mean sojourn times #' and the probability that each state is next (\code{\link{pnext.msm}}). This #' is a more intuitively meaningful description of a model than the transition #' intensity matrix (\code{\link{qmatrix.msm}}). #' #' Time dependent covariates, or time-inhomogeneous models, are not supported. #' This would require the mean of a piecewise exponential distribution, and the #' package author is not aware of any general analytic form for that. #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param covariates The covariate values at which to estimate the mean sojourn #' times. This can either be:\cr #' #' the string \code{"mean"}, denoting the means of the covariates in the data #' (this is the default),\cr #' #' the number \code{0}, indicating that all the covariates should be set to #' zero,\cr #' #' a list of values, with optional names. For example, #' #' \code{list(60, 1)}, where the order of the list follows the order of the #' covariates originally given in the model formula, or a named list, e.g. #' #' \code{list (age = 60, sex = 1)} #' #' @param ci If \code{"delta"} (the default) then confidence intervals are #' calculated by the delta method, or by simple transformation of the Hessian #' in the very simplest cases. #' #' If \code{"normal"}, then calculate a confidence interval by simulating #' \code{B} random vectors from the asymptotic multivariate normal distribution #' implied by the maximum likelihood estimates (and covariance matrix) of the #' log transition intensities and covariate effects, then transforming. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' @param cl Width of the symmetric confidence interval to present. Defaults #' to 0.95. #' @param B Number of bootstrap replicates, or number of normal simulations #' from the distribution of the MLEs #' @return A data frame with components: #' #' \item{estimates}{Estimated mean sojourn times in the transient states.} #' \item{SE}{Corresponding standard errors.} \item{L}{Lower confidence limits.} #' \item{U}{Upper confidence limits.} #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}}, \code{\link{qmatrix.msm}}, #' \code{\link{deltamethod}} #' @keywords models #' @export sojourn.msm <- function(x, covariates = "mean", ci=c("delta","normal","bootstrap","none"), cl=0.95, B=1000) { ci <- match.arg(ci) qmatrix <- qmatrix.msm(x, covariates, sojourn=TRUE, ci=ci, cl=cl, B=B) sojstates <- (1 : x$qmodel$nstates) [transient.msm(x)] if (x$foundse && (ci != "none")){ soj <- qmatrix$sojourn[sojstates] names (soj) <- rownames(x$qmodel$qmatrix)[sojstates] sojse <- qmatrix$sojournSE[sojstates] sojl <- qmatrix$sojournL[sojstates] soju <- qmatrix$sojournU[sojstates] names(sojse) <- names(sojl) <- names(soju) <- names(soj) res <- data.frame(estimates=soj, SE=sojse, L=sojl, U=soju) } else if (ci != "none") { res <- list(estimates=qmatrix$sojourn[sojstates]) } else res <- list(estimates=qmatrix[sojstates]) res } #' Probability of each state being next #' #' Compute a matrix of the probability of each state \eqn{s} being the next #' state of the process after each state \eqn{r}. Together with the mean #' sojourn times in each state (\code{\link{sojourn.msm}}), these fully define #' a continuous-time Markov model. #' #' For a continuous-time Markov process in state \eqn{r}, the probability that #' the next state is \eqn{s} is \eqn{-q_{rs} / q_{rr}}, where \eqn{q_{rs}} is #' the transition intensity (\code{\link{qmatrix.msm}}). #' #' A continuous-time Markov model is fully specified by these probabilities #' together with the mean sojourn times \eqn{-1/q_{rr}} in each state \eqn{r}. #' This gives a more intuitively meaningful description of a model than the #' intensity matrix. #' #' Remember that \pkg{msm} deals with continuous-time, not discrete-time #' models, so these are \emph{not} the same as the probability of observing #' state \eqn{s} at a fixed time in the future. Those probabilities are given #' by \code{\link{pmatrix.msm}}. #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' @param covariates The covariate values at which to estimate the intensities. #' This can either be:\cr #' #' the string \code{"mean"}, denoting the means of the covariates in the data #' (this is the default),\cr #' #' the number \code{0}, indicating that all the covariates should be set to #' zero,\cr #' #' or a list of values, with optional names. For example #' #' \code{list (60, 1)} #' #' where the order of the list follows the order of the covariates originally #' given in the model formula, or a named list, #' #' \code{list (age = 60, sex = 1)} #' @param ci If \code{"normal"} (the default) then calculate a confidence #' interval by simulating \code{B} random vectors from the asymptotic #' multivariate normal distribution implied by the maximum likelihood estimates #' (and covariance matrix) of the log transition intensities and covariate #' effects, then transforming. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' #' If \code{"delta"} then confidence intervals are calculated based on the #' delta method SEs of the log rates, but this is not recommended since it may #' not respect the constraint that probabilities are less than one. #' @param cl Width of the symmetric confidence interval to present. Defaults #' to 0.95. #' @param B Number of bootstrap replicates, or number of normal simulations #' from the distribution of the MLEs. #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' @return The matrix of probabilities that the next move of a process in state #' \eqn{r} (rows) is to state \eqn{s} (columns). #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso #' \code{\link{qmatrix.msm}},\code{\link{pmatrix.msm}},\code{\link{qratio.msm}} #' @keywords models #' @export pnext.msm <- function(x, covariates="mean", ci=c("normal","bootstrap","delta","none"), cl=0.95, B=1000, cores=NULL) { ci <- match.arg(ci) Q <- unclass(qmatrix.msm(x, covariates, ci="none")) pnext <- - Q / diag(Q) pnext[x$qmodel$imatrix==0] <- 0 p.ci <- array(0, dim=c(dim(pnext), 2)) if (x$foundse && (ci != "none")){ if (ci == "delta") { for (i in 1:x$qmodel$nstates) { for (j in 1:x$qmodel$nstates) { if (pnext[i,j] > 0) { se <- qratio.se.msm(x, c(i,j), c(i,i), covariates, cl)$se lse <- qratio.se.msm(x, c(i,j), c(i,i), covariates, cl)$lse p.ci[i,j,1] <- exp ( log(pnext[i,j]) - qnorm(1 - 0.5*(1 - cl)) * lse ) p.ci[i,j,2] <- exp ( log(pnext[i,j]) + qnorm(1 - 0.5*(1 - cl)) * lse ) } } } } else if (ci=="normal") p.ci <- pnext.normci.msm(x, covariates, cl, B) else if (ci=="bootstrap") p.ci <- pnext.ci.msm(x, covariates, cl, B, cores) res <- list(estimates=pnext, L=p.ci[,,1], U=p.ci[,,2]) } else res <- list(estimates=pnext) class(res) <- "msm.est" res } #' Extract model coefficients #' #' Extract the estimated log transition intensities and the corresponding #' linear effects of each covariate. #' #' #' @param object A fitted multi-state model object, as returned by #' \code{\link{msm}}. #' @param ... (unused) further arguments passed to or from other methods. #' @return If there is no misclassification, \code{coef.msm} returns a list of #' matrices. The first component, labelled \code{logbaseline}, is a matrix #' containing the estimated transition intensities on the log scale with any #' covariates fixed at their means in the data. Each remaining component is a #' matrix giving the linear effects of the labelled covariate on the matrix of #' log intensities. \cr #' #' For misclassification models, \code{coef.msm} returns a list of lists. The #' first component, \code{Qmatrices}, is a list of matrices as described in the #' previous paragraph. The additional component \code{Ematrices} is a list of #' similar format containing the logit-misclassification probabilities and any #' estimated covariate effects. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}} #' @keywords models #' @export coef.msm #' @export coef.msm <- function(object, ...) { if (!inherits(object, "msm")) stop("expected object to be a msm model") if (object$emodel$misc) object[c("Qmatrices", "Ematrices")] else object$Qmatrices } #' Extract model log-likelihood #' #' Extract the log-likelihood and the number of parameters of a model fitted #' with \code{\link{msm}}. #' #' #' @param object A fitted multi-state model object, as returned by #' \code{\link{msm}}. #' @param by.subject Return vector of subject-specific log-likelihoods, which #' should sum to the total log-likelihood. #' @param ... (unused) further arguments passed to or from other methods. #' @return The log-likelihood of the model represented by 'object' evaluated at #' the maximum likelihood estimates. #' #' Akaike's information criterion can also be computed using #' \code{\link{AIC}(object)}. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}},\code{\link{lrtest.msm}}. #' @keywords models #' @export logLik.msm #' @export logLik.msm <- function(object, by.subject=FALSE, ...) { if (!inherits(object, "msm")) stop("expected object to be a msm model") if (by.subject){ p <- object$paramdata val <- -0.5*Ccall.msm(p$opt$par, do.what="lik.subj", expand.data(object), object$qmodel, object$qcmodel, object$cmodel, object$hmodel, p) names(val) <- unique(model.extract(object$data$mf, "subject")) } else { val <- - 0.5*object$minus2loglik attr(val, "df") <- object$paramdata$nopt class(val) <- "logLik" } val } #' Likelihood ratio test #' #' Likelihood ratio test between two or more fitted multi-state models #' #' #' @param ... Two or more fitted multi-state models, as returned by #' \code{\link{msm}}, ordered by increasing numbers of parameters. #' @return A matrix with three columns, giving the likelihood ratio statistic, #' difference in degrees of freedom and the chi-squared p-value for a #' comparison of the first model supplied with each subsequent model. #' @section Warning: The comparison between models will only be valid if they #' are fitted to the same dataset. This may be a problem if there are missing #' values and R's default of 'na.action = na.omit' is used. #' #' The likelihood ratio statistic only has the indicated chi-squared #' distribution if the models are nested. An alternative for comparing #' non-nested models is Akaike's information criterion. This can be computed #' for one or more fitted \code{msm} models \code{x,y,...} using #' \code{\link{AIC}(x,y,...)}. #' @seealso \code{\link{logLik.msm}},\code{\link{msm}} #' @keywords models #' @export lrtest.msm lrtest.msm <- function(...){ mods <- list(...) if (length(mods) < 2) stop("Expected 2 or more models as arguments") lx <- logLik(mods[[1]]) res <- matrix(nrow=length(mods)-1, ncol=3) colnames(res) <- c("-2 log LR","df","p") rownames(res) <- sapply(as.list(match.call())[-(1:2)], deparse) for (i in 2:length(mods)) { if (!inherits(mods[[i]], "msm")) stop("Expected argument",i,"to be a msm object") ly <- logLik(mods[[i]]) lr <- as.numeric(-2 * (lx - ly)) df <- attr(ly,"df") - attr(lx,"df") res[i-1,] <- c(lr, df, 1 - pchisq(lr, df)) } res } #' Transient and absorbing states #' #' Returns the transient and absorbing states of either a fitted model or a #' transition intensity matrix. #' #' #' @aliases transient.msm absorbing.msm #' @param x A fitted multi-state model as returned by \code{\link{msm}}. #' @param qmatrix A transition intensity matrix. The diagonal is ignored and #' taken to be minus the sum of the rest of the row. #' @return A vector of the ordinal indices of the transient or absorbing #' states. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @keywords models #' @export transient.msm transient.msm <- function(x=NULL, qmatrix=NULL) { if (!is.null(x)) { if (!inherits(x, "msm")) stop("expected x to be a msm model") qmatrix <- x$Qmatrices[[1]] nst <- x$qmodel$nstates } else if (!is.null(qmatrix)) { nst <- nrow(qmatrix) } else stop("Neither a fitted msm model nor a qmatrix have been supplied") which(diag(msm.fixdiag.qmatrix(qmatrix)) != 0) } ## Return indices of absorbing states (can either call for a fitted model or a qmatrix) #' @rdname transient.msm #' @export absorbing.msm <- function(x=NULL, qmatrix=NULL) { if (!is.null(x)) { if (!inherits(x, "msm")) stop("expected x to be a msm model") qmatrix <- x$Qmatrices[[1]] nst <- x$qmodel$nstates } else if (!is.null(qmatrix)) { nst <- nrow(qmatrix) } else stop("Neither a fitted msm model nor a qmatrix have been supplied") which(diag(msm.fixdiag.qmatrix(qmatrix)) == 0) } ## Return two-column matrix containing pairs of states with allowed ## transitions in an interval. Handles transitions between observed ## states in misclassification models intervaltrans.msm <- function(x=NULL, qmatrix=NULL, ematrix=NULL, exclude.absabs=FALSE, censor=FALSE) { if (!is.null(x)) { if (!inherits(x, "msm")) stop("expected x to be a msm model") qmatrix <- qmatrix.msm(x, ci="none") if (is.null(ematrix) & x$emodel$misc) ematrix <- ematrix.msm(x, ci="none") > 0 abs <- absorbing.msm(x) } else if (!is.null(qmatrix)) { abs <- absorbing.msm(qmatrix=qmatrix) } else if (is.null(qmatrix)) stop("Neither a fitted msm model nor a qmatrix have been supplied") P <- MatrixExp(qmatrix) if (!is.null(ematrix)) P <- t(ematrix) %*% P %*% ematrix # > 0 iff P(obs state=s | prev obs state = r) > 0 ## P(obs state = s | obs prev = r) = Sum_ij P(obsst = s | truest = j) P(truest = j | trueprev = i) P(trueprev = i | obsprev = r) ## Sum_ij Ejs Pij Eir = Eir Pij Ejs gt0 <- abs(P) > .Machine$double.eps ^ 0.5 at <- cbind(row(P)[gt0], col(P)[gt0]) if (exclude.absabs) at <- at[!(at[,1] %in% abs & at[,2] %in% abs),] if (censor && x$cmodel$ncens > 0) { # consider censoring as separate state atcens.all <- numeric() for (i in 1:x$cmodel$ncens) { truestates <- x$cmodel$states[x$cmodel$index[i] : (x$cmodel$index[i+1] - 1)] atcens <- at[at[,2] %in% truestates,] atcens[,2] <- 99 atcens <- unique(atcens) atcens.all <- rbind(atcens.all, atcens) } at <- rbind(at, atcens.all) } at[order(at[,1],at[,2]),] } #' Plot empirical and fitted survival curves #' #' Plot a Kaplan-Meier estimate of the survival probability and compare it with #' the fitted survival probability from a \code{msm} model. #' #' If the data represent observations of the process at arbitrary times, then #' the first occurrence of the absorbing state in the data will usually be #' greater than the actual first transition time to that state. Therefore the #' Kaplan-Meier estimate of the survival probability will be an overestimate. #' #' The method of Turnbull (1976) could be used to give a non-parametric #' estimate of the time to an interval-censored event, and compared to the #' equivalent estimate from a multi-state model. This is implemented in the #' CRAN package \pkg{interval} (Fay and Shaw 2010). #' #' This currently only handles time-homogeneous models. #' #' @param x Output from \code{\link{msm}}, representing a fitted multi-state #' model object. #' @param from Non-absorbing state from which to consider survival. Defaults #' to state 1. The fitted probabilities will then be calculated as the #' transition probabilities from this state to \code{to}. The empirical #' survival curve plots survival from the first observation of \code{from} #' (where this exists) to the first entry time into \code{to}. #' @param to Absorbing state to consider. Defaults to the highest-labelled #' absorbing state. #' @param range Vector of two elements, giving the range of times to plot for. #' @param covariates Covariate values for which to evaluate the expected #' probabilities. This can either be:\cr #' #' the string \code{"mean"}, denoting the means of the covariates in the data #' (this is the default),\cr #' #' the number \code{0}, indicating that all the covariates should be set to #' zero,\cr #' #' or a list of values, with optional names. For example #' #' \code{list (60, 1)} #' #' where the order of the list follows the order of the covariates originally #' given in the model formula, or a named list, #' #' \code{list (age = 60, sex = 1)} #' #' but note the empirical curve is plotted for the full population. To #' consider subsets for the empirical curve, set \code{survdata=TRUE} to #' extract the survival data and build a survival plot by hand using #' \code{\link[survival]{plot.survfit}}. #' @param ci If \code{"none"} (the default) no confidence intervals are #' plotted. If \code{"normal"} or \code{"bootstrap"}, confidence intervals are #' plotted based on the respective method in \code{\link{pmatrix.msm}}. This is #' very computationally-intensive, since intervals must be computed at a series #' of times. #' @param B Number of bootstrap or normal replicates for the confidence #' interval. The default is 100 rather than the usual 1000, since these plots #' are for rough diagnostic purposes. #' @param interp If \code{interp="start"} (the default) then the entry time #' into the absorbing state is assumed to be the time it is first observed in #' the data. #' #' If \code{interp="midpoint"} then the entry time into the absorbing state is #' assumed to be halfway between the time it is first observed and the previous #' observation time. This is generally more reasonable for "progressive" models #' with observations at arbitrary times. #' @param legend.pos Vector of the \eqn{x} and \eqn{y} position, respectively, #' of the legend. #' @param xlab x axis label. #' @param ylab y axis label. #' @param lty Line type for the fitted curve. See \code{\link{par}}. #' @param lwd Line width for the fitted curve. See \code{\link{par}}. #' @param col Colour for the fitted curve. See \code{\link{par}}. #' @param lty.ci Line type for the fitted curve confidence limits. See #' \code{\link{par}}. #' @param lwd.ci Line width for the fitted curve confidence limits. See #' \code{\link{par}}. #' @param col.ci Colour for the fitted curve confidence limits. See #' \code{\link{par}}. #' @param mark.time Mark the empirical survival curve at each censoring point, #' see \code{\link[survival]{lines.survfit}}. #' @param col.surv Colour for the empirical survival curve, passed to #' \code{\link[survival]{lines.survfit}}. See \code{\link{par}}. #' @param lty.surv Line type for the empirical survival curve, passed to #' \code{\link[survival]{lines.survfit}}. See \code{\link{par}}. #' @param lwd.surv Line width for the empirical survival curve, passed to #' \code{\link[survival]{lines.survfit}}. See \code{\link{par}}. #' @param survdata Set to \code{TRUE} to return the survival data frame #' constructed when plotting the empirical curve. This can be used for #' constructing survival plots by hand using #' \code{\link[survival]{plot.survfit}}. #' @param ... Other arguments to be passed to the \code{\link{plot}} function #' which draws the fitted curve, or the \code{\link[survival]{lines.survfit}} #' function which draws the empirical curve. #' @seealso \code{\link[survival]{survfit}}, #' \code{\link[survival]{plot.survfit}}, \code{\link{plot.prevalence.msm}} #' @references Turnbull, B. W. (1976) The empirical distribution function with #' arbitrarily grouped, censored and truncated data. J. R. Statist. Soc. B 38, #' 290-295. #' #' Fay, MP and Shaw, PA (2010). Exact and Asymptotic Weighted Logrank Tests for #' Interval Censored Data: The interval R package. Journal of Statistical #' Software. http://www.jstatsoft.org/v36/ i02/. 36 (2):1-34. #' @keywords models #' @export plot.survfit.msm plot.survfit.msm <- function(x, from=1, to=NULL, range=NULL, covariates="mean", interp=c("start","midpoint"), ci=c("none","normal","bootstrap"), B=100, legend.pos=NULL, xlab="Time", ylab="Survival probability", lty=1, lwd=1, col="red", lty.ci=2, lwd.ci=1, col.ci="red", mark.time=TRUE, col.surv="blue", lty.surv=2, lwd.surv=1, survdata=FALSE, ...) { if (!inherits(x, "msm")) stop("expected \"x\" to be a msm model") if (is.null(to)) to <- max(absorbing.msm(x)) else { if (!is.numeric(to)) stop("\"to\" must be numeric") if (! (to %in% absorbing.msm(x) ) ) stop("\"to\" must be an absorbing state") } if (! (from %in% transient.msm(x) ) ) stop("\"from\" must be a non-absorbing state") if (is.null(range)) rg <- range(model.extract(x$data$mf, "time")) else { if (!is.numeric(range) || length(range)!= 2) stop("\"range\" must be a numeric vector of two elements") rg <- range } interp <- match.arg(interp) ci <- match.arg(ci) timediff <- (rg[2] - rg[1]) / 50 times <- seq(rg[1], rg[2], timediff) pr <- lower <- upper <- numeric() for (t in times) { P <- pmatrix.msm(x, t, t1=times[1], covariates=covariates, ci=ci, B=B) if (ci != "none") { pr <- c(pr, P$estimates[from, to]) lower <- c(lower, P$L[from, to]) upper <- c(upper, P$U[from, to]) } else pr <- c(pr, P[from, to]) } plot(times, 1 - pr, type="l", xlab=xlab, ylab=ylab, lwd=lwd, ylim=c(0,1), lty = lty, col=col,...) if (ci != "none") { lines(times, 1 - lower, lty=lty.ci, col=col.ci, lwd=lwd.ci) lines(times, 1 - upper, lty=lty.ci, col=col.ci, lwd=lwd.ci) } dat <- x$data$mf[,c("(subject)", "(time)", "(state)")] dat$"(subject)" <- match(dat$"(subject)", unique(dat$"(subject)")) # guard against factor dat$subjstate <- paste(dat$"(subject)", dat$"(state)") ## restrict data to subjects with any observations of "from" anyfrom <- tapply(dat$"(state)", dat$"(subject)", function(x)any(x==from))[as.character(dat$"(subject)")] dat <- dat[anyfrom,] obspt <- sequence(table(dat$"(subject)")) # observation numbers, starting at 1 for each subject ## number of first observation of "from" for current subject minfrom <- rep(which(dat$"(state)"==from & !duplicated(dat$subjstate)) - which(!duplicated(dat$"(subject)")), table(dat$"(subject)")) + 1 ## restrict data to observations after and including first observation of "from" for each person dat <- dat[obspt>=minfrom,] first <- !duplicated(dat$"(subject)") last <- !duplicated(dat$"(subject)", fromLast=TRUE) ## does each subject have an absorbing state anyabs <- tapply(dat$"(state)", dat$"(subject)", function(x)any(x==to))[as.character(dat$"(subject)")] subjstate <- paste(dat$"(subject)", dat$"(state)") ## index of first occurrence of absorbing state, or last obs if no absorbing state minabs <- dat$"(state)"==to & !duplicated(subjstate) dtime <- dat$"(time)" - tapply(dat$"(time)", dat$"(subject)", min)[as.character(dat$"(subject)")] if (interp=="midpoint"){ ## index of state just before first occurrence of abs state prevminabs <- c(minabs[-1], FALSE) dtime[minabs] <- 0.5*(dtime[minabs] + dtime[prevminabs]) } minabs[!anyabs] <- last[!anyabs] survdat <- data.frame(survtime = dtime[minabs], died = as.numeric(anyabs[minabs])) lines(survfit(Surv(survdat$survtime, survdat$died) ~ 1), mark.time=mark.time, col=col.surv, lty=lty.surv, lwd=lwd.surv,...) timediff <- (rg[2] - rg[1]) / 50 if (!is.numeric(legend.pos) || length(legend.pos) != 2) legend.pos <- c(max(x$data$mf$"(time)") - 25*timediff, 1) if (ci=="none") legend(legend.pos[1], legend.pos[2], lty=c(lty, lty.surv), lwd=c(lwd, lwd.surv), col=c(col, col.surv), legend=c("Fitted","Empirical")) else legend(legend.pos[1], legend.pos[2], lty=c(lty, lty.ci, lty.surv), lwd=c(lwd,lwd.ci, lwd.surv), col=c(col ,col.ci, col.surv), legend=c("Fitted","Fitted (confidence interval)", "Empirical")) if (survdata) survdat else invisible() } #' Calculate tables of hazard ratios for covariates on transition intensities #' #' Hazard ratios are computed by exponentiating the estimated covariate effects #' on the log-transition intensities. This function is called by #' \code{\link{summary.msm}}. #' #' #' @param x Output from \code{\link{msm}} representing a fitted multi-state #' model. #' @param hazard.scale Vector with same elements as number of covariates on #' transition rates. Corresponds to the increase in each covariate used to #' calculate its hazard ratio. Defaults to all 1. #' @param cl Width of the symmetric confidence interval to present. Defaults #' to 0.95. #' @return #' #' A list of tables containing hazard ratio estimates, one table for each #' covariate. Each table has three columns, containing the hazard ratio, and #' an approximate upper and lower confidence limit respectively (assuming #' normality on the log scale), for each Markov chain transition intensity. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}}, \code{\link{summary.msm}}, #' \code{\link{odds.msm}} #' @keywords models #' @export hazard.msm hazard.msm <- function(x, hazard.scale = 1, cl = 0.95) { if (!inherits(x, "msm")) stop("expected x to be a msm model") if (length(hazard.scale) == 1) hazard.scale <- rep(hazard.scale, x$qcmodel$ncovs) if (length(hazard.scale) != x$qcmodel$ncovs) stop ("hazard.scale of length ", length(hazard.scale), ", expected ", x$qcmodel$ncovs) keep <- (x$qmodel$imatrix != 0) nst <- x$qmodel$nstates keepvec <- as.vector(t(keep)) fromlabs <- rep(rownames(keep), each=nst) [keepvec] tolabs <- rep(colnames(keep), nst) [keepvec] if (x$qcmodel$ncovs > 0) { haz.list <- list() covlabels <- attr(x$Qmatrices, "covlabels") # rewritten as baseline.1 if any covariates called "baseline" if (x$foundse) { for (i in 1:x$qcmodel$ncovs) { cov <- covlabels[i] haz.rat <- t(exp(hazard.scale[i]*x$Qmatrices[[cov]]))[keepvec] LCL <- t(exp(hazard.scale[i]*(x$Qmatrices[[cov]] - qnorm(1 - 0.5*(1 - cl))*x$QmatricesSE[[cov]]) ))[keepvec] UCL <- t(exp(hazard.scale[i]*(x$Qmatrices[[cov]] + qnorm(1 - 0.5*(1 - cl))*x$QmatricesSE[[cov]]) ))[keepvec] haz.tab <- cbind(haz.rat, LCL, UCL) dimnames(haz.tab) <- list(paste(fromlabs, "-", tolabs), c("HR", "L", "U")) haz.list[[x$qcmodel$covlabels[i]]] <- haz.tab } } else { for (i in 1:x$qcmodel$ncovs) { cov <- x$qcmodel$covlabels[i] haz.tab <- as.matrix(t(exp(hazard.scale[i]*x$Qmatrices[[cov]]))[keepvec]) dimnames(haz.tab) <- list(paste(fromlabs, "-", tolabs), "HR") haz.list[[x$qcmodel$covlabels[i]]] <- haz.tab } } } else haz.list <- "No covariates on transition intensities" haz.list } #' Calculate tables of odds ratios for covariates on misclassification #' probabilities #' #' Odds ratios are computed by exponentiating the estimated covariate effects #' on the logit-misclassification probabilities. #' #' #' @param x Output from \code{\link{msm}} representing a fitted multi-state #' model. #' @param odds.scale Vector with same elements as number of covariates on #' misclassification probabilities. Corresponds to the increase in each #' covariate used to calculate its odds ratio. Defaults to all 1. #' @param cl Width of the symmetric confidence interval to present. Defaults #' to 0.95. #' @return #' #' A list of tables containing odds ratio estimates, one table for each #' covariate. Each table has three columns, containing the odds ratio, and an #' approximate upper 95\% and lower 95\% confidence limit respectively #' (assuming normality on the log scale), for each misclassification #' probability. #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} #' @seealso \code{\link{msm}}, \code{\link{hazard.msm}} #' @keywords models #' @export odds.msm odds.msm <- function(x, odds.scale = 1, cl = 0.95) { if (!inherits(x, "msm")) stop("expected x to be a msm model") if (!x$emodel$misc) stop("Requires a misclassification model specified with ematrix") if (length(odds.scale) == 1) odds.scale <- rep(odds.scale, x$ecmodel$ncovs) if (length(odds.scale) != x$ecmodel$ncovs) stop ("odds.scale of length ", length(odds.scale), ", expected ", x$ecmodel$ncovs) keep <- (x$emodel$imatrix != 0) nst <- x$qmodel$nstates keepvec <- as.vector(t(keep)) truelabs <- rep(rownames(keep), each=nst) [keepvec] obslabs <- rep(colnames(keep), nst) [keepvec] if (x$ecmodel$ncovs > 0) { odds.list <- list() if (x$foundse) { for (i in 1:x$ecmodel$ncovs) { cov <- x$ecmodel$covlabels[i] odds.rat <- t(exp(odds.scale[i]*x$Ematrices[[cov]]))[keepvec] LCL <- t(exp(odds.scale[i]*(x$Ematrices[[cov]] - qnorm(1 - 0.5*(1 - cl))*x$EmatricesSE[[cov]]) ))[keepvec] UCL <- t(exp(odds.scale[i]*(x$Ematrices[[cov]] + qnorm(1 - 0.5*(1 - cl))*x$EmatricesSE[[cov]]) ))[keepvec] odds.tab <- cbind(odds.rat, LCL, UCL) dimnames(odds.tab) <- list(paste("Obs", obslabs, "|", truelabs), c("OR", "L", "U")) odds.list[[cov]] <- odds.tab } } else { for (i in 1:x$ecmodel$ncovs) { cov <- x$ecmodel$covlabels[i] odds.tab <- as.matrix(t(exp(odds.scale[i]*x$Ematrices[[cov]]))[keepvec]) dimnames(odds.tab) <- list(paste("Obs", obslabs, "|", truelabs), "OR") odds.list[[cov]] <- odds.tab } } } else odds.list <- "No covariates on misclassification probabilities" odds.list } msm/R/ppass.R0000644000176200001440000002427214535071742012537 0ustar liggesusers#' Passage probabilities #' #' Probabilities of having visited each state by a particular time in a #' continuous time Markov model. #' #' The passage probabilities to state \eqn{s} are computed by setting the #' \eqn{s}th row of the transition intensity matrix \eqn{Q} to zero, giving an #' intensity matrix \eqn{Q^*}{Q*} for a simplified model structure where state #' \eqn{s} is absorbing. The probabilities of passage are then equivalent to #' row \eqn{s} of the transition probability matrix \eqn{Exp(tQ^*)}{Exp(tQ*)} #' (\code{\link{pmatrix.msm}}) under this #' simplified model for \eqn{t=}\code{tot}. #' #' For time-inhomogenous models, #' this process is generalised by calculating an intensity matrix for each #' time period, zeroing the appropriate row of each, and calculating and multiplying #' transition probability matrices as in \code{\link{pmatrix.piecewise.msm}}. #' #' Note this is different from the probability of occupying each state at #' exactly time \eqn{t}, given by \code{\link{pmatrix.msm}}. The passage #' probability allows for the possibility of having visited the state before #' \eqn{t}, but then occupying a different state at \eqn{t}. #' #' The mean of the passage distribution is the expected first passage time, #' \code{\link{efpt.msm}}. #' #' @param x A fitted multi-state model, as returned by \code{\link{msm}}. #' #' @param qmatrix Instead of \code{x}, you can simply supply a transition #' intensity matrix in \code{qmatrix}. #' #' @param tot Finite time to forecast the passage probabilites for. #' #' @param start Starting state (integer). By default (\code{start="all"}), #' this will return a matrix one row for each starting state. #' #' Alternatively, this can be used to obtain passage probabilities from a #' \emph{set} of states, rather than single states. To achieve this, #' \code{state} is set to a vector of weights, with length equal to the number #' of states in the model. These weights should be proportional to the #' probability of starting in each of the states in the desired set, so that #' weights of zero are supplied for other states. The function will calculate #' the weighted average of the passage probabilities from each of the #' corresponding states. #' #' @param covariates Covariate values defining the intensity matrix for the #' fitted model \code{x}, as supplied to \code{\link{qmatrix.msm}}. #' #' @param piecewise.times For models with time-dependent covariates, #' this defines the cut points in time at which the transition #' intensity matrix changes. This is not required for models fitted #' with the \code{pci} option to \code{\link{msm}}, which are #' handled automatically. #' #' @param piecewise.covariates For models with time-dependent #' covariates, this is the list of covariates for each time period #' defined by \code{piecewise.times}, in the format documented for #' the \code{covariates} argument to #' \code{\link{pmatrix.piecewise.msm}}. This is not required for #' models fitted with the \code{pci} option to \code{\link{msm}}, #' which are handled automatically. #' #' @param ci If \code{"normal"}, then calculate a confidence interval by #' simulating \code{B} random vectors from the asymptotic multivariate normal #' distribution implied by the maximum likelihood estimates (and covariance #' matrix) of the log transition intensities and covariate effects. #' #' If \code{"bootstrap"} then calculate a confidence interval by non-parametric #' bootstrap refitting. This is 1-2 orders of magnitude slower than the #' \code{"normal"} method, but is expected to be more accurate. See #' \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. #' #' If \code{"none"} (the default) then no confidence interval is calculated. #' #' @param cl Width of the symmetric confidence interval, relative to 1. #' #' @param B Number of bootstrap replicates. #' #' @param cores Number of cores to use for bootstrapping using parallel #' processing. See \code{\link{boot.msm}} for more details. #' #' @param ... Arguments to pass to \code{\link{MatrixExp}}. #' #' @return A matrix whose \eqn{r, s} entry is the probability of having visited #' state \eqn{s} at least once before time \eqn{t}, given the state at time #' \eqn{0} is \eqn{r}. The diagonal entries should all be 1. #' #' @author C. H. Jackson \email{chris.jackson@@mrc-bsu.cam.ac.uk} with #' contributions from Jon Fintzi. #' #' @seealso \code{\link{efpt.msm}}, \code{\link{totlos.msm}}, #' \code{\link{boot.msm}}. #' #' @references Norris, J. R. (1997) Markov Chains. Cambridge University Press. #' #' @keywords models #' #' @examples #' #' Q <- rbind(c(-0.5, 0.25, 0, 0.25), c(0.166, -0.498, 0.166, 0.166), #' c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)) #' #' ## ppass[1,2](t) converges to 0.5 with t, since given in state 1, the #' ## probability of going to the absorbing state 4 before visiting state #' ## 2 is 0.5, and the chance of still being in state 1 at t decreases. #' #' ppass.msm(qmatrix=Q, tot=2) #' ppass.msm(qmatrix=Q, tot=20) #' ppass.msm(qmatrix=Q, tot=100) #' #' Q <- Q[1:3,1:3]; diag(Q) <- 0; diag(Q) <- -rowSums(Q) #' #' ## Probability of about 1/2 of visiting state 3 by time 10.5, the #' ## median first passage time #' #' ppass.msm(qmatrix=Q, tot=10.5) #' #' ## Mean first passage time from state 2 to state 3 is 10.02: similar #' ## to the median #' #' efpt.msm(qmatrix=Q, tostate=3) #' #' @export ppass.msm ppass.msm <- function(x=NULL, qmatrix=NULL, tot, start="all", covariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, ci=c("none","normal","bootstrap"), cl = 0.95, B = 1000, cores=NULL, ...) { ci <- match.arg(ci) if (!is.null(x) && !inherits(x, "msm")) stop("expected x to be a msm model") if (is.null(x$pci) && is.null(piecewise.times)){ if (!is.null(x)) { qmatrix <- qmatrix.msm(x, covariates=covariates, ci="none") } else if (!is.null(qmatrix)) { if (!is.matrix(qmatrix) || (nrow(qmatrix) != ncol(qmatrix))) stop("expected qmatrix to be a square matrix") if (ci != "none") {warning("No fitted model supplied: not calculating confidence intervals."); ci <- "none"} } res <- array(dim=dim(qmatrix)) if (!is.null(dimnames(qmatrix))) { dimnames(res) <- dimnames(qmatrix) names(dimnames(res)) <- c("from","to") } states <- 1:nrow(qmatrix) for (i in states) { Qred <- qmatrix; Qred[states[i],] <- 0 res[,i] <- MatrixExp(Qred*tot, ...)[,i] } if (!is.character(start)) { if (!is.numeric(start) || (length(start)!=nrow(qmatrix))) stop("Expected \"start\" to be \"all\" or a numeric vector of length ", nrow(qmatrix)) start <- start / sum(start) res <- matrix(start %*% res, nrow=1, dimnames=list(from="start",to=colnames(res))) } else if (any(start!="all")) stop("Expected \"start\" to be \"all\" or a numeric vector of length ", nrow(qmatrix)) } else { res <- ppass.td.msm(x=x, tot=tot, start=start, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, ...) } p.ci <- switch(ci, bootstrap = ppass.ci.msm(x=x, qmatrix=qmatrix, tot=tot, start=start, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, cl=cl, B=B, cores=cores), normal = ppass.normci.msm(x=x, qmatrix=qmatrix, tot=tot, start=start, covariates=covariates, piecewise.times=piecewise.times, piecewise.covariates=piecewise.covariates, cl=cl, B=B), none = NULL) if (ci != "none") { res <- list(estimates=res, L=p.ci$L, U=p.ci$U) } class(res) <- "msm.est" res } ## Thanks to Jon Fintzi ppass.td.msm <- function(x=NULL, tot, start="all", covariates="mean", piecewise.times=NULL, piecewise.covariates=NULL, ...) { if (!is.null(x$pci)){ ## this goes to the times argument in pmatrix.piecewise.msm piecewise.times <- x$pci ## for defining piecewise constant intensity matrices piecewise.covariates <- msm.fill.pci.covs(x, covariates) } else { ## user-supplied times and covariates for non-pci time-dependent models validate_piecewise(piecewise.times, piecewise.covariates) } ## get temporary qmatrix qmat_temp <- qmatrix.msm(x, covariates = "mean", ci = "none") ## array for storing the first passage probabilities res <- array(dim=dim(qmat_temp)) if (!is.null(dimnames(qmat_temp))) { dimnames(res) <- dimnames(qmat_temp) names(dimnames(res)) <- c("from","to") } ## generate list of intensity matrices Q_list = lapply(piecewise.covariates, function(y) qmatrix.msm(x, covariates = y, ci = "none")) states <- seq_len(nrow(qmat_temp)) for (i in states) { ## zero out the appropriate row in the intensity matrices Q_ppass <- lapply(Q_list, function(M) {Q = M; Q[i,] = 0; return(Q)}) ## supply Q_ppass to pmatrix.piecewise.msm res[,i] <- pmatrix.piecewise.msm(qlist = Q_ppass, times = piecewise.times, covariates = piecewise.covariates, t1 = 0, t2 = tot, ci = "none")[,i] } if (!is.character(start)) { if (!is.numeric(start) || (length(start)!=nrow(qmat_temp))) stop("Expected \"start\" to be \"all\" or a numeric vector of length ", nrow(qmat_temp)) start <- start / sum(start) res <- matrix(start %*% res, nrow=1, dimnames=list(from="start",to=colnames(res))) } else if (any(start!="all")) stop("Expected \"start\" to be \"all\" or a numeric vector of length ", nrow(qmat_temp)) res } msm/R/datasets_doc.R0000644000176200001440000002307314527611327014044 0ustar liggesusers#' Aortic aneurysm progression data #' #' This dataset contains longitudinal measurements of grades of aortic #' aneurysms, measured by ultrasound examination of the diameter of the aorta. #' #' #' @name aneur #' @docType data #' @format A data frame containing 4337 rows, with each row corresponding to an #' ultrasound scan from one of 838 men over 65 years of age. #' #' \tabular{rll}{ \code{ptnum} \tab (numeric) \tab Patient identification #' number \cr \code{age} \tab (numeric) \tab Recipient age at examination #' (years) \cr \code{diam} \tab (numeric) \tab Aortic diameter\cr \code{state} #' \tab (numeric) \tab State of aneurysm. \cr } #' #' The states represent successive degrees of aneurysm severity, as indicated #' by the aortic diameter. #' #' \tabular{rll}{ State 1 \tab Aneurysm-free \tab < 30 cm \cr State 2 \tab Mild #' aneurysm \tab 30-44 cm \cr State 3 \tab Moderate aneurysm \tab 45-54 cm \cr #' State 4 \tab Severe aneurysm \tab > 55 cm \cr } #' #' 683 of these men were aneurysm-free at age 65 and were re-screened every two #' years. The remaining men were aneurysmal at entry and had successive #' screens with frequency depending on the state of the aneurysm. Severe #' aneurysms are repaired by surgery. #' @references Jackson, C.H., Sharples, L.D., Thompson, S.G. and Duffy, S.W. #' and Couto, E. Multi-state Markov models for disease progression with #' classification error. \emph{The Statistician}, 52(2): 193--209 (2003) #' #' Couto, E. and Duffy, S. W. and Ashton, H. A. and Walker, N. M. and Myles, #' J. P. and Scott, R. A. P. and Thompson, S. G. (2002) \emph{Probabilities of #' progression of aortic aneurysms: estimates and implications for screening #' policy} Journal of Medical Screening 9(1):40--42 #' @source The Chichester, U.K. randomised controlled trial of screening for #' abdominal aortic aneurysms by ultrasonography. #' @keywords datasets NULL #' Bronchiolitis obliterans syndrome after lung transplants #' #' A dataset containing histories of bronchiolitis obliterans syndrome (BOS) #' from lung transplant recipients. BOS is a chronic decline in lung function, #' often observed after lung transplantation. The condition is classified into #' four stages of severity: none, mild, moderate and severe. #' #' The entry time of each patient into each stage of BOS was estimated by #' clinicians, based on their history of lung function measurements and acute #' rejection and infection episodes. BOS is only assumed to occur beyond six #' months after transplant. In the first six months the function of each #' patient's new lung stabilises. Subsequently BOS is diagnosed by comparing #' the lung function against the "baseline" value. #' #' The objects \code{bos3} and \code{bos4} contain the same data, but with #' mild/moderate/severe combined, and moderate/severe combined, to give 3 and #' 4-state representations respectively. #' #' @name bos #' @aliases bos bos3 bos4 #' @docType data #' @format A data frame containing 638 rows, grouped by patient, including #' histories of 204 patients. The first observation for each patient is #' defined to be stage 1, no BOS, at six months after transplant. Subsequent #' observations denote the entry times into stages 2, 3, 4, representing mild, #' moderate and severe BOS respectively, and stage 5, representing death. #' \tabular{rll}{ \code{ptnum} \tab (numeric) \tab Patient identification #' number \cr \code{time} \tab (numeric) \tab Months after transplant \cr #' \code{state} \tab (numeric) \tab BOS state entered at this time \cr } #' @references Heng. D. et al. (1998). Bronchiolitis Obliterans Syndrome: #' Incidence, Natural History, Prognosis, and Risk Factors. Journal of Heart #' and Lung Transplantation 17(12)1255--1263. #' @source Papworth Hospital, U.K. #' @keywords datasets NULL #' Heart transplant monitoring data #' #' A series of approximately yearly angiographic examinations of heart #' transplant recipients. The state at each time is a grade of cardiac #' allograft vasculopathy (CAV), a deterioration of the arterial walls. #' #' #' @name cav #' @docType data #' @format A data frame containing 2846 rows. There are 622 patients, the rows #' are grouped by patient number and ordered by years after transplant, with #' each row representing an examination and containing additional covariates. #' #' \tabular{rll}{ \code{PTNUM} \tab (numeric) \tab Patient identification #' number \cr \code{age} \tab (numeric) \tab Recipient age at examination #' (years) \cr \code{years} \tab (numeric) \tab Examination time (years after #' transplant)\cr \code{dage} \tab (numeric) \tab Age of heart donor (years) #' \cr \code{sex} \tab (numeric) \tab sex (0=male, 1=female) \cr \code{pdiag} #' \tab (factor) \tab Primary diagnosis (reason for transplant) \cr \tab \tab #' IHD=ischaemic heart disease, IDC=idiopathic dilated cardiomyopathy. \cr #' \code{cumrej} \tab (numeric) \tab Cumulative number of acute rejection #' episodes \cr \code{state} \tab (numeric) \tab State at the examination. \cr #' \tab \tab State 1 represents no CAV, state 2 is mild/moderate CAV \cr \tab #' \tab and state 3 is severe CAV. State 4 indicates death. \cr #' \code{firstobs} \tab (numeric) \tab 0 = record represents an angiogram or #' date of death.\cr \tab \tab 1 = record represents transplant (patient's #' first observation) \cr \code{statemax} \tab (numeric) \tab Maximum observed #' state so far for this patient (added in version 1.5.1) } #' @references Sharples, L.D. and Jackson, C.H. and Parameshwar, J. and #' Wallwork, J. and Large, S.R. (2003). Diagnostic accuracy of coronary #' angiopathy and risk factors for post-heart-transplant cardiac allograft #' vasculopathy. Transplantation 76(4):679-82 #' @source Papworth Hospital, U.K. #' @keywords datasets NULL #' FEV1 measurements from lung transplant recipients #' #' A series of measurements of the forced expiratory volume in one second #' (FEV1) from lung transplant recipients, from six months onwards after their #' transplant. #' #' A baseline "normal" FEV1 for each individual is calculated using #' measurements from the first six months after transplant. After six months, #' as presented in this dataset, FEV1 is expressed as a percentage of the #' baseline value. #' #' FEV1 is monitored to diagnose bronchiolitis obliterans syndrome (BOS), a #' long-term lung function decline, thought to be a form of chronic rejection. #' Acute rejections and infections also affect the lung function in the short #' term. #' #' @name fev #' @docType data #' @format A data frame containing 5896 rows. There are 204 patients, the rows #' are grouped by patient number and ordered by days after transplant. Each #' row represents an examination and containing an additional covariate. #' #' \tabular{rll}{ \code{ptnum} \tab (numeric) \tab Patient identification #' number. \cr \code{days} \tab (numeric) \tab Examination time (days after #' transplant). \cr \code{fev} \tab (numeric) \tab Percentage of baseline FEV1. #' A code of 999 indicates the patient's date of death. \cr \code{acute} \tab #' (numeric) \tab 0/1 indicator for whether the patient suffered an acute #' infection or rejection \cr \tab \tab within 14 days of the visit. \cr } #' @references Jackson, C.H. and Sharples, L.D. Hidden Markov models for the #' onset and progression of bronchiolitis obliterans syndrome in lung #' transplant recipients \emph{Statistics in Medicine}, 21(1): 113--128 (2002). #' @source Papworth Hospital, U.K. #' @keywords datasets NULL #' Psoriatic arthritis data #' #' A series of observations of grades of psoriatic arthritis, as indicated by #' numbers of damaged joints. #' #' #' @name psor #' @docType data #' @format A data frame containing 806 observations, representing visits to a #' psoriatic arthritis (PsA) clinic from 305 patients. The rows are grouped by #' patient number and ordered by examination time. Each row represents an #' examination and contains additional covariates. #' #' \tabular{rll}{ \code{ptnum} \tab (numeric) \tab Patient identification #' number \cr \code{months} \tab (numeric) \tab Examination time in months \cr #' \code{state} \tab (numeric) \tab Clinical state of PsA. Patients in states #' 1, 2, 3 and 4 \cr \tab \tab have 0, 1 to 4, 5 to 9 and 10 or more damaged #' joints, \cr \tab \tab respectively. \cr \code{hieffusn} \tab (numeric) \tab #' Presence of five or more effusions \cr \code{ollwsdrt} \tab (character) \tab #' Erythrocyte sedimentation rate of less than 15 mm/h \cr } #' @references Gladman, D. D. and Farewell, V.T. (1999) Progression in #' psoriatic arthritis: role of time-varying clinical indicators. J. #' Rheumatol. 26(11):2409-13 #' @keywords datasets #' @examples #' #' ## Four-state progression-only model with high effusion and low #' ## sedimentation rate as covariates on the progression rates. High #' ## effusion is assumed to have the same effect on the 1-2, 2-3, and 3-4 #' ## progression rates, while low sedimentation rate has the same effect #' ## on the 1-2 and 2-3 intensities, but a different effect on the 3-4. #' #' data(psor) #' psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) #' psor.msm <- msm(state ~ months, subject=ptnum, data=psor, #' qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, #' constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), #' fixedpars=FALSE, control = list(REPORT=1,trace=2), method="BFGS") #' qmatrix.msm(psor.msm) #' sojourn.msm(psor.msm) #' hazard.msm(psor.msm) #' NULL msm/vignettes/0000755000176200001440000000000014713146130013056 5ustar liggesusersmsm/vignettes/Sweave-local.sty0000644000176200001440000000104614471426252016151 0ustar liggesusers\RequirePackage[T1]{fontenc} %%Check if we are compiling under latex or pdflatex \ifx\pdftexversion\undefined \RequirePackage[dvips]{graphicx} \else \RequirePackage[pdftex]{graphicx} \RequirePackage{epstopdf} \fi \RequirePackage{ae,fancyvrb} \IfFileExists{upquote.sty}{\RequirePackage{upquote}}{} \setkeys{Gin}{width=0.8\textwidth} \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontshape=sl} \newenvironment{Schunk}{}{} msm/vignettes/msm-manual.Rnw0000644000176200001440000036734114471426252015642 0ustar liggesusers%%\VignetteIndexEntry{User guide to msm with worked examples} %\VignettePackage{msm} \documentclass{article} %% Need to modify Sweave.sty to pass pdftex option to graphicx. %\usepackage{Sweave-local} \usepackage{graphics} \RequirePackage[T1]{fontenc} %%Check if we are compiling under latex or pdflatex \ifx\pdftexversion\undefined \RequirePackage[dvips]{graphicx} \else \RequirePackage[pdftex]{graphicx} \RequirePackage{epstopdf} \fi \RequirePackage{ae,fancyvrb} \IfFileExists{upquote.sty}{\RequirePackage{upquote}}{} \setkeys{Gin}{width=0.8\textwidth} \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontshape=sl} \newenvironment{Schunk}{}{} \usepackage{times} \usepackage{url} \addtolength{\textwidth}{2cm} \newcommand{\Exp}{\mathop{\mathrm{Exp}}} \newcommand{\etal}{{\textit{et al.}}} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} %% version <- 1.3 <>= version <- gsub("Version: +", "", packageDescription("msm", lib.loc=c("../..",.libPaths()))$Version) @ \title{Multi-state modelling with R: the {\tt msm} package \vskip 0.2in \large{Version % <>= cat(version) @ \vskip 0.1in <>= cat(format(Sys.time(), "%d %B, %Y")) @ }} \author{Christopher Jackson\\MRC Biostatistics Unit\\Cambridge, U.K.\\ \texttt{chris.jackson@mrc-bsu.cam.ac.uk}} \date{} %% label with date when Rnw is compiled, not when tex is compiled. should be release date of package \bibliographystyle{unsrt} \begin{document} \maketitle \begin{abstract} The multi-state Markov model is a useful way of describing a process in which an individual moves through a series of states in continuous time. The \Rpackage{msm} package for R allows a general multi-state model to be fitted to longitudinal data. Data often consist of observations of the process at arbitrary times, so that the exact times when the state changes are unobserved. For example, the progression of chronic diseases is often described by stages of severity, and the state of the patient may only be known at doctor or hospital visits. Features of \Rpackage{msm} include the ability to model transition rates and hidden Markov output models in terms of covariates, and the ability to model data with a variety of observation schemes, including censored states. Hidden Markov models, in which the true path through states is only observed through some error-prone marker, can also be fitted. The observation is generated, conditionally on the underlying states, via some distribution. An example is a screening misclassification model in which states are observed with error. More generally, hidden Markov models can have a continuous response, with some arbitrary distribution, conditionally on the underlying state. This manual introduces the theory behind multi-state Markov and hidden Markov models, and gives a tutorial in the typical use of the \Rpackage{msm} package, illustrated by some typical applications to modelling chronic diseases. Much of the material in this manual is published, in a more concise form, in Journal of Statistical Software (2011) 38(8):1-29, \url{http://www.jstatsoft.org/v38/i08/} \end{abstract} \section{Multi-state models} \label{sec:multistate} \subsection{Introduction} \label{sec:intro} Figure \ref{fig:multi} illustrates a multi-state model in continuous time. Its four states are labelled {\bf 1, 2, 3, 4}. At a time $t$ the individual is in state $S(t)$. The arrows show which transitions are possible between states. The next state to which the individual moves, and the time of the change, are governed by a set of {\em transition intensities} $q_{rs}(t, z(t))$ for each pair of states $r$ and $s$. The intensities may also depend on the time of the process $t$, or more generally a set of individual-specific or time-varying explanatory variables $z(t)$. The intensity represents the instantaneous risk of moving from state $r$ to state $s$: \begin{equation} \label{eq:multi:intensity} q_{rs}(t, z(t)) = \lim_{\delta t \rightarrow 0} P (S(t+\delta t) = s | S(t) = r) / \delta t \end{equation} The intensities form a matrix $Q$ whose rows sum to zero, so that the diagonal entries are defined by $q_{rr} = - \sum_{s \neq r} q_{rs}$. To fit a multi-state model to data, we estimate this transition intensity matrix. We concentrate on {\em Markov} models here. The Markov assumption is that future evolution only depends on the current state. That is, $q_{rs}(t, z(t), \mathcal{F}_t)$ is independent of $\mathcal{F}_t$, the observation history $\mathcal{F}_t$ of the process up to the time preceding $t$. See, for example, Cox and Miller\cite{cox:miller} for a thorough introduction to the theory of continuous-time Markov chains. \begin{figure}[p] \begin{center} \scalebox{0.4}{\includegraphics{figures/multistate}} \[ Q = \left( \begin{array}{llll} q_{11} & q_{12} & q_{13} & q_{14}\\ q_{21} & q_{22} & q_{23} & q_{24}\\ q_{31} & q_{32} & q_{33} & q_{34}\\ q_{41} & q_{42} & q_{43} & q_{44}\\ \end{array} \right ) \] \caption{\label{fig:multi}General multi-state model.} \end{center} \end{figure} In a time-homogeneous continuous-time Markov model, a single period of occupancy (or \emph{sojourn time}) in state $r$ has an exponential distribution, with rate given by $-q_{rr}$, (or mean $-1 / q_{rr}$). The remaining elements of the $r$th row of $Q$ are \emph{proportional to} the probabilities governing the next state after $r$ to which the individual makes a transition. The probability that the individual's next move from state $r$ is to state $s$ is $-q_{rs} / q_{rr}$. \subsection{Disease progression models} The development of the \Rpackage{msm} package was motivated by applications to disease modelling. Many chronic diseases have a natural interpretation in terms of staged progression. Multi-state Markov models in continuous time are often used to model the course of diseases. A commonly-used model is illustrated in Figure \ref{fig:disease}. This represents a series of successively more severe disease stages, and an `absorbing' state, often death. The patient may advance into or recover from adjacent disease stages, or die at any disease stage. Observations of the state $S_i(t)$ are made on a number of individuals $i$ at arbitrary times $t$, which may vary between individuals. The stages of disease may be modelled as a homogeneous continuous-time Markov process, with a transition matrix $Q$, pictured below Figure \ref{fig:disease}. A commonly-used model is the \emph{illness-death} model, with three states representing health, illness and death (Figure \ref{fig:multi:illdeath}). Transitions are permitted from health to illness, illness to death and health to death. Recovery from illness to health is sometimes also considered. A wide range of medical situations have been modelled using multi-state methods, for example, screening for abdominal aortic aneurysms (Jackson \etal\cite{jackson:sharples:2003}), problems following lung transplantation (Jackson and Sharples\cite{jackson:sharples:2002}), problems following heart transplantation (Sharples\cite{sharp:gibbs}, Klotz and Sharples\cite{klotz:est}), hepatic cancer (Kay\cite{kay:mark}), HIV infection and AIDS (Longini \etal\cite{long1}, Satten and Longini\cite{sattlong}, Guihenneuc-Jouyaux \etal\cite{rich}, Gentleman \etal\cite{gentlaw}), diabetic complications (Marshall and Jones\cite{retino2}, Andersen\cite{andersen88}), breast cancer screening (Duffy and Chen\cite{duffy95}, Chen \emph{et al.}\cite{duffy96}), cervical cancer screening (Kirby and Spiegelhalter\cite{kirby:spiegelhalter}) and liver cirrhosis (Andersen \etal\cite{ander:proth}). Many of these references also describe the mathematical theory, which will be reviewed in the following sections. \begin{figure}[p] \centering \vskip 1cm \scalebox{1.0}{\includegraphics{figures/general}} \[ Q = \left( \begin{array}{llllll} q_{11} & q_{12} & 0 & 0 & \ldots & q_{1n}\\ q_{21} & q_{22} & q_{23} & 0 & \ldots & q_{2n}\\ 0 & q_{32} & q_{33} & q_{34} & \ddots & q_{3n}\\ 0 & 0 & q_{43} & q_{44} & \ddots & q_{4n}\\ \vdots & \vdots & \ddots & \ddots & \ddots & \vdots\\ 0 & 0 & 0 & 0 & \ldots & 0\\ \end{array} \right ) \] \caption{\label{fig:disease}General model for disease progression.} \end{figure} \begin{figure}[p] \begin{center} \scalebox{0.4}{\includegraphics{figures/illdeath}} \caption{Illness-death model.} \label{fig:multi:illdeath} \end{center} \end{figure} \subsection{Arbitrary observation times} \label{sec:arbitr-observ-times} Longitudinal data from monitoring disease progression are often incomplete in some way. Usually patients are seen at intermittent follow-up visits, at which monitoring information is collected, but information from the periods between visits is not available. Often the exact time of disease onset is unknown. Thus, the changes of state in a multi-state model usually occur at unknown times. Also a subject may only be followed up for a portion of their disease history. A fixed observation schedule may be specified in advance, but in practice times of visits may vary due to patient and hospital pressures. The states of disease progression models often include death. Death times are commonly recorded to within a day. Also observations may be censored. For example, at the end of a study, an individual may be known only to be alive, and in an unknown state. A typical sampling situation is illustrated in Figure \ref{fig:multi:sampling}. The individual is observed at four occasions through 10 months. The final occasion is the death date which is recorded to within a day. The only other information available is the occupation of states 2, 2, and 1 at respective times 1.5, 3.5 and 5. The times of movement between states and the state occupancy in between the observation times are unknown. Although the patient was in state 3 between 7 and 9 months this was not observed at all. \paragraph{Informative sampling times} To fit a model to longitudinal data with arbitrary sampling times we must consider the reasons why observations were made at the given times. This is analogous to the problem of missing data, where the fact that a particular observation is missing may implicitly give information about the value of that observation. Possible observation schemes include: \begin{itemize} \item {\em fixed}. Each patient is observed at fixed intervals specified in advance. \item {\em random}. The sampling times vary randomly, independently of the current state of the disease. \item {\em doctor's care}. More severely ill patients are monitored more closely. The next sampling time is chosen on the basis of the current disease state. \item patient {\em self-selection}. A patient may decide to visit the doctor on occasions when they are in a poor condition. \end{itemize} Gr\"uger \etal \cite{gruger:valid} discussed conditions under which sampling times are \emph{informative}. If a multi-state model is fitted, ignoring the information available in the sampling times, then inference may be biased. Mathematically, because the sampling times are often themselves random, they should be modelled along with the observation process $X_t$. However the ideal situation is where the joint likelihood for the times and the process is proportional to the likelihood obtained if the sampling times were fixed in advance. Then the parameters of the process can be estimated independently of the parameters of the sampling scheme. In particular, they showed that fixed, random and doctor's care observation policies are not informative, whereas patient self-selection is informative. Note that \Rpackage{msm} does not deal with informative sampling times. See, e.g. \cite{sweeting:inform:msm} for some methods in this case, which require specialised programming. \begin{figure}[p] \begin{center} \scalebox{0.6}{\rotatebox{270}{\includegraphics{figures/sampling}}} \caption{Evolution of a multi-state model. The process is observed on four occasions.} \label{fig:multi:sampling} \end{center} \end{figure} \subsection{Likelihood for the multi-state model} \label{sec:multi:likelihood} Kalbfleisch and Lawless\cite{kalbfleisch:lawless} and later Kay \cite{kay:mark} described a general method for evaluating the likelihood for a general multi-state model in continuous time, applicable to any form of transition matrix. The only available information is the observed state at a set of times, as in Figure \ref{fig:multi:sampling}. The sampling times are assumed to be non-informative. \paragraph{Transition probability matrix} The likelihood is calculated from the \emph{transition probability matrix} $P(t)$. For a time-homogeneous process, the $(r,s)$ entry of $P(t)$, $p_{rs}(t)$, is the probability of being in state $s$ at a time $t+u$ in the future, given the state at time $u$ is $r$. It does not say anything about the time of transition from $r$ to $s$, indeed the process may have entered other states between times $u$ and $t+u$. $P(t)$ can be calculated by taking the matrix exponential of the scaled transition intensity matrix (see, for example, Cox and Miller \cite{cox:miller}). \begin{equation} \label{eq:exptq} P(t) = \Exp(tQ) \end{equation} The matrix exponential $\Exp$ is different from a scalar exponential. The exponential of a matrix is defined by the same "power series" $\Exp(X) = 1 + X^2/2! + X^3/3! + ...$ as the scalar exponential, except that each term $X^k$ in the series is defined by matrix products, not element-wise scalar multiplication. It is notoriously difficult to calculate reliably, as discussed by Moler and van Loan \cite{matrixexp}. For simpler models, it is feasible to calculate an analytic expression for each element of $P(t)$ in terms of $Q$. This is generally faster and avoids the potential numerical instability of calculating the matrix exponential. Symbolic algebra sofware, such as Mathematica, can be helpful for obtaining these expressions. For example, the three-state illness-death model with no recovery has a transition intensity matrix of \[ Q = \left( \begin{array}{llllll} -(q_{12} + q_{13}) & q_{12} & q_{13}\\ 0 & - q_{23} & q_{23}\\ 0 & 0 & 0\\ \end{array} \right ) \] The corresponding time $t$ transition probabilities are \begin{eqnarray*} p_{11}(t) & = & e^{-(q_{12} + q_{13})t}\\ p_{12}(t) & = & \left\{ \begin{array}{ll} \frac{ q_{12} }{q_{12} + q_{13} - q_{23} } (e^{-q_{23} t} - e^{-(q_{12} + q_{13})t}) & (q_{12} + q_{13} \neq q_{23})\\ q_{12}te^{(-(q_{12} + q_{13})t} & (q_{12} + q_{13} = q_{23}) \end{array} \right. \\ p_{13}(t) & = & \left\{ \begin{array}{ll} 1 - e^{-(q_{12} + q_{13})t} - \frac{ q_{12} }{q_{12} + q_{13} - q_{23} } (e^{-q_{23} t} - e^{-(q_{12} + q_{13})t}) & (q_{12} + q_{13} \neq q_{23})\\ (-1 + e^{(q_{12} + q_{13})t} - q_{12}t)e^{-(q_{12} + q_{13})t} & (q_{12} + q_{13} = q_{23}) \end{array} \right. \\ p_{21}(t) & = & 0\\ p_{22}(t) & = & e^{-q_{23}t}\\ p_{23}(t) & = & 1 - e^{-q_{23}t}\\ p_{31}(t) & = & 0\\ p_{32}(t) & = & 0\\ p_{33}(t) & = & 1\\ \end{eqnarray*} The \Rpackage{msm} package calculates $P(t)$ analytically for selected 2, 3, 4 and 5-state models, illustrated in Figures \ref{fig:anp2}--\ref{fig:anp5}. For other models, which can have any transition structure on any number of states in principle, $P(t)$ is determined from the matrix exponential. This is calculated using eigensystem decomposition (if eigenvalues are distinct) or a method based on Pad\'e approximants with scaling and squaring \cite{matrixexp} (if there are repeated eigenvalues). Notice that the states are not labelled in these figures. Each graph can correspond to several different $Q$ matrices, depending on how the states are labelled. For example, Figure~\ref{fig:anp2} a) illustrates the model defined by either \( Q = \left( \begin{array}{ll} - q_{12} & q_{12} \\ 0 & 0 \end{array} \right) \) or \( Q = \left( \begin{array}{ll} 0 & 0\\ q_{21} & - q_{21} \end{array} \right) \). \begin{figure} \begin{center} a) \includegraphics[width=3cm]{figures/p2q1} \hskip 3cm b) \includegraphics[width=3cm]{figures/p2q12} \end{center} \caption{\label{fig:anp2}Two-state models fitted using analytic $P(t)$ matrices in \Rpackage{msm}. Implemented for all permutations of state labels 1, 2.} \end{figure} \begin{figure} \begin{center} a) \includegraphics[width=3cm]{figures/p3q12} \hskip 3cm b) \includegraphics[width=5cm]{figures/p3q14} \vskip 1cm c) \includegraphics[width=3cm]{figures/p3q16}\hskip 3cm d) \includegraphics[width=3cm]{figures/p3q124}\vskip 1cm e) \includegraphics[width=3cm]{figures/p3q135}\hskip 3cm f) \includegraphics[width=3cm]{figures/p3q1246} \end{center} \caption{\label{fig:anp3}Three-state models fitted using analytic $P(t)$ matrices in \Rpackage{msm}. Implemented for all permutations of state labels 1, 2, 3.} \end{figure} \begin{figure} \begin{center} a) \includegraphics[width=7cm]{figures/p4q159} \vskip 1cm b) \includegraphics[width=7cm]{figures/p4q13569} \end{center} \caption{\label{fig:anp4}Four-state models fitted using analytic $P(t)$ matrices in \Rpackage{msm}. Implemented for all permutations of state labels 1, 2, 3, 4.} \end{figure} \begin{figure} \begin{center} a) \includegraphics[width=9cm]{figures/p5q1_6_11_16}\vskip 1cm b) \includegraphics[width=9cm]{figures/p5q1_4_6_8_11_12_16}\vskip 1cm c) \includegraphics[width=5cm]{figures/p5q1_6_7_11_12} \end{center} \caption{\label{fig:anp5}Five-state models fitted using analytic $P(t)$ matrices in \Rpackage{msm}. Implemented for all permutations of state labels 1, 2, 3, 4, 5.} \end{figure} \paragraph{Likelihood for intermittently-observed processes} Suppose $i$ indexes $M$ individuals. The data for individual $i$ consist of a series of times $(t_{i1}, \ldots, t_{in_i})$ and corresponding states $(S(t_{i1}), \ldots, S(t_{in_i}))$. Consider a general multi state model, with a pair of successive observed disease states $S(t_j), S(t_{j+1})$ at times $t_j, t_{j+1}$. The contribution to the likelihood from this pair of states is \begin{equation} \label{eq:multi:lik:contrib} L_{i, j} = p_{S(t_j)S(t_{j+1})}(t_{j+1} - t_j) \end{equation} This is the entry of the transition matrix $P(t)$ at the $S(t_j)$th row and $S(t_{j+1})$th column, evaluated at $t = t_{j+1} - t_j$. The full likelihood $L(Q)$ is the product of all such terms $L_{i,j}$ over all individuals and all transitions. It depends on the unknown transition matrix $Q$, which was used to determine $P(t)$. \paragraph{Exactly-observed death times} In observational studies of chronic diseases, it is common that the time of death is known, but the state on the previous instant before death is unknown. If $S(t_{j+1}) = D $ is such a death state, then the contribution to the likelihood is summed over the unknown state $m$ on the instant before death: \begin{equation} \label{eq:multi:lik:death} L_{i, j} = \sum_{m \neq D} p_{S(t_j),m}(t_{j+1} - t_j) q_{m, D} \end{equation} The sum is taken over all possible states $m$ which can be visited between $S(t_j)$ and $D$. \paragraph{Exactly observed transition times} If the times $(t_{i1}, \ldots, t_{in_i})$ had been the {\em exact} transition times between the states, with no transitions between the observation times, then the contributions would be of the form \begin{equation} \label{eq:multi:lik:exact} L_{i, j} = \exp(q_{S(t_j)S(t_{j})}(t_{j+1} - t_j)) q_{S(t_j)S(t_{j+1})} \end{equation} since the state is assumed to be $S(t_j)$ throughout the interval between $t_j$ and $t_{j+1}$ with a known transition to state $S(t_{j+1})$ at $t_{j+1}$. \Rpackage{msm} is restricted to Markov models, but much richer models are possible for this type of data. For example, Putter \etal \cite{putter:mstate} discussed the \Rpackage{mstate} software for semi-parametric multi-state models with non-parametric baseline hazards and Cox regression. The Markov assumption is restrictive but necessary in general to compute a likelihood for intermittently-observed processes. \paragraph{Censored states} A censored quantity is one whose exact value is unknown, but known to be in a certain interval. For example, in survival analysis, a death time is \emph{right-censored} if the study ends and the patient is still alive, since the death time is known to be greater than the end time. In multi-state models for intermittently-observed processes, the times of changes of state are usually \emph{interval censored}, known to be within bounded intervals. This leads to a likelihood based on equation \ref{eq:multi:lik:contrib}. In some circumstances, \emph{states} may be censored as well as \emph{event times}. For example, at the end of some chronic disease studies, patients are known to be alive but in an \emph{unknown state}. For such a censored observation $S(t_{j+1})$ ($j+1=n$) known only to be a state in the set $C$, the equivalent contribution to the likelihood is \begin{equation} \label{eq:multi:lik:deathcens} L_{i, j} = \sum_{m \in C} p_{S(t_j),m}(t_{j+1} - t_j) \end{equation} Note that this special likelihood is not needed if the state is known at the end of the study. In this case, likelihood \ref{eq:multi:lik:contrib} applies. Although the \emph{survival time} is censored, the \emph{state} at the end of the study is not censored. More generally, suppose every observation from a particular individual is censored. Observations $1, 2, \ldots n_i$ are known only to be in the sets $C_1, C_2, \ldots, C_{n_i}$ respectively. The likelihood for this individual is a sum of the likelihoods of all possible paths through the unobserved states. \begin{equation} \label{eq:multi:lik:cens} L_i = \sum_{s_{n_i} \in C_{n_i}} \ldots \sum_{s_2 \in C_2} \sum_{s_1 \in C_1} p_{s_1 s_2}(t_2 - t_1) p_{s_2 s_3} (t_3 - t_2) \ldots p_{s_{n_i-1} s_{n_i}} (t_{n_i} - t_{n_i-1}) \end{equation} Suppose the states comprising the set $C_j$ are $c^{(j)}_1, \ldots, c^{(j)}_{m_j}$. This likelihood can also be written as a matrix product, say, \begin{equation} \label{eq:multi:lik:cens:matrix} L_i = \mathbf{1}^T P^{1,2} P^{2,3} \ldots P^{n_i-1, n_i} \mathbf{1} \end{equation} where $P^{j-1, j}$ is a $m_{j-1} \times m_j$ matrix with $(r,s)$ entry $p_{c^{(j-1)}_r c^{(j)}_s}(t_j - t_{j-1})$, and $\mathbf{1}$ is the vector of ones. The \Rpackage{msm} package allows multi-state models to be fitted to data from processes with arbitrary observation times (panel data), exactly-observed transition times, exact death times and censored states, or a mixture of these schemes. \subsection{Covariates} \label{sec:multi:covariates} The relation of constant or time-varying characteristics of individuals to their transition rates is often of interest in a multi-state model. Explanatory variables for a particular transition intensity can be investigated by modelling the intensity as a function of these variables. Marshall and Jones \cite{retino2} described a form of a {\em proportional hazards} model, where the transition intensity matrix elements $q_{rs}$ which are of interest can be replaced by \[ q_{rs}(z(t)) = q_{rs}^{(0)} \exp(\beta_{rs}^T z(t)) \] The new $Q$ is then used to determine the likelihood. If the covariates $z(t)$ are time dependent, the contributions to the likelihood of the form $p_{rs} (t - u)$ are replaced by \[ p_{rs}(t - u, z(u)) \] although this requires that the value of the covariate is known at every observation time $u$. Sometimes covariates are observed at different times to the main response, for example recurrent disease events or other biological markers. In some of these cases it could be assumed that the covariate is a step function which remains constant between its observation times. If the main response (the state of the Markov process) is not observed at the times when the covariate changes, it could be considered as a "censored" state (as in Section \ref{sec:multi:likelihood}). The \Rpackage{msm} package allows individual-specific or time dependent covariates to be fitted to transition intensities. In order to calculate transition probabilities $P(t)$ on which the likelihood depends, time-dependent covariates are assumed to be piecewise-constant. Models whose intensities change with time are called \emph{time-inhomogeneous}. An important special case handled by \Rpackage{msm} is the model in which intensities change at a series of times common to each individual. Marshall and Jones \cite{retino2} described likelihood ratio and Wald tests for covariate selection and testing hypotheses, for example whether the effect of a covariate is the same for all forward transitions in a disease progression model, or whether the effect on backward transitions is equal to minus the effect on forward transitions. \subsection{Hidden Markov models} \label{sec:hmm} In a {\em hidden Markov model} (HMM) the states of the Markov chain are not observed. The observed data are governed by some probability distribution (the \emph{emission} distribution) conditionally on the unobserved state. The evolution of the underlying Markov chain is governed by a transition intensity matrix $Q$ as before. (Figure \ref{fig:multi:hidden}). Hidden Markov models are mixture models, where observations are generated from a certain number of unknown distributions. However the distribution changes through time according to states of a hidden Markov chain. This class of model is commonly used in areas such as speech and signal processing \cite{juang:rabiner} and the analysis of biological sequence data \cite{biolog:seq}. In engineering and biological sequencing applications, the Markov process usually evolves over an equally-spaced, discrete `time' space. Therefore most of the theory of HMM estimation was developed for discrete-time models. HMMs have less frequently been used in medicine, where continuous time processes are often more suitable. A disease process evolves in continuous time, and patients are often monitored at irregular and differing intervals. These models are suitable for estimating population quantities for chronic diseases which have a natural staged interpretation, but which can only be diagnosed by an error-prone marker. The \Rpackage{msm} package can fit continuous-time hidden Markov models with a variety of emission distributions. \begin{figure}[htbp] \begin{center} \scalebox{0.6}{\rotatebox{270}{\includegraphics{figures/hidden}}} \caption{A hidden Markov model in continuous time. Observed states are generated conditionally on an underlying Markov process. } \label{fig:multi:hidden} \end{center} \end{figure} \subsubsection{Misclassification models} An example of a hidden Markov model is a multi-state model with misclassification. Here the observed data are states, assumed to be misclassifications of the true, underlying states. For example, consider a disease progression model with at least a disease-free and a disease state. When screening for the presence of the disease, the screening process can sometimes be subject to error. Then the Markov disease process $S_i(t)$ for individual $i$ is not observed directly, but through realisations $O_i(t)$. The quality of a diagnostic test is often measured by the probabilities that the true and observed states are equal, $Pr(O_i(t) = r | S_i(t) = r)$. Where $r$ represents a `positive' disease state, this is the {\em sensitivity}, or the probability that a true positive is detected by the test. Where $r$ represents a `negative' or disease-free state, this represents the {\em specificity}, or the probability that, given the condition of interest is absent, the test produces a negative result. As an extension to the simple multi-state model described in section \ref{sec:multistate}, the \Rpackage{msm} package can fit a general multi-state model with misclassification. For patient $i$, observation time $t_{ij}$, observed states $O_{ij}$ are generated conditionally on true states $S_{ij}$ according to a {\em misclassification matrix} $E$. This is a $n \times n$ matrix, whose $(r,s)$ entry is \begin{equation} \label{eq:misc} e_{rs} = Pr(O(t_{ij}) = s | S(t_{ij}) = r), \end{equation} which we first assume to be independent of time $t$. Analogously to the entries of $Q$, some of the $e_{rs}$ may be fixed to reflect knowledge of the diagnosis process. For example, the probability of misclassification may be negligibly small for non-adjacent states of disease. Thus the progression through underlying states is governed by the transition intensity matrix $Q$, while the observation process of the underlying states is governed by the misclassification matrix $E$. To investigate explanatory variables $w(t)$ for the probability $e_{rs}$ of misclassification as state $s$ given underlying state $r$, a multinomial logistic regression model can be used: \begin{equation} \label{eq:misccovs} \log \frac{e_{rs}(t)}{e_{rs_0}(t)} = \gamma_{rs}^T w(t). \end{equation} where $s_0$ is some baseline state, usually chosen as the underlying state, or the state with the highest probability (for numerical stability). \subsubsection{General hidden Markov model} \label{sec:hmm:general} Consider now a general hidden Markov model in continuous time. The true state of the model $S_{ij}$ evolves as an unobserved Markov process. Observed data $y_{ij}$ are generated conditionally true states $S_{ij} = 1, 2, \ldots, n$ according to a set of distributions $f_1(y | \theta_1, \gamma_1)$, $f_2(y | \theta_2, \gamma_2)$, $\ldots$, $f_n(y | \theta_n, \gamma_n)$, respectively. $\theta_r$ is a vector of parameters for the state $r$ distribution. One or more of these parameters may depend on explanatory variables through a link-transformed linear model with coefficients $\gamma_r$. \subsubsection{Likelihood for general hidden Markov models} A type of EM algorithm known as the {\em Baum-Welch} or {\em forward-backward} algorithm \cite{baum:petrie66, baum:petrie70}, is commonly used for hidden Markov model estimation in discrete-time applications. See, for example, Durbin \etal \cite{biolog:seq}, Albert \cite{albert99}. A generalisation of this algorithm to continuous time was described by Bureau \etal \cite{bureau:hughes:shiboski:00}. The \Rpackage{msm} package uses a direct method of calculating likelihoods for continuous-time models based on matrix products. This type of method has been described by Macdonald and Zucchini \cite[pp. 77--79]{macdonald:zucchini}, Lindsey \cite[p.73]{lindsey:rm} and Guttorp \cite{guttorp}. Satten and Longini \cite{sattlong} used this method to calculate likelihoods for a hidden Markov model in continuous time with observations of a continuous marker generated conditionally on underlying discrete states. Patient $i$'s contribution to the likelihood is \begin{eqnarray} \label{eq:multi:hiddencontrib} L_i & = & Pr(y_{i1}, \ldots, y_{in_i})\\ & = & \sum Pr(y_{i1}, \ldots, y_{in_i} | S_{i1}, \ldots, S_{in_i}) Pr(S_{i1}, \ldots, S_{in_i}) \nonumber \end{eqnarray} where the sum is taken over all possible paths of underlying states $S_{i1}, \ldots, S_{in_i}$. Assume that the observed states are conditionally independent given the values of the underlying states. Also assume the Markov property, $Pr(S_{ij}|S_{i,j-1}, \ldots, S_{i1}) = Pr(S_{ij}|S_{i,j-1})$. Then the contribution $L_i$ can be written as a product of matrices, as follows. To derive this matrix product, decompose the overall sum in equation \ref{eq:multi:hiddencontrib} into sums over each underlying state. The sum is accumulated over the unknown first state, the unknown second state, and so on until the unknown final state: \begin{eqnarray} \label{eq:multi:hiddenlik} L_i & = & \sum_{S_{i1}} Pr(y_{i1}|S_{i1})Pr(S_{i1}) \sum_{S_{i2}} Pr(y_{i2}|S_{i2})Pr(S_{i2}|S_{i1}) \sum_{S_{i3}} Pr(y_{i3}|S_{i3}) Pr(S_{i3}|S_{i2}) \nonumber \\ & & \ldots \sum_{S_{in_i}} Pr(y_{in_i}|S_{in_i}) Pr(S_{in_i}|S_{in_{i-1}}) \end{eqnarray} where $Pr(y_{ij}|S_{ij})$ is the emission probability density. For misclassification models, this is the misclassification probability $e_{S_{ij} O_{ij}}$. For general hidden Markov models, this is the probability density $f_{S_{ij}}(y_{ij}|\theta_{S_{ij}},\gamma_{S_{ij}})$. $Pr(S_{i,j+1}|S_{ij})$ is the $(S_{ij}, S_{i,j+1})$ entry of the Markov chain transition matrix $P(t)$ evaluated at $t = t_{i,j+1} - t_{ij}$. Let $f$ be the vector with $r$ element the product of the initial state occupation probability $Pr(S_{i1}=r)$ and $Pr(y_{i1}| r)$, and let $\mathbf 1$ be a column vector consisting of ones. For $j = 2, \ldots, n_i$ let $T_{ij}$ be the $R \times R$ matrix (where $R$ is the number of states) with $(r,s)$ entry \[ Pr(y_{ij}| s) p_{rs} (t_{ij} - t_{i,j-1}) \] Then subject $i$'s likelihood contribution is \begin{equation} L_i = f T_{i2} T_{i3}, \ldots T_{in_i} \mathbf 1 \label{eq:multi:hidden:matprod} \end{equation} If $S(t_{j}) = D$ is an absorbing state such as death, measured without error, whose entry time is known exactly, then the contribution to the likelihood is summed over the unknown state at the previous instant before death. The $(r,s)$ entry of $T_{ij}$ is then \[ p_{rs}(t_{j} - t_{j-1}) q_{s, D} \] Section \ref{sec:fitting:hmm:misc} describes how to fit multi-state models with misclassification using the \Rpackage{msm} package, and Section \ref{sec:fitting:hmm:general} describes how to apply general hidden Markov models. \subsubsection{Example of a general hidden Markov model} \label{sec:hmm:example:fev} Jackson and Sharples \cite{jackson:sharples:2002} described a model for FEV$_1$ (forced expiratory volume in 1 second) in recipients of lung transplants. These patients were at risk of BOS (bronchiolitis obliterans syndrome), a progressive, chronic deterioration in lung function. In this example, BOS was modelled as a discrete, staged process, a model of the form illustrated in Figure \ref{fig:disease}, with 4 states. State 1 represents absence of BOS. State 1 BOS is roughly defined as a sustained drop below 80\% below baseline FEV$_1$, while state 2 BOS is a sustained drop below 65\% baseline. FEV$_1$ is measured as a percentage of a baseline value for each individual, determined in the first six months after transplant, and assumed to be 100\% baseline at six months. As FEV$_1$ is subject to high short-term variability due to acute events and natural fluctuations, the exact BOS state at each observation time is difficult to determine. Therefore, a hidden Markov model for FEV$_1$, conditionally on underlying BOS states, was used to model the natural history of the disease. Discrete states are appropriate as onset is often sudden. \paragraph{Model 1} Jackson \cite{my:phd} considered models for these data where FEV$_1$ were Normally distributed, with an unknown mean and variance conditionally each state (\ref{eq:fev:normal}). This model seeks the most likely location for the within-state FEV$_1$ means. \begin{equation} \label{eq:fev:normal} y_{ij} | \{ S_{ij} = k\} \sim N(\mu_k + \beta x_{ij}, \sigma^2_k) \end{equation} \paragraph{Model 2} Jackson and Sharples \cite{jackson:sharples:2002} used a more complex two-level model for FEV$_1$ measurements. Level 1 (\ref{eq:fev:level1}) represents the short-term fluctuation error of the marker around its underlying continuous value $y^{hid}_{ij}$. Level 2 (\ref{eq:fev:level2}) represents the distribution of $y^{hid}_{ij}$ conditionally on each underlying state, as follows. \begin{equation} \label{eq:fev:level1} y_{ij} | y^{hid}_{ij} \qquad \sim N ( y^{hid}_{ij} + \beta x_{ij} , \sigma^2_\epsilon) \end{equation} \begin{equation} \label{eq:fev:level2} y^{hid}_{ij} | S_{ij} \quad \sim \quad \left\{ \begin{array}{cll} \mbox{State}& \mbox{Three state model} & \mbox{Four state model} \\ S_{ij} = 0 & N(\mu_0, \sigma^2_0)I_{[80, \infty)} & N(\mu_0, \sigma^2_0)I_{[80, \infty)} \\ S_{ij} = 1 & N(\mu_1, \sigma^2_1)I_{(0, 80)} & Uniform(65, 80) \\ S_{ij} = 2 & \mbox{(death)} & N(\mu_2, \sigma^2_2)I_{(0, 65)} \\ S_{ij} = 3 & & \mbox{(death)} \end{array} \right . \end{equation} Integrating over $y^{hid}_{ij}$ gives an explicit distribution for $y_{ij}$ conditionally on each underlying state (given in Section \ref{sec:fitting:hmm:general}, Table \ref{tab:hmm:dists}). Similar distributions were originally applied by Satten and Longini \cite{sattlong} to modelling the progression through discrete, unobserved HIV disease states using continuous CD4 cell counts. The \Rpackage{msm} package includes density, quantile, cumulative density and random number generation functions for these distributions. In both models 1 and 2, the term $\beta x_{ij}$ models the short-term fluctuation of the marker in terms of acute events. $x_{ij}$ is an indicator for the occurrence of an acute rejection or infection episode within 14 days of the observation of FEV$_1$. Section \ref{sec:fitting:hmm:general} describes how these and more general hidden Markov models can be fitted with the \Rpackage{msm} package. \clearpage \section{Fitting multi-state models with {\tt msm}} <>= options(width = 60) @ \Rpackage{msm} is a package of functions for multi-state modelling using the R statistical software. The \Rfunction{msm} function itself implements maximum-likelihood estimation for general multi-state Markov or hidden Markov models in continuous time. We illustrate its use with a set of data from monitoring heart transplant patients. Throughout this section ``\textsl{\texttt{>}}'' indicates the R command prompt, \textsl{\texttt{slanted typewriter}} text indicates R commands, and \texttt{typewriter} text R output. \subsection{Installing \tt{msm}} \label{sec:installing} The easiest way to install the \Rpackage{msm} package on a computer connected to the Internet is to run the R command: \begin{Scode} install.packages("msm") \end{Scode} This downloads \Rpackage{msm} from the CRAN archive of contributed R packages (\texttt{cran.r-project.org} or one of its mirrors) and installs it to the default R system library. To install to a different location, for example if you are a normal user with no administrative privileges, create a directory in which R packages are to be stored, say, \texttt{/your/library/dir}, and run \begin{Scode} install.packages("msm", lib='/your/library/dir') \end{Scode} After \Rpackage{msm} has been installed, its functions can be made visible in an R session by <<>>= library(msm) @ or, if it has been installed into a non-default library, \begin{Scode} library(msm, lib.loc='/your/library/dir') \end{Scode} \subsection{Getting the data in} \label{sec:datain} The data are specified as a series of observations, grouped by patient. At minimum there should be a data frame with variables indicating \begin{itemize} \item the time of the observation, \item the observed state of the process. \end{itemize} If the data do not also contain \begin{itemize} \item the subject identification number, \end{itemize} then all the observations are assumed to be from the same subject. The subject ID does not need to be numeric, but data must be grouped by subject, and observations must be ordered by time within subjects. If the model includes variables with missing values, then the corresponding observations are omitted by \Rfunction{msm} with a warning. If you have missing data, as in any statistical model, it is recommended to ensure these do not result in biases. An example data set, taken from monitoring a set of heart transplant recipients, is provided with \Rpackage{msm}. (Note: since \Rpackage{msm} version 1.3, the command \Rfunction{data(cav)} is no longer needed to load the data --- it is now ``lazy-loaded'' when required). Sharples \etal \cite{my:cav} studied the progression of coronary allograft vasculopathy (CAV), a post-transplant deterioration of the arterial walls, using these data. Risk factors and the accuracy of the screening test were investigated using multi-state Markov and hidden Markov models. The first three patient histories are shown below. There are 622 patients in all. \Robject{PTNUM} is the subject identifier. Approximately each year after transplant, each patient has an angiogram, at which CAV can be diagnosed. The result of the test is in the variable \Robject{state}, with possible values 1, 2, 3 representing CAV-free, mild CAV and moderate or severe CAV respectively. A value of 4 is recorded at the date of death. \Robject{years} gives the time of the test in years since the heart transplant. Other variables include \Robject{age} (age at screen), \Robject{dage} (donor age), \Robject{sex} (0=male, 1=female), \Robject{pdiag} (primary diagnosis, or reason for transplant - IHD represents ischaemic heart disease, IDC represents idiopathic dilated cardiomyopathy), \Robject{cumrej} (cumulative number of rejection episodes), and \Robject{firstobs}, an indicator which is 1 when the observation corresponds to the patient's transplant (the first observation), and 0 when the observation corresponds to a later angiogram. <<>>= cav[1:21,] @ A useful way to summarise multi-state data is as a frequency table of pairs of consecutive states. This counts over all individuals, for each state $r$ and $s$, the number of times an individual had an observation of state $r$ followed by an observation of state $s$. The function \Rfunction{statetable.msm} can be used to produce such a table, as follows, <<>>= statetable.msm(state, PTNUM, data=cav) @ Thus there were 148 CAV-free deaths, 48 deaths from state 2, and 55 deaths from state 3. On only four occasions was there an observation of severe CAV followed by an observation of no CAV. \subsection{Specifying a model} \label{sec:specifying:model} We now specify the multi-state model to be fitted to the data. A model is governed by a transition intensity matrix $Q$. For the heart transplant example, there are four possible states through which the patient can move, corresponding to CAV-free, mild/moderate CAV, severe CAV and death. We assume that the patient can advance or recover from consecutive states while alive, and die from any state. Thus the model is illustrated by Figure \ref{fig:disease} with four states, and we have \[ Q = \left( \begin{array}{llll} -(q_{12} + q_{14}) & q_{12} & 0 & q_{14}\\ q_{21} & -(q_{21}+q_{23}+q_{24}) & q_{23} & q_{24}\\ 0 & q_{32} & -(q_{32}+q_{34}) & q_{34}\\ 0 & 0 & 0 & 0 \\ \end{array} \right ) \] It is important to remember that this defines which \emph{instantaneous} transitions can occur in the Markov process, and that the data are \emph{snapshots} of the process (see section \ref{sec:arbitr-observ-times}). Although there were 44 occasions on which a patient was observed in state 1 followed by state 3, we can still have $q_{13}=0$. The underlying model specifies that the patient must have passed through state 2 in between, rather than jumping straight from 1 to 3. If your data represent the exact and complete transition times of the process, then you must specify \Rfunarg{exacttimes=TRUE} or \Rfunarg{obstype=2} in the call to \Rfunction{msm}. To tell \Rfunction{msm} what the allowed transitions of our model are, we define a matrix of the same size as $Q$, containing zeroes in the positions where the entries of $Q$ are zero. All other positions contain an initial value for the corresponding transition intensity. The diagonal entries supplied in this matrix do not matter, as the diagonal entries of $Q$ are defined as minus the sum of all the other entries in the row. This matrix will eventually be used as the \Rfunarg{qmatrix} argument to the \Rfunction{msm} function. For example, <<>>= Q <- rbind ( c(0, 0.25, 0, 0.25), c(0.166, 0, 0.166, 0.166), c(0, 0.25, 0, 0.25), c(0, 0, 0, 0) ) @ Fitting the model is a process of finding values of the seven unknown transition intensities: $q_{12}$, $q_{14}$, $q_{21}$, $q_{23}$, $q_{24}$, $q_{32}$, $q_{34}$, which maximise the likelihood. \subsection{Specifying initial values} \label{sec:inits} The likelihood is maximised by numerical methods, which need a set of initial values to start the search for the maximum. For reassurance that the true maximum likelihood estimates have been found, models should be run repeatedly starting from different initial values. However a sensible choice of initial values can be important for unstable models with flat or multi-modal likelihoods. For example, the transition rates for a model with misclassification could be initialised at the corresponding estimates for an approximating model without misclassification. Initial values for a model without misclassification could be set by supposing that transitions between states take place only at the observation times. If we observe $n_{rs}$ transitions from state $r$ to state $s$, and a total of $n_r$ transitions from state $r$, then $q_{rs} / q_{rr}$ can be estimated by $n_{rs} / n_r$. Then, given a total of $T_r$ years spent in state $r$, the mean sojourn time $1 / q_{rr}$ can be estimated as $T_r / n_r$. Thus, $n_{rs} / T_r$ is a crude estimate of $q_{rs}$. Such default initial values can be used by supplying \Rfunarg{gen.inits=TRUE} in the call to \Rfunction{msm} below, along with a \Rfunarg{qmatrix} whose non-zero entries represent the allowed transitions of the model. Alternatively the function \Rfunction{crudeinits.msm} could be used to get this matrix of initial values explicitly as follows. These methods are only available for non-hidden Markov models. <<>>= Q.crude <- crudeinits.msm(state ~ years, PTNUM, data=cav, qmatrix=Q) @ However, if there are are many changes of state in between the observation times, then this crude approach may fail to give sensible initial values. For the heart transplant example we could also guess that the mean period in each state before moving to the next is about 2 years, and there is an equal probability of progression, recovery or death. This gives $q_{rr} = - 0.5$ for $r = 1, 2, 3$, and $q_{12} = q_{14} = 0.25$, $q_{21} = q_{23} = q_{24} = 0.166$, $q_{32} = q_{34} = 0.25$, and the initial value matrix \Robject{Q} shown above, which we now use to fit the model. \subsection{Running \Rfunction{msm}} \label{sec:running} To fit the model, call the \Rfunction{msm} function with the appropriate arguments. For our running example, we have defined a data set \Robject{cav}, a matrix \Robject{Q} indicating the allowed transitions, and initial values. We are ready to run \Rfunction{msm}. \paragraph{Model 1: simple bidirectional model} <<>>= cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4) @ In this example the day of death is assumed to be recorded exactly, as is usual in studies of chronic diseases. At the previous instant before death the state of the patient is unknown. Thus we specify \Rfunarg{deathexact = 4}, to indicate to \Rfunction{msm} that the entry times into state 4 are observed in this manner. If the model had five states, and states 4 and 5 were two competing causes of death with times recorded exactly in this way, then we would specify \Rfunarg{deathexact = c(4,5)}. By default, the data are assumed to represent snapshots of the process at arbitrary times. However, observations can also represent exact times of transition, ``exact death times'', or a mixture of these. See the \Rfunarg{obstype} argument to \Rfunction{msm}. While the \Rfunction{msm} function runs, it searches for the maximum of the likelihood of the unknown parameters. Internally, it uses the R function \Rfunction{optim} to minimise the minus log-likelihood. When the data set, the model, or both, are large, then this may take a long time. It can then be useful to see the progress of the optimisation algorithm. To do this, we can specify a \Rfunarg{control} argument to \Rfunction{msm}, which is passed internally to the \Rfunction{optim} function. For example \texttt{control = list(trace=1, REPORT=1)}. See the help page for \Rfunction{optim}, <>= help(optim) @ for more options to control the optimisation. \footnote{Note that since version 1.3.2, \Rfunarg{method=''BFGS''}, is the default optimisation algorithm in \Rfunction{msm}, since it can use analytic derivatives, which are available for most models.} When completed, the \Rfunction{msm} function returns a value. This value is a list of the important results of the model fitting, including the parameter estimates and their covariances. To keep these results for post-processing, we store them in an R object, here called \Robject{cav.msm}. When running several similar \Rfunction{msm} models, it is recommended to store the respective results in informatively-named objects. \subsection{Showing results} To show the maximum likelihood estimates and 95\% confidence intervals, type the name of the fitted model object at the R command prompt. \footnote{This is equivalent to typing \texttt{print.msm(cav.msm)}. The function \Rfunction{print.msm} formats the important information in the model object for printing on the screen.} The confidence level can be changed using the \Rfunarg{cl} argument to \Rfunction{msm}. <<>>= cav.msm @ From the estimated intensities, we see patients are three times as likely to develop symptoms than die without symptoms (transitions from state 1). After disease onset (state 2), progression to severe symptoms (state 3) is 50\% more likely than recovery. Once in the severe state, death is more likely than recovery, and a mean of 1 / -0.44 = 2.3 years is spent in state 3 before death or recovery. Section \ref{sec:extractor} describes various functions that can be used to obtain summary information from the fitted model. \subsection{Covariates on the transition rates} \label{sec:msm:covariates} We now model the effect of explanatory variables on the rates of transition, using a proportional intensities model. Now we have an intensity matrix $Q(z)$ which depends on a covariate vector $z$. For each entry of $Q(z)$, the transition intensity for patient $i$ at observation time $j$ is $q_{rs}(z_{ij}) = q_{rs}^{(0)} \exp(\beta_{rs}^T z_{ij})$. The covariates $z$ are specified through the \Rfunarg{covariates} argument to \Rfunction{msm}. If $z_{ij}$ is time-dependent, we assume it is constant in between the observation times of the Markov process. \Rfunction{msm} calculates the probability for a state transition from times $t_{i,j-1}$ to $t_{ij}$ using the covariate value at time $t_{i,j-1}$. We consider a model with just one covariate, female sex. Out of the 622 transplant recipients, 535 are male and 87 are female. By default, all linear covariate effects $\beta_{rs}$ are initialised to zero. To specify different initial values, use a \Rfunarg{covinits} argument, as described in \Rfunction{help(msm)}. Initial values given in the \Rfunarg{qmatrix} represent the intensities with covariate values set to their means in the data. In the following model, all transition intensities are modelled in terms of sex. \paragraph{Model 2: sex as a covariate} <<>>= cavsex.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4, covariates = ~ sex) @ Printing the \Robject{msm} object now displays the estimated covariate effects and their confidence intervals (note since version 1.3.2 these are \emph{hazard ratios} $\exp(\beta_{rs})$, not \emph{log hazard ratios} $\beta_{rs}$ as in previous versions). <<>>= cavsex.msm @ The sizes of the confidence intervals for some of the hazard ratios suggests there is no information in the data about the corresponding covariate effects, leading to a likelihood that is a flat function of these parameters, and this model should be simplified. The first column shown in the output is the estimated transition intensity matrix $q_{rs}(z) = q_{rs}^{(0)} \exp(\beta_{rs}^T z)$ with the covariate $z$ set to its mean value in the data. This represents an average intensity matrix for the population of 535 male and 87 female patients. To extract separate intensity matrices for male and female patients ($z = 0$ and $1$ respectively), use the function \Rfunction{qmatrix.msm}, as shown below. This and similar summary functions will be described in more detail in section \ref{sec:extractor}. <<>>= qmatrix.msm(cavsex.msm, covariates=list(sex=0)) # Male qmatrix.msm(cavsex.msm, covariates=list(sex=1)) # Female @ Since \Rpackage{msm} version 1.2.3, different transition rates may be easily modelled on different covariates by specifying a named list of formulae as the \Rfunarg{covariates} argument. Each element of the list has a name identifying the transition. In the model below, the transition rate from state 1 to state 2 and the rate from state 1 to state 4 are each modelled on sex as a covariate, but no other intensities have covariates on them. \paragraph{Model 2a: transition-specific covariates} <>= cavsex.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4, covariates = list("1-2" = ~ sex, "1-4" = ~sex) ) @ We may also want to constrain the effect of a covariate to be equal for certain transition rates, to reduce the number of parameters in the model, or to investigate hypotheses on the covariate effects. A \Rfunarg{constraint} argument can be used to indicate which of the transition rates have common covariate effects. \paragraph{Model 3: constrained covariate effects} <>= cav3.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4, covariates = ~ sex, constraint = list(sex=c(1,2,3,1,2,3,2)) ) @ This constrains the effect of sex to be equal for the progression rates $q_{12}, q_{23}$, equal for the death rates $q_{14}, q_{24}, q_{34}$, and equal for the recovery rates $q_{21}, q_{32}$. The intensity parameters are assumed to be ordered by reading across the rows of the transition matrix, starting at the first row: ($q_{12}, q_{14}, q_{21}, q_{23}, q_{24}, q_{32}, q_{34}$), giving constraint indicators \Rfunarg{(1,2,3,1,2,3,2)}. Any vector of increasing numbers can be used for the indicators. Negative entries can be used to indicate that some effects are equal to minus others: \Rfunarg{(1,2,3,-1,2,3,2)} sets the fourth effect to be minus the first. In a similar manner, we can constrain some of the baseline transition intensities to be equal to one another, using the \Rfunarg{qconstraint} argument. For example, to constrain the rates $q_{12}$ and $q_{23}$ to be equal, and $q_{24}$ and $q_{34}$ to be equal, specify \Rfunarg{qconstraint = c(1,2,3,1,4,5,4)}. \subsection{Fixing parameters at their initial values} For exploratory purposes we may want to fit a model assuming that some parameters are fixed, and estimate the remaining parameters. This may be necessary in cases where there is not enough information in the data to be able to estimate a proposed model, and we have strong prior information about a certain transition rate. To do this, use the \Rfunarg{fixedpars} argument to \Rfunction{msm}. For model 1, the following statement fixes the parameters numbered 6, 7, that is, $q_{32}$, $q_{34}$, to their initial values (0.25 and 0.25, respectively). \paragraph{Model 4: fixed parameters} <>= cav4.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4, control = list(trace=2, REPORT=1), fixedpars = c(6, 7) ) @ A \Rfunarg{fixedpars} statement can also be used for fixing covariate effect parameters to zero, that is to assume no effect of a covariate on a certain transition rate. \subsection{Extractor functions} \label{sec:extractor} We may want to extract some of the information from the \Rfunction{msm} model fit for post-processing, for example for plotting graphs or generating summary tables. A set of functions is provided for extracting interesting features of the fitted model. \begin{description} \item[Intensity matrices] The function \Rfunction{qmatrix.msm} extracts the estimated transition intensity matrix and its confidence intervals for a given set of covariate values, as shown in section \ref{sec:msm:covariates}. Confidence intervals are calculated from the covariance matrix of the estimates by assuming the distribution is symmetric on the log scale. Standard errors for the intensities are also available from the object returned by \Rfunction{qmatrix.msm}. These are calculated by the delta method. The \Rpackage{msm} package provides a general-purpose function \Rfunction{deltamethod} for estimating the variance of a function of a random variable $X$ given the expectation and variance of $X$. See \texttt{help(deltamethod)} for further details. Bootstrap confidence intervals are also available for \Rfunction{qmatrix.msm} and for most output functions; these are often more accurate, at the cost of computational time. For more about bootstrapping in \Rpackage{msm}, see Section \ref{sec:boot}. \item[Transition probability matrices] The function \Rfunction{pmatrix.msm} extracts the estimated transition probability matrix $P(t)$ within a given time. For example, for model 1, the 10 year transition probabilities are given by: <<>>= pmatrix.msm(cav.msm, t=10) @ Thus, a typical person in state 1, disease-free, has a probability of 0.5 of being dead ten years from now, a probability of 0.3 being still disease-free, and probabilities of 0.1 of being alive with mild/moderate or severe disease, respectively. This assumes $Q$ is constant within the desired time interval. For non-homogeneous processes, where $Q$ varies with time-dependent covariates but can be approximated as piecewise constant, there is an equivalent function \Rfunction{pmatrix.piecewise.msm}. Consult its help page for further details. If \Rfunarg{ci=''norm''} is specified, then a confidence interval is calculated based on drawing a random sample (default size 1000) from the assumed multivariate normal distribution of the maximum likelihood estimates and covariance matrix, and transforming. If \Rfunarg{ci=''boot''} is specified, then a bootstrap confidence interval for the transition probability matrix is calculated (see Section \ref{sec:boot}) . However, both of these are computationally intensive, particularly the bootstrap method, so no confidence interval is calculated by default. \item[Mean sojourn times] The function \Rfunction{sojourn.msm} extracts the estimated mean sojourn times in each transient state $r$, for a given set of covariate values. This is calculated as $-1 / \hat q_{rr}$, where $\hat q_{rr}$ is the $r$th diagonal entry of the estimated transition intensity matrix. <<>>= sojourn.msm(cav.msm) @ \item[Probability that each state is next] The function \Rfunction{pnext.msm} extracts the matrix of probabilities $-q_{rs} / q_{rr}$ that the next state after state $r$ is state $s$, for each $r$ and $s$. Together with the mean sojourn times, this gives a more intuitive parameterisation of a continuous-time Markov model than the raw transition intensities $q_{rs}$. Note these are different from the transition probabilities in a given time $t$ returned by \Rfunction{pmatrix.msm}. <<>>= pnext.msm(cav.msm) @ \item[Total length of stay] Mean sojourn times describe the average period in a single stay in a state. For processes with successive periods of recovery and relapse, we may want to forecast the total time spent healthy or diseased, before death. The function \Rfunction{totlos.msm} estimates the forecasted total length of time spent in each transient state $s$ between two future time points $t_1$ and $t_2$, for a given set of covariate values. This defaults to the expected amount of time spent in each state between the start of the process (time 0, the present time) and death or a specified future time. This is obtained as \[ L_s = \int_{t_1}^{t_2} P(t)_{r,s} dt \] where $r$ is the state at the start of the process, which defaults to 1. This is calculated using numerical integration. For model 1, each patient is forecasted to spend 8.8 years disease free, 2.2 years with mild or moderate disease and 1.8 years with severe disease. Bootstrap and asymptotic confidence intervals are available, as for \Rfunction{pmatrix.msm}, but are not calculated by default. <<>>= totlos.msm(cav.msm) @ \item[Expected first passage times] The function \Rfunction{efpt.msm} estimates the expected time until the process first enters a given state or set of states, also called the ``hitting time''. See its help page for further details. \item[Expected number of visits] The function \Rfunction{envisits.msm} estimates the expected number of visits to a state, computed in a similar way to the total length of stay. See its help page for further details. \item[Ratio of transition intensities] The function \Rfunction{qratio.msm} estimates a ratio of two entries of the transition intensity matrix at a given set of covariate values, together with a confidence interval estimated assuming normality on the log scale and using the delta method. For example, we may want to estimate the ratio of the progression rate $q_{12}$ into the first state of disease to the corresponding recovery rate $q_{21}$. For example in model 1, recovery is 1.8 times as likely as progression. <<>>= qratio.msm(cav.msm, ind1=c(2,1), ind2=c(1,2)) @ \item[Hazard ratios for transition] The function \Rfunction{hazard.msm} gives the estimated hazard ratios corresponding to each covariate effect on the transition intensities. 95\% confidence limits are computed by assuming normality of the log-effect. <<>>= hazard.msm(cavsex.msm) @ \end{description} \paragraph{Setting covariate values} All of these extractor functions take an argument called \Rfunarg{covariates}. If this argument is omitted, for example, <>= qmatrix.msm(cav.msm) @ then the intensity matrix is evaluated as $Q(\bar x)$ with all covariates set to their mean values $\bar x$ in the data. For factor / categorical variables, the mean of the 0/1 dummy variable for each factor level is used, representing an average over all values in the data, rather than a specific factor level. Alternatively, set \Rfunarg{covariates} to 0 to return the result $Q(0)$ with covariates set to zero. This will usually be preferable for categorical covariates, where we wish to see the result for the baseline category. <>= qmatrix.msm(cavsex.msm, covariates = 0) @ Alternatively, the desired covariate values can be specified explicitly as a list, <>= qmatrix.msm(cavsex.msm, covariates = list(sex = 1)) @ Values of categorical covariates must be quoted. For example, consider a covariate \texttt{smoke}, representing tobacco smoking status, with three levels, \texttt{NON, CURRENT, EX}, representing a non-smoker, current smoker or ex-smoker. \begin{Scode} qmatrix.msm(example.msm, covariates = list(age = 60, smoke=''CURRENT'')) \end{Scode} \subsection{Survival plots} In studies of chronic disease, an important use of multi-state models is in predicting the probability of survival for patients in increasingly severe states of disease, for some time $t$ in the future. This can be obtained directly from the transition probability matrix $P(t)$. The \Rfunction{plot} method for \Robject{msm} objects produces a plot of the expected probability of survival against time, from each transient state. Survival is defined as not entering the final absorbing state. <>= plot(cav.msm, legend.pos=c(8, 1)) @ This shows that the 10-year survival probability with severe CAV is approximately 0.1, as opposed to 0.3 with mild CAV and 0.5 without CAV. With severe CAV the survival probability diminishes very quickly to around 0.3 in the first five years after transplant. The \Rfunarg{legend.pos} argument adjusts the position of the legend in case of clashes with the plot lines. A \Rfunarg{times} argument can be supplied to indicate the time interval to forecast survival for. A more sophisticated analysis of these data might explore competing causes of death from causes related or unrelated to the disease under study. \subsection{Bootstrapping} \label{sec:boot} Most of \Rpackage{msm}'s output functions present confidence intervals based on asymptotic standard errors calculated from the Hessian, or transformations of these using the delta method. The asymptotic standard errors are expected to be underestimates of the true standard errors (Cramer-Rao lower bound). For some output functions, such as \Rfunction{pmatrix.msm}, and functions based on \Rfunction{pmatrix.msm} such as \Rfunction{totlos.msm} and \Rfunction{prevalence.msm}, the delta method cannot be used at all to obtain standard errors. In these cases, confidence intervals can be calculated by drawing a random sample from the assumed multivariate normal distribution of the maximum likelihood estimates and covariance matrix, and transforming. However, this is still based on potentially inaccurate asymptotic theory. The \Rpackage{msm} package provides the function \Rfunction{boot.msm} to enable bootstrap refitting of \Rfunction{msm} models, an alternative way to estimate uncertainty. For non-hidden Markov models, a bootstrap dataset is drawn by resampling pairs of consecutive states from the full data, i.e. \emph{transitions}. These are assumed to be independent when calculating the likelihood (Section \ref{sec:multi:likelihood}). For hidden Markov models and models with censoring, a bootstrap dataset is drawn by resampling complete series from independent subjects. The bootstrap datasets have the same number of transitions, or subjects, respectively, as the original data. For most output extractor functions provided with \Rpackage{msm}, the option \Rfunarg{ci=''boot''} is available, as a wrapper around \Rfunction{boot.msm}, to enable bootstrap confidence intervals to be calculated. But any user-defined output statistic can be bootstrapped, as follows. The function \Rfunction{boot.msm} is called with the fitted \Rfunction{msm} model as first argument, and an R function specifying the statistic to be bootstrapped as the second argument \texttt{stat}. The return value from \Rfunction{boot.msm} is a list of \texttt{B} replicates (by default, \texttt{B=1000}) of the desired statistic. For example, to bootstrap the transition intensity matrix of the heart transplantation model \Robject{cav.msm}: \begin{Scode} q.list <- boot.msm(cav.msm, stat=function(x){qmatrix.msm(x)$estimates}) \end{Scode} Note that for \Rfunction{boot.msm} to be able to refit the original model that produced \Robject{cav.msm}, all objects used in the original model fit (for example, in this case, \Robject{Q}) must be in the working environment. Otherwise, \Rfunction{boot.msm} will give an ``object not found'' error. The user can then summarise these replicates by calculating empirical standard deviations or quantile-based intervals. In this example, \Robject{q.list} is a list of 1000 4$\times$4 matrices. The following code calculates the bootstrap standard error as the empirical standard deviation of the 1000 replicates, and a similar 95\% bootstrap confidence interval. \begin{Scode} q.array <- array(unlist(q.list), dim=c(4,4,1000)) apply(q.array, c(1,2), sd) apply(q.array, c(1,2), function(x)quantile(x, c(0.025, 0.975))) \end{Scode} Note that when bootstrapping, the refits of the model to the resampled datasets may occasionally fail to converge (as discussed in Section \ref{sec:failure}) even if the original model fit did converge. In these cases, a warning is given, but \Rfunction{boot.msm} simply discards the failed dataset and moves on to the next bootstrap iteration. Unless convergence failure occurs for a large proportion of iterations, this should not affect the accuracy of the final bootstrap confidence intervals. \subsection{Convergence failure} \label{sec:failure} Inevitably if over-complex models are applied with insufficient data then the parameters of the model will not be identifiable. This will result in the optimisation algorithm failing to find the maximum of the log-likelihood, or even failing to evaluate the likelihood. For example, it will commonly be inadvisable to include several covariates in a model simultaneously. In some circumstances, the optimisation may report convergence, but fail to calculate any standard errors. In these cases, the Hessian of the log-likelihood at the reported solution is not positive definite. Thus the reported solution may be a saddle point rather than the maximum likelihood, or it may be close to the maximum. \begin{description} \item[Model simplification] Firstly, make sure there are not too many parameters in the model. There may not be enough information in the data on a certain transition rate. It is recommended to count all the pairs of transitions between states in successive observation times, making a frequency table of previous state against current state (function \Rfunction{statetable.msm}), and do this for any subgroups defining covariates. Although the data are a series of snapshots of a continuous-time process, and the actual transitions take place in between the observation times, this type of table may still be helpful. If there are not many observed `transitions' from state 2 to state 4, for example, then the data may be insufficient to estimate $q_{24}$. For a staged disease model (Figure \ref{fig:disease}), the number of disease states should be low enough that all transition rates can be estimated. Consecutive states of disease severity should be merged if necessary. If it is realistic, consider applying constraints on the intensities or the covariate effects so that the parameters are equal for certain transitions, or zero for certain transitions. Be careful to use a observation scheme and transition matrix appropriate to your data (see Section \ref{sec:arbitr-observ-times}). By default, \Rfunction{msm} assumes that the data represent snapshots of the process, and the true state is unknown between observation times. In such circumstances, it is rarely feasible to estimate an intensity matrix with \emph{instantaneous} transitions allowed between every pair of states. This would be easier if the complete course of the process is known \Rfunarg{(exacttimes = TRUE)} in the call to \Rfunction{msm}. Understand the difference between \emph{instantaneous} and \emph{interval} transitions - although individuals may be in state 1 at time $t_r$, and state 3 at time $t_{r+1}$, that doesn't mean that instantaneous transitions from 1 to 3 should be permitted. \item[Initial values] Make sure that a sensible set of initial values have been chosen. The optimisation may only converge within a limited range of `informative' initial values. It is also sensible to run the model for several different initial values to ensure that the estimation has converged to a global rather than a local optimum. \item[Scaling] It is often necessary to apply a scaling factor to normalise the likelihood (\Rfunarg{fnscale}), or certain individual parameters \Rfunarg{(parscale)}. This may prevent overflow or underflow problems within the optimisation. For example, if the value of the -2 $\times$ log-likelihood is around 5000, then the following option leads to an minimisation of the -2 $\times$ log-likelihood on an approximate unit scale: \Rfunarg{control = list(fnscale = 5000)}. % Though since version 1.4.1, \Rfunarg{fnscale} is applied automatically using the likelihood at the initial values, unless the user has already supplied it. % If not provided by the user, \code{control=list(fnscale = a)} is % applied automatically to normalise the optimisation, where \code{a} % is the minus twice log likelihood at the initial values. It is also advisable to analyse all variables, including covariates and the time unit, on a roughly normalised scale. For example, working in terms of a time unit of months or years instead of days, when the data range over thousands of days. \item[Convergence criteria] ``False convergence'', in which \Rfunction{optim()} reports convergence of the optimisation but the Hessian is not positive definite, can sometimes be solved by tightening the criteria (\Rfunarg{reltol}, defaults to \texttt{1e-08}) for reporting convergence. For example, \Rfunarg{control = list(reltol = 1e-16)}. Alternatively consider using smaller step sizes for the numerical approximation to the gradient, used in calculating the Hessian. This is given by the control parameter \Rfunarg{ndeps}. For example, for a model with 5 parameters, \Rfunarg{control = list(ndeps = rep(1e-6, 5))} \item[Choice of algorithm] By default, since version 1.3.2, \Rfunction{msm} uses the BFGS method of \Rfunction{optim}, which makes use of analytic derivatives. Analytic derivatives are available for all models in msm, apart from hidden Markov models with unknown initial state probabilities, misclassification models with equality constraints on misclassification probabilities, and truncated or measurement-error outcome distributions. This speeds up optimisation. Though alternative algorithms are available such as \Rfunarg{method = ``CG''}. Or use the \Rfunction{nlm} R function via \Rfunarg{msm(..., opt.method = "nlm" , ...)} Note also the Fisher scoring method available for non-hidden Markov models for panel data, via \Rfunarg{msm(..., opt.method = "fisher", ...)}, is expected to be faster than the generic methods, but less robust to bad initial values. Or since version 1.3.2, msm can also use \Rfunarg{method=``bobyqa''} from the \Rpackage{minqa} package, a fast derivative-free method. \item[\Rfunction{optim} "function cannot be evaluated at initial parameters"] To diagnose this problem, run \Rfunction{msm} again with \Rfunarg{fixedpars=TRUE} set, to calculate the -2 log-likelihood at the initial values. This will probably be \Robject{Inf}. To show the contributions of individual subjects to the overall log likelihood, call \Rfunction{logLik.msm(x, by.subject=TRUE)}, where \Robject{x} is the fitted model object. If only a few subjects give an infinite log-likelihood, then you can check whether their state histories are particularly unusual and conflict with the model. For example, they might appear to make unusually large jumps between states in short periods of time. For models with misclassification, note that the default true initial state distribution \Rfunarg{initprobs} puts all individuals in true state 1 at their first observation. If someone starts in a much higher state, this may result in an infinite log-likelihood, and changing \Rfunarg{initprobs} would be sensible. \end{description} \subsection{Model assessment} \label{sec:model-assessment} \paragraph{Observed and expected prevalence} To compare the relative fit of two nested models, it is easy to compare their likelihoods. However it is not always easy to determine how well a fitted multi-state model describes an irregularly-observed process. Ideally we would like to compare observed data with fitted or expected data under the model. If there were times at which all individuals were observed then the fit of the expected numbers in each state or {\em prevalences} can be assessed directly at those times. Otherwise, some approximations are necessary. We could assume that an individual's state at an arbitrary time $t$ was the same as the state at their previous observation time. This might be fairly accurate if observation times are close together. This approach is taken by the function \Rfunction{prevalence.msm}, which constructs a table of observed and expected numbers and percentages of individuals in each state at a set of times. A set of expected counts can be produced if the process begins at a common time for all individuals. Suppose at this time, each individual is in state 0. Then given $n(t)$ individuals are under observation at time $t$, the expected number of individuals in state $r$ at time $t$ is $n(t) P(t)_{0,r}$. If the covariates on which $P(t)$ depends vary between individuals, then this can be averaged over the covariates observed in the data. For example, we calculate the observed and expected numbers and percentages at two-yearly intervals up to 20 years after transplant, for the heart transplant model \Rfunction{cav.msm}. The number of individuals still alive and under observation decreases from 622 to 251 at year 20. The observed and expected percentages are plotted against time. <<>>= options(digits=3) prevalence.msm(cav.msm, times=seq(0,20,2)) @ <>= plot.prevalence.msm(cav.msm, mintime=0, maxtime=20) @ Comparing the observed and expected percentages in each state, we see that the predicted number of individuals who die (State 4) is under-estimated by the model from about year 8 onwards. Similarly the number of individuals sill alive and free of CAV (State 1) is over-estimated by the model from about year 8 onwards. Such discrepancies could have many causes. One possibility is that the transition rates vary with the time since the beginning of the process, the age of the patient, or some other omitted covariate, so that the Markov model is {\em non-homogeneous}. This could be accounted for by modelling the intensity as a function of age, for example, such as a piecewise-constant function. The \Rfunarg{pci} argument to \Rfunction{msm} can be used to automatically construct models with transition intensities which are piecewise-constant in time. In this example, the hazard of death may increase with age, so that the model underestimates the number of deaths when forecasting far into the future. Another cause of poor model fit may sometimes be the failure of the Markov assumption. That is, the transition intensities may depend on the time spent in the current state (a semi-Markov process) or other characteristics of the process history. Accounting for the process history is difficult as the process is only observed through a series of snapshots. Semi-Markov models may in principle be fitted to this type of data using phase-type distributions. Since version 1.4.1 the \Rfunarg{phase.states} option to \Rfunction{msm} can be used to define some phase-type models. See \Rfunction{help(msm)} for further details. However, if it is known that individuals who died would not have been followed up after a certain time, had they survived to that time, then they should not be included in the observed prevalence of the death state after that time. This can be accounted for by passing a vector of maximum potential follow-up times, one for each individual in the same order as the original data, in the \Rfunarg{censtime} argument to \Rfunction{prevalence.msm}. Ignoring the potential follow-up times is likely to have resulted in overestimates of the number of deaths at later times for the ``observed'' prevalences in the CAV example, though these times are not available in the data supplied with \Rpackage{msm}. \paragraph{Pearson-type goodness-of-fit test} \label{sec:pearson} Suppose that the true transition times are unknown, and data consist of observations of the process at arbitrary times which differ between individuals (panel data). Assessing goodness of fit by prevalence counts then involves estimating the observed prevalence at a series of points by some form of interpolation. This is only advisable if observation times are close together. An alternative method of assessing goodness-of-fit is to construct tables of observed and expected numbers of transitions, as described by Aguirre-Hernandez and Farewell \cite{ahf}. This leads to a formal test of goodness-of-fit, analogous to the classical Pearson $\chi^2$ test for contingency tables. The tables are constructed as follows. Each pair of successive observations in the data (\emph{transition}) is classified by \begin{itemize} \item the starting state $r$ and finishing state $s$, \item time between the start of the process and the first of the pair of observations (indexed by $h$), \item time interval between the observations (indexed by $l_h$, within categories $h$), \item (if there are fitted covariates) the impact of covariates, as summarised by $q_{rr}$ (indexed by $c$), \item any other grouping of interest for diagnosing lack of fit (indexed by $g$). \end{itemize} Groupings of continuous quantities are normally defined by quantiles, so that there are a similar number of observed transitions in each (one-dimensional) category. The observed and expected numbers of transitions in each group are then defined by \[ o_{hl_h rscg} = \sum I(S(t_{i,j+1}) = s, S(t_{ij}) = r) \] \[ e_{hl_h rscg} = \sum P(S(t_{i,j+1}) = s | S(t_{ij}) = r) \] where $I(A)$ is the indicator function for an event $A$ and the summation is over the set of transitions in the category defined by $h,l_h,c,g$, over all individuals $i$. The Pearson-type test statistic is then \[ T = \sum_{hl_h rscg} \frac{(o_{hl_h rscg} - e_{hl_h rscg})^2}{e_{hl_h rscg}} \] The classical Pearson test statistic is distributed as $\chi^2_{n-p}$, where $n$ is the number of independent cells in the table and $p$ is the number of estimated parameters $p$. But the null distribution of $T$ is not exactly $\chi^2$, since the time intervals are non-identical, therefore the observed transitions are realizations from a set of independent but non-identical multinomial distributions. Titman \cite{titman:asympnull} showed that the null distribution of $T$ is asymptotically approximated by a weighted sum of $\chi^2_1$ random variables. Aguirre-Hernandez and Farewell \cite{ahf} also showed that $\chi^2_{n-p}$ is a good approximation if there are no fitted covariates. For models with covariates, the null mean of $T$ is higher than $n - p$, but lower than $n$. Therefore, upper and lower bounds for the true $p$-value of the statistic can be obtained from the $\chi^2_{n-p}$ and $\chi^2_n$ distributions. Aguirre-Hernandez and Farewell \cite{ahf} also described a bootstrap procedure for obtaining an accurate $p$-value. Titman and Sharples \cite{titman:sharples} described modifications to the test to correct for the biases introduced where in addition to the panel-data observation scheme: \begin{itemize} \item Times of death are known exactly. In this case, transitions ending in death are classified according to the next scheduled observation time after the death, which is estimated by multiple imputation from a Kaplan-Meier estimate of the distribution of time intervals between observations. \item An individual's final observation is censored, so that they are only known to be alive at that point. \item States are misclassified. \end{itemize} The \Rpackage{msm} package provides the function \Rfunction{pearson.msm} to perform the Pearson-type test. By default, three groups are used for each of $h$, $l_h$ and $c$. Often the number of groups will need to be reduced in cases where the resulting contingency tables are sparse (thus there are several low expected counts and the variance of $T$ is inflated). The test is now performed on the model \Robject{cav.msm} for the heart transplant dataset (a version of which was also analysed by Titman and Sharples \cite{titman:sharples}). The default three interval groups are used, and two groups of the time since the start of the process. The \Rfunarg{transitions} argument groups the transitions from state 3 to each of states 1, 2 and 3 (the 9th, 10th and 11th transitions) together in the table, since these transitions are infrequent. <<>>= options(digits=2) pearson.msm(cav.msm, timegroups=2, transitions=c(1,2,3,4,5,6,7,8,9,9,9,10)) @ The first two tables in the output show the contingency tables of observed and expected numbers of transitions. Note that the observed number of transitions in certain categories is not a whole number, since these are averaged over multiple imputations of the next scheduled observation time following deaths. The column \texttt{Time} is the group defined by time since the start of the process, and the column \texttt{Interval} is the group defined by intervals between observations. The columns indicate the allowed transitions, or pairs of states which can be observed in successive observations. The third table presents the ``deviance'', the value of $\frac{(o_{hl_h rscg} - e_{hl_h rscg})^2}{e_{hl_h rscg}}$ for each cell, multipled by the sign of $o_{hl_h rscg} - e_{hl_h rscg}$ to indicate whether there were more or fewer transitions than expected in each cell. These can indicate areas of bad fit. For example, systematic changes in deviance by time or time interval between observations can indicate that a model with time-varying transition intensities is more suitable. Changes in deviance by covariate impact may indicate heterogeneity between individuals which is unexplained by the fitted covariates. Changes in deviance with the length of the interval between observations may also indicate failure of the Markov assumption, and that a semi-Markov model (in which intensities depend on the time spent in the current state) may fit better. In this example, the test statistic is 100. \Robject{p.upper} is an upper bound for the $p$-value of the statistic based on an asymptotic $\chi^2_{42}$ distribution, therefore the model does not fit well. It is not clear from the table of deviances which aspects of the fit are most influental to the test statistic. However, the two-way Markov model itself is not biologically plausible, as discussed in Section \ref{sec:fitting:hmm:misc}. For non-hidden Markov models for panel data, \Rfunction{pearson.msm} also presents the accurate analytic p-value of Titman \cite{titman:asympnull}. For all models, \Rfunction{pearson.msm} provides an option for parametric bootstrapping to obtain an accurate p-value. \subsection{Fitting misclassification models with \Rpackage{msm}} \label{sec:fitting:hmm:misc} In fact, in the heart transplant example from section \ref{sec:datain}, it is not medically realistic for patients to recover from a diseased state to a healthy state. Progression of coronary artery vasculopathy is thought to be an irreversible process. The angiography scan for CAV is actually subject to error, which leads to some false measurements of CAV states and apparent recoveries. Thus we account for misclassification by fitting a \emph{hidden Markov model} using \Rpackage{msm}. Firstly we replace the two-way multi-state model by a one-way model with transition intensity matrix \[ Q = \left( \begin{array}{llll} -(q_{12} + q_{14}) & q_{12} & 0 & q_{14}\\ 0 & -(q_{23}+q_{24}) & q_{23} & q_{24}\\ 0 & 0 & -q_{34} & q_{34}\\ 0 & 0 & 0 & 0 \\ \end{array} \right ) \] We also assume that true state 1 (CAV-free) can be classified as state 1 or 2, state 2 (mild/moderate CAV) can be classified as state 1, 2 or 3, while state 3 (severe CAV) can be classified as state 2 or 3. Recall that state 4 represents death. Thus our matrix of misclassification probabilities is \[ E = \left( \begin{array}{llll} 1 - e_{12} & e_{12} & 0 & 0 \\ e_{21} & 1 - e_{21} - e_{23} & e_{23} & 0 \\ 0 & e_{32} & 1 - e_{32} & 0 \\ 0 & 0 & 0 & 0\\ \end{array} \right) \] with underlying states as rows, and observed states as columns. To model observed states with misclassification, we define a matrix \Rfunarg{ematrix} indicating the states that can be misclassified. Rows of this matrix correspond to true states, columns to observed states. It should contains zeroes in the positions where misclassification is not permitted. Non-zero entries are initial values for the corresponding misclassification probabilities. We then call \Rfunction{msm} as before, but with this matrix as the \Rfunarg{ematrix} argument. Initial values of 0.1 are assumed for each of the four misclassification probabilities $e_{12}, e_{21}, e_{23}, e_{32}$. Zeroes are given where the elements of $E$ are zero. The diagonal elements supplied in \Rfunarg{ematrix} are ignored, as rows must sum to one. The matrix \Rfunarg{qmatrix}, specifying permitted transition intensities and their initial values, also changes to correspond to the new $Q$ representing the progression-only model for the underlying states. The true state for every patient at the date of transplant is known to be ``CAV-free'', not misclassified. To indicate this we use the argument \Rfunarg{obstrue} to \Rfunction{msm}. This is set to be a variable in the dataset, \Rfunarg{firstobs}, indicating where the observed state equals the true state. This takes the value of 1 at the patient's first observation, at the transplant date, and 0 elsewhere. We use an alternative quasi-Newton optimisation algorithm \Rfunarg{(method="BFGS")} which can often be faster or more robust than the default Nelder-Mead simplex-based algorithm. An optional argument \Rfunarg{initprobs} could also have been given here, representing the vector of the probabilities of occupying each true state at the initial observation (equation \ref{eq:multi:hidden:matprod}). This can also be a matrix with number of rows equal to the number of subjects, if these probabilities are subject-dependent and known. If not given, all individuals are assumed to be in true state 1 at their initial observation. If \Rfunarg{est.initprobs=TRUE} is specified, then these probabilites are estimated as part of the model fit, using a vector \Rfunarg{initprobs} as initial values. Covariate effects on these probabilities can also be estimated using a multinomial logistic regression model, if an \Rfunarg{initcovariates} argument is specified. See \Rfunction{help(msm)} for further details. \paragraph{Model 5: multi-state model with misclassification} <<>>= Qm <- rbind(c(0, 0.148, 0, 0.0171), c(0, 0, 0.202, 0.081), c(0, 0, 0, 0.126), c(0, 0, 0, 0)) ematrix <- rbind(c(0, 0.1, 0, 0), c(0.1, 0, 0.1, 0), c(0, 0.1, 0, 0), c(0, 0, 0, 0)) cavmisc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = Qm, ematrix = ematrix, deathexact = 4, obstrue = firstobs) cavmisc.msm @ Thus there is an estimated probability of about 0.03 that mild/moderate CAV will be diagnosed erroneously, but a rather higher probability of 0.17 that underlying mild/moderate CAV will be diagnosed as CAV-free. Between the two CAV states, the mild state will be misdiagnosed as severe with a probability of 0.06, and the severe state will be misdiagnosed as mild with a probability of 0.12. The model also estimates the progression rates through underlying states. An average of 8 years is spent disease-free, an average of about 3 years is spent with mild/moderate disease, and periods of severe disease also last about 3 years on average before death. \subsection{Effects of covariates on misclassification rates} We can investigate how the probabilities of misclassification depend on covariates in a similar way to the transition intensities, using a \Rfunarg{misccovariates} argument to \Rfunction{msm}. For example, we now include female sex as a covariate for the misclassification probabilities. The linear effects on the log odds of each misclassified state relative to the true state are initialised to zero by default (but this can be changed with the \Rfunarg{misccovinits} argument). \paragraph{Model 6: misclassification model with misclassification probabilities modelled on sex} <<>>= cavmiscsex.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = Qm, ematrix = ematrix, deathexact = 4, misccovariates = ~sex, obstrue=firstobs) @ <<>>= cavmiscsex.msm @ The large confidence interval for the odds ratio for 1/2 misclassification suggests there is no information in the data about the difference between genders in the false positive rates for angiography. On the other hand, women have slightly more false negatives. \subsection{Extractor functions} As well as the functions described in section \ref{sec:extractor} for extracting useful information from fitted models, there are a number of extractor functions specific to models with misclassification. \begin{description} \item[Misclassification matrix] The function \Rfunction{ematrix.msm} gives the estimated misclassification probability matrix at the given covariate values. For illustration, the fitted misclassification probabilities for men and women in model 6 are given by <<>>= ematrix.msm(cavmiscsex.msm, covariates=list(sex=0)) ematrix.msm(cavmiscsex.msm, covariates=list(sex=1)) @ The confidence intervals for the estimates for women are wider, since there are only 87 women in this set of 622 patients. \item[Odds ratios for misclassification] The function \Rfunction{odds.msm} would give the estimated odds ratios corresponding to each covariate effect on the misclassification probabilities. \begin{Scode} odds.msm(cavmiscsex.msm) \end{Scode} \item[Observed and expected prevalences] The function \Rfunction{prevalence.msm} is intended to assess the goodness of fit of the hidden Markov model for the \emph{observed} states to the data. Tables of observed prevalences of observed states are calculated as described in section \ref{sec:model-assessment}, by assuming that observed states are retained between observation times. The expected numbers of individuals in each observed state are calculated similarly. Suppose the process begins at a common time for all individuals, and at this time, the probability of occupying \emph{true} state $r$ is $f_r$. Then given $n(t)$ individuals under observation at time $t$, the expected number of individuals in true state $r$ at time $t$ is the $r$th element of the vector $n(t) f P(t)$. Thus the expected number of individuals in \emph{observed} state $r$ is the $r$th element of the vector $n(t) f P(t) E$, where $E$ is the misclassification probability matrix. The expected prevalences (not shown) for this example are similar to those forecasted by the model without misclassification, with underestimates of the rates of death from 8 years onwards. To improve this model's long-term prediction ability, it is probably necessary to account for the natural increase in the hazard of death from any cause as people become older. \item[Goodness-of-fit test] The Pearson-type goodness-of-fit test is performed, as in Section \ref{sec:pearson}. The table of deviances indicates that there are more 1-3 and 1-4 transitions than expected in short intervals, and fewer in long intervals. This may indicate some time-dependence in the transition rates. Indeed, Titman \cite{titman:phd} found that a model with piecewise-constant transition intensities gave a greatly improved fit to these data. <<>>= pearson.msm(cavmisc.msm, timegroups=2, transitions=c(1,2,3,4,5,6,7,8,9,9,9,10)) @ \end{description} \subsection{Recreating the path through underlying states} In speech recognition and signal processing, {\em decoding} is the procedure of determining the underlying states that are most likely to have given rise to the observations. The most common method of reconstructing the most likely state path is the {\em Viterbi} algorithm. Originally proposed by Viterbi \cite{viterbi}, it is also described by Durbin \etal \cite{biolog:seq} and Macdonald and Zucchini \cite{macdonald:zucchini} for discrete-time hidden Markov chains. For continuous-time models it proceeds as follows. Suppose that a hidden Markov model has been fitted and a Markov transition matrix $P(t)$ and misclassification matrix $E$ are known. Let $v_k(t_i)$ be the probability of the most probable path ending in state $k$ at time $t_i$. \begin{enumerate} \item Estimate $v_k(t_1)$ using known or estimated initial-state occupation probabilities (\texttt{initprobs}), each multiplied by the probability of the observed outcome at the initial time, given that the true initial state is $k$. \item For $i = 1 \ldots N$, calculate $v_l(t_i) = e_{l,O_{t_i}} \max_k v_k(t_{i-1}) P_{kl}(t_{i} - t_{i-1})$. Let $K_i(l)$ be the maximising value of $k$. \item At the final time point $t_N$, the most likely underlying state $S^*_N$ is the value of $k$ which maximises $v_k(t_N)$. \item Retrace back through the time points, setting $S^*_{i-1} = K_i(S^*_i)$. \end{enumerate} The computations should be done in log space to prevent underflow. The \Rpackage{msm} package provides the function \Rfunction{viterbi.msm} to implement this method. For example, the following is an extract from a result of calling \Rfunction{viterbi.msm} to determine the most likely underlying states for all patients. The results for patient 100103 are shown, who appeared to `recover' to a less severe state of disease while in state 3. We assume this is not biologically possible for the true states, so we expect that either the observation of state 3 at time 4.98 was an erroneous observation of state 2, or their apparent state 2 at time 5.94 was actually state 3. According to the expected path constructed using the Viterbi algorithm, it is the observation at time 5.94 which is most probably misclassified. <<>>= vit <- viterbi.msm(cavmisc.msm) vit[vit$subject==100103,] @ \subsection{Fitting general hidden Markov models with \Rpackage{msm}} \label{sec:fitting:hmm:general} The \Rpackage{msm} package provides a framework for fitting continuous-time hidden Markov models with general, continuous outcomes. As before, we use the \Rfunction{msm} function itself. \paragraph{Specifying the hidden Markov model} A hidden Markov model consists of two related components: \begin{itemize} \item the model for the evolution of the underlying Markov chain, \item the set of models for the observed data conditionally on each underlying state. \end{itemize} The model for the transitions between underlying states is specified as before, by supplying a \Rfunarg{qmatrix}. The model for the outcomes is specified using the argument \Rfunarg{hmodel} to \Rfunction{msm}. This is a list, with one element for each underlying state, in order. Each element of the list should be an object returned by a hidden Markov model \emph{constructor function}. The HMM constructor functions provided with \Rpackage{msm} are listed in Table \ref{tab:hmm:dists}. There is a separate constructor function for each class of outcome distribution, such as uniform, normal or gamma. Consider a three-state hidden Markov model, with a transition intensity matrix of \[ Q = \left( \begin{array}{llll} -q_{12} & q_{12} & 0 \\ 0 & -q_{23} & q_{23}\\ 0 & 0 & 0 \\ \end{array} \right ) \] Suppose the outcome distribution for state 1 is Normal$(\mu_1, \sigma^2_1)$, the distribution for state 2 is Normal$(\mu_2, \sigma^2_2)$, and state 3 is exactly observed. Observations of state 3 are given a label of -9 in the data. Here our \Rfunarg{hmodel} argument should be a list of objects returned by \Rfunction{hmmNorm} and \Rfunction{hmmIdent} constructor functions. We must specify initial values for the parameters as the arguments to the constructor functions. For example, we take initial values of $\mu_1 = 90, \sigma_1 = 8, \mu_2 = 70, \sigma_2 = 8$. Initial values for $q_{12}$ and $q_{23}$ are 0.25 and 0.2. Finally suppose the observed data are in a variable called \Robject{y}, the measurement times are in \Robject{time}, and subject identifiers are in \Robject{ptnum}. The call to \Rfunction{msm} to estimate the parameters of this hidden Markov model would then be \begin{Scode} msm( y ~ time, subject=ptnum, data = example.df, qmatrix = rbind( c(0, 0.25, 0), c(0, 0, 0.2), c(0, 0, 0)), hmodel = list (hmmNorm(mean=90, sd=8), hmmNorm(mean=70, sd=8), hmmIdent(-9)) ) \end{Scode} \begin{table}[htbp] \scriptsize \centering \begin{tabular}{lp{0.8in}p{0.6in}p{0.6in}p{0.7in}l} \hline Function & Distribution & Parameters & & Location (link) & Density for an observation $x$ \\ \hline \Rfunction{hmmCat} & Categorical & \Rfunarg{prob, basecat} & $p,c_0$ & $p$ (logit) & $p_x$, $x = 1, \ldots, n$ \\ \Rfunction{hmmIdent} & Identity & \Rfunarg{x} & $x_0$ & & $I_{x = x_0}$ \\ \Rfunction{hmmUnif} & Uniform & \Rfunarg{lower, upper} & $l,u$ & & $1 / (u - l)$, $u \leq x \leq l$ \\ \Rfunction{hmmNorm} & Normal & \Rfunarg{mean, sd} & $\mu,\sigma$ & $\mu$ (identity) & $\phi(x, \mu, \sigma) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp(-(x - \mu)^2/(2 \sigma^2) )$ \\ \Rfunction{hmmLNorm} & Log-normal & \Rfunarg{meanlog, sdlog} & $\mu,\sigma$ & $\mu$ (identity) & $\frac{1}{x \sqrt{2 \pi \sigma^2}} \exp(-(\log x - \mu)^2 / (2 \sigma^2))$ \\ \Rfunction{hmmExp} & Exponential & \Rfunarg{rate} & $\lambda$ & $\lambda$ (log) & $\lambda e^{- \lambda x}$, $x > 0$ \\ \Rfunction{hmmGamma} & Gamma & \Rfunarg{shape, rate} & $n,\lambda$ & $\lambda$ (log) & $\frac{\lambda^n}{\Gamma(n)}x^{n-1} \exp(-\lambda x)$, $x > 0, n > 0, \lambda > 0$ \\ \Rfunction{hmmWeibull} & Weibull & \Rfunarg{shape, scale} & $a, b$ & $b$ (log) & $\frac{a}{b} (\frac{x}{b})^{a-1} \exp{(-(\frac{x}{b})^a)}$, $x > 0$ \\ \Rfunction{hmmPois} & Poisson & \Rfunarg{rate} & $\lambda$ & $\lambda$ (log) & $\lambda^x \exp(-\lambda)/x!$, $x = 0, 1, 2, \ldots$ \\ \Rfunction{hmmBinom} & Binomial & \Rfunarg{size, prob} & $n,p$ & $p$ (logit) & ${n \choose x} p^x (1-p)^{n-x}$ \\ \Rfunction{hmmNBinom} & Negative binomial & \Rfunarg{disp, prob} & $n,p$ & $p$ (logit) & $\Gamma(x+n)/(\Gamma(n)x!) p^n (1-p)^x$ \\ \Rfunction{hmmBetaBinom} & Beta-binomial & \Rfunarg{size, meanp, sdp} & $n,\mu,\sigma$ & $\mu$ (logit) & ${n \choose x} Beta(x+a,n-x+b)/Beta(a,b)$ \\ & & & & & where $a=\mu/\sigma, b=(1-\mu)/\sigma$ \\ \Rfunction{hmmBeta} & Beta & \Rfunarg{shape1,shape2} & $a,b$ & & $ \Gamma(a+b) / (\Gamma(a)\Gamma(b))x^{a-1}(1-x)^{b-1}$ \\ \Rfunction{hmmT} & Student $t$ & \Rfunarg{mean, scale, df} & $\mu,\sigma,k$ & $\mu$ (identity) & $\frac{\Gamma\left((k+1)/2\right)}{\Gamma(k/2)}{\sqrt{\frac{1}{k\pi\sigma^2}}}\left\{1 + \frac{1}{k\sigma^2}(x - \mu)^{2} \right\}^{-(k + 1)/2}$ \\ \Rfunction{hmmTNorm} & Truncated normal & \Rfunarg{mean, sd, lower, upper} & $\mu,\sigma,l,u$ & $\mu$ (identity) & \parbox[t]{2in}{$\phi(x, \mu, \sigma) / \\ (\Phi(u, \mu, \sigma) - \Phi(l, \mu, \sigma))$, \\ where $\Phi(x,\mu,\sigma) = \int_{-\infty}^x \phi(u,\mu,\sigma) du$} \\ \Rfunction{hmmMETNorm} & Normal with truncation and measurement error & \Rfunarg{mean, sd, lower, upper, sderr, meanerr} & \parbox[t]{1in} {$\mu_0,\sigma_0,l,u$, \\ $\sigma_\epsilon,\mu_\epsilon$} & $\mu_\epsilon$ (identity) & \parbox[t]{2in}{$( \Phi(u, \mu_2, \sigma_3) - \Phi(l, \mu_2, \sigma_3)) / $ \\ $(\Phi(u, \mu_0, \sigma_0) - \Phi(l, \mu_0, \sigma_0)) $ \\ $\times \phi(x, \mu_0 + \mu_\epsilon, \sigma_2)$, \\ $\sigma_2^2 = \sigma_0^2 + \sigma_\epsilon^2$, \\ $\sigma_3 = \sigma_0 \sigma_\epsilon / \sigma_2$, \\ $\mu_2 = (x - \mu_\epsilon) \sigma_0^2 + \mu_0 \sigma_\epsilon^2$} \\ \Rfunction{hmmMEUnif} & Uniform with measurement error & \Rfunarg{lower, upper, sderr, meanerr} & $l,u,\mu_\epsilon,\sigma_\epsilon$ & $\mu_\epsilon$ (identity) & \parbox[t]{2in}{$(\Phi(x, \mu_\epsilon+l, \sigma_\epsilon) - \Phi(x, \mu_\epsilon+u, \sigma_\epsilon)) / \\ (u - l)$} \\ \hline \end{tabular} \caption{Hidden Markov model distributions in \Rpackage{msm}.} \label{tab:hmm:dists} \end{table} \paragraph{Covariates on hidden Markov model parameters} Most of the outcome distributions can be parameterised by covariates, using a link-transformed linear model. For example, an observation $y_{ij}$ may have distribution $f_1$ conditionally on underlying state 1. The link-transformed parameter $\theta_1$ is a linear function of the covariate vector $x_{ij}$ at the same observation time. \begin{eqnarray*} \label{eq:hmm:covs} y_{ij} | S_{ij} & \sim & f_1 (y | \theta_1, \gamma_1)\\ g(\theta_1) & = & \alpha + \beta^T x_{ij} \end{eqnarray*} Specifically, parameters named as the ``Location'' parameter in Table \ref{tab:hmm:dists} can be modelled in terms of covariates, with the given link function. The \Rfunarg{hcovariates} argument to \Rfunction{msm} specifies the model for covariates on the hidden Markov outcome distributions. This is a list of the same length as the number of underlying states, and the same length as the \Rfunarg{hmodel} list. Each element of the list is a formula, in standard R linear model notation, defining the covariates on the distribution for the corresponding state. If there are no covariates for a certain hidden state, then insert a \texttt{NULL} in the corresponding place in the list. For example, in the three-state normal-outcome example above, suppose that the normal means on states 1 and 2 are parameterised by a single covariate $x$. \[ \mu_1 = \alpha_1 + \beta_1 x_{ij}, \qquad \mu_2 = \alpha_2 + \beta_2 x_{ij}. \] The equivalent call to \Rfunction{msm} would be \begin{Scode} msm( state ~ time, subject=ptnum, data = example.df, qmatrix = rbind( c(0, 0.25, 0), c(0, 0, 0.2), c(0, 0, 0)), hmodel = list (hmmNorm(mean=90, sd=8), hmmNorm(mean=70, sd=8), hmmIdent(-9)), hcovariates = list ( ~ x, ~ x, NULL) ). \end{Scode} \paragraph{Constraints on hidden Markov model parameters} Sometimes it is realistic that parameters are shared between some of the state-specific outcome distributions. For example, the Normally-distributed outcome in the previous example could have a common variance $\sigma^2_1 = \sigma^2_2 = \sigma^2$ between states 1 and 2, but differing means. It would also be realistic for any covariates on the mean to have a common effect $\beta_1 = \beta_2 = \beta$ on the state 1 and 2 outcome distributions. The argument \Rfunarg{hconstraint} to \Rfunction{msm} specifies which hidden Markov model parameters are constrained to be equal. This is a named list. Each element is a vector of constraints on the named hidden Markov model parameter. The vector has length equal to the number of times that class of parameter appears in the whole model. As for the other constraint arguments such as \Rfunarg{qconstraint}, identical values of this vector indicate parameters constrained to be equal. For example, consider the three-state hidden Markov model described above, with normally-distributed outcomes for states 1 and 2. To constrain the outcome variance to be equal for states 1 and 2, and to also constrain the effect of \Robject{x} on the outcome mean to be equal for states 1 and 2, specify \begin{Scode} hconstraint = list(sd = c(1,1), x=c(1,1)) \end{Scode} Parameters of the outcome distributions may also be constrained within specific ranges. If chosen carefully, this may improve identifiability of hidden Markov states. For example to constrain the mean for state 1 to be between 80 and 110, and the mean for state 2 to be between 50 and 80, specify \begin{Scode} hranges = list(mean=list(lower=c(80,50), upper=c(110,80))) \end{Scode} Maximum likelihood estimation is then performed on the appropriate log or logit-transformed scale so that these constraints are satisfied. See the \Rfunction{msm} help page for further details. Note that initial values should be strictly within the ranges, and not on the range boundary. \paragraph{FEV$_1$ after lung transplants} Now we give an example of fitting a hidden Markov model to a real dataset. The data on FEV$_1$ measurements from lung transplant recipients, described in \ref{sec:hmm:example:fev}, are provided with the \Rpackage{msm} package in a dataset called \Robject{fev}. We fit models Models 1 and 2, each with three states and common $Q$ matrix. <<>>= three.q <- rbind(c(0, exp(-6), exp(-9)), c(0, 0, exp(-6)), c(0, 0, 0)) @ The simpler Model 1 is specified as follows. Under this model the FEV$_1$ outcome is Normal with unknown mean and variance, and the mean and variance are different between BOS state 1 and state 2. \Rfunarg{hcovariates} specifies that the mean of the Normal outcome depends linearly on acute events. Specifically, this covariate is an indicator for the occurrence of an acute event within 14 days of the observation, denoted \texttt{acute} in the data. As an initial guess, we suppose the mean FEV$_1$ is 100\% baseline in state 1, and 54\% baseline in state 2, with corresponding standard deviations 16 and 18, and FEV$_1$ observations coinciding with acute events are on average 8\% baseline lower. \Rfunarg{hconstraint} specifies that the acute event effect is equal between state 1 and state 2. Days of death are coded as 999 in the \texttt{fev} outcome variable. <<>>= hmodel1 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(999)) fev1.msm <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel1, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(acute = c(1,1))) fev1.msm sojourn.msm(fev1.msm) @ Printing the \Rclass{msm} object \Rfunarg{fev1.msm} shows estimates and confidence intervals for the transition intensities and the hidden Markov model parameters. The estimated within-state means of FEV$_1$ are around 98\% and 52\% baseline respectively. From the estimated transition intensities, individuals spend around 1421 days (3.9 years) before getting BOS, after which they live for an average of 1248 days (3.4 years). FEV$_1$ is lower by an average of 8\% baseline within 14 days of acute events. Model 2, where the outcome distribution is a more complex two-level model, is specified as follows. We use the distribution defined by equations \ref{eq:fev:level1}--\ref{eq:fev:level2}. The \Rfunction{hmmMETNorm} constructor defines the truncated normal outcome with an additional normal measurement error. The explicit probability density for this distribution is given in Table \ref{tab:hmm:dists}. Our initial values are 90 and 54 for the means of the within-state distribution of \emph{underlying} FEV$_1$, and 16 and 18 for the standard errors. This time, underlying FEV$_1$ is truncated normal. The truncation limits \Rfunarg{lower} and \Rfunarg{upper} are not estimated. We take an initial measurement error standard deviation of \Rfunarg{sderr=8}. The extra shift \Rfunarg{meanerr} in the measurement error model is fixed to zero and not estimated. The \Rfunarg{hconstraint} specifies that the measurement error variance $\sigma^2_\epsilon$ is equal between responses in states 1 and 2, as is the effect of short-term acute events on the FEV$_1$ response. The convergence of maximum likelihood estimation in this example is particularly sensitive to the optimisation method and options, initial values, the unit of the time variable and whether covariates are centered, probably because the likelihood surface is irregular near to the true maximum. \begin{Scode} hmodel2 <- list(hmmMETNorm(mean=90, sd=16, sderr=8, lower=80, upper=Inf, meanerr=0), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=80, meanerr=0), hmmIdent(999)) fev2.msm <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel2, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(sderr = c(1,1), acute = c(1,1)), control=list(maxit=10000), center=TRUE) \end{Scode} Under this model the standard deviation of FEV$_1$ measurements caused by measurement error (more realistically, natural short-term fluctuation) is around 9\% baseline. The estimated effect of acute events on FEV$_1$ and sojourn times in the BOS-free state and in BOS before death are similar to Model 1. The following code will create a plot that illustrates a trajectory of declining FEV$_1$ from the first lung transplant recipient in this dataset. The Viterbi algorithm is used to locate the most likely point at which this individual moved from BOS state 1 to BOS state 2, according to the fitted Model 2. This is illustrated by a vertical dotted line. This is the point at which the individual's lung function started to remain consistently below 80\% baseline FEV$_1$. \begin{Scode} keep <- fev$ptnum==1 & fev$fev<999 plot(fev$days[keep], fev$fev[keep], type="l", ylab=expression(paste("% baseline ", FEV[1])), xlab="Days after transplant") vit <- viterbi.msm(fev2.msm)[keep,] (max1 <- max(vit$time[vit$fitted==1])) (min2 <- min(vit$time[vit$fitted==2])) abline(v = mean(max1,min2), lty=2) text(max1 - 500, 50, "STATE 1") text(min2 + 500, 50, "STATE 2") \end{Scode} \includegraphics{figures/fev_viterbi} \paragraph{An alternative way of specifying a misclassification model} This general framework for specifying hidden Markov models can also be used to specify multi-state models with misclassification. A misclassification model is a hidden Markov model with a categorical outcome distribution. So instead of an \Rfunarg{ematrix} argument to \Rfunction{msm}, we can use a \Rfunarg{hmodel} argument with \Rfunction{hmmCat} constructor functions. \Rfunction{hmmCat} takes at least one argument \Rfunarg{prob}, a vector of probabilities of observing outcomes of $1, 2, \ldots, n$ respectively, where $n$ is the length of \Rfunarg{prob}. All outcome probabilities with an initial value of zero are assumed to be fixed at zero. \Rfunarg{prob} is scaled if necessary to sum to one. The model in section \ref{sec:fitting:hmm:misc} specifies that an individual occupying underlying state 1 can be observed as states 2 (and 1), underlying state 2 can be observed as states 1, 2 or 3, and state 3 can be observed as states 2 or 3, and underlying state 4 (death) cannot be misclassified. Initial values of 0.1 are given for the 1-2, 2-1, 2-3 and 3-2 misclassification probabilities. This is equivalent to the model below, specified using a \Rfunarg{hmodel} argument to \Rfunction{msm}. The maximum likelihood estimates should be the same as before (Model 5) if the \Rfunarg{obstrue=firstobs} is removed from the \Rfunction{msm()} call. \Rfunarg{obstrue} has a slightly different meaning for models specified with \Rfunarg{hmodel}. If supplied, the variable indicated by \Rfunarg{obstrue} should contain the true state if this is known, and \Robject{NA} otherwise, whereas the \Rfunarg{state} variable contains an observation generated from the HMM outcome model given the (unobserved) true state. For models specified with \Rfunarg{ematrix}, the \Rfunarg{state} variable contains the (observed) true state itself. Thus the \Rfunarg{hmodel} specification is not strictly suitable for the CAV data, since the true state is both \emph{known} and \emph{observed} at the time of transplant. \begin{Scode} Qm <- rbind(c(0, 0.148, 0, 0.0171), c(0, 0, 0.202, 0.081), c(0, 0, 0, 0.126), c(0, 0, 0, 0)) cavmisc.msm <- msm(state ~ years, subject = PTNUM, data = cav, hmodel = list (hmmCat(c(0.9, 0.1, 0, 0)), hmmCat(c(0.1, 0.8, 0.1, 0)), hmmCat(c(0, 0.1, 0.9, 0)), hmmIdent(4)), qmatrix = Qm, deathexact = 4) cavmisc.msm \end{Scode} \subsubsection{Hidden Markov models with multivariate outcomes} Since version 1.5.2, \Rpackage{msm} can fit models where at each time point, there are multiple outcomes generated conditionally on a single hidden Markov state. The outcomes must be independent conditionally on the hidden state, but they may be generated from the same or different univariate distributions. See \Rfunction{help(hmmMV)} for detailed documentation and a worked example. \subsubsection{Defining a new hidden Markov model distribution} Suppose the hidden Markov model outcome distributions supplied with \Rpackage{msm} (Table \ref{tab:hmm:dists}) are insufficient. We want to define our own univariate distribution, called \Rfunction{hmmNewDist}, taking two parameters \Robject{location} and \Robject{scale}. Download the source package, for example \texttt{msm-0.7.2.tar.gz} for version 0.7.2, from CRAN and edit the files in there, as follows. \begin{enumerate} \item Add an element to \Robject{.msm.HMODELPARS} in the file \texttt{R/constants.R}, naming the parameters of the distribution. For example \begin{Scode} newdist = c('location', 'scale') \end{Scode} \item Add a corresponding element to the C variable \texttt{HMODELS} in the file \texttt{src/lik.c}. This MUST be in the same position as in the \Robject{.msm.HMODELPARS} list. For example, \begin{Scode} hmmfn HMODELS[] = { ..., hmmNewDist };. \end{Scode} \item The new distribution is allowed to have one parameter which can be modelled in terms of covariates. Add the name of this parameter to the named vector \Robject{.msm.LOCPARS} in \texttt{R/constants.R}. For example \texttt{newdist = 'location'}. Specify \texttt{newdist = NA} if there is no such parameter. \item Supposed we have specified a parameter with a non-standard name, that is, one which doesn't already appear in \Robject{.msm.HMODELPARS}. Standard names include, for example, \texttt{'mean'}, \texttt{'sd'}, \texttt{'shape'} or \texttt{'scale'}. Then we should add the allowed range of the parameter to \Robject{.msm.PARRANGES}. In this example, we add \texttt{meanpars = c(-Inf, Inf)} to \Robject{.msm.PARRANGES}. This ensures that the optimisation to estimate the parameter takes place on a suitable scale, for example, a log scale for a parameter constrained to be positive. If the parameter should be fixed during maximum likelihood estimation (for example, the denominator of a binomial distribution) then add its name to \Robject{.msm.AUXPARS}. \item Add an R constructor function for the distribution to \texttt{R/hmm-dists.R}. For a simple univariate distribution, this is of the form \begin{Scode} hmmNewDist <- function(location, scale) { hmmDIST(label = "newdist", link = "identity", r = function(n) rnewdist(n, location, scale), match.call()) } \end{Scode} \begin{itemize} \item The \texttt{'label'} must be the same as the name you supplied for the new element of \Robject{.msm.HMODELPARS} \item \texttt{link} is the link function for modelling the location parameter of the distribution as a linear function of covariates. This should be the quoted name of an R function. A log link is \texttt{'log'} and a logit link is \texttt{'qlogis'}. If using a new link function other than \texttt{'identity'}, \texttt{'log'}, or \texttt{'qlogis'}, you should add its name to the vector \Robject{.msm.LINKFNS} in \texttt{R/constants.R}, and add the name of the corresponding inverse link to \Robject{.msm.INVLINK}. You should also add the names of these functions to the C array \texttt{LINKFNS} in \texttt{src/lik.c}, and write the functions if they do not already exist. \item \texttt{r} is an R function, of the above format, returning a vector of \texttt{n} random values from the distribution. You should write this if it doesn't already exist. \end{itemize} \item Add the name of the new constructor function to the NAMESPACE in the top-level directory of the source package. \item Write a C function to compute the probability density of the distribution, and put this in \texttt{src/hmm.c}, with a declaration in \texttt{src/hmm.h}. This must be of the form \begin{Scode} double hmmNewDist(double x, double *pars) \end{Scode} where \texttt{*pars} is a vector of the parameters of the distribution, and the density is evaluated at \texttt{x}. \item (Optionally) Write a C function to compute the derivatives of the probability density with respect to the parameters, and put this in \texttt{src/hmmderiv.c}, with a declaration in \texttt{src/hmm.h}. Then add the model to \texttt{DHMODELS} in \texttt{lik.c} (in the same position as in \texttt{HMODELS}) and \texttt{.msm.HMODELS.DERIV} in \texttt{R/constants.R}. This will generally double the speed of maximum likelihood estimation, but analytic derivatives will not be available for all distributions. \item Update the documentation (\texttt{man/hmm-dists.Rd}) and the distribution table in\\ \texttt{inst/doc/msm-manual.Rnw}) if you like. \item Recompile the package (see the ``Writing R Extensions'' manual) \end{enumerate} Your new distribution will be available to use in the \Rfunarg{hmodel} argument to \Rfunction{msm}, as, for example \begin{Scode} hmodel = list(..., hmmNewDist(location = 0, scale = 1), ...) \end{Scode} If your distribution may be of interest to others, ask me (\texttt{chris.jackson@mrc-bsu.cam.ac.uk}) to include it in a future release. \clearpage \section{\Rpackage{msm} reference guide} The R help page for \Rfunction{msm} gives details of all the allowed arguments and options to the \Rfunction{msm} function. To view this online in R, type: <>= help(msm) @ Similarly all the other functions in the package have help pages, which should always be consulted in case of doubt about how to call them. The web-browser based help interface may often be convenient - type <>= help.start() @ and navigate to \textsf{Packages} $\ldots$ \textsf{msm}, which brings up a list of all the functions in the package with links to their documentation, and a link to this manual in PDF format. \appendix \section{Changes in the msm package} For a detailed list of the changes in recent versions of \Rpackage{msm}, see the \texttt{NEWS} file in the top-level directory of the installed package. Development versions of \Rpackage{msm} are to be found on GitHub \url{https://github.com/chjackson/msm}. These are often more recent than the version released on CRAN, so if you think you have found a bug, then please check first to see whether it has been fixed on the GitHub version. \section{Get in touch} If you use \Rpackage{msm} in your work, whatever your field of application, please let me know, for my own interest! Suggestions for improvement are welcome. \clearpage \bibliography{msm} \end{document} msm/vignettes/figures/0000755000176200001440000000000014670547223014534 5ustar liggesusersmsm/vignettes/figures/fev_viterbi.pdf0000644000176200001440000001157114471426252017535 0ustar liggesusers%PDF-1.4 %âãÏÓ\r 1 0 obj << /CreationDate (D:20140103094218) /ModDate (D:20140103094218) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 1046 /Filter /FlateDecode >> stream xœ­WMo7 ½Ï¯à¥ÀúU¤¾Iê0Щé!Èa“:@µÑx ý÷}iF²á¤$¯ýüÄoŠÔ2]Ó5}š^Ó' ÅXOÉïɳ7IÈ%6AèîŠ~§ÛéÇÓo?¿ ——“5ÖZ?/_þŠÿ¦@Ooß‘¥?&¦ ü\O¬è—)yã-9'¦Xº™2N3yLtœ²3™ÉÅ`b,΄@ÞF­3Eúifgb$ïØˆqV­Ž£Š).ªGR0a>/p"uõ,lr!ÕT±áã€cRŸ+Žž8ZS\ÃÉ“ c²à‰áv¬öàø¬â¬ŽJaS²b?+êþkB$çYÝT GFaØæײ ö‘>AÑfR2Î|fÃaà ì—'Mt¸ø‘‡ÿðÏfã¤á‡|—9k¼‚zE0šÀ ö…Ť¡^‚ú€Xõ+Vûþh>ÄY-d—wð/ ¼&.ôüŠUì¬Õ°+Fãtý>©cÃyÄãõHy°ÿ(³6uÇèf[}9šìzÿINš¯;+ÆÃ_žËZ1ê=`7ëƒÛÙ5ŒzØÏñvœ´>kÿ)V{]ü呇ãnà™€½ö‡‘Çý‘Ñ_猌ño˜Œ¡º}$ õ™Ûtöý†ü¯¼Gch<ùÒþñÚHàqXõyïuz°‹ÚVŠ‹Þ×Σ~ò+UÌ:/tŒÄY_ˆZÿ4j…YûEš§É¥NÃov¬ˆm–Þ`pe­w…Gº|Ì7uã#÷Y ¾Â΋DV¾Á¯ ºòv^ èËÊ78ð˜Ö¸0+_aç´Æ×ùû–¿§'òwú€]òJ°zöQ4ÓˆúQ±6@Ò°ö7´ ÖžÑþz:ßϺ¿,ÌÃxéÒl·ˆ‹em£A|“uAóërZÅe“u½›ìGñMÖZ£¼‹»MÖ=½¹ƒø`½>Ú-ºiïq÷µêy,Ù<òãrç+ì¼Ø S{áøty®|…wx5¤n¿Á¯[cåÛYùÐÂñérölH%QŠT¢ºTûö©ÜQ¸u¯JǯÆjöy–NÛ¥ƒÁªtÞ.­ûÖÖ¸ËWHû¹í¾n×7Нâü¨eÛœš<þHËØ=.P· ^oÇ¥þár¸n…ol‚$X…YŸ×pöíî§Ã2G»NtøxuG÷wg¸5´;Üžþ:nïÏÞÑþâæ Hˈ} eÎÅôþpº:þy{ERÚÔ¤¨ÏUój»0Ó±¶Òùvá2/l~óYáy§=Ëc‚‹Š–E”Ñïùí†Doˆ~Qxzõ··Ùº:+\šê{ìF‘¤Ï$}s—ÚB—{t Þ.»çí÷þœøÉ¶ùÌÒÀ{£î?4ʪñõô/âŽÓ„endstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 /MediaBox [0 0 504 504] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óûendstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj xref 0 11 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000001410 00000 n 0000001493 00000 n 0000001605 00000 n 0000001638 00000 n 0000000212 00000 n 0000000292 00000 n 0000004333 00000 n 0000004590 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 4687 %%EOF msm/vignettes/figures/p5q1_6_7_11_12.pdf0000644000176200001440000000222514471426252017271 0ustar liggesusers%PDF-1.3 %Çì¢ 5 0 obj <> stream xœ]QAnÃ0 »ë>ï°Y²%;/Øyë ´[‘†ý˜lYŽ3EØšdHú'ÄW ±}Æóú„·Ïî¿€á¡ßoˆá¨–€˜cxB2°7PbQÀ%ž OÉ_pÌ„n˜æ™aSë#ŸñàL­yÅp¢¢ÿeJêGX%`Ú¸½¶ãÌØðäìp{QÙcØÅäÇ—ÄN02¹¡a3<8ݰ·u…l‹—¾‰˜Ù [±KÇV’jªg<8S»Œ'¾œx.É—Z øb²ªAõi£ \;%oÂ1Óz[Ý+ã¹™x-ñNfÐk,P¼Ž§é?, 1Ɉ@\Ó„ƒ0Óœ¦ì^žÆ«kÊ’µ:Û U!þÛF½Žkh|½V!óù€?ÑÙ•ôendstream endobj 6 0 obj 279 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000573 00000 n 0000000691 00000 n 0000000514 00000 n 0000000383 00000 n 0000000015 00000 n 0000000364 00000 n 0000000621 00000 n 0000000662 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [<0507AE57B35FF484D029A4B37E531833><0507AE57B35FF484D029A4B37E531833>] >> startxref 843 %%EOF msm/vignettes/figures/sampling.ps0000644000176200001440000001111414471426252016705 0ustar liggesusers%!PS-Adobe-3.0 %%DocumentNeededResources: font Symbol %%+ font Helvetica %%+ font Helvetica-Bold %%+ font Helvetica-Oblique %%+ font Helvetica-BoldOblique %%DocumentMedia: a4 595 841 0 () () %%Title: R Graphics Output %%Creator: R Software %%Pages: (atend) %%Orientation: Landscape %%BoundingBox: 118 61 478 781 %%EndComments %%BeginProlog /bp { gs 595.00 0 translate 90 rotate gs } def % begin .ps.prolog /gs { gsave } def /gr { grestore } def /ep { showpage gr gr } def /m { moveto } def /l { lineto } def /np { newpath } def /cp { closepath } def /f { fill } def /o { stroke } def /c { newpath 0 360 arc } def /r { 3 index 3 index moveto 1 index 4 -1 roll lineto exch 1 index lineto lineto closepath } def /p1 { stroke } def /p2 { gsave bg setrgbcolor fill grestore newpath } def /p3 { gsave bg setrgbcolor fill grestore stroke } def /t { 6 -2 roll moveto gsave rotate ps mul neg 0 2 1 roll rmoveto 1 index stringwidth pop mul neg 0 rmoveto show grestore } def /cl { grestore gsave newpath 3 index 3 index moveto 1 index 4 -1 roll lineto exch 1 index lineto lineto closepath clip newpath } def /rgb { setrgbcolor } def /s { scalefont setfont } def /R { /Font1 findfont } def /B { /Font2 findfont } def /I { /Font3 findfont } def /BI { /Font4 findfont } def /S { /Font5 findfont } def 1 setlinecap 1 setlinejoin % end .ps.prolog /Helvetica findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /Font1 exch definefont pop /Helvetica-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /Font2 exch definefont pop /Helvetica-Oblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /Font3 exch definefont pop /Helvetica-BoldOblique findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /Font4 exch definefont pop /Symbol findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall currentdict end /Font5 exch definefont pop %%EndProlog %%Page: 1 1 bp 60.94 117.64 780.94 477.64 cl /ps 12 def R 12 s 0.0000 0.0000 0.0000 rgb 435.34 136.36 (Time) 0.50 0.00 0.00 t 60.94 117.64 780.94 477.64 cl /ps 12 def R 12 s 0.0000 0.0000 0.0000 rgb 105.58 247.85 (Stage 1) 1.00 0.00 0.00 t 105.58 300.52 (Stage 2) 1.00 0.00 0.00 t 105.58 353.18 (Stage 3) 1.00 0.00 0.00 t 105.58 405.85 (Death) 1.00 0.00 0.00 t 0.75 setlinewidth [] 0 setdash np 143.34 191.08 m 581.34 191.08 l o np 143.34 191.08 m 143.34 183.88 l o np 216.34 191.08 m 216.34 183.88 l o np 313.68 191.08 m 313.68 183.88 l o np 386.68 191.08 m 386.68 183.88 l o np 581.34 191.08 m 581.34 183.88 l o 143.34 165.16 (0.0) 0.50 0.00 0.00 t 216.34 165.16 (1.5) 0.50 0.00 0.00 t 313.68 165.16 (3.5) 0.50 0.00 0.00 t 386.68 165.16 (5.0) 0.50 0.00 0.00 t 581.34 165.16 (9.0) 0.50 0.00 0.00 t 119.98 191.08 750.70 418.60 cl 0.0000 0.0000 0.0000 rgb 0.75 setlinewidth [] 0 setdash np 143.34 252.17 m 192.01 252.17 l o np 185.78 248.57 m 192.01 252.17 l 185.78 255.77 l o np 192.01 304.84 m 338.01 304.84 l o np 331.78 301.24 m 338.01 304.84 l 331.78 308.44 l o np 338.01 252.17 m 435.34 252.17 l o np 429.11 248.57 m 435.34 252.17 l 429.11 255.77 l o np 435.34 357.50 m 581.34 357.50 l o np 575.11 353.90 m 581.34 357.50 l 575.11 361.10 l o np 581.34 410.17 m 630.01 410.17 l o np 623.78 406.57 m 630.01 410.17 l 623.78 413.77 l o np 192.01 252.17 m 192.01 304.84 l o np 338.01 304.84 m 338.01 252.17 l o np 435.34 252.17 m 435.34 357.50 l o np 581.34 357.50 m 581.34 410.17 l o 0.75 setlinewidth [ 3.00 5.00] 0 setdash np 216.34 191.08 m 216.34 418.60 l o np 313.68 191.08 m 313.68 418.60 l o np 386.68 191.08 m 386.68 418.60 l o np 582.80 191.08 m 582.80 418.60 l o np 216.34 191.08 m 216.34 418.60 l o np 313.68 191.08 m 313.68 418.60 l o np 386.68 191.08 m 386.68 418.60 l o np 582.80 191.08 m 582.80 418.60 l o np 216.34 191.08 m 216.34 418.60 l o np 313.68 191.08 m 313.68 418.60 l o np 386.68 191.08 m 386.68 418.60 l o np 582.80 191.08 m 582.80 418.60 l o np 216.34 191.08 m 216.34 418.60 l o np 313.68 191.08 m 313.68 418.60 l o np 386.68 191.08 m 386.68 418.60 l o np 582.80 191.08 m 582.80 418.60 l o ep %%Trailer %%Pages: 1 %%EOF msm/vignettes/figures/sampling.pdf0000644000176200001440000000440014471426252017034 0ustar liggesusers%PDF-1.3 %Çì¢ 8 0 obj <> stream xœíT¹nÛ@í÷+¦¤ mvfölƒ¸qç˜@ Ã…aËDB ä÷³'¹¤)ÜÅ}óžæÜÑ ”DPéSß÷“8‰o?-<ýWñ˜lSüv¤› Wçtx¿àMœ³£öºŸàû]¡$£„}ŠÂZI«-J¥<Œ“Æ—é°_ÅÅW_—(H4À’Ð*ã^¿ß=Sh†¤u0>43-fÛ™9™ƒdí‚ë~óãp÷þ<×à¤?á2>¯ñyäMžXêXZ…†TÂGqýAgØñhÌJPq§ CVúEQq§`2+EÅ¢æ5+º<ÿaЈÒǹå^ß JªÝ^ÛÀ’y@iv{ëcÿN 1&ÉPû× !‚Ûñr¹-?JZgq&FëŽEÔ.Ê™‘ö’—ŽˆŒir3Èëd!íJ´‚iáÓ/0WÔSÃä\ó‰Î¸lQÅçVÖ›…/Yä¨U1gÁNσ/y²õxVQó¬|΃iüTP7b$F0¨‹·5‹hBã’ÖÚj¾/ÚÐêuJg•r7¼eZØ®Øm»¡¬6mÚÓùX—×µ«/hZèà¸õ nã~ø°véb}²s‰þdá}nÛ°‘ùxnÝÿÇýš¸éoå/wcçendstream endobj 9 0 obj 487 endobj 7 0 obj <> /Contents 8 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 6 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 5 0 obj <>stream xœkhÙDÀ€ endstream endobj 4 0 obj <>stream xœc`Ù endstream endobj 14 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <> endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 17 0000000000 65535 f 0000000801 00000 n 0000001730 00000 n 0000000742 00000 n 0000001191 00000 n 0000001043 00000 n 0000000849 00000 n 0000000591 00000 n 0000000015 00000 n 0000000572 00000 n 0000001659 00000 n 0000001573 00000 n 0000001491 00000 n 0000001412 00000 n 0000001338 00000 n 0000000937 00000 n 0000000967 00000 n trailer << /Size 17 /Root 1 0 R /Info 2 0 R >> startxref 1886 %%EOF msm/vignettes/figures/hidden.pdf0000644000176200001440000000502314471426252016457 0ustar liggesusers%PDF-1.3 %Çì¢ 8 0 obj <> stream xœµVMo!½ó+8ÚR—2ÃǵR.¹Tn\õåÒØMe-%©Zõßw`Ù5Û%VR©²ì…}7ÀÀ?J­@êô)ÏÛ^<Š÷Ÿœ¼{n¦w=ÿzÔZ>CÑÎÚ©ñ]|‘Gñ(! Û^~زX (·ßXd—¢í”ÒX§?·½Xmý~½½[¹ùoqÑ{…A‚õÊ»öGŠ™©!12Fv¨xØN\¯ëN+ÒÚ†°‚õÍö²V­•ñ²[J1Æ™˜VÞz`… ­Ù3ZccbŽ"®Þ­§æqÔÕÃÀ ,ÏžxåIµ›«ZeBšáÂ3Š "½uqÖaäùtSûø÷B;ÂsN  eíÏÇÝþéá÷áx—‚¯5ÈTˆýøõyÿôs¿›Î†W$ —ü½çïA RœUtŽÏ°µ–¼¡òi/®F6<Û—`kÒÙx& ¼_K}Ù.À*.Á*æ L· Œr|â}d°û õøpúV¿ðÇ›ÓØK4—Á8Æú±˜òÅãxCÐÛô8G±Á@Ôx‡#ð*MÎs˜kD×À‹bF+=A«Šo R^Û¤gÑ™^ô2ZéÙȶPé‘q8×#£“K.E±àiÄ5{œ$-oøzíøz§SB9~/À9vޱŸØàSvÈA“1â6ÄqDRDÊñ'~éWŠHl,-Æ„£«­+y/üÒ¯­óØdL8ïÉ•¬~éWŠäul2FÜ_F¼ÁéѨÀçØòbvú«¹…¥u±0È6x²1⻂K¿¤’ÛOì…âB‹}ÐFÏw¼eø<¿órJs…ÖÏøìÉøÍÉÛÆo_0ýËã[×X äP‡rsiû–SÉÅ’«Jª÷É×ç±Þ¤í_Q|£jïÄo Vùõ¯©Á8Ôàsš\‡C{žÿ±jñ?-ö5Áqê8ûœ„$¯$RˆÈ+íøNyÅü„mò{6*JWWùaBÕ·ø3©-endstream endobj 9 0 obj 762 endobj 7 0 obj <> /Contents 8 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 6 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 5 0 obj <>stream xœkhÙDÀ€ endstream endobj 4 0 obj <>stream xœc`Ù endstream endobj 14 0 obj <> endobj 13 0 obj <> endobj 12 0 obj <> endobj 11 0 obj <> endobj 10 0 obj <> endobj 2 0 obj <>endobj xref 0 17 0000000000 65535 f 0000001076 00000 n 0000002005 00000 n 0000001017 00000 n 0000001466 00000 n 0000001318 00000 n 0000001124 00000 n 0000000866 00000 n 0000000015 00000 n 0000000847 00000 n 0000001934 00000 n 0000001848 00000 n 0000001766 00000 n 0000001687 00000 n 0000001613 00000 n 0000001212 00000 n 0000001242 00000 n trailer << /Size 17 /Root 1 0 R /Info 2 0 R >> startxref 2161 %%EOF msm/vignettes/figures/p2q12.pdf0000644000176200001440000000203314471426252016067 0ustar liggesusers%PDF-1.3 %Çì¢ 5 0 obj <> stream xœMN;Ã0Ý9s‡lc''ÈÜú•š6r†ª÷— Æ‘"ËðÄûÀéÊHöFîp{\À¸éÿáa*Êíµ6­’‹v)tBƸ®Á*p ÜMÌѧ¸ ¥3ì´ÜM¸öTN¬YU§\GÇNc¼.*ß<~èã4¸êãÄ.! çlË &‰ÇY&èI{¨ó<æîðp9Âendstream endobj 6 0 obj 158 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000451 00000 n 0000000569 00000 n 0000000392 00000 n 0000000262 00000 n 0000000015 00000 n 0000000243 00000 n 0000000499 00000 n 0000000540 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 721 %%EOF msm/vignettes/figures/p4q13569.eps0000644000176200001440000000673514471426252016371 0ustar liggesusers%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 28 643 426 814 %%HiResBoundingBox: 28.300000 643.600000 425.200000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (epswrite) %%CreationDate: 2006/06/22 17:45:33 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> stream xœUQAn1¼ó Ÿ{HÁ6`¿ ç6OˆÔ´ÑæPõÿRÁØn¢•åÃÌ`ö'á‰ú7ïË^?4]ÒÍÎ7`zƒÜ4ULw(Šj€Ÿ`Ð[rÀœj¦eAT68ÔvÕg<{¶6¼×$æãi2SYËr{€ÎFw(1]g" û$ÈÙpq~â¾Å£ç€Ï“ÝâiK%}±gè]F¤×ÍHx $‡‹N¦*{ Xm2{š»PÖ¾‰\ #÷1I÷:Ž=ìžá¥”Wp.¶ ìaõ_—Ò, ZUšEq3´Øañð_EÉzu8¼Ã+^gËendstream endobj 6 0 obj 233 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000527 00000 n 0000000645 00000 n 0000000468 00000 n 0000000337 00000 n 0000000015 00000 n 0000000318 00000 n 0000000575 00000 n 0000000616 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [<043BADFF288CA31BAAF50CBE8CB75FF8><043BADFF288CA31BAAF50CBE8CB75FF8>] >> startxref 797 %%EOF msm/vignettes/figures/p3q14.pdf0000644000176200001440000000205414471426252016075 0ustar liggesusers%PDF-1.3 %Çì¢ 5 0 obj <> stream xœMOK1Ýs Ö.èôã \ëÁÄÑIga¼"…V'MË ïCy#©^ïœn—0®z_@x)Y¹ ‚¾Uߘ²Ö˜i‡㺠O˜'a31ïpgšöÐh7¸›p‘Ì(%h†pI(1¶ 懠Âã –ÕúE(tröÑÞgŠÒ£ zÔO`QmŸ¡NçŠNPg´µl8_ø.*,{h´|­+|·G†endstream endobj 6 0 obj 175 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000468 00000 n 0000000586 00000 n 0000000409 00000 n 0000000279 00000 n 0000000015 00000 n 0000000260 00000 n 0000000516 00000 n 0000000557 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 738 %%EOF msm/vignettes/figures/general.eps0000644000176200001440000002457614471426252016675 0ustar liggesusers%!PS-Adobe-2.0 EPSF-2.0 %%Title: general.fig %%Creator: fig2dev Version 3.2 Patchlevel 4 %%CreationDate: Fri Jan 3 17:31:54 2003 %%For: chris@bumblebee (Chris Jackson,,,) %%BoundingBox: 0 0 650 218 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save newpath 0 218 moveto 0 0 lineto 650 0 lineto 650 218 lineto closepath clip newpath -35.3 252.7 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /reencdict 12 dict def /ReEncode { reencdict begin /newcodesandnames exch def /newfontname exch def /basefontname exch def /basefontdict basefontname findfont def /newfont basefontdict maxlength dict def basefontdict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall newfont /FontName newfontname put newcodesandnames aload pop 128 1 255 { newfont /Encoding get exch /.notdef put } for newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat newfontname newfont definefont pop end } def /isovec [ 8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde 8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis 8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron 8#220 /dotlessi 8#230 /oe 8#231 /OE 8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling 8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis 8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot 8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus 8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph 8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine 8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf 8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute 8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring 8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute 8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute 8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve 8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply 8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex 8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave 8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring 8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute 8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute 8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve 8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide 8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex 8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def /Helvetica-Bold /Helvetica-Bold-iso isovec ReEncode /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc % % Fig objects follow % % % here starts figure with depth 100 % Polyline 7.500 slw n 705 600 m 600 600 600 1695 105 arcto 4 {pop} repeat 600 1800 1695 1800 105 arcto 4 {pop} repeat 1800 1800 1800 705 105 arcto 4 {pop} repeat 1800 600 705 600 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline n 10305 600 m 10200 600 10200 1695 105 arcto 4 {pop} repeat 10200 1800 11295 1800 105 arcto 4 {pop} repeat 11400 1800 11400 705 105 arcto 4 {pop} repeat 11400 600 10305 600 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline n 7905 600 m 7800 600 7800 1695 105 arcto 4 {pop} repeat 7800 1800 8895 1800 105 arcto 4 {pop} repeat 9000 1800 9000 705 105 arcto 4 {pop} repeat 9000 600 7905 600 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline n 5505 3000 m 5400 3000 5400 4095 105 arcto 4 {pop} repeat 5400 4200 6495 4200 105 arcto 4 {pop} repeat 6600 4200 6600 3105 105 arcto 4 {pop} repeat 6600 3000 5505 3000 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline [60] 0 sd gs clippath 5252 3633 m 5275 3578 l 5136 3519 l 5235 3594 l 5112 3574 l cp eoclip n 1200 1875 m 5250 3600 l gs col0 s gr gr [] 0 sd % arrowhead n 5112 3574 m 5235 3594 l 5136 3519 l 5112 3574 l cp gs 0.00 setgray ef gr col0 s % Polyline [60] 0 sd gs clippath 5321 3033 m 5353 2983 l 5226 2900 l 5311 2991 l 5194 2950 l cp eoclip n 3600 1875 m 5325 3000 l gs col0 s gr gr [] 0 sd % arrowhead n 5194 2950 m 5311 2991 l 5226 2900 l 5194 2950 l cp gs 0.00 setgray ef gr col0 s % Polyline [60] 0 sd gs clippath 6646 2983 m 6678 3033 l 6805 2950 l 6689 2991 l 6773 2900 l cp eoclip n 8400 1875 m 6675 3000 l gs col0 s gr gr [] 0 sd % arrowhead n 6773 2900 m 6689 2991 l 6805 2950 l 6773 2900 l cp gs 0.00 setgray ef gr col0 s % Polyline [60] 0 sd gs clippath 6649 3578 m 6672 3633 l 6812 3575 l 6690 3594 l 6789 3520 l cp eoclip n 10800 1875 m 6675 3600 l gs col0 s gr gr [] 0 sd % arrowhead n 6789 3520 m 6690 3594 l 6812 3575 l 6789 3520 l cp gs 0.00 setgray ef gr col0 s % Polyline n 3105 600 m 3000 600 3000 1695 105 arcto 4 {pop} repeat 3000 1800 4095 1800 105 arcto 4 {pop} repeat 4200 1800 4200 705 105 arcto 4 {pop} repeat 4200 600 3105 600 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline gs clippath 2940 1080 m 2940 1020 l 2789 1020 l 2909 1050 l 2789 1080 l cp eoclip n 1875 1050 m 2925 1050 l gs col0 s gr gr % arrowhead n 2789 1080 m 2909 1050 l 2789 1020 l 2789 1080 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 5340 1080 m 5340 1020 l 5189 1020 l 5309 1050 l 5189 1080 l cp eoclip n 4275 1050 m 5325 1050 l gs col0 s gr gr % arrowhead n 5189 1080 m 5309 1050 l 5189 1020 l 5189 1080 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 7740 1080 m 7740 1020 l 7589 1020 l 7709 1050 l 7589 1080 l cp eoclip n 6675 1050 m 7725 1050 l gs col0 s gr gr % arrowhead n 7589 1080 m 7709 1050 l 7589 1020 l 7589 1080 l cp gs 0.00 setgray ef gr col0 s % Polyline gs clippath 10140 1080 m 10140 1020 l 9989 1020 l 10109 1050 l 9989 1080 l cp eoclip n 9075 1050 m 10125 1050 l gs col0 s gr gr % arrowhead n 9989 1080 m 10109 1050 l 9989 1020 l 9989 1080 l cp gs 0.00 setgray ef gr col0 s % Polyline [60] 0 sd gs clippath 1860 1320 m 1860 1380 l 2011 1380 l 1891 1350 l 2011 1320 l cp eoclip n 2925 1350 m 1875 1350 l gs col0 s gr gr [] 0 sd % arrowhead n 2011 1320 m 1891 1350 l 2011 1380 l 2011 1320 l cp gs 0.00 setgray ef gr col0 s % Polyline [60] 0 sd gs clippath 4260 1320 m 4260 1380 l 4411 1380 l 4291 1350 l 4411 1320 l cp eoclip n 5325 1350 m 4275 1350 l gs col0 s gr gr [] 0 sd % arrowhead n 4411 1320 m 4291 1350 l 4411 1380 l 4411 1320 l cp gs 0.00 setgray ef gr col0 s % Polyline [60] 0 sd gs clippath 6660 1320 m 6660 1380 l 6811 1380 l 6691 1350 l 6811 1320 l cp eoclip n 7725 1350 m 6675 1350 l gs col0 s gr gr [] 0 sd % arrowhead n 6811 1320 m 6691 1350 l 6811 1380 l 6811 1320 l cp gs 0.00 setgray ef gr col0 s % Polyline [60] 0 sd gs clippath 9060 1320 m 9060 1380 l 9211 1380 l 9091 1350 l 9211 1320 l cp eoclip n 10125 1350 m 9075 1350 l gs col0 s gr gr [] 0 sd % arrowhead n 9211 1320 m 9091 1350 l 9211 1380 l 9211 1320 l cp gs 0.00 setgray ef gr col0 s /Helvetica-Bold-iso ff 180.00 scf sf 7950 1425 m gs 1 -1 sc (STATE n-2) col0 sh gr /Helvetica-Bold-iso ff 180.00 scf sf 10350 1425 m gs 1 -1 sc (STATE n-1) col0 sh gr /Helvetica-Bold-iso ff 180.00 scf sf 675 1125 m gs 1 -1 sc ( DISEASE) col0 sh gr /Helvetica-Bold-iso ff 180.00 scf sf 3150 1125 m gs 1 -1 sc ( DISEASE) col0 sh gr /Helvetica-Bold-iso ff 180.00 scf sf 8025 1125 m gs 1 -1 sc (DISEASE) col0 sh gr /Helvetica-Bold-iso ff 180.00 scf sf 10425 1125 m gs 1 -1 sc (DISEASE) col0 sh gr /Helvetica-Bold-iso ff 300.00 scf sf 5925 1200 m gs 1 -1 sc (...) col0 sh gr /Helvetica-Bold-iso ff 180.00 scf sf 5450 3450 m gs 1 -1 sc (ABSORBING) col0 sh gr /Helvetica-Bold-iso ff 180.00 scf sf 5650 3750 m gs 1 -1 sc (STATE n) col0 sh gr /Helvetica-Bold-iso ff 180.00 scf sf 750 1425 m gs 1 -1 sc (STATE 1) col0 sh gr /Helvetica-Bold-iso ff 180.00 scf sf 3225 1425 m gs 1 -1 sc (STATE 2) col0 sh gr % here ends figure; $F2psEnd rs showpage msm/vignettes/figures/dags/0000755000176200001440000000000014670547223015452 5ustar liggesusersmsm/vignettes/figures/dags/p5q1_6_7_11_12.pdf0000644000176200001440000000275214471426252020214 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xœ…RËjÃ0¼ ô{ÎAèíõzKsèôAq Í%¿íj%ËŽK  ÍîÌÈÂM«_°å—æd"`ôp}ƒ×üheùÃËS¥ÜÊÿ|i•²™`J|kåÑ>/ÀGtÁÀ4+¡ß[´úÔê¢ÕùAÛMÖ¸&î¢k7 ž›¦›‘ÖÝ áuqJõrý( §Dß1•eiÿ˜M.ЛDa¡4P(Zï§1™º*q¾Œ3ÅGcºŒï3ª3GêÁLÊr•‰fî¢ôLê=U/µ(>·ð‚sw¨Úþ-,ÇP‚ë•UØÝXË+J`$Ì­ß'Åòm”'ŠÍbY—Z÷”EG+õ¨¸ÍîÄñÿ•b÷W³kkJª2H²Û îoÔ9ô'i7-=Eqä1Óãêh¥øÛ/ÜîoHt胘Ö3DVõ63ŠÕ=N쯋uøAÛÔ&žá7âÕœendstream endobj 3 0 obj 350 endobj 5 0 obj << >> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621155441+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000580 00000 n 0000000021 00000 n 0000000456 00000 n 0000000765 00000 n 0000000482 00000 n 0000000509 00000 n 0000000901 00000 n 0000000960 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ <58D06F6B2D57E47E8526B6AEAD0C21F9> <58D06F6B2D57E47E8526B6AEAD0C21F9> ] >> startxref 1150 %%EOF msm/vignettes/figures/dags/p2q1.odg0000644000176200001440000001676114471426252016740 0ustar liggesusersPK³jÕ4Ÿ.Ä++mimetypeapplication/vnd.oasis.opendocument.graphicsPK³jÕ4Configurations2/statusbar/PK³jÕ4'Configurations2/accelerator/current.xmlPKPK³jÕ4Configurations2/floater/PK³jÕ4Configurations2/popupmenu/PK³jÕ4Configurations2/progressbar/PK³jÕ4Configurations2/menubar/PK³jÕ4Configurations2/toolbar/PK³jÕ4Configurations2/images/Bitmaps/PK³jÕ4 content.xmlÅVAoÛ ½ïWD¾;ÄÉ&µV’jÒ´S+UÚ&íJÛ¨, q²_¿°ÜÔ7iÛ%1|ï™ÇãÞÞj±82m¸’»$[®’“DQ.Ë]òíëçô&¹Û¿Ûª¢à„åT‘CͤM‰’þÀ–&Õ]rÐ2WØp“K\3“[’«†Éž•ÇèÜzŒ=‹ÙtŽÙ–ì\²Ãޏøiþȳ©Æí\²Ã‚©1½PsÉ'#ÒBëuƒ-¡â$¸|Þ%•µMŽPÛ¶Ëv³TºDÙíí-òÕA0pÍA ¢1ÁÜ`eË õØšYXåØ$õ;Ùì·aGûßExvƒïÚdI×Q`P~†®p6¦ .Y‚¦©¥¾¢–7'}wƒµ»ž|# $ç+Åš&ý{;JÚh0A[ÎÌÂ È .Àr©$,‚ïp—¼§•ÒüÜxX¤XðÌ 0ŠËåwt¯#TÍ)~F(šÒ[ó[ÿÅùÕX?3 \8šÒ–Sw¨¬–kR'£:äb—|ÔZµWý¯±þ¹IWS°Ÿô`ÁЛP(/â…º«qÑd¢»Â“¢ç¡ÑEw¿õ“tÓ Z];ë ˆ×ÌïÎ\*|ò»Ú'Vàƒ°—½æž…?¨/š Ø»p\Xˆk(68§”˜^Z+Êú2êÔiF쵿©†%E뱯|v×9ü©ƒûeÞEÁÁµ+ÆËÊF'82úçsxÞoý÷Wã<ý/q~C|C±×Ä­ÿDÜ)Û%›að,VµŽe­CåJ—Ó?»Ü\";„¢Š&¾Þ÷?PKý½U­þ PK³jÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæqúV;5 Ÿâ‰xl¡Ž-Ô±…z2-Ô±…:¶PÇêË"4¶PÇêiµP›=Δžõ áZKëD+ÏÙlPå)Lr_¦Î[4Žj¬ lâx‡š8{Äý&Nÿ²WµÅú.‡7|9¼§Y޶~¢Sß#j¬Aúþ|þ¬kp*U¹wbir¬«Çºz¬«O¡±®ëê±®ëê±®>m„ƺúèuµŠ¥ýÊzw¼|ç¡ã‚REh)ª†ÝBj¢3ô•ë£@\Þyùrþð 4g^œžÛ£aÕh‰Ñ‹ô^¤æµ°ò„l0º'ªåOºYË:Â!ÈýÇ"c”åì9âUïL ½JUw9ê«R­r+TµÔnšxm!m&[|ﺊWx}«$”°­1ìkw4ç ÐÿºrÌžCžtøZê€N­œ¯€È›«Kjåpy±Uúf¹ôŒ(”‘ú%üV>óQª_0Ò̸ßz÷4¬w[m/0é´>¥Œ3Døaã÷#-H÷~ñ[–¯ Ñ÷‚i…üokFspså§+ʱÃ?øêWî%ÓAj5~k! Y 8X"O×w[YBJù=,rªò'$ŠKέŒâØâD¶zÅã:ãv?P BŒ2.ÓÎ]ýz= OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:21:39en-GB4PT3M55SPK³jÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100îñtq ©˜óöF W³€ÃA¶=ÿ§æò/X1Á.}Ÿ*‹œž÷´ÒXû?ÛŸ¾ä.˜ÛÁ¨ÄÖ!±A²°§0ëöO]÷Ç'Ê7Ÿ«Ý}×þãKƒôóµÆMŽ02»ðìP}4QõÈ2Ë󺂬UÓ ¥’:w ¦ïQѹó~Ú‘Èî.Ö >¸rÃQéŒý­œ*5K€ÑÉàéêç²Î)¡ PKb¢ªÜÁõPK³jÕ4 settings.xmlÝZmsâ6þÞ_‘ñL?yiâ ÜðÚ0G ½ë7a/ F–<’|„’1)ûâ“Q‡i>Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {s™ ^»®ýVý/Èe|­V­_”†¿¼Xfªsq}]¾¢¨‚i¯ì‹‚U¶¯’=*tøºˆÂ°{Z ÉU 8M53CüÎq0©9öàgŒ@ÔiÎP¿ÏÝ7ñ1ÐbLQ4aZJ¼äqIôZÀâ L…=!úsˆ)äŠ8‚™žfÿ€/û\]´.eÄÔ3d‡ÌˆÄâÑ€€h‘Z[ _ºê.G‹±zÔH¾{Ì# Gpˆ)’0bd˜m¨.È–—™ö®ªUS6‡²l¸(õÇ­Õ¹·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MKaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqfmlXnþÿÃ()Új¯ äC\@¾òUÓ²â_ð|ÕË¡÷Uaœ«¸q9´EÎ׺´®†-Y[CÛ²õ›Ú_ã8’ŒÛ3Í—.P–T¤ÙRJtµo2¾þ<¾Úá1I Åô¨.bs»Ü2'ŸB·ÐlüÍXøD3J¦":g\Ü–äÝN0Ù Èâ“¶Í…˜'åÆÏŒÜZQDÖS¼‹$:~9ÔÆRèX˜>sæAsLÀS]JÇs»éxRüZ¯ªÓ\}ŽS.®¿äXœ·§ía¯Ýë¹Zsì'„Õ2­¾û}z±ÖÝXñJÕvEZÏœ 63ã¢j:ŽT]Í;,Ôc="("G-±“FæÄìå›Qé"±<1&!˜£˜HEf,³ËÀZýÊ8/£+Þ'f©…›{$ýSsúÒô0û œ¶FtS_ƶZ¹H†>mÆ^Ø;ï h#ÿÅFß»+ã‡ôÒB”óí Oô>–†U@A÷8 ©4¬ÌçýÑÖÜ<‘0QO±];M°ýõ[‹ N,I™’a(x0JÖlõHĦô`T–V9†ï3“ðŒÃð>ã!Êl '#U¤-8Š–ã8 m¥ì$>ÿˆÁrßìeY ,ðj ô«zsC´>œhmc”°UEÕ¡ŒÄšf)‘¹"•R`´Ÿb¨§"Þ/ŽÞ¿°hµZ†/"Æ>"`§iM ØsO£@Tê( 'FÄìÐÊí ݃oe¸yßÁi~PKHo¡3øÅ#PK³jÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPK³jÕ4Ÿ.Ä++mimetypePK³jÕ4QConfigurations2/statusbar/PK³jÕ4'‰Configurations2/accelerator/current.xmlPK³jÕ4àConfigurations2/floater/PK³jÕ4Configurations2/popupmenu/PK³jÕ4NConfigurations2/progressbar/PK³jÕ4ˆConfigurations2/menubar/PK³jÕ4¾Configurations2/toolbar/PK³jÕ4ôConfigurations2/images/Bitmaps/PK³jÕ4ý½U­þ 1content.xmlPK³jÕ4M¶•êæqF ‚styles.xmlPK³jÕ4³HTjj  meta.xmlPK³jÕ4b¢ªÜÁõ0Thumbnails/thumbnail.pngPK³jÕ4Ho¡3øÅ# 7settings.xmlPK³jÕ4³„ANiMETA-INF/manifest.xmlPKîímsm/vignettes/figures/dags/p5q1_6_7_11_12.odg0000644000176200001440000001721714471426252020216 0ustar liggesusersPKÒvÕ4Ÿ.Ä++mimetypeapplication/vnd.oasis.opendocument.graphicsPKÒvÕ4Configurations2/statusbar/PKÒvÕ4'Configurations2/accelerator/current.xmlPKPKÒvÕ4Configurations2/floater/PKÒvÕ4Configurations2/popupmenu/PKÒvÕ4Configurations2/progressbar/PKÒvÕ4Configurations2/menubar/PKÒvÕ4Configurations2/toolbar/PKÒvÕ4Configurations2/images/Bitmaps/PKÒvÕ4 content.xmlÕW]oÚ0}߯@y&°¶#"T“¦=µR¥mÒ^]ÇI¬&vdûõóG0N!;­l{Ø÷ûøÜë\XÝîšz²Å\F³(™Î¢ ¦ˆå„–YôíëçøCt»~·bEANs†6 ¦2FŒJõ=Ql*RÍ¢ §)ƒ‚ˆ”‹T¢”µ˜X©NÍ^vFÈ}L7`Ÿ-ñN†’5vÀ…á;°ÏÎ9ìBÉ«Lõé %ïDL¹Þ´P’g*v5¡OYTIÙ¦t]7íSÆK,—K`¢N0r¸vÃkƒÊÀ5Ö› LpÀ6XÂP}ëK¢›æó`k „'Ym9 ¢Ž« 3l!Ÿ3¨¯m\]ÛrÄfTA\g<,•E^*‹Üç6PV#ùýîUÐ|ÜßëŠ7¡{iìÀ*ÄI|L‹öùŒ1'Uìe7rç³Ù{`Ǻ{Þq"1÷àèE8‚5r޳æœi —…ˆñV—¼»DÚ1B˜v`‘.ýýþî ªp`òkpL¨ ©ƒ³ °#E ) .õ®Nÿšô†õ¡ØÄ à&àF2ÍF±¹Éb½²7Ú|Nì³Þ<‹ò6‰ú‰*å{5eßq KqjÉO¨%‡mEÐaº…\·'3ˆ-IûšCžG‡u{JÜre—‹‰¤V–SFUÌ„nj=WŒ“ªãÁ:†5)•Hí¢ërˆÛêåÐÕ<¯Í‰€w¤—Î7Ãó5?a®¸êÕw$×/•ÙtŽšhWu‘E9gÝÉü9ÖÅMz8©e 4‡v¸ß„‚ÏÔì F+º<²|ï}é®W満íq­V=Nzüœ™;Л+” Sù}ì.খQ¿$ÇHž.`n‚óuP‡H ÷º«/¶‘ʳm™öù3ÙÓã “²’ÞÄNÝóÃóÞ>¯WæGS«rŠþ–¸«WˆS?|ð9qóß·K²èÆmžøªæY´t‘¹œèÒbÞJ×bT×Õkt]<™Ëÿ¥Ò®.]i×~F~F¯ýŒžÕõ¯dôâ¦%³Q×¼P€m\ÙrTØM .àÚ˱A¹Ö ŒüW_ÿPKWy™ç3ìPKÒvÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæÀþß)iÇ&èØ› 'ƒÐØ› ctl‚¾,Bctl‚žV´Ù¥,AéY®5¥N´vœÍÕŽÂ$÷%lê¼ã¨ÖÈÀ6Œw¨ ³GÜoÃô/\Uc«ïrx×Ã{šåhë:õM Æ„¡ïÏçϺ§RW{'–&Ǻz¬«Çºúdëê±®ëê±®ëêÓFh¬«^W«XÚ¯¬wÇË·:®U„–¢jØ=¢&:ÓA_šn0 Äõ›—/çï¿@sæuÁé¹ý1V–½Hàå@j^ì*obAÈá{¢Zþd¡›µÜ‰#‚Ü,¢1FYΞ#^õÎÔÐËPu—£¾ìÔ*׸UK=ஈ×Òö΋´ÅGñ¶ªx ×·JB ÛþvGsÞý¯+Çlá9äI‡/–èÔÊù ˆ¼¹ºfV—WS¥o–KÏ€B©_£`å3¥ú!ÍŒû­wOÃz·Õö“NëSÊ8C„6~?Ò‚t/á¿æ` ù }p/˜VÈÿ¶f47W~º¢,;üƒ/oé^2¤Vã×’¥€ƒ%òt}K±•%¤”ßÃ"§*¢¸¦ÜÊ Ž-Nd«W<®3n÷µ Ä(ã2íÜÕ/ÈÓÅ8üÕŸõ÷åÕŠ‹ÙÚéõbõáQw³nV²£ÑŽ"™‹RrÙ»v(P c¼ WøM½t\'ý:6ëÈ-“z½ǶkŒw ´ÛóåòPK¬Î|±Þ3FPKÒvÕ4‰3llmeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T15:54:36en-GB13PT30M8SPKÒvÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100Iyº8†TÌy{ë ß!‡ÀÙ?þïïÙU˜³pÊ6ƒéÅ×-Læí9iðòùÓ¢ŸnÔÚýfüR!ÀìÈÃbxA瑉oùܲ}üî—g—Ýø.ð¼UP÷ä>3ª¯Û¾Št?Y&Å‘¤ÐѨÀv‹µðlcâé•®í::ùÙ´2G›Wó93c·]v™´¥£âÊÛc‚¯Ãò“®™uW‹¶ßýö>u{ðZ~ˆ[š$8`Œ%.ù»ßÞ_Ùá~'Zì½Óû³p#)¹Œ_L+–ÖÖ}á5í&OW?—uN MPK.íªLSPKÒvÕ4 settings.xmlÝZßsâ6~ï_‘ñL‰$w‰'pÃφ9’Ðí]ß„½€YòHòþûJƤìÄ'£Ó #¥óŒ¼±¢8, £çî°N ÿÆÝÍ­o·.mÞ¦D7¿*XB¨ý}–ky GQ÷~`X½F‚“µîíš?°ÐdZЄEÎö¡\Gê!¦ÒiV굛Ϸî!ÐOa.³Ð¯o®/Kƒÿ‰¹ÌB¯]]\×KÃß^,3µ¯Õ>}¾*Š_ QTÁ4€öeÁ*ÛYÉ;|]DcX ‚=5…ä*œ¦Ž‹š™%~ã8ˆÔ{ð3Æ ê4çˆ(ƒßçŒîÛøè1¦(š0-%^ò¸$ú-àñ¦Âžý9ÄrEÁL³¿Á—}®­K1µ‰ì‘XÜ!-²Bk‹á«CWýÑåh1V[ä»Ç<z‡˜" #FÖ‰Ù†j@¶´¸ìs¯Z5es(ˆ‹R ÑZ]|ûøHÀ§Ë¶R‚¯¦[øçºa¦ËH‘Š6Cæ?Cð±*îÇP¬%Õù?³áÀÖa„ªX>ØŸbüà Ç_ŸÕ_Õ=¼S.W[Çpߌ¨  ~TàHBážL1m¼HÏI+Gc—Åʇ‚ýç ¼È^€sïø2,%¢ xb›šÂ1Áˆð'¶Êö±a*«Í¢<–ʈïGfr¤†ÏúÉW‹³“ãÒ‰÷ÿ´"¹°\‘|2ÏÃ; qùÚWMóŠÁßѽz_eƹŠçC[ä|­KAëtØ’µ5´-[¿ªýí!#ɸ=Ó|ëeIJš-¥DYû*ãûÀ㻑”ZLê,6·Ì-sõ)t ÕÆ_Œ…4#g*¢sÆàn»$ïqÚÉž @ïµmbžä?ÓtkEYOð.’èøùPKEt¢caú4ÌiÍ1O•)Ïí¦ Jñk½ª®sõ9N¹¸þ’cqÞžÞ·‡½v¯çjͱŸVÓ´úîcôñµÉZwcÅ+UÛiBs.ØÌŒ‹Jê8R‰5ï°P·Œu“t¢ˆ5ÇN*™³—oF¥‹ÄòʆL`Žb"™±ÌÎkõ+ãsXñ>1K-ÌØÜ!韚ӗ¦—ÙWà´%0¢£˜ú2¶UË DÒõi3öLÀNßyW@ùÏ6 ß]ïvÐK QηÓ=MÐûXfÜá €$Ó°Ò Odhô[óDÂDíb»vš`+úë×=œØ!eJ†¡à PÀ(Y[°Õ= s˜Òƒ^Yšåö’ðŒÃð>ã!Ê, ;#•¤-8Š–ã8 mÙI|þ#‚å¾ÙËt²XàUè—õ*æ†h}ØÒÚÆ(a«ŠÊC‰5ÍR"3ΊTJÞ~Š¡vE¼Ÿ½}cÑjµ ßDŒ}DÀNÑš@¿[sO£@]Tê* 'FÄìÒÊ­ ݃ïe¸yßÂiþPK¤_–­öÇ#PKÒvÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPKÒvÕ4Ÿ.Ä++mimetypePKÒvÕ4QConfigurations2/statusbar/PKÒvÕ4'‰Configurations2/accelerator/current.xmlPKÒvÕ4àConfigurations2/floater/PKÒvÕ4Configurations2/popupmenu/PKÒvÕ4NConfigurations2/progressbar/PKÒvÕ4ˆConfigurations2/menubar/PKÒvÕ4¾Configurations2/toolbar/PKÒvÕ4ôConfigurations2/images/Bitmaps/PKÒvÕ4Wy™ç3ì 1content.xmlPKÒvÕ4¬Î|±Þ3F styles.xmlPKÒvÕ4‰3ll³ meta.xmlPKÒvÕ4.íªLSEThumbnails/thumbnail.pngPKÒvÕ4¤_–­öÇ# ×settings.xmlPKÒvÕ4³„ANMETA-INF/manifest.xmlPKî‹msm/vignettes/figures/dags/p3q1246.odg0000644000176200001440000001722414471426252017170 0ustar liggesusersPK{lÕ4Ÿ.Ä++mimetypeapplication/vnd.oasis.opendocument.graphicsPK{lÕ4Configurations2/statusbar/PK{lÕ4'Configurations2/accelerator/current.xmlPKPK{lÕ4Configurations2/floater/PK{lÕ4Configurations2/popupmenu/PK{lÕ4Configurations2/progressbar/PK{lÕ4Configurations2/menubar/PK{lÕ4Configurations2/toolbar/PK{lÕ4Configurations2/images/Bitmaps/PK{lÕ4 content.xmlÍW]oÛ }߯ˆüîP;íÔZIªIÓžZ©Ò6i¯°Š$NöëwÁÁMÝ¢Iíö’î9æÜÃå’¬o•Xì™Ò\Ö›(Y^D VIy]l¢Ÿ?¾Å×ÑíöÓZæ9',£’ì*V›˜ÈÚÀ÷صκè&Ú©:“XsÕ¸b:3$“ «Væ£3·V7£ÍQÓØgv0¡d‹pñcøÊ쳩Âm(ÙbÁTŸžËPòA‹8—àzÕ`ß©8^?m¢Ò˜&C¨mÛe»ZJU äææ¹è(˜Œ¸f§„CQ‚˜`v1’e‚lÅ Õg±¾¤zW=2l 6ølWÅ4@ ][˜a/ò9“úÚÁÕµ/fl&%VÁuæÀÓRYÑðRYQŸ[aSÎìï5º‡ û¸¿;Õ•ªBײ؉UDñ&8Íí󥔣TK軓›^\\¢nì¡ÛWá­â†)N^…,È踬^2 p DÌö¶äÇCdÐ3„uá¬éì«Ýß}'%«ð ÌßǼÖ×'gtÅEð.v¦hq̓KÁb½£Ó·éÉݰ.‚nã5'ðÎHË&±;Éz»îN´û\tÏvñMD›$ê'r Ê0ÕõƸÁ‹Ð<µPgÔBá¦äd˜n°²×“ÄÉúJ±¢ÑðÞž7 LP†3½°²œ °¼–5l‚›°—¼Ç¥Tü7ÜxXÄXðÌ °Š­Ë)no_GN¨ŠS*\FÈKéµüÒw̯Âê‰)àBkŠ[NmS¹X¦¤Š&q¨‹MôE)ٞͿÄúp“ÎjLÁ.éÑ‚qÆ7!—NÄ3ugë¢ÙŠî’ÇA_ºÛµKÒp—n§ÕŽ“ÞÏÜèÍÕ ÂU~ûÊr¼ætÖ\ëY¸F}Ò”ÃÙ…v•c¡¡\»`ÓˆcL™†ôâJR6„Q¯N1bε¸C5nѤ´†ˆÀG{×ܰ_d})¸B°ã’ñ¢4ÞÄZÆð|ìž·k÷û«±žŠþ•¸«ÿYÜÊwõ†8øÇ^—þ¸Câ/žØ¶?uH}×Ò!v¦Í z/mŸOr޾T«ír9Q÷áÚVSmSߦÚV­-umì{Ü©KŽýMº#šùøýPKIžÛˆDqPK{lÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæÀþß)iÇ&èØ› 'ƒÐØ› ctl‚¾,Bctl‚žV´Ù¥,AéY®5¥N´vœÍÕŽÂ$÷%lê¼ã¨ÖÈÀ6Œw¨ ³GÜoÃô/\Uc«ïrx×Ã{šåhë:õM Æ„¡ïÏçϺ§RW{'–&Ǻz¬«Çºúdëê±®ëê±®ëêÓFh¬«^W«XÚ¯¬wÇË·:®U„–¢jØ=¢&:ÓA_šn0 Äõ›—/çï¿@sæuÁé¹ý1V–½Hàå@j^ì*obAÈá{¢Zþd¡›µÜ‰#‚Ü,¢1FYΞ#^õÎÔÐËPu—£¾ìÔ*׸UK=ஈ×Òö΋´ÅGñ¶ªx ×·JB ÛþvGsÞý¯+Çlá9äI‡/–èÔÊù ˆ¼¹ºfV—WS¥o–KÏ€B©_£`å3¥ú!ÍŒû­wOÃz·Õö“NëSÊ8C„6~?Ò‚t/á¿æ` ù }p/˜VÈÿ¶f47W~º¢,;üƒ/oé^2¤Vã×’¥€ƒ%òt}K±•%¤”ßÃ"§*¢¸¦ÜÊ Ž-Nd«W<®3n÷µ Ä(ã2íÜÕ/ÈÓÅ8üÕŸõ÷åÕŠ‹ÙÚéõbõáQw³nV²£ÑŽ"™‹RrÙ»v(P c¼ WøM½t\'ý:6ëÈ-“z½ǶkŒw ´ÛóåòPK¬Î|±Þ3FPK{lÕ4Oˆ­llmeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:35:55en-GB13PT15M37SPK{lÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100 {º8†TÌy{ût^“ƒÃÅI?þïÏyÝ´$sAh›{•múS'µ#³%/Üþ[÷ÿAýîØZ¦aC‡# ‚ÌbÊ~—¿\ºzîúÑ‹_Îüî“ú~wí¹#«ï±zg½yÛ¡‹kv^ÓÔx}Ó¶ …¤†F% cƒÔÇ··KþŽîùq»ö¾ò¡k¶g™ŸÜÓóû^¤ëë§ŸßÜòÔ9ÞÊï@áì´GÓ&0É=Ÿò4ä@rnß79"*œ?®ŸÀ4/¹Â2–[óA%ßO?‘1»]ç(sVì{ØqûÅg×½£³³­M{>îað7drá€¸Îø£­•0Ý=°zÇíH?fLùËhðϼ´ºªå‘ì`*aðtõsYç”ÐPKÊ´ ¦ELPK{lÕ4 settings.xmlÝZmsâ6þÞ_‘ñL?yiâ ÜðÚ0G ½ë7a/ F–<’|„’1)ûâ“Q‡i>Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {si ü/Èez­V­_”†¿¼Xfjsq}]¾¢¨‚i¯ì‹‚U¶«’=*røºˆÂ°{Z ÉU8M53CüÎq0©9öàgŒ@ÔiÎP¿ÏÝ7ñ1ÐbLQ4aZJ¼äqIôZÀâ L…=!úsˆ)äŠ8‚™žfÿ€/û\]´.eÄÔ3d‡ÌˆÄâÑ€€h‘Z[ _ºê.G‹±zÔH¾{Ì# Gpˆ)’0bd˜m¨.È–—™ö®ªUS6‡²l¸(õÇ­Õ±·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MGaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqfmlXnþïûà )Úüf^…wâò•¯šVÿ‚ç«^½¯êâ\Å«¡-r¾Ö¥ u1lÉÚÚ–­ßÔþò‡À‘dÜži¾t²¤ Í–R¢©}“ñõ?àñÕHš-¦Gu ›Ûä–9øº…^ãoÆÂ'šQ1Ñ9ãâî°$ïv:É^ @Ÿ³m.Ä<©6~fàÖŠ"²ž à]$Ññ«¡6–ŠèDÇÂôy˜3šcžjR:žÛM‡“â×zUæêsœrqý%Çâ¼=}h{í^ÏÕšc?!¬–iõݧèÓÛ€µîÆŠWª¶+Òræ\°™UÒq¤ÊjÞa¡ëéD9j…ô1'f/ߌJ‰å‰1 ™ÀÅD*2c™]ÖêWÆyXñ>1K-ÌØÜ#韚ӗ¦‡Ùgà´%0¢£˜ú2¶ÕÉ D2ói3öBÀÎÔyW@ù/6ÚÞ]?œŸ—¢œogvš ÷±4¬ ¸ÇAI¥ae<ŸÈÐè¶Ææ‰„‰zŠíÚi‚­è¯_ZôhpbIÊ” CÁ3 €Q²¶`«@"æ0¥“²´Ê1|™„g΀÷Qf[h8™©"mÁQ´Çah+e'ñùGŒ–ûf/3ÇJ`T[ _Ô«˜¢õá@k£„­*ªe$Ö4K‰ÌÈ©”“ýC=ñ~qôþ}E«Õ2|1ö;MkýÞÛxê RGa80"f‡Vngè|'ÃÍûNó;PK'f§áñÃ#PK{lÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPK{lÕ4Ÿ.Ä++mimetypePK{lÕ4QConfigurations2/statusbar/PK{lÕ4'‰Configurations2/accelerator/current.xmlPK{lÕ4àConfigurations2/floater/PK{lÕ4Configurations2/popupmenu/PK{lÕ4NConfigurations2/progressbar/PK{lÕ4ˆConfigurations2/menubar/PK{lÕ4¾Configurations2/toolbar/PK{lÕ4ôConfigurations2/images/Bitmaps/PK{lÕ4IžÛˆDq 1content.xmlPK{lÕ4¬Î|±Þ3F ®styles.xmlPK{lÕ4Oˆ­llÄ meta.xmlPK{lÕ4Ê´ ¦ELVThumbnails/thumbnail.pngPK{lÕ4'f§áñÃ# ásettings.xmlPK{lÕ4³„AN META-INF/manifest.xmlPKîmsm/vignettes/figures/dags/p2q12.ps0000644000176200001440000000611714471426252016665 0ustar liggesusers%!PS-Adobe-3.0 %%Pages: (atend) %%BoundingBox: 28 757 199 814 %%HiResBoundingBox: 28.300000 757.000000 198.400000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (pswrite) %%CreationDate: 2006/06/21 15:30:09 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_pswrite_2_0_1001 /GS_pswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<‹ %ñ}ó@dti †»ÚJ¢ Ĥk÷¢3ñסŠvסš)3ª¡Œö™O­²ÆñVYãÛ@]Ïìïgpg‚îãîöì+ÙÄ®e±“R!IÛè4{tÈBx©–Ð7»“»ººúúq€î^„w’j"8zŽ C¾â¢y®h—ƒHÉÁZÞ7‘-„š!¬@ö`…g_ýëîö;ªIÏ`úwpJ¹ÒŸ+£Ê¢wÁ`gL 9¶‚Å­3Ó“»a7^ýÆ+à'à^ ËF©ëdµÛöí>ý³]¼Hp›%ÃD ò“™êÏÆ´…IÀ<µ’ÔJ¶¦hœn¡´×“¤=ÉÖC‰“ñ½%m¥)‚Ô”¨…—”™’sÁÍ&¸ {Y˜÷Á´’þ67d)d´2Å@fëË)î`_‡Î¨†bÌ\F Hé¥üVo˜_å#‘†kަ´£Ø*WËj’IÜø¢H¾H)º‹ùçXï^¤û ˜¢@—´/Ÿ ‹P '≺‹uÁ¬£‡ÀƒÀ'?¬»Ûº$­ût{­vœ ÷ÌõÀP\eT8籯¤„{¦Ï½æŽž…;¨ÏšJÓ»æ¸*!SÆ®}°mÙ)ÅD™ôÒF`2†Á N¤/µ¸¦ò[4±Öýaðd¯só%öÚ”ÿP僜ì¸&´ªu0q4GÆø|êŸw[÷û«µ5÷Šþ—¸ëWˆ3¿¡ÈsâVÿ"î˜É'¿xªZÉÆGV}äB—óVºÖ³º®_£ëÝ7s·™Àwé¹Ï}ƒIƒ™¿<»?PKCñcf+3 PKùjÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæqúV;5 Ÿâ‰xl¡Ž-Ô±…z2-Ô±…:¶PÇêË"4¶PÇêiµP›=Δžõ áZKëD+ÏÙlPå)Lr_¦Î[4Žj¬ lâx‡š8{Äý&Nÿ²WµÅú.‡7|9¼§Y޶~¢Sß#j¬Aúþ|þ¬kp*U¹wbir¬«Çºz¬«O¡±®ëê±®ëê±®>m„ƺúèuµŠ¥ýÊzw¼|ç¡ã‚REh)ª†ÝBj¢3ô•ë£@\Þyùrþð 4g^œžÛ£aÕh‰Ñ‹ô^¤æµ°ò„l0º'ªåOºYË:Â!ÈýÇ"c”åì9âUïL ½JUw9ê«R­r+TµÔnšxm!m&[|ﺊWx}«$”°­1ìkw4ç ÐÿºrÌžCžtøZê€N­œ¯€È›«Kjåpy±Uúf¹ôŒ(”‘ú%üV>óQª_0Ò̸ßz÷4¬w[m/0é´>¥Œ3Døaã÷#-H÷~ñ[–¯ Ñ÷‚i…üokFspså§+ʱÃ?øêWî%ÓAj5~k! Y 8X"O×w[YBJù=,rªò'$ŠKέŒâØâD¶zÅã:ãv?P BŒ2.ÓÎ]ýz= OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:23:27en-GB6PT5M43SPKùjÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100žñtq ©˜óöF W³€ÃA®{ÿOmc_aÕücÆÏiª? tÖÝÞ¶·bÛ×wÌì™]x dIä˵žÿ4C²2ïØÈôÚIwõ?ž3p~Îêuð?°*‡# ÞJ}:<éÛÅwÏ~&9ÝeÎW#W©ÇV¼`É»›ÿå™ýWØøUöu]­iò×3›:•Ø:$’F¤3ògŸ6¯rÿÖ—Œ^OW?—uN MPK†ü­yÓPKùjÕ4 settings.xmlÝZmsâ6þÞ_‘ñL?yiâ ÜðÚ0G ½ë7a/ F–<’|„’1)ûâ“Q‡i>Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {s™^»¾®–ÿ r™‰^«Ö/JÃß^,3µ¿¹¸¾. _ QTÁ4€WöEÁ*ÛUÉ9|]DaX ‚=-…ä*œ¦ŽŠš™!~ç8ˆÔ{ð3Æ ê4çˆ(ƒßçŒî›øè1¦(š0-%^ò¸$ú-àñ¦Âžý9ÄrEÁLO³À—}®.Z—2bê²CfDbqh@@´È ­-†¯]õG—£ÅX=j$ß=æÐ#8ÄI1²NÌ6TdK‹ËL{WUä:‡²l¸(õÇ­Õ±·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MGaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqve_ºîþö#†AR´ùͼ ï0Ää+_5­*þÏW½z_ÕŹŠWC[ä|­KAëbØ’µ5´-[¿©ýå1#ɸ=Ó|éeIAš-¥DSû&ãëÀã«‘4ZLê6·É-sð)t ½ÆßŒ…O4£b*¢sÆÅÝaIÞítþ’½@€,>gÛ\ˆyRmüÌÀ­Ed=À»H¢ãWCm,Ñ‰Ž…éó0g4Ç<Õ¤t<·›'ůõª:ÌÕç8åâúKŽÅy{úÐöÚ½ž«5Ç~BX-Óê»OЧ·kݯTmW¤å̹`33.ª¤ãH•Õ¼ÃB=.ÖÒ‰"rÔ ;écNÌ^¾•.Ëc29ЉTdÆ2» ¬Õ¯Œó2 °â}b–Z˜±¹GÒ?5§/M³ÏÀiK`DG1õel«“ˆdæÓfì…€©ó®€6ò_l´½»2~8?/-D9ßÎì4AïciXpƒ’JÃÊx>‘¡ÑmÍ õÛµÓ[Ñ_¿´èÑàÄ’”)†‚g@£dmÁV€DÌaJ&ei•cø:3 Ï8œï3¢Ì¶Ðp21REÚ‚£h9ŽÃÐVÊNâó,÷Í^fŽ•À¨¶@¿¨W17DëÃÖ6F [UTÊH¬i–™‘+R)&û)†z*âýâèýûŠV«eøbì#všÖú‡=·!ð4 ÔA¥ŽÂpaDÌ­ÜÎÐ=øN†›÷ œæwPK§ê»Þ÷Ã#PKùjÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPKùjÕ4Ÿ.Ä++mimetypePKùjÕ4QConfigurations2/statusbar/PKùjÕ4'‰Configurations2/accelerator/current.xmlPKùjÕ4àConfigurations2/floater/PKùjÕ4Configurations2/popupmenu/PKùjÕ4NConfigurations2/progressbar/PKùjÕ4ˆConfigurations2/menubar/PKùjÕ4¾Configurations2/toolbar/PKùjÕ4ôConfigurations2/images/Bitmaps/PKùjÕ4Cñcf+3 1content.xmlPKùjÕ4M¶•êæqF •styles.xmlPKùjÕ4{Ÿšöjj³ meta.xmlPKùjÕ4†ü­yÓCThumbnails/thumbnail.pngPKùjÕ4§ê»Þ÷Ã# \settings.xmlPKùjÕ4³„ANMETA-INF/manifest.xmlPKîmsm/vignettes/figures/dags/p2q12.pdf0000644000176200001440000000252714471426252017015 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xœmM Â0…÷ÜaÖ] ™üç‚;íÂøƒTÁnz}3I#J)¼Gß|ó¦ )^ òã’C Ñj˜Ïpà)…*Ž»Yò»‚»Îc€à<¤ÐMÑÉ ›èzYmn’â&Å(Åá‡MA!mp²´M@Õ“Räº_nÍ5@¿¥Þ2_¥à6r$ó“Av6Uéù„Ú¸d&È„ËÐÿ‹µSCÆûEk0¥ æ[ŒA­GÏ-‹‹J—}}ôÏJ®óÁXL-ÊÇÁX‹VIendstream endobj 3 0 obj 203 endobj 5 0 obj << >> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152859+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000433 00000 n 0000000021 00000 n 0000000309 00000 n 0000000618 00000 n 0000000335 00000 n 0000000362 00000 n 0000000754 00000 n 0000000813 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ ] >> startxref 1003 %%EOF msm/vignettes/figures/dags/p3q1246.ps0000644000176200001440000000635614471426252017045 0ustar liggesusers%!PS-Adobe-3.0 %%Pages: (atend) %%BoundingBox: 28 643 199 814 %%HiResBoundingBox: 28.300000 643.600000 198.400000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (pswrite) %%CreationDate: 2006/06/21 15:30:09 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_pswrite_2_0_1001 /GS_pswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> stream xœ}RInÃ0 ¼ ÐxÎAÐBYÔ ô–æÐtA‘h.ù~¸ØŽÜ…aƒ g†”#\½û…ÈOí5 f¸¼Áë~¼‹zðòd”+¿ÏàË»:…­6øö.S(ZŸAKJ% :–FXûÎÞ}zwòîø Z iO˜–°zÑL$îͼUà?nD˜°„I|8¡Õ6FdqÜ¢…6 Œ>¶³ËÇš½÷Pu”RBf8Y»"Šy4RêXëý0n_"Ýe0ô•zÚæÆÚW™I!™E©ŠÐÐ@Ý1L„ó¥ªN–ÝÆÊ[ýëX«„™y5 @⯌ÔôHÝVÚŽO’‡Ð,"——ͶĞi(d/uRpçíØ¿n—‘D£™×n$(”Pendstream endobj 3 0 obj 287 endobj 5 0 obj << >> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152643+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000517 00000 n 0000000021 00000 n 0000000393 00000 n 0000000702 00000 n 0000000419 00000 n 0000000446 00000 n 0000000838 00000 n 0000000897 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ ] >> startxref 1087 %%EOF msm/vignettes/figures/dags/p3q14.pdf0000644000176200001440000000255314471426252017017 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xœmQIÂ0 ¼GÊ|æ`ÕIܺ/@âx‹PA¢—~Ÿì„‚¢He2c;X´zAçŒÄ˜ÏpÚÀS«.>¶‰²ø»‚»VÜãðÐÊÚXOK!‹·e"Ô“V7­ŽZí´ièŠ89*? ÕE“F í~¡Ì«­Kše¾ú†™Ã»°o6ôïzì=4Èa„ŒÄS> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152830+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000453 00000 n 0000000021 00000 n 0000000329 00000 n 0000000638 00000 n 0000000355 00000 n 0000000382 00000 n 0000000774 00000 n 0000000833 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ ] >> startxref 1023 %%EOF msm/vignettes/figures/dags/p3q16.odg0000644000176200001440000001712414471426252017021 0ustar liggesusersPKVkÕ4Ÿ.Ä++mimetypeapplication/vnd.oasis.opendocument.graphicsPKVkÕ4Configurations2/statusbar/PKVkÕ4'Configurations2/accelerator/current.xmlPKPKVkÕ4Configurations2/floater/PKVkÕ4Configurations2/popupmenu/PKVkÕ4Configurations2/progressbar/PKVkÕ4Configurations2/menubar/PKVkÕ4Configurations2/toolbar/PKVkÕ4Configurations2/images/Bitmaps/PKVkÕ4 content.xmlÍWÑnÛ }ßWD~wˆ“vj­$Õ¤iO­Ti›´Wбjƒ8Nöõ»€ãà&nQ¥u{IÌå8œ{¯IÖwûºší¨TLðM”ÌÑŒr"2Æ‹MôóÇ·ø&ºÛ~Z‹TÁt öÙšîu(Ù`G\ü¾³ûìLâ.”l°`ªOÏE(y¯ª8àzÝ`Í^¨ØWŒ?o¢Rë&E¨ëºy·š Y äööÙÙA0pM++‹Ê¢5›)”ÌtÄÖTãP}ëKâmýDe°5X㳬6’*€ÀqMa†-äsFõµ+‚«kWLØLJ,ƒë̂ǥ²ÊÂKe•ùÜër"¿7è&íÇÃý©®dº—Áެ"’5ÁÇthŸ/„¤‚kv+w¹X\!7öÐÝ«ðN2M¥'¯Â ®Èศ/™¸"¦;SòC#Ôa‰ÜôVÙäÒ¿î¿“’ÖøfoƒcÆ•Æü䌪YœÀN-æ,¸ Ökþ5=º¶Ç‹À%^¡!€[- ›Ä¶“Õví:Ú~ÎܳÙ|eMõƒò„Ü»1npA#4M-䵸)9†,Íõd±#_3,³è¸nO‰ &HͨšiÎ*°œ I°sYÀz8.…d¿áÆÃUŒ+V€v1u9ÆíÌr䄪Y–UöDÈ;Òkç[þÅóÕX>S \x5ÅËÌKe1_’:ÍC]l¢/RŠî,~‰õá&=žÕ˜‚í¡ †ˆoB.¬ˆêÎöE“ÝO<‰ì0 úÒÝ®í!M»ã:­fœôø9³=Л«@…­ü~î+Íq[é¨_RR¢Ï°0ø:ª‡ÇãL…æ†/ÑjðlW¤}þlö̸¤¬(µØo¢ëã38»‚çíÚþhjŒQƒ¢%.ñÄ%ÿ³¸ë7ÄÁ¯2zIÜò=âö‰K•Û<ñU-ý„Âàê’.#æCt}~.4´Ö©9‡¶C£¦DÿS¶PKrWè PKVkÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæÀþß)iÇ&èØ› 'ƒÐØ› ctl‚¾,Bctl‚žV´Ù¥,AéY®5¥N´vœÍÕŽÂ$÷%lê¼ã¨ÖÈÀ6Œw¨ ³GÜoÃô/\Uc«ïrx×Ã{šåhë:õM Æ„¡ïÏçϺ§RW{'–&Ǻz¬«Çºúdëê±®ëê±®ëêÓFh¬«^W«XÚ¯¬wÇË·:®U„–¢jØ=¢&:ÓA_šn0 Äõ›—/çï¿@sæuÁé¹ý1V–½Hàå@j^ì*obAÈá{¢Zþd¡›µÜ‰#‚Ü,¢1FYΞ#^õÎÔÐËPu—£¾ìÔ*׸UK=ஈ×Òö΋´ÅGñ¶ªx ×·JB ÛþvGsÞý¯+Çlá9äI‡/–èÔÊù ˆ¼¹ºfV—WS¥o–KÏ€B©_£`å3¥ú!ÍŒû­wOÃz·Õö“NëSÊ8C„6~?Ò‚t/á¿æ` ù }p/˜VÈÿ¶f47W~º¢,;üƒ/oé^2¤Vã×’¥€ƒ%òt}K±•%¤”ßÃ"§*¢¸¦ÜÊ Ž-Nd«W<®3n÷µ Ä(ã2íÜÕ/ÈÓÅ8üÕŸõ÷åÕŠ‹ÙÚéõbõáQw³nV²£ÑŽ"™‹RrÙ»v(P c¼ WøM½t\'ý:6ëÈ-“z½ǶkŒw ´ÛóåòPK¬Î|±Þ3FPKVkÕ4óŸiimeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:26:45en-GB9PT8M9SPKVkÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100qzº8†TÌy{Ë;ÉP„á`Ï‘¿ë}5Éö0ýX\²ŠA9ʦ_7~Ýõ×âõ·S¿3°dvá0|xä±E\Õퟕ–VÇløÞWüòÿ“;#¼Ùx^¡”BRC£[‡„Ê£·¼WÍ’ç+ æ3¶ÞI¿a!Z4aö¢ Õ6½?Þyž‰ô8^YlÓóãe¹Ø¥Â{—·I¸½¶ þÞé´Î°v³þ“šÓ~9k ?[”qGˆ}´ ¯½_od»èkÁ¾•‚¬1ÉQ.Œ×gÝ~«³ ´pÏÃíwÏ1ýJ?gX2Gja5O·Æ»ué,<»ç>*®èOÞÎq¶Ã‘ ÊˆüS¹æ×Œü Bp¹‘ÌhÈïëîÍ{¦7ñ0m0xºú¹¬sJhPK¿ O(@BPKWkÕ4 settings.xmlÝZmsâ6þÞ_‘ñL?yiâ ÜðÚ0G ½ë7a/ F–<’|„’1)ûâ“Q‡i>Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {s™~u}Sû/Èex­V­_”†¿¼Xf*sq}]¾¢¨‚i¯ì‹‚U¶§’=*pøºˆÂ°{Z ÉU8M53CüÎq0©9öàgŒ@ÔiÎP¿ÏÝ7ñ1ÐbLQ4aZJ¼äqIôZÀâ L…=!úsˆ)äŠ8‚™žfÿ€/û\]´.eÄÔ3d‡ÌˆÄâÑ€€h‘Z[ _ºê.G‹±zÔH¾{Ì# Gpˆ)’0bd˜m¨.È–—™ö®ªUS6‡²l¸(õÇ­Õ©·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MCaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqfmlXnþßÛÃ)ÚŽüf^„wâò•¯šÿ‚ç«^½¯Êâ\Å‹¡-r¾Ö¥ u-lÉÚÚ–­ßÔþò‡À‘dÜži¾t²¤Í–R¢§}“ñõ?àñÕHz-¦Gu ›Ûã–9÷º…VãoÆÂ'šQ0Ñ9ãâî¬$ïv:~É^ @Ÿ²m.Ä<)6~fÜÖŠ"²ž à]$Ññ‹¡6–ŠèDÇÂôy˜3 šcžêQ:žÛMG“â×zUåêsœrqý%Çâ¼=}h{í^ÏÕšc?!¬–iõݧèÓÛxµîÆŠWª¶+Òjæ\°™UÑq¤ªjÞa¡ëñèD9j´1'f/ߌJ‰å‰1 ™ÀÅD*2c™]ÖêWÆyXñ>1K-ÌØÜ#韚ӗ¦‡Ùgà´%0¢£˜ú2¶ÕÈ D2òi3öBÀÎÐyW@ù/6ºÞ]?Ÿ—¢œogtš ÷±4¬ ¸ÇAI¥ae:ŸÈÐ趦扄‰zŠíÚi‚­è¯ßYôhpbIÊ” CÁ3 €Q²¶`«@"æ0¥ƒ²´Ê1|›™„g΀÷Qf[h8™©"mÁQ´Çah+e'ñùGŒ–ûf/3ÆJ`T[ _Ó«˜¢õáTð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPKVkÕ4Ÿ.Ä++mimetypePKVkÕ4QConfigurations2/statusbar/PKVkÕ4'‰Configurations2/accelerator/current.xmlPKVkÕ4àConfigurations2/floater/PKVkÕ4Configurations2/popupmenu/PKVkÕ4NConfigurations2/progressbar/PKVkÕ4ˆConfigurations2/menubar/PKVkÕ4¾Configurations2/toolbar/PKVkÕ4ôConfigurations2/images/Bitmaps/PKVkÕ4rWè 1content.xmlPKVkÕ4¬Î|±Þ3F qstyles.xmlPKVkÕ4óŸii‡ meta.xmlPKVkÕ4¿ O(@BThumbnails/thumbnail.pngPKWkÕ49E~÷öÁ# œsettings.xmlPKWkÕ4³„ANÌMETA-INF/manifest.xmlPKîPmsm/vignettes/figures/dags/p5q1_6_7_11_12.ps0000644000176200001440000000661614471426252020070 0ustar liggesusers%!PS-Adobe-3.0 %%Pages: (atend) %%BoundingBox: 28 643 312 814 %%HiResBoundingBox: 28.300000 643.600000 311.800000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (pswrite) %%CreationDate: 2006/06/21 15:55:21 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_pswrite_2_0_1001 /GS_pswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<À ¾ú×Ýíw´%5<éßÁ)åJC~ªŒª)›¼ ;bZÈéd+Xlttº6=¸6ýEà7^0wZX6JÝIV›µ?ÑîsæŸíâE‚›,é&Jh”Í”ïi+’€qj%Ϩ•„Í–¢~ºÒ^Onz’­+†'ý{;JÚHS©)Q3+ /)3%ç‚›Mpö²0ïƒéVHúÛÜx¥ÑÊ™U¬/‡¸½}:¡jŠ1s(¥Kù-^1¿ÊG" ×´¦´¥Ø6•«ùÕÉ n|Q$_¤íÙüs¬7/Òý™LQ K:” ÌÄE(…ñDÝÙº`ÔÑ]àAàctÖݬ]’ÖÀ>]¯Õ޳®ñž¹3ÐWÎù]ì+)áŽéÓYs­gæõISiήiW%dÊØÕ›†SL”I/­&}tê$Aú\‹;Ta‹Öºï# íun¾ÄN›ò﫼³‚3‚o ­¶:š8˜–Ñ?ýófí~5¶æAÑ{‰»~8óŠ<'nñ/âY‘| ‹g±ªE‘¬Bdá#gº¬˜×ÒµÕuý]o¾™«ÿÙiÙò=­–e£{ »¼© t·S  ú"ù«¸ùPKü„l;kPKülÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæqúV;5 Ÿâ‰xl¡Ž-Ô±…z2-Ô±…:¶PÇêË"4¶PÇêiµP›=Δžõ áZKëD+ÏÙlPå)Lr_¦Î[4Žj¬ lâx‡š8{Äý&Nÿ²WµÅú.‡7|9¼§Y޶~¢Sß#j¬Aúþ|þ¬kp*U¹wbir¬«Çºz¬«O¡±®ëê±®ëê±®>m„ƺúèuµŠ¥ýÊzw¼|ç¡ã‚REh)ª†ÝBj¢3ô•ë£@\Þyùrþð 4g^œžÛ£aÕh‰Ñ‹ô^¤æµ°ò„l0º'ªåOºYË:Â!ÈýÇ"c”åì9âUïL ½JUw9ê«R­r+TµÔnšxm!m&[|ﺊWx}«$”°­1ìkw4ç ÐÿºrÌžCžtøZê€N­œ¯€È›«Kjåpy±Uúf¹ôŒ(”‘ú%üV>óQª_0Ò̸ßz÷4¬w[m/0é´>¥Œ3Døaã÷#-H÷~ñ[–¯ Ñ÷‚i…üokFspså§+ʱÃ?øêWî%ÓAj5~k! Y 8X"O×w[YBJù=,rªò'$ŠKέŒâØâD¶zÅã:ãv?P BŒ2.ÓÎ]ýz= OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:39:57en-GB7PT22M13SPKülÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100^òtq ©˜óöF4×!Gæ{ÿO]d–èéWÌ þ*ÛÆë{íàï}ïͯ•íÿÅðÇïƒ ³ O…dáímýÛæ>/Ú2·2/éWúÜ¢ªq7Í?ûrpÌrF%¶ …¤ñJó~&þO«®6/Oz¶½xý—éÁú¶†å[Òwø 0|`ðèÊ~áâp«×-Óuµ²uÖ]["`èpd”ACŽë±WEê”!`$3xºú¹¬sJhPK™ëWÛ PKülÕ4 settings.xmlÝZmsâ6þÞ_‘ñL?yiâ ÜðÚ0G ½ë7a/ F–<’|„’1)ûâ“Q‡i>Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {s™^«V+ þä2½V­_”†¿¼Xfjsq}]¾¢¨‚i¯ì‹‚U¶«’=*røºˆÂ°{Z ÉU8M53CüÎq0©9öàgŒ@ÔiÎP¿ÏÝ7ñ1ÐbLQ4aZJ¼äqIôZÀâ L…=!úsˆ)äŠ8‚™žfÿ€/û\]´.eÄÔ3d‡ÌˆÄâÑ€€h‘Z[ _ºê.G‹±zÔH¾{Ì# Gpˆ)’0bd˜m¨.È–—™ö®ªUS6‡²l¸(õÇ­Õ±·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MGaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqve_ºîþö#†AR´1Ô^×dž¸€|嫦UÅ¿àùª—C﫺8Wqãjh‹œ¯u)h] [²¶†¶eë7µ¿<Æ!p$·gš/] ,)H³¥”hjßd|ýx|µÃc ’&@‹éQ]Ãæ6¹e>…n¡×ø›±ð‰fTLEtθ¸;,É»Î_²Åçl› 1OªŸ¸µ¢ˆ¬§xItüj¨¥":ѱ0}挃昀§š”ŽçvÓá¤øµ^U‡¹ú§\\ɱ8oOÚÃ^»×sµæØO«eZ}÷)úô6`­»±â•ªíŠ´œ9lfÆE•t©²šwX¨ÇÅz@:QDŽZa'}̉ÙË7£ÒEbybLC&0G1‘ŠÌXfWµú•q^FV¼OÌR 36÷Hú§æô¥éaö8m Œè(¦¾Œmur‘Ì|ÚŒ½°3uÞÐFþ‹¶wWÆç祅(çÛ™&è}, «€‚îq@RiXÏ'24ú£­±y"a¢žb»vš`+úë—=œX’2%ÃPð (`”¬-Øêˆ9LéÁ¤,­r _g&á‡3à}ÆC”ÙN&FªH[p-ÇqÚJÙI|þ#‚å¾ÙË̱XàÕèõ*æ†h}8ÐÚÆ(a«ŠªC‰5ÍR"3rE*¥Àd?ÅPOE¼_½_Ñjµ ßCŒ}DÀNÓš@ÿ°ç6žF:¨ÔQN ŒˆÙ¡•ÛºßÉpó¾ÓüPK«!â±÷Ã#PKülÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPKülÕ4Ÿ.Ä++mimetypePKülÕ4QConfigurations2/statusbar/PKülÕ4'‰Configurations2/accelerator/current.xmlPKülÕ4àConfigurations2/floater/PKülÕ4Configurations2/popupmenu/PKülÕ4NConfigurations2/progressbar/PKülÕ4ˆConfigurations2/menubar/PKülÕ4¾Configurations2/toolbar/PKülÕ4ôConfigurations2/images/Bitmaps/PKülÕ4ü„l;k 1content.xmlPKülÕ4M¶•êæqF ¥styles.xmlPKülÕ4XƒFakkà meta.xmlPKülÕ4™ëWÛ TThumbnails/thumbnail.pngPKülÕ4«!â±÷Ã# usettings.xmlPKülÕ4³„AN¦META-INF/manifest.xmlPKî*msm/vignettes/figures/dags/p4q159.pdf0000644000176200001440000000263314471426252017111 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xœ}QËjÄ0 ¼ü:ïAø%Gù‚Boíú}PÒB÷²¿_Û²ï6”ÐàÑŒ4rpµæ\ùh%LÀ)Àå^NðmkÏB¹–ÿ<|ZCXh/kclõ­d±¦¹ÂèÛ¬ù°ælÍÓm¿8ô*î“×Z5ýÊuÜÔyC`v‘].ïe`¢úÎT†­ó§Œ¹À€TWèˆ ¥ ‰ºAÑz;Í©t×]©EÑÙçÙ³ï¡L#†á©H> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152615+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000501 00000 n 0000000021 00000 n 0000000377 00000 n 0000000686 00000 n 0000000403 00000 n 0000000430 00000 n 0000000822 00000 n 0000000881 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ <30714F62D20957CAE82C55C9381F3FD8> <30714F62D20957CAE82C55C9381F3FD8> ] >> startxref 1071 %%EOF msm/vignettes/figures/dags/p5q1_4_6_8_11_12_16.ps0000644000176200001440000000724114471426252020615 0ustar liggesusers%!PS-Adobe-3.0 %%Pages: (atend) %%BoundingBox: 28 643 539 814 %%HiResBoundingBox: 28.300000 643.600000 538.600000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (pswrite) %%CreationDate: 2006/06/21 15:55:21 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_pswrite_2_0_1001 /GS_pswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> stream xœ}TËn1 ¼¯”ð™C”÷ã *õF9ô úP•Ê…ßÇŽ“l²,B²ÙñŒ=ö¢à&–?PøñÙKɸ~Àû~Ţʃ·†Üðû ~Ä⃌}„‹XL’¶Äg(aÒVR’ü2 ×Åò-–“XŽÜ:*©¹vºUÇSçDíNYÅu‚Q…g¹~aÃÞÓóä±Yêß05ÒÓ5KÁl€ž¹>£+Uue*VTôiÔ¬s4¤¶Vš®Ù2Ö¡;šäåJãd7Všd¥ï{âYxQ%næY­eÚdm¡àŸ…Ù¨ V±!µ à¸ñ:ãqÊ9«¸N°¿°ÊÙ¦¶Auë8fãFØŽqu®•e´yÇ;œÅs¸´UsÚÏM©R\²ŠœyJWÛé*sÔè ¥ŒÈ-ŸF6HbªÙ ݙЙuÛTHPry{‹CóI݇:Y,Yæ[œæ|¼ÿéU-ÿÄã¶Š£AåCA²†ÁEø®?{ù ¸¹èD7ô\±›ŠÅÄrÓÁâdp^·õÌÒé¶™Å7µ#Üvlþ^endstream endobj 3 0 obj 409 endobj 5 0 obj << >> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152535+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000639 00000 n 0000000021 00000 n 0000000515 00000 n 0000000824 00000 n 0000000541 00000 n 0000000568 00000 n 0000000960 00000 n 0000001019 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ <9D5AA8DE0D7CBF3727E646EC8D851B8E> <9D5AA8DE0D7CBF3727E646EC8D851B8E> ] >> startxref 1209 %%EOF msm/vignettes/figures/dags/p5q1_6_11_16.ps0000644000176200001440000000652214471426252017642 0ustar liggesusers%!PS-Adobe-3.0 %%Pages: (atend) %%BoundingBox: 28 757 539 814 %%HiResBoundingBox: 28.300000 757.000000 538.600000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (pswrite) %%CreationDate: 2006/06/21 15:55:21 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_pswrite_2_0_1001 /GS_pswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<°MpSglR·KbøÞƒÇãa’Íý±©*|%ËU´ œˆœñr}ÿö%¾îw6¢(¡Y.Ⱦ¡\ÇDp ß `s•õÕm´—<X1•qÜP•i’‰–ò‘•ùèÌÎÕ÷(}ªƒéì³5=êP²ÁN¸ø9|f öÙ¹Ä](Ù`ÁTŸ^ˆPòQÕq!Àõ¦Åš½Rq¬ÙF•Öm†P×uËn½²DÉÝݲU'˜8\»—µEåÑššÉJ– ± Õ8TŸÁú’ø¾y¦2جñÅ®¶’*€ÀrM0Ãò9“|ÊàtÊ›I…epÎ,x•u•uîs¬«™ý½EP´ç\É&t.ƒXE$kƒ—Ù£}¾ÂI5„þ°[¹éjõõmÝ]…w’i*=8¹ '¸&ÎqѼeàˆ˜LäÝ!2F¨BŠú²«|vè_IE|³ßƒcÆ•ÆüìŒjX¼ € -æ,8 ëá5=¹vãEÐo¼B®ïµ0lÛ“¬v›þDÛÏEÿl&ßFy›DCGAù ºúwcÜâ’FhžZÊ j)q[12v·XšëÉ6âžd|ͱ̣qÜ·LšQµ0²‚Õ`96Áv˜ËÆÃq%$û 7®c\³Ì 0‹Éåw0Ñ3ªay^Û!oI×Ö—¾ãú,_¨.¼šâŽå楲Z¦¤‰&uÈÅ6ú$¥è.úßbýs“ž.2¦`»hgëñM(„ñJÝżh6ÑCáYä'×¢»ÛØEš÷Ëíµšv2àï™=ƒ¹ TØäµÏ´ÀûZGÃ’}9€= Î×IžÆJOæ†/±×à١̆ý³»gÚee¥½Ž#œóñùÔ?ï6öGSkŒrŠþ—¸›??|è[âÒ¿wLüÉ¡‘.]ó˜n£µ«¥cíB›ô^ÚÖ¾¶dªíÆ×–\Ó†\ŠÏçÀ%Mòfþì~PKé6ÏS PKSÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæÀþß)iÇ&èØ› 'ƒÐØ› ctl‚¾,Bctl‚žV´Ù¥,AéY®5¥N´vœÍÕŽÂ$÷%lê¼ã¨ÖÈÀ6Œw¨ ³GÜoÃô/\Uc«ïrx×Ã{šåhë:õM Æ„¡ïÏçϺ§RW{'–&Ǻz¬«Çºúdëê±®ëê±®ëêÓFh¬«^W«XÚ¯¬wÇË·:®U„–¢jØ=¢&:ÓA_šn0 Äõ›—/çï¿@sæuÁé¹ý1V–½Hàå@j^ì*obAÈá{¢Zþd¡›µÜ‰#‚Ü,¢1FYΞ#^õÎÔÐËPu—£¾ìÔ*׸UK=ஈ×Òö΋´ÅGñ¶ªx ×·JB ÛþvGsÞý¯+Çlá9äI‡/–èÔÊù ˆ¼¹ºfV—WS¥o–KÏ€B©_£`å3¥ú!ÍŒû­wOÃz·Õö“NëSÊ8C„6~?Ò‚t/á¿æ` ù }p/˜VÈÿ¶f47W~º¢,;üƒ/oé^2¤Vã×’¥€ƒ%òt}K±•%¤”ßÃ"§*¢¸¦ÜÊ Ž-Nd«W<®3n÷µ Ä(ã2íÜÕ/ÈÓÅ8üÕŸõ÷åÕŠ‹ÙÚéõbõáQw³nV²£ÑŽ"™‹RrÙ»v(P c¼ WøM½t\'ý:6ëÈ-“z½ǶkŒw ´ÛóåòPK¬Î|±Þ3FPK OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:33:57en-GB6PT4M45SPKÄ–žÝgw½Ú]s÷ù5$gß ÌhéW3 > 0]4œé¤_¹q>7¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷Ãê-œ¬}ï÷ü…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {s™ ^ÿT«–Fÿr™_«Uë¥áï/–™êß\\_…¯„(ª`À+û¢`•í«d ¾.¢0¬Áž–BrNS‡EÍÌ¿q DjŽ=øcušsD”ÁïsF÷M| ôSM˜–’/y\}„ð€øSaOˆþb ¹"Ž`¦§ÙßàË>W­K1õ Ù!3"±¸G4 Zd…ÖÃW‡®ú£ËÑb¬5’ïóèbŠ$ŒY'fª ²¥Åe¦½«ªaRˆCY6\”úcˆÖêÜÛÇG®/ÛJ ¾všn៛†™.#•"%:m†ÌàcUÜ¡YKªü?³áÀGÖa„ªX>ØŸcüÃÇ_çê/êÞ?)—Œ«GÇð¹Q  ~TàHBáL1m¼Hó¤•ÔØe±òa‡`ÿe¯²àÜ3¾ ‹D@g‰èžÙ¦¥°@gLpbü™­²}|i˜Þ•Y´ƒÇR¹ñýÈLRºaøl¡™™—ᆸ€|嫦eÅ¿àùª—Cï«Â8Wqãrh‹œ¯u)h] [²¶†¶eë7µ¿>Æ!p$·gš¯] ,©H³¥”èjßd|ûx|³Ãc ’.@‹éQ]Äæv¹eN>…n¡Ùø‹±ð‰f”LEtθ¸;-É»`²Å'm› 1OÊŸ¹µ¢ˆ¬§xItür¨¥":ѱ0}æÌƒæ˜€§º”ŽçvÓñ¤øµ^U§¹ú§\\ɱ8oOÚÃ^»×sµæØO«eZ}÷)úô6b­»±â•ªíŠ´ž9lfÆEÕt©ºšwX¨ÆzD:QDŽZb'̉ÙË7£ÒEbybLC&0G1‘ŠÌXf—µú•q^FV¼OÌR 36÷Hú§æô¥éaö8m Œè(¦¾Œmµr‘ }ÚŒ½°3vÞÐFþ‹¾wWÆ襅(çÛž&è}, «€‚îq@RiX™Ï'24ú£­¹y"a¢žb»vš`+úë·=œX’2%ÃPð (`”¬-Øêˆ9LéÁ¨,­r ßg&á‡3à}ÆC”ÙN&FªH[p-ÇqÚJÙI|þ#‚å¾ÙË ²XàÕèWõ*æ†h}8ÑÚÆ(a«ŠªC‰5ÍR"3rE*¥Àh?ÅPOE¼_½aÑjµ _DŒ}DÀNÓš@ÿ°ç6žF:¨ÔQN ŒˆÙ¡•ÛºßÊpó¾ƒÓüPK .0øÅ#PKTð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPK> stream xœ}QKjC1 Ü|­³–ÿ>A¡»4‹œ Êk¡Ùäú•äØñ£¡<ÌàÑÌXvpµæ©%ŒP£‡Ë+œðmÓƒ—§.¹òÿ ŸÖ¤ŒJ*ðe¯o °R@!5­° æÜf͇5'k޼©8¤aN‘Æt<<©U©»c7Ý4ø/…#ä0K7츗uŽ/2÷lÈVƒ5§ïìò>»·†I¯z¦¹+«Î¯A*Ý€½Þëö¥ÒÝ&b›ÒÓ(²B|w–µ€Â"k:ÌU“¦æAÌ­Å´ ¬S¼ ZŸ?GÅâÀX¹ßúÔ‚tw}¯bAR0ùt„_b }®endstream endobj 3 0 obj 252 endobj 5 0 obj << >> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152716+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000482 00000 n 0000000021 00000 n 0000000358 00000 n 0000000667 00000 n 0000000384 00000 n 0000000411 00000 n 0000000803 00000 n 0000000862 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ <9BE3F9135CD5B57B7682B0B733769DBE> <9BE3F9135CD5B57B7682B0B733769DBE> ] >> startxref 1052 %%EOF msm/vignettes/figures/dags/p3q16.ps0000644000176200001440000000620014471426252016663 0ustar liggesusers%!PS-Adobe-3.0 %%Pages: (atend) %%BoundingBox: 28 643 199 814 %%HiResBoundingBox: 28.300000 643.600000 198.400000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (pswrite) %%CreationDate: 2006/06/21 15:30:10 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_pswrite_2_0_1001 /GS_pswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<šP +♺‹}ÑdE¢8úÁPºÛµMÒ°K×i5ãl0 <3Ûƒ¹ TØÊæ¾Ðï KJJôå¶¼¯£zx8Í4øhî`ø; ží«|8?{zf\SVÕ: ÏOÏàì ž·kû£©3FyEï%î:—ýÏâ®ß¿ÊèKâ–"î¹£r›ÃàÊ«Z†²–Nï….#æu}œÖ…|k›Ó·5%šøŸ²ý PKÉÖ€—è PK-kÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæÀþß)iÇ&èØ› 'ƒÐØ› ctl‚¾,Bctl‚žV´Ù¥,AéY®5¥N´vœÍÕŽÂ$÷%lê¼ã¨ÖÈÀ6Œw¨ ³GÜoÃô/\Uc«ïrx×Ã{šåhë:õM Æ„¡ïÏçϺ§RW{'–&Ǻz¬«Çºúdëê±®ëê±®ëêÓFh¬«^W«XÚ¯¬wÇË·:®U„–¢jØ=¢&:ÓA_šn0 Äõ›—/çï¿@sæuÁé¹ý1V–½Hàå@j^ì*obAÈá{¢Zþd¡›µÜ‰#‚Ü,¢1FYΞ#^õÎÔÐËPu—£¾ìÔ*׸UK=ஈ×Òö΋´ÅGñ¶ªx ×·JB ÛþvGsÞý¯+Çlá9äI‡/–èÔÊù ˆ¼¹ºfV—WS¥o–KÏ€B©_£`å3¥ú!ÍŒû­wOÃz·Õö“NëSÊ8C„6~?Ò‚t/á¿æ` ù }p/˜VÈÿ¶f47W~º¢,;üƒ/oé^2¤Vã×’¥€ƒ%òt}K±•%¤”ßÃ"§*¢¸¦ÜÊ Ž-Nd«W<®3n÷µ Ä(ã2íÜÕ/ÈÓÅ8üÕŸõ÷åÕŠ‹ÙÚéõbõáQw³nV²£ÑŽ"™‹RrÙ»v(P c¼ WøM½t\'ý:6ëÈ-“z½ǶkŒw ´ÛóåòPK¬Î|±Þ3FPK-kÕ4‰¯T¨jjmeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:25:26en-GB8PT6M50SPK-kÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100q{º8†TÌy{ëtÞ!‡ƒnþ×ÏÜÆ]æ¢õôV zØš€#{åwÞ}ÿÿß¶ÛWùüvá0t8Ò°V°ÿqE¦è×­/¬Âl½O~›øã²Áz¶ÿç}–3*±uH($5t9?öÆnx^éÂx=Z*ð€í<·9rÖÜ/TÒî½ô¨y^ñFgAàÎc?J²¸îæ›,j¸.Ñ­ñ ÔM‰«bíĦ¸Ó<ÒNqé9‰ÊOJݶKôOè??ùþÙ—;öÛÊU©6ÓÚûvÛ±ËÂö÷n~y•»½Ò;ßðÿ»ìO|Ývç ÷Žiå9L732»ðÜ»èyfÏZÁ·â× æ":Ê`œÏ2¹#‡eŸ€ 0u0xºú¹¬sJhPKÓž«rBDPK-kÕ4 settings.xmlÝZmsâ6þÞ_‘ñL?yiâ ÜðÚ0G ½ë7a/ F–<’|„’1)ûâ“Q‡i>Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {s™~u}Sû/Èex­V­_”†¿¼Xf*sq}]¾¢¨‚i¯ì‹‚U¶§’=*pøºˆÂ°{Z ÉU8M53CüÎq0©9öàgŒ@ÔiÎP¿ÏÝ7ñ1ÐbLQ4aZJ¼äqIôZÀâ L…=!úsˆ)äŠ8‚™žfÿ€/û\]´.eÄÔ3d‡ÌˆÄâÑ€€h‘Z[ _ºê.G‹±zÔH¾{Ì# Gpˆ)’0bd˜m¨.È–—™ö®ªUS6‡²l¸(õÇ­Õ©·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MCaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqfmlXnþßÛÃ)ÚŽüf^„wâò•¯šÿ‚ç«^½¯Êâ\Å‹¡-r¾Ö¥ u-lÉÚÚ–­ßÔþò‡À‘dÜži¾t²¤Í–R¢§}“ñõ?àñÕHz-¦Gu ›Ûã–9÷º…VãoÆÂ'šQ0Ñ9ãâî¬$ïv:~É^ @Ÿ²m.Ä<)6~fÜÖŠ"²ž à]$Ññ‹¡6–ŠèDÇÂôy˜3 šcžêQ:žÛMG“â×zUåêsœrqý%Çâ¼=}h{í^ÏÕšc?!¬–iõݧèÓÛxµîÆŠWª¶+Òjæ\°™UÑq¤ªjÞa¡ëñèD9j´1'f/ߌJ‰å‰1 ™ÀÅD*2c™]ÖêWÆyXñ>1K-ÌØÜ#韚ӗ¦‡Ùgà´%0¢£˜ú2¶ÕÈ D2òi3öBÀÎÐyW@ù/6ºÞ]?Ÿ—¢œogtš ÷±4¬ ¸ÇAI¥ae:ŸÈÐ趦扄‰zŠíÚi‚­è¯ßYôhpbIÊ” CÁ3 €Q²¶`«@"æ0¥ƒ²´Ê1|›™„g΀÷Qf[h8™©"mÁQ´Çah+e'ñùGŒ–ûf/3ÆJ`T[ _Ó«˜¢õáTð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPK-kÕ4Ÿ.Ä++mimetypePK-kÕ4QConfigurations2/statusbar/PK-kÕ4'‰Configurations2/accelerator/current.xmlPK-kÕ4àConfigurations2/floater/PK-kÕ4Configurations2/popupmenu/PK-kÕ4NConfigurations2/progressbar/PK-kÕ4ˆConfigurations2/menubar/PK-kÕ4¾Configurations2/toolbar/PK-kÕ4ôConfigurations2/images/Bitmaps/PK-kÕ4ÉÖ€—è 1content.xmlPK-kÕ4¬Î|±Þ3F qstyles.xmlPK-kÕ4‰¯T¨jj‡ meta.xmlPK-kÕ4Óž«rBDThumbnails/thumbnail.pngPK-kÕ49E~÷öÁ# Ÿsettings.xmlPK-kÕ4³„ANÏMETA-INF/manifest.xmlPKîSmsm/vignettes/figures/dags/p5q1_6_11_16.pdf0000644000176200001440000000271414471426252017770 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xœ}RËnÄ ¼#ñ>ïÅ€‰ó•zk÷Ð/èCUZ©{Ùß_À˜Ý¨Š"yÄ0öŒ™àjÍLù£…\Ž.ïðv‚_k¦zðú$”kþŸáÛJn†™fø±Æ³ µ^¡–ŒÁÀ4–Bè÷Vk¾¬9[óò óäPÅ1¢Þ©U.ãîPãu±‹x¹|æ‰Ê9S¶Ì“KzGÅBCœ) Ô²ÖÇiL¥uÝ”j}{6ÊÄœï=IÏ‘zгd¹ÉD·Œ ï¢ôõ=‰YT­5¼€èøéBUàŸ……%•)¤KH¬7@jÕž²Ë=j¼.p¼°¦©®CšztRKp#í ¸ækSc~ÌŽpjfrdÔ AjõAó{Ù£öÖ»À±«¦©óÄ9Ô·$¾‰³‘zà¬e¹)¶´…—­¾.endstream endobj 3 0 obj 320 endobj 5 0 obj << >> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621155455+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000550 00000 n 0000000021 00000 n 0000000426 00000 n 0000000735 00000 n 0000000452 00000 n 0000000479 00000 n 0000000871 00000 n 0000000930 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ <3C103CC8F41886FCB09AD9858B892A3F> <3C103CC8F41886FCB09AD9858B892A3F> ] >> startxref 1120 %%EOF msm/vignettes/figures/dags/p3q135.odg0000644000176200001440000001715314471426252017105 0ustar liggesusersPK2lÕ4Ÿ.Ä++mimetypeapplication/vnd.oasis.opendocument.graphicsPK2lÕ4Configurations2/statusbar/PK2lÕ4'Configurations2/accelerator/current.xmlPKPK2lÕ4Configurations2/floater/PK2lÕ4Configurations2/popupmenu/PK2lÕ4Configurations2/progressbar/PK2lÕ4Configurations2/menubar/PK2lÕ4Configurations2/toolbar/PK2lÕ4Configurations2/images/Bitmaps/PK2lÕ4 content.xmlÍW]oÛ }߯ˆüî;­´ZIªIÓžZ©Ò6i¯°ŠÁ'ûõ»àà¦n­Iíö’î9æÜÃå’ln•X˜6\Ém”,WÑ‚I¢(—Å6úùã[ü9ºÝ}Ú¨<ç„eT‘}Ť‰’¾À–&k£Ûh¯e¦°á&“¸b&³$S5“=+ Ñ™_«1ö$fÓ=8d[v´sÉ;ââÇù+{pȦ7sÉ ¦†ô\Í%ˆs®W5¶ü™Š£àòi•ÖÖBMÓ,›õRé%777ÈGÁdÀÕ{-<ŠÄs‹”,Ôc+fñ\}J’ûê‘éÙÖ`‹/vµÖÌÒu…9ïE!gT_‡bvuŠ ›I‰õì:óàq©¬éüRYÓ[a[NìïgtAÿqw®+]Í]ËaGVÍëÙi¶è¯”¤:B{ؽÜtµºBí8@7¯ÂÍ-Óœ¼ 'XÁqU½dàˆ˜\ɇÈa&)jÃØÐÉWÿº¿ûNJVá3˜¿ ޹4˳3¦âbö.v¢h±ä³KÁaƒ£ÓµéÑݰë/‚vã &ðÞ*Ç&±?Éf·iO´ÿ\´ÏnñmDë$ê&r ÊO0ÕöƸÆ‹Ð4µÐÔBãºä¤Ÿ®±vדÄ-ÉùJ±¦QÿÞŽ×LЖ3³p²œ °\* ›à'ÜeïÃq©4ÿ 71¼3¬âêrŒ;¸×‘3ªâ” Ÿ Rz-¿ôó«°~b¸Ðšâ†S×TVË”TÑ(u±¾h­š‹ù—XnÒÃE €)Ø'=X0Ì„&äÊ‹x¦îb]4YÑ]àQÑÓ0èJw·ñIºnÓmµºqÒî™?¹TøÊïb_YŽ÷žϚo= ߨϚr8»Ð®r, ”k¬kqŠ)3^\)Êú0êÔiF쥨†-•ÖCøä®søR{ öЬ+_n\2^”6˜8BËèŸOíónãÕÎóAÑ¿wý?‹[â®ß?ðØKâÒ¿wLÂÅ×ö£ŽièZÚÇ.´9Aï¥í:Ô–Žµ­CméÇk» µ”¥¡²õ´.4t‘s: õ4ñ—l÷PKÙ–ïñ;Ó PK2lÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæÀþß)iÇ&èØ› 'ƒÐØ› ctl‚¾,Bctl‚žV´Ù¥,AéY®5¥N´vœÍÕŽÂ$÷%lê¼ã¨ÖÈÀ6Œw¨ ³GÜoÃô/\Uc«ïrx×Ã{šåhë:õM Æ„¡ïÏçϺ§RW{'–&Ǻz¬«Çºúdëê±®ëê±®ëêÓFh¬«^W«XÚ¯¬wÇË·:®U„–¢jØ=¢&:ÓA_šn0 Äõ›—/çï¿@sæuÁé¹ý1V–½Hàå@j^ì*obAÈá{¢Zþd¡›µÜ‰#‚Ü,¢1FYΞ#^õÎÔÐËPu—£¾ìÔ*׸UK=ஈ×Òö΋´ÅGñ¶ªx ×·JB ÛþvGsÞý¯+Çlá9äI‡/–èÔÊù ˆ¼¹ºfV—WS¥o–KÏ€B©_£`å3¥ú!ÍŒû­wOÃz·Õö“NëSÊ8C„6~?Ò‚t/á¿æ` ù }p/˜VÈÿ¶f47W~º¢,;üƒ/oé^2¤Vã×’¥€ƒ%òt}K±•%¤”ßÃ"§*¢¸¦ÜÊ Ž-Nd«W<®3n÷µ Ä(ã2íÜÕ/ÈÓÅ8üÕŸõ÷åÕŠ‹ÙÚéõbõáQw³nV²£ÑŽ"™‹RrÙ»v(P c¼ WøM½t\'ý:6ëÈ-“z½ǶkŒw ´ÛóåòPK¬Î|±Þ3FPK2lÕ40>7‰llmeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:33:35en-GB11PT13M17SPK2lÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100~òtq ©˜óöÖíUM [þýŸ¾öž°×qãyw£ú…”rÒfx/Íÿ“ÿý¦üB%¶ …¤·;NoªÙz«R¯oš]ùµêú»Ï<æÈ>»ýýŸÑåÌ:ÜÎÆ8+ÍRzn4¬¾¡Õ„^š$?Š\|,Cæ}î‘Íçtæ¶ÎK¾^òKÊ·)æøºŽõ NqÇßµöN¸^˜QªõÄTæ^‡åý g÷MøÌsû ·åù ÂÒŠÏ%êÞ¨=¹o-SøZ"÷õÎwå(èZÑÁq”ñàüaFg½V÷Žß3ý˜]x Ž0Ž2Ž4°Z[PòsC‚?00xºú¹¬sJhPK¼Ï=%+PK2lÕ4 settings.xmlÝZmsâ6þÞ_‘ñL?yiâ ÜðÚ0G ½ë7a/ F–<’|„’1)ûâ“Q‡i>Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {si ü/Èez­V­_”†¿¼Xfjsq}]¾¢¨‚i¯ì‹‚U¶«’=*røºˆÂ°{Z ÉU8M53CüÎq0©9öàgŒ@ÔiÎP¿ÏÝ7ñ1ÐbLQ4aZJ¼äqIôZÀâ L…=!úsˆ)äŠ8‚™žfÿ€/û\]´.eÄÔ3d‡ÌˆÄâÑ€€h‘Z[ _ºê.G‹±zÔH¾{Ì# Gpˆ)’0bd˜m¨.È–—™ö®ªUS6‡²l¸(õÇ­Õ±·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MGaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqfmlXnþïûà )Úüf^…wâò•¯šVÿ‚ç«^½¯êâ\Å«¡-r¾Ö¥ u1lÉÚÚ–­ßÔþò‡À‘dÜži¾t²¤ Í–R¢©}“ñõ?àñÕHš-¦Gu ›Ûä–9øº…^ãoÆÂ'šQ1Ñ9ãâî°$ïv:É^ @Ÿ³m.Ä<©6~fàÖŠ"²ž à]$Ññ«¡6–ŠèDÇÂôy˜3šcžjR:žÛM‡“â×zUæêsœrqý%Çâ¼=}h{í^ÏÕšc?!¬–iõݧèÓÛ€µîÆŠWª¶+Òræ\°™UÒq¤ÊjÞa¡ëéD9j…ô1'f/ߌJ‰å‰1 ™ÀÅD*2c™]ÖêWÆyXñ>1K-ÌØÜ#韚ӗ¦‡Ùgà´%0¢£˜ú2¶ÕÉ D2ói3öBÀÎÔyW@ù/6ÚÞ]?œŸ—¢œogvš ÷±4¬ ¸ÇAI¥ae<ŸÈÐè¶Ææ‰„‰zŠíÚi‚­è¯_ZôhpbIÊ” CÁ3 €Q²¶`«@"æ0¥“²´Ê1|™„g΀÷Qf[h8™©"mÁQ´Çah+e'ñùGŒ–ûf/3ÇJ`T[ _Ô«˜¢õá@k£„­*ªe$Ö4K‰ÌÈ©”“ýC=ñ~qôþ}E«Õ2|1ö;MkýÞÛxê RGa80"f‡Vngè|'ÃÍûNó;PK'f§áñÃ#PK2lÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPK2lÕ4Ÿ.Ä++mimetypePK2lÕ4QConfigurations2/statusbar/PK2lÕ4'‰Configurations2/accelerator/current.xmlPK2lÕ4àConfigurations2/floater/PK2lÕ4Configurations2/popupmenu/PK2lÕ4NConfigurations2/progressbar/PK2lÕ4ˆConfigurations2/menubar/PK2lÕ4¾Configurations2/toolbar/PK2lÕ4ôConfigurations2/images/Bitmaps/PK2lÕ4Ù–ïñ;Ó 1content.xmlPK2lÕ4¬Î|±Þ3F ¥styles.xmlPK2lÕ40>7‰ll» meta.xmlPK2lÕ4¼Ï=%+MThumbnails/thumbnail.pngPK2lÕ4'f§áñÃ# ¸settings.xmlPK2lÕ4³„ANãMETA-INF/manifest.xmlPKîgmsm/vignettes/figures/dags/p2q1.pdf0000644000176200001440000000247014471426252016730 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xœe= Ã0 …wï 9ƒ°l«VNPèÖvè úCI Í’ëÇŽc7¥ƒ~úžd‹“Út¤ ¨ÁáxÅK‡ovy8í‹eJ÷€ŒO²£ˆQ"¾ 8%¿Ô.¥²§,T¶e1´¾ÁÀÃÀÙÀñÍÑW8®XêÊä^ó¸?jõ5À6¥ì2ÞS% ›#¼'—¤#Éͫ҄¨‘Å:`bݺí¯ä½¾˜@}³æLœó B‡endstream endobj 3 0 obj 173 endobj 5 0 obj << >> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152908+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000403 00000 n 0000000021 00000 n 0000000279 00000 n 0000000588 00000 n 0000000305 00000 n 0000000332 00000 n 0000000724 00000 n 0000000783 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ <6E0EC88F90721DE09933C42F4A56F82D> <6E0EC88F90721DE09933C42F4A56F82D> ] >> startxref 973 %%EOF msm/vignettes/figures/dags/p5q1_4_6_8_11_12_16.pdf0000644000176200001440000000316014471426252020740 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xœ}TIn1 ¼7ÐÐÙA»Ô/›3‡¼ ‚±ûâï›I55­ƒDt©ŠÅEÎ|ìÛ›qðËG¶É´Ìû/óóɼî›ë~|#Èü¿oþí[.¶šš«yÙ·Ðlìç»éÇæ£Å e}$À¸wß·¿ûvÛ·ç ·¯Îz!÷ÉË CgáôGÃt§ˆqƒ@«—÷?pÎø½eHóOŃÍh£ˆôn€ë÷“® «žL½Œ¾iMö!H£ CS"ÒÔÐ…&Öò¤IöЂ¥ -Ú<úD^¨Qý,Å‹ÞÛöIC…à‹†Å£`¤K“†Î›B—sĸA°nsŠëXÜ(©p¶(û:Yt™¯µËÞq‚NÍK††Îâ#Çó2G<ëƒ`íŠ9%ŸTcŸ%ò%9ÓÐ…3®åɤ‡öSQR„TÇ\P8&Þ¹~™k6EŒœyzVëE+“çE †^*\–Q…"KÐ…Ã齋@S—½-6»§Ë‚0.³t`o\ÙGŸ×ÍÖÞ„f¸tÑ£õzÍu…UÂÝ)øŒè„.ôæMelíÍŸuCpˆ}íä)§üν»®Ã´µÀ“W¹åÒÂèqŤi¨WGC5tÕB½OÈãuŸÍ'== endstream endobj 3 0 obj 484 endobj 5 0 obj << >> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152514+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000714 00000 n 0000000021 00000 n 0000000590 00000 n 0000000899 00000 n 0000000616 00000 n 0000000643 00000 n 0000001035 00000 n 0000001094 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ ] >> startxref 1284 %%EOF msm/vignettes/figures/dags/p3q124.odg0000644000176200001440000001720114471426252017075 0ustar liggesusersPKŽkÕ4Ÿ.Ä++mimetypeapplication/vnd.oasis.opendocument.graphicsPKŽkÕ4Configurations2/statusbar/PKŽkÕ4'Configurations2/accelerator/current.xmlPKPKŽkÕ4Configurations2/floater/PKŽkÕ4Configurations2/popupmenu/PKŽkÕ4Configurations2/progressbar/PKŽkÕ4Configurations2/menubar/PKŽkÕ4Configurations2/toolbar/PKŽkÕ4Configurations2/images/Bitmaps/PKŽkÕ4 content.xmlÍW]oÛ }߯ˆüî;íÔZIªIÓžZ©Ò6i¯°ŠÁ'ûõ»àà&i­MÝö’î9æÜÃå’¬îö•˜í˜6\Éu”ÌÑŒI¢(—Å:úþíK|Ým>¬TžsÂ2ªÈ¶bÒÆDI ß3`K“µÑu´Õ2SØp“I\1“Y’©šÉž•…è̯ÕÎ{“é²-ÛÛ©d‡qñÓô•=8dS›©d‡SCz®¦’÷FĹ׫[þBÅ^pù¼ŽJkë ¡¦iæÍr®t’ÛÛ[䣃`2àê­E b‚¹Å Jæ ê±³xª>‡ %ÉmõÄôdk°Å'»ZkféºÂœö¢3ª¯]1¹ºvÅ›I‰õä:óàq©,éôRYÒ[a[^ØßôAÿñp¬+]M]ËaGVÍëÉi¶è¯”¤:B{ؽÜt±¸Bí8@7¯ÂÍ-Óœ¼ 'XÁqU3 p DÌv®ä‡CäŒ0)jÃØÐ‹¯þñpÿ•”¬ÂG0si,–GgLÅÅä]셢ŒO.‡ ŽNצGwæ¿Ú7h˜À[«›Äþ$›Íª=ÑþsÖ>»Å×­“¨›È1(?ÀTÛã,B—©…>¡×%'ýtµ»žü nIÎWŠ5ú÷v”¸Ö`‚¶œ™™å\€åRIØ?á. xŽK¥ùO¸ñ°ˆ±à˜A`W—cÜνŽQ§TøŒPÒkù¥ï˜_…õ3ÓÀ…Ö7œº¦²˜§¤ŠFq¨‹uôIk՜̟cýu“OjLÁ>éÁ‚a&4!W^Ä u'뢋Ýž= ƒ®t7+Ÿ¤+à6ÝV«'ážù3Йk@…¯ü.ö™åx+ìñ¬ùÖ3óú¨)‡³ í*ÇÂ@¹¶Áº‡˜2éÅ•¢¬£NfÄžjñ‡jØ¢Qi=öî:‡/µµ`ÿ®ÈºRð…àÆ%ãEiƒ‰=´ŒþùÐ>oVþ÷Wí<ý+q×ÿ³¸e îú qð—þޏ}.ž„ªÒг´œèrbÞKWêZ†º®B]gýzO]ÿXºÇ±ÿ úºðWló PKèÇÖÙ3Ë PKŽkÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæÀþß)iÇ&èØ› 'ƒÐØ› ctl‚¾,Bctl‚žV´Ù¥,AéY®5¥N´vœÍÕŽÂ$÷%lê¼ã¨ÖÈÀ6Œw¨ ³GÜoÃô/\Uc«ïrx×Ã{šåhë:õM Æ„¡ïÏçϺ§RW{'–&Ǻz¬«Çºúdëê±®ëê±®ëêÓFh¬«^W«XÚ¯¬wÇË·:®U„–¢jØ=¢&:ÓA_šn0 Äõ›—/çï¿@sæuÁé¹ý1V–½Hàå@j^ì*obAÈá{¢Zþd¡›µÜ‰#‚Ü,¢1FYΞ#^õÎÔÐËPu—£¾ìÔ*׸UK=ஈ×Òö΋´ÅGñ¶ªx ×·JB ÛþvGsÞý¯+Çlá9äI‡/–èÔÊù ˆ¼¹ºfV—WS¥o–KÏ€B©_£`å3¥ú!ÍŒû­wOÃz·Õö“NëSÊ8C„6~?Ò‚t/á¿æ` ù }p/˜VÈÿ¶f47W~º¢,;üƒ/oé^2¤Vã×’¥€ƒ%òt}K±•%¤”ßÃ"§*¢¸¦ÜÊ Ž-Nd«W<®3n÷µ Ä(ã2íÜÕ/ÈÓÅ8üÕŸõ÷åÕŠ‹ÙÚéõbõáQw³nV²£ÑŽ"™‹RrÙ»v(P c¼ WøM½t\'ý:6ëÈ-“z½ǶkŒw ´ÛóåòPK¬Î|±Þ3FPKŽkÕ48ÜAÇiimeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:28:28en-GB9PT8M9SPKŽkÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100‰{º8†TÌy{ë`^“ƒˆÃÅI?þïÏy½(3éÇ™„*ÛôÕB‡zøP´7nÿûzïíû„ Ž02˹ÅLK½œ÷<½xËžOû"ÿ-Y}ÿHyûͪ;þi–¼Em.5©ÂIË-ÏOè`Ú;ý© X0Lùܬ3Žô|7x´¹÷”î¡{½gþ>ï“é¶Ÿ=ýòmWù¬2é×ó]œÀÔ·µ:y³ù’†Ç²·ææñj>iÏ7ŒÒ6‡åWâ´¸¾aöß­˜Î™—$Ë(ö‘Üý×/•ÅæøÃŽóÇ2úã„ËöÏWŸ5ûÜCM·†F%¶ …$8ã@fýãôyŠü­îs8~Gú1»ð@]=ÊhÈ7UššgyL° ˜R<]ý\Ö9%4PKP†FPPKŽkÕ4 settings.xmlÝZmsâ6þÞ_‘ñL?yiâ ÜðÚ0G ½ë7a/ F–<’|„’1)ûâ“Q‡i>Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {si ü/Èez­V­_”†¿¼Xfjsq}]¾¢¨‚i¯ì‹‚U¶«’=*røºˆÂ°{Z ÉU8M53CüÎq0©9öàgŒ@ÔiÎP¿ÏÝ7ñ1ÐbLQ4aZJ¼äqIôZÀâ L…=!úsˆ)äŠ8‚™žfÿ€/û\]´.eÄÔ3d‡ÌˆÄâÑ€€h‘Z[ _ºê.G‹±zÔH¾{Ì# Gpˆ)’0bd˜m¨.È–—™ö®ªUS6‡²l¸(õÇ­Õ±·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MGaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqfmlXnþïûà )Úüf^…wâò•¯šVÿ‚ç«^½¯êâ\Å«¡-r¾Ö¥ u1lÉÚÚ–­ßÔþò‡À‘dÜži¾t²¤ Í–R¢©}“ñõ?àñÕHš-¦Gu ›Ûä–9øº…^ãoÆÂ'šQ1Ñ9ãâî°$ïv:É^ @Ÿ³m.Ä<©6~fàÖŠ"²ž à]$Ññ«¡6–ŠèDÇÂôy˜3šcžjR:žÛM‡“â×zUæêsœrqý%Çâ¼=}h{í^ÏÕšc?!¬–iõݧèÓÛ€µîÆŠWª¶+Òræ\°™UÒq¤ÊjÞa¡ëéD9j…ô1'f/ߌJ‰å‰1 ™ÀÅD*2c™]ÖêWÆyXñ>1K-ÌØÜ#韚ӗ¦‡Ùgà´%0¢£˜ú2¶ÕÉ D2ói3öBÀÎÔyW@ù/6ÚÞ]?œŸ—¢œogvš ÷±4¬ ¸ÇAI¥ae<ŸÈÐè¶Ææ‰„‰zŠíÚi‚­è¯_ZôhpbIÊ” CÁ3 €Q²¶`«@"æ0¥“²´Ê1|™„g΀÷Qf[h8™©"mÁQ´Çah+e'ñùGŒ–ûf/3ÇJ`T[ _Ô«˜¢õá@k£„­*ªe$Ö4K‰ÌÈ©”“ýC=ñ~qôþ}E«Õ2|1ö;MkýÞÛxê RGa80"f‡Vngè|'ÃÍûNó;PK'f§áñÃ#PKŽkÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPKŽkÕ4Ÿ.Ä++mimetypePKŽkÕ4QConfigurations2/statusbar/PKŽkÕ4'‰Configurations2/accelerator/current.xmlPKŽkÕ4àConfigurations2/floater/PKŽkÕ4Configurations2/popupmenu/PKŽkÕ4NConfigurations2/progressbar/PKŽkÕ4ˆConfigurations2/menubar/PKŽkÕ4¾Configurations2/toolbar/PKŽkÕ4ôConfigurations2/images/Bitmaps/PKŽkÕ4èÇÖÙ3Ë 1content.xmlPKŽkÕ4¬Î|±Þ3F styles.xmlPKŽkÕ48ÜAÇii³ meta.xmlPKŽkÕ4P†FPBThumbnails/thumbnail.pngPKŽkÕ4'f§áñÃ# Îsettings.xmlPKŽkÕ4³„ANùMETA-INF/manifest.xmlPKî}msm/vignettes/figures/dags/p3q124.ps0000644000176200001440000000627014471426252016752 0ustar liggesusers%!PS-Adobe-3.0 %%Pages: (atend) %%BoundingBox: 28 643 199 814 %%HiResBoundingBox: 28.300000 643.600000 198.400000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (pswrite) %%CreationDate: 2006/06/21 15:30:09 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_pswrite_2_0_1001 /GS_pswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<;èæ"¼áDbîÀÑE8‚%êgÕ9Ó. âŽ|¿ˆ´b„0¶ÜƒE:úêß÷?P+x“ƒCB…„ô茨Hé= ;ZH‰w4ÖY:í6=86ÝA`'^€¾n%Ólš•,6k»¢ÍïÄÞëΓ ­£ mÈ R~PMvo k˜ãŒSs~BÍ9¬ ‚ºær}<™‡Ð’´¯)äiн·¥„5W&pI°˜hqFJe9eTM‚iЇ…z ÆÉuâÁ2„%É•Hõ¢s9ÄíôëÐU‘4-͈€3¤K㛿áø*ÈŸ1W\µ5… Iõ¦2›ÎQ ê*Ið•sÖœ´Ÿc½»I'P¦@3èÞ‚¾Å5!cFÄ u'ý‚ÑD·…'–ú‡6º›µ¤°®ÕªŸ£ÖwÎÌhÍJ…I~[û†3¸-åq­™­gb6꣦L­]µ]e°*®¶X×å!L±Pà +–â® Zu#yªÅ,ª~ŠÑzì*%<èã\]ØV*ûwyÜFÁA?˜ä…töjËèîö~³6ß_µö¼WôQâ–¯§¾¡ð9qóÿ·’à¦ïSÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæqúV;5 Ÿâ‰xl¡Ž-Ô±…z2-Ô±…:¶PÇêË"4¶PÇêiµP›=Δžõ áZKëD+ÏÙlPå)Lr_¦Î[4Žj¬ lâx‡š8{Äý&Nÿ²WµÅú.‡7|9¼§Y޶~¢Sß#j¬Aúþ|þ¬kp*U¹wbir¬«Çºz¬«O¡±®ëê±®ëê±®>m„ƺúèuµŠ¥ýÊzw¼|ç¡ã‚REh)ª†ÝBj¢3ô•ë£@\Þyùrþð 4g^œžÛ£aÕh‰Ñ‹ô^¤æµ°ò„l0º'ªåOºYË:Â!ÈýÇ"c”åì9âUïL ½JUw9ê«R­r+TµÔnšxm!m&[|ﺊWx}«$”°­1ìkw4ç ÐÿºrÌžCžtøZê€N­œ¯€È›«Kjåpy±Uúf¹ôŒ(”‘ú%üV>óQª_0Ò̸ßz÷4¬w[m/0é´>¥Œ3Døaã÷#-H÷~ñ[–¯ Ñ÷‚i…üokFspså§+ʱÃ?øêWî%ÓAj5~k! Y 8X"O×w[YBJù=,rªò'$ŠKέŒâØâD¶zÅã:ãv?P BŒ2.ÓÎ]ýz= OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T14:41:37en-GB11PT23M52SPK2mÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100M÷tq ©˜óöÖí¼Å {¯üÿÿ´äwCË¢ó™„¢g;·øñ°}*Ýÿÿ“[ûúìrÂ]]Ylz+vß{[ö/¯/oýŸ»…ëKÖ,þ³K¨Þ›I ¶r‰«ˆ`Hñn—š§‡ö¥}ÿ¶¿Ð½ggÙå·B…W–¸÷TouXÿ¢„KCiAGC¼r_—aÒmÙ×þÊvq–ŸÌ¹+bóûÿüÛ{¬“Î/ü>뿆þ\¿åÍò†3çoüöã‚»åç¾b±ÂîÇ“ÿ5óùŒ«ÇÒÞÏHê ï2¿¹Åzîq›ÃK¶Ë|¶ñJžζºæþ˜Þð˜ÚâÝwÕåj÷ÆüfÝñêÕìÛÓê½Ï”¯;¶zý¾‰þ9÷vMo»çÃñ¼ì¤¾_–^5ÿ¾-}ùúw)ò‹õ%Çoò¿±?ð.ÛTý'%0¶¶¸}ÏÑŠã_? ?òå«5ÕZVóªæ™È{áï]?=Wç¿TWŽ+­m v=cåÊ ’å}Sãg˾Ý"hÿµ,±÷²Û™×]à€Pbe4ä»lµŒ¾.¿˜R<]ý\Ö9%4PKEÜ ÖÐPK2mÕ4 settings.xmlÝZmsâ6þÞ_‘ñL?yiâ ÜðÚ0G ½ë7a/ F–<’|„’1)ûâ“Q‡i>Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {s™~uq{[ü/Èez­V­_”†¿¼Xfjsq}]¾¢¨‚i¯ì‹‚U¶«’=*røºˆÂ°{Z ÉU8M53CüÎq0©9öàgŒ@ÔiÎP¿ÏÝ7ñ1ÐbLQ4aZJ¼äqIôZÀâ L…=!úsˆ)äŠ8‚™žfÿ€/û\]´.eÄÔ3d‡ÌˆÄâÑ€€h‘Z[ _ºê.G‹±zÔH¾{Ì# Gpˆ)’0bd˜m¨.È–—™ö®ªUS6‡²l¸(õÇ­Õ±·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MGaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqfmlXnþïûà )Úüf^…wâò•¯šVÿ‚ç«^½¯êâ\Å«¡-r¾Ö¥ u1lÉÚÚ–­ßÔþò‡À‘dÜži¾t²¤ Í–R¢©}“ñõ?àñÕHš-¦Gu ›Ûä–9øº…^ãoÆÂ'šQ1Ñ9ãâî°$ïv:É^ @Ÿ³m.Ä<©6~fàÖŠ"²ž à]$Ññ«¡6–ŠèDÇÂôy˜3šcžjR:žÛM‡“â×zUæêsœrqý%Çâ¼=}h{í^ÏÕšc?!¬–iõݧèÓÛ€µîÆŠWª¶+Òræ\°™UÒq¤ÊjÞa¡ëéD9j…ô1'f/ߌJ‰å‰1 ™ÀÅD*2c™]ÖêWÆyXñ>1K-ÌØÜ#韚ӗ¦‡Ùgà´%0¢£˜ú2¶ÕÉ D2ói3öBÀÎÔyW@ù/6ÚÞ]?œŸ—¢œogvš ÷±4¬ ¸ÇAI¥ae<ŸÈÐè¶Ææ‰„‰zŠíÚi‚­è¯_ZôhpbIÊ” CÁ3 €Q²¶`«@"æ0¥“²´Ê1|™„g΀÷Qf[h8™©"mÁQ´Çah+e'ñùGŒ–ûf/3ÇJ`T[ _Ô«˜¢õá@k£„­*ªe$Ö4K‰ÌÈ©”“ýC=ñ~qôþ}E«Õ2|1ö;MkýÞÛxê RGa80"f‡Vngè|'ÃÍûNó;PKì÷“'÷Ã#PK2mÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPK2mÕ4Ÿ.Ä++mimetypePK2mÕ4QConfigurations2/statusbar/PK2mÕ4'‰Configurations2/accelerator/current.xmlPK2mÕ4àConfigurations2/floater/PK2mÕ4Configurations2/popupmenu/PK2mÕ4NConfigurations2/progressbar/PK2mÕ4ˆConfigurations2/menubar/PK2mÕ4¾Configurations2/toolbar/PK2mÕ4ôConfigurations2/images/Bitmaps/PK2mÕ4"W{Tgl 1content.xmlPK2mÕ4M¶•êæqF Ñstyles.xmlPK2mÕ4ËVÙtmmï meta.xmlPK2mÕ4EÜ ÖЂThumbnails/thumbnail.pngPK2mÕ4ì÷“'÷Ã# žsettings.xmlPK2mÕ4³„ANÏMETA-INF/manifest.xmlPKîSmsm/vignettes/figures/dags/p3q12.pdf0000644000176200001440000000255514471426252017017 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xœ‘=Â0 …÷H¹ƒg†(nš8=0p~„ ,½>ŽJ*PUÕŸòüžãz˜¬y€ç'ÑõûžG8¬àn—ƒÝZ%¿@¸Z“# ï]€›5]æ¯Ò ‘¸Ì±)êqÓ9Zs±foÍöËÉ;”f¶ÇK8i18¡!—‘Tu³Áϔԗ>9Šï¤÷ØÕ{AU¹ôaNÓí=Ïó rÔ}a ‚Dj‚¢R#¯Óªýe“¼a7$7°Ô»ÈÒýw`"d(ƒ`d,$4(5Ò¿%Yw¹$¼Ãmjendstream endobj 3 0 obj 225 endobj 5 0 obj << >> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152844+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000455 00000 n 0000000021 00000 n 0000000331 00000 n 0000000640 00000 n 0000000357 00000 n 0000000384 00000 n 0000000776 00000 n 0000000835 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ ] >> startxref 1025 %%EOF msm/vignettes/figures/dags/p3q135.ps0000644000176200001440000000626414471426252016757 0ustar liggesusers%!PS-Adobe-3.0 %%Pages: (atend) %%BoundingBox: 28 643 199 814 %%HiResBoundingBox: 28.300000 643.600000 198.400000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (pswrite) %%CreationDate: 2006/06/21 15:30:10 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_pswrite_2_0_1001 /GS_pswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<> stream xœM Â0…÷ÜaÖ]„ü'=àN»ðþ UÐ×w2“¶)B‘R˜GÞ¼ox>R¼@ãú > endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152821+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000448 00000 n 0000000021 00000 n 0000000324 00000 n 0000000633 00000 n 0000000350 00000 n 0000000377 00000 n 0000000769 00000 n 0000000828 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ <0C24517CCB13A965D9C6104BA475DA8D> <0C24517CCB13A965D9C6104BA475DA8D> ] >> startxref 1018 %%EOF msm/vignettes/figures/dags/p3q124.pdf0000644000176200001440000000260114471426252017073 0ustar liggesusers%PDF-1.4 %äüöß 2 0 obj << /Length 3 0 R /Filter /FlateDecode >> stream xœ}QKj1 Ý|­³–?cÍ Ù¥YômB™šM®ÙŠ Ã0 ‡ßϲƒ›5ÿàäKsÂ=\¿àsÖ¸zð±WÊMþüX“&ÌS†_k> endobj 6 0 obj << /Font 5 0 R /ProcSet [ /PDF /Text ] >> endobj 1 0 obj << /Type /Page /Parent 4 0 R /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Group << /S /Transparency /CS /DeviceRGB /I true >> /Contents 2 0 R >> endobj 4 0 obj << /Type /Pages /Resources 6 0 R /MediaBox [ 0 0 595 842 ] /Kids [ 1 0 R ] /Count 1 >> endobj 7 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 8 0 obj << /Creator /Producer /CreationDate (D:20060621152809+01'00') >> endobj xref 0 9 0000000000 65535 f 0000000475 00000 n 0000000021 00000 n 0000000351 00000 n 0000000660 00000 n 0000000377 00000 n 0000000404 00000 n 0000000796 00000 n 0000000855 00000 n trailer << /Size 9 /Root 7 0 R /Info 8 0 R /ID [ ] >> startxref 1045 %%EOF msm/vignettes/figures/dags/p5q1_4_6_8_11_12_16.odg0000644000176200001440000001752714471426252020754 0ustar liggesusersPK@rÕ4Ÿ.Ä++mimetypeapplication/vnd.oasis.opendocument.graphicsPK@rÕ4Configurations2/statusbar/PK@rÕ4'Configurations2/accelerator/current.xmlPKPK@rÕ4Configurations2/floater/PK@rÕ4Configurations2/popupmenu/PK@rÕ4Configurations2/progressbar/PK@rÕ4Configurations2/menubar/PK@rÕ4Configurations2/toolbar/PK@rÕ4Configurations2/images/Bitmaps/PK@rÕ4 content.xmlÍX]oÚ0}߯@y&¡´%ªIÓžZ©Ò6i¯®ã$V;² ýúÙN0N!ÌTè I|ϱϽþ‹‡mUŽ6˜ Âè2ˆÆ“`„)b)¡ù2øõó{x<¬¾,X–„“”¡u…© £R=GŠMEÒF—ÁšÓ„AADBa…E"QÂjL÷¬ÄE'f¬¶EÈ]éM7`—-ñVú’5¶Ç…/þ#°ËN9l|É«Luéó%oEfL¹^ÕP’7*¶%¡¯Ë ²NhšfÜLÇŒç šÏçÀD­`dqõš—•"€K¬ G`­°„¾ú4Ö•D×Õ æÞÖ@ ²Zs,DMW¦_G.§W_›Ü»º6ù€Í¨€Ü»Î ¸_*ÓÔ¿T¦©Ë­ ,ò{žTÐü<=êŠW¾cilÏ*ÄIí=ÍíòcVª&´‹ÝÈ'“Ð~;èæ,¼áDbîÀÑY8‚%²Ž³ê”i …ñF—¼]DÚ1@ˆA¶`‘výûéñ*p`òopH¨œ)½³ °E )ñ.u–N·M÷ΆÕþ h/€m€kÉ4…f%‹Õ¢]ÑæwÔ¾ëÁ—AZGA×A¥|§šÚ½1¬aŽ0LÍù5ç°.Ú7×ëãÉ|„-IûšBžû~;JXse—‹‘d¤T–SFULƒ>,T0,'ԉ˖$Wf 5Š®Ë>n£»CTEÒ´43ΔÎÍ/þÀùU¿b®¸jk ’êMe2ŽQôâª.–ÁWÎYsÔ~Šuq“žj@™ͤ­¶Å5!cFÄuGã‚ÁŠî/,ÝÙ®tW 3I]Àít[­ú;ê psfÖ@g®P*Låw±o8ƒëR]—#yÜY Ö×^=<ï#%Üé3X=ØZ*Ï6yÒåÏdO˜ä…t¶jïßwíûja.Mµ6Ê*º–¸Ù;Ä©‹>%.þqÛhÜÙÁ#WU¼ æ6·‘#]ZÌGéšêš½G×Å“9ÿÌ•M¯YjQ4˜SGØgLjtwUßfþÝ}jßÜÅ0»´m±ëÚtpg»½ôÎvë§ë¤_©+š sBWQv3¬,º®²{Oegª Ø[Öážfo` w?Y­þPK†-bTóPK@rÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæÀþß)iÇ&èØ› 'ƒÐØ› ctl‚¾,Bctl‚žV´Ù¥,AéY®5¥N´vœÍÕŽÂ$÷%lê¼ã¨ÖÈÀ6Œw¨ ³GÜoÃô/\Uc«ïrx×Ã{šåhë:õM Æ„¡ïÏçϺ§RW{'–&Ǻz¬«Çºúdëê±®ëê±®ëêÓFh¬«^W«XÚ¯¬wÇË·:®U„–¢jØ=¢&:ÓA_šn0 Äõ›—/çï¿@sæuÁé¹ý1V–½Hàå@j^ì*obAÈá{¢Zþd¡›µÜ‰#‚Ü,¢1FYΞ#^õÎÔÐËPu—£¾ìÔ*׸UK=ஈ×Òö΋´ÅGñ¶ªx ×·JB ÛþvGsÞý¯+Çlá9äI‡/–èÔÊù ˆ¼¹ºfV—WS¥o–KÏ€B©_£`å3¥ú!ÍŒû­wOÃz·Õö“NëSÊ8C„6~?Ò‚t/á¿æ` ù }p/˜VÈÿ¶f47W~º¢,;üƒ/oé^2¤Vã×’¥€ƒ%òt}K±•%¤”ßÃ"§*¢¸¦ÜÊ Ž-Nd«W<®3n÷µ Ä(ã2íÜÕ/ÈÓÅ8üÕŸõ÷åÕŠ‹ÙÚéõbõáQw³nV²£ÑŽ"™‹RrÙ»v(P c¼ WøM½t\'ý:6ëÈ-“z½ǶkŒw ´ÛóåòPK¬Î|±Þ3FPK@rÕ4%¬Û¹mmmeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T15:18:00en-GB10PT58M15SPK@rÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100mótq ©˜óöÖÅ¢f†‹V“ÿÿO½mgPjå&ø.ôÆ›Ê\¯ ÑŽ¾q¯wÕeæ­_®¾ ÎÅ@©A±LYïtÑˬçÏe¬¬Œ=¶ãÜ×>5ŸÖ÷ý~Y\jÉ VÓÃ! ´1MxÝÝ ë{f¦]Û¡›|«s†éÁžÂôYÙºÓƒ”™$äYíož•ÚÔy··b›çôΘ»gîïÝWºg³aµžÙ¶ý·÷¿1¬7Õ]þ´w1ÿºïüó«ü&~ìZgk¨œvÌq[Çœãeœg-Ö]ø}¤ãd_A˜ÛÞï±ÿ', _>1ûŸpzê•ßwmßo‰îéXúíÜæMßm7M?£üò{g á滫Ë&òï›¶¿üþ íêcRŠq…¿…gß«ÝülÍî…ï8 ‚ö<ºxÄ–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {s™~]¿,þä2 ½V«Ö/JÃß^,3µ¿¹¸¾. _ QTÁ4€WöEÁ*ÛUÉ9|]DaX ‚=-…ä*œ¦ŽŠš™!~ç8ˆÔ{ð3Æ ê4çˆ(ƒßçŒî›øè1¦(š0-%^ò¸$ú-àñ¦Âžý9ÄrEÁLO³À—}®.Z—2bê²CfDbqh@@´È ­-†¯]õG—£ÅX=j$ß=æÐ#8ÄI1²NÌ6TdK‹ËL{WÕª)›CY6\”úcˆÖêØÛÇG®/ÛJ ¾všn៛†™.#•"%:m†ÌàcUÜ¡YKªü?³áÀGÖa„ªX>ØŸcüÃÇ_çêÏêÞ?)—Œ«GÇð¹Q  ~TàHBáL1m¼Hó¤•ÔØe±òa‡`ÿe¯²àÜ3¾ ‹D@g‰èžÙ¦£°@gLpbü™­²}|i˜Þ•Y´ƒÇR¹ñýÈLRºaøl¡™´‡½v¯çjͱŸVË´úîSôémÀZwcÅ+UÛi9s.ØÌŒ‹*é8Re5ï°P‹õ€t¢ˆµÂNú˜³—oF¥‹ÄòʆL`Žb"™±Ì®kõ+㼌¬xŸ˜¥flî‘ôOÍéKÓÃì3pÚÑQL}Ûêä"™ù´{!`gê¼+ ümﮌÎÏK Qη3;MÐûXVÜã €¤Ò°2žOdhôG[cóDÂD=Åví4ÁVô×/-z48±$eJ†¡àPÀ(Y[°Õ s˜ÒƒIYZå¾ÎLÂ3gÀûŒ‡(³-4œLŒT‘¶à(ZŽã0´•²“øü#FË}³—™c%°Àª-Ð/êUÌ Ñúp µQÂVU‡2kš¥DfäŠTJÉ~Š¡žŠx¿8zÿ¾¢Õj¾‡ûˆ€¦5þaÏm<uP©£0œ@³C+·3t¾“áæ}§ùPK@ nþöÃ#PK@rÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPK@rÕ4Ÿ.Ä++mimetypePK@rÕ4QConfigurations2/statusbar/PK@rÕ4'‰Configurations2/accelerator/current.xmlPK@rÕ4àConfigurations2/floater/PK@rÕ4Configurations2/popupmenu/PK@rÕ4NConfigurations2/progressbar/PK@rÕ4ˆConfigurations2/menubar/PK@rÕ4¾Configurations2/toolbar/PK@rÕ4ôConfigurations2/images/Bitmaps/PK@rÕ4†-bTó 1content.xmlPK@rÕ4¬Î|±Þ3F ¾styles.xmlPK@rÕ4%¬Û¹mmÔ meta.xmlPK@rÕ4ÛB@¤òïgThumbnails/thumbnail.pngPK@rÕ4@ nþöÃ# Ÿsettings.xmlPK@rÕ4³„ANÏMETA-INF/manifest.xmlPKîSmsm/vignettes/figures/dags/p5q1_6_11_16.odg0000644000176200001440000001706414471426252017774 0ustar liggesusersPKWrÕ4Ÿ.Ä++mimetypeapplication/vnd.oasis.opendocument.graphicsPKWrÕ4Configurations2/statusbar/PKWrÕ4'Configurations2/accelerator/current.xmlPKPKWrÕ4Configurations2/floater/PKWrÕ4Configurations2/popupmenu/PKWrÕ4Configurations2/progressbar/PKWrÕ4Configurations2/menubar/PKWrÕ4Configurations2/toolbar/PKWrÕ4Configurations2/images/Bitmaps/PKWrÕ4 content.xmlÍW_oÛ |ß§ˆüîP'«ºXqªIÓžZ©Ò6i¯°ŠÁ'ûôìÜÔÔ?/‰áwgŽã€d}½oØlG¤¢‚I6¿Hf„#)¯Šä×Ïïé—äzói-Ê’"’c¶ á:E‚kó=3l®ò¾Z$[ÉsU9‡ Q¹F¹h ?²ò»±ú¥,šîÀ![“½Ž%[ìˆ ïãGvà%ìbÉkL 饈%ïKKa\oZ¨é#{FùC‘ÔZ·9]×Í»å\È d«Õ ¸ªŒ<®ÝJæPˆLlž#¶!Æê³ØPß6÷DF[5<[ÕVe fº6˜q/ 9£|íªètíª ›Q etÎx•%ŽÊ‡Üêzb}¿€[St·7§\É&v,‹Y…$m£§Ù£C¾ÂKµ„~³;¹‹‹‹Ï oèîYx'©&2€£gá2äÍS¦\ "%;y¿‰¬j‚°}Ùƒž|õïÛ›¨& <é¿Á)åJC~rF5”E¯‚ÁN„r‹ ¶ÎpLî†Íñ"è^ß·ZX6JÝNV›u¿£Ý笶ƒ n³dè(¡Q~0]ýÙ˜¶°" ˜¦VòŒZIØÖ»[(íõäiO²¾b(qr|ï@I[iLš5³ò’2c9Ü,‚ë°—…yLk!ésãA–BF+c2£Ø\Žq;û:tB5cæf‚)=7¿Å+ίòHÃ5GSÚQl•‹ù5ɨnrQ$_¥ÝYÿS¬77éî,Æè&í-ð=¡ ¥p"©;L&z(Ü |ð!º›µ›¤ p?Ý^«mgƒáš¹=0˜«Œ —ü¡ö”pËôi¯¹£gæꓦÒì]s\•)׾ضìb¢ÌôÒF`r,ƒA$HŸkq›Ê/Ñ(ZwÇ ƒ{›/±ÕÆþ]•QpA°íšÐªÖAÇÞÇçCÿ¼Y»ß_­õÜ+z/q—/g~C‘§Ä-þGÜ>+’+?xªZÉÊW}åL—óZº–“º._¢ëÍsõ‘“–-ß3jY6¹¦°¸¨ÙÕ»úv9íÛU¤oÀß §{Åß`tŸ€‰¿Ø›¿PKÚn·E£PKWrÕ4 styles.xmlí\]rÛ6~ï)8ì¤o$'–j9“L§y©;:9D‚’à€ eç}ìýz’.þ€)“¶l+&3™»Kì~Ø]`W .Þ߯‘qƒYFh²4݉c8ñi@’õÒüòùwëÜ|ùÓ CâãE@ý<Æ ·2~áÌá$[(âÒÌY² (#Ù"A1ÎÜ_Ð'¥ÐBç^ȩԈ|X_qɬKs|Ëû Þ†,ZõŸY2ëÒC۾‚0ÕÅCÚWø6‹¬Z>SÄÉŽ·I¾-Í çé¶·Ûíd;P¶¶Ýù|nKj¥°_ñ¥9‹$WàÛ8Âb²Ìv'®]òƘ£¾ú ^]¥$W˜õ†q´·ª)ð€¹Â/û=H—iø×ͺ·wݬ;`ö7ˆõö3ÉÜt•iÐßU¦.#¾éXßsû ˆòŸ«?j¿bqß¹o*Ÿ‘´·™Š[—§”Vª ìR]Ïqf¶ú¬qo²oá˜iìþAvE~…8Û@>× ß—¯ìŽIÔÛjàíp”ÞÐ ^ÍU‹´ØHÅ—eÞUéöòBdðö 3Cþ_L°4?0F·¦λ¸!xû‘Þ.MÇp Ï1¦Žï‹]³\1¶ñœï¦}y¡Â.À!Ê£"©j,D`åÝÒ\3”nˆo–¼)bHŽY)£'° (’H®Ê9ÍR$¶`ªXQ”nY°¥yâó\Znm¼43§.é°°µbARË8#>/) ‡Z1 àñ³øª$…6%’Xà,6(ù¡ˆÜÈBe¸²9ØJÓ °»ÍªØ…]{Öæ¶ £tkÉÉ}QHyœå`IH•F%Š¿ ”f¿~&à ÆŸxküMc”¨Á†ŠßZãƒáK“ ¾GJ¸Ùà1"¶£zªŒ|P¼YÊåX„’uŽÖ0„9àÓ<á tùô±mJpW””Šþ‘û$@Æ5J2ãKBà8€[”•ª”‚µB‡Ð©dPšK\(WÒšT‚…žm$]_?ÿŒ6R‹bG·jK«rµM½&±v¤F,•¤–ŠØŒ£$@,0ï ·â³î~2î!0è7ñ‘@E¸Ÿ Äváøqc¸pÏŸùÇ4´LºÂnU N¦BtŸîCX‰M]ÅRƒb ¶ ‡$Š* ª‘JÓùÜ÷ÃPúnŠq µ fÅ ®w&æÐ+ʹÈ÷m´‡\PöŒ¬7EáºAÜ“HˆÀÑ-ÈÅæÖmÓÈ&ñ®•Xšt°¸ò‘¬ò“z ‚)RÃÖ*"Ì Eã°-˜ê£"Yâ ±4ÿû÷³+[í¦¢kXÌë»xE#sH&SéevöFúú!uãÝgŒöÍ$)#7k…áƒèoè’“ÄŠÐ d*ŸDûGDhz4„܉÷*š¡óW‰ÐÙÑò&³W‰ÐÛ£!4}•ø¼;>¯4OŸ ¡Ù+ÍÓó#"ô:ó´ë ¢³+QkäâÕ0?áó έ¢òQZ®hp÷’š>„[Ë[Ènƒ­úšgำÇú|ÖuVÔ7&YÃN!´%áÝp3ÕãÅŒ|ÒfæÀþß)iÇ&èØ› 'ƒÐØ› ctl‚¾,Bctl‚žV´Ù¥,AéY®5¥N´vœÍÕŽÂ$÷%lê¼ã¨ÖÈÀ6Œw¨ ³GÜoÃô/\Uc«ïrx×Ã{šåhë:õM Æ„¡ïÏçϺ§RW{'–&Ǻz¬«Çºúdëê±®ëê±®ëêÓFh¬«^W«XÚ¯¬wÇË·:®U„–¢jØ=¢&:ÓA_šn0 Äõ›—/çï¿@sæuÁé¹ý1V–½Hàå@j^ì*obAÈá{¢Zþd¡›µÜ‰#‚Ü,¢1FYΞ#^õÎÔÐËPu—£¾ìÔ*׸UK=ஈ×Òö΋´ÅGñ¶ªx ×·JB ÛþvGsÞý¯+Çlá9äI‡/–èÔÊù ˆ¼¹ºfV—WS¥o–KÏ€B©_£`å3¥ú!ÍŒû­wOÃz·Õö“NëSÊ8C„6~?Ò‚t/á¿æ` ù }p/˜VÈÿ¶f47W~º¢,;üƒ/oé^2¤Vã×’¥€ƒ%òt}K±•%¤”ßÃ"§*¢¸¦ÜÊ Ž-Nd«W<®3n÷µ Ä(ã2íÜÕ/ÈÓÅ8üÕŸõ÷åÕŠ‹ÙÚéõbõáQw³nV²£ÑŽ"™‹RrÙ»v(P c¼ WøM½t\'ý:6ëÈ-“z½ǶkŒw ´ÛóåòPK¬Î|±Þ3FPKWrÕ4ó3·Kkkmeta.xml OpenOffice.org/2.0$Win32 OpenOffice.org_project/680m5$Build-90112006-06-21T14:17:492006-06-21T15:18:46en-GB9PT23M57SPKWrÕ4Thumbnails/thumbnail.pngë ðsçå’âb``àõôp Ò…@¼€ƒ HZË4G100^ðtq ©˜óöF W“ƒˆÃE–ïûS³E“-;®ï{üñÑ£žy·¿=¸um³øƒz%¶ …¤·;NozSu»r¯Œ®òþÙ†××ÅÏ;büÿͽå÷¯J)$5t0*±É>’Û{áû™¹†Å×îħõY©Ä–žÝgw½Ú]s÷é5$g߀ ÌhéW3 > 0]4œé¤_¹q>5¹có9öÁ ˜‡@eE€”j‰8SÛ©ð6·NÌ©ÇÀ£(áIßcÐí6owµ—Û\y%˜¾4œ¥”‘纫Õê|uqÎøÂ­ÝÞÞºÉÝíÒˆƒPPH& ¸»gW¬Ïè/Š¢lVïîgŒ½)­7lˆ%Š×«ÕKwóÿvµ1)*K¯­ø,Œ”Î3òÎVˆâ°(Œ^»Ã:5ü;w7·¾Ýº´y—Ýüª` ¡ö÷YzYËk8Šº÷ Ãê-œ¬}ï÷ü‰…&Óâ€&,r¶7å:R71•N³rU¿ºsq~ {s™ ^«]ýVý/Èe|­V­_”†¿¼Xfªsq}]¾¢¨‚i¯ì‹‚U¶¯’=*tøºˆÂ°{Z ÉU 8M53CüÎq0©9öàgŒ@ÔiÎP¿ÏÝ7ñ1ÐbLQ4aZJ¼äqIôZÀâ L…=!úsˆ)äŠ8‚™žfÿ€/û\]´.eÄÔ3d‡ÌˆÄâÑ€€h‘Z[ _ºê.G‹±zÔH¾{Ì# Gpˆ)’0bd˜m¨.È–—™ö®ªUS6‡²l¸(õÇ­Õ¹·\_¶•|í4ÝÂ?7 3]F*EJt*Ú ™ÿÁǪ¸C=²–TùfìÃ;T±|°?Çø‡Ž9¾ÎÕŸÕ9¼R.WŽás3¢2ü¨À‘„ ,˜b Úx‘æI+©±ËbåÃÁþË^e/À¹g|‰€ÎÑ<³MKaΘàÄø3[eûøÒ0½+³h¥râû‘™¤tÃðÙB?2yàâcàêàaqfmlXnþÿÃ()Új¯ äC\@¾òUÓ²â_ð|ÕË¡÷Uaœ«¸q9´EÎ׺´®†-Y[CÛ²õ›Ú_ã8’ŒÛ3Í—.P–T¤ÙRJtµo2¾þ<¾Úá1I Åô¨.bs»Ü2'ŸB·ÐlüÍXøD3J¦":g\Ü–äÝN0Ù Èâ“¶Í…˜'åÆÏŒÜZQDÖS¼‹$:~9ÔÆRèX˜>sæAsLÀS]JÇs»éxRüZ¯ªÓ\}ŽS.®¿äXœ·§ía¯Ýë¹Zsì'„Õ2­¾û}z±ÖÝXñJÕvEZÏœ 63ã¢j:ŽT]Í;,Ôc="("G-±“FæÄìå›Qé"±<1&!˜£˜HEf,³ËÀZýÊ8/£+Þ'f©…›{$ýSsúÒô0û œ¶FtS_ƶZ¹H†>mÆ^Ø;ï h#ÿÅFß»+ã‡ôÒB”óí Oô>–†U@A÷8 ©4¬ÌçýÑÖÜ<‘0QO±];M°ýõ[‹ N,I™’a(x0JÖlõHĦô`T–V9†ï3“ðŒÃð>ã!Êl '#U¤-8Š–ã8 m¥ì$>ÿˆÁrßìeY ,ðj ô«zsC´>œhmc”°UEÕ¡ŒÄšf)‘¹"•R`´Ÿb¨§"Þ/ŽÞ¿°hµZ†/"Æ>"`§iM ØsO£@Tê( 'FÄìÐÊí ݃oe¸yßÁi~PKÙ¤/øÅ#PKWrÕ4META-INF/manifest.xmlµ•KjÃ0@÷=…ÑÞVÛU1q-ôé&òØè‡f’ÛWäÓ6”¦X; HïFi±Ú[Sí0’ö®OÍ£¨Ð)ßk7vâcý^¿ˆÕòaaÁé‰ÛÓ ÊëÃN¤èZ¤©u`‘ZV­èz¯’EÇí×ùídZ>Tð  Öybì„`´ÎyÊ뛣«¹V4c„°ÕŠÄ…0$cê¼í„ò.ámÊ›wƒS<&BÏ’8Ñb<(…sè£T)Æi›¹’Å]EƒñÀX|H!_ƒTý‘Êô”z18{oŠÁµ…I¾j¶¨¨ãNö÷7ƒ’›º§IºQׂ¿åp§œqÏrêÕ›ðìçÿ5óï\âƒAšk‘a¶‡g½Mvã@’|6ÁsÃç-,2çOñ\Ú…üñ'.?PK³„ANPKWrÕ4Ÿ.Ä++mimetypePKWrÕ4QConfigurations2/statusbar/PKWrÕ4'‰Configurations2/accelerator/current.xmlPKWrÕ4àConfigurations2/floater/PKWrÕ4Configurations2/popupmenu/PKWrÕ4NConfigurations2/progressbar/PKWrÕ4ˆConfigurations2/menubar/PKWrÕ4¾Configurations2/toolbar/PKWrÕ4ôConfigurations2/images/Bitmaps/PKWrÕ4Ún·E£ 1content.xmlPKWrÕ4¬Î|±Þ3F ¯styles.xmlPKWrÕ4ó3·KkkÅ meta.xmlPKWrÕ4ì’ºÞ VThumbnails/thumbnail.pngPKWrÕ4Ù¤/øÅ# zsettings.xmlPKWrÕ4³„AN¬META-INF/manifest.xmlPKî0msm/vignettes/figures/p3q1246.eps0000644000176200001440000000631114471426252016263 0ustar liggesusers%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 28 643 199 814 %%HiResBoundingBox: 28.300000 643.600000 198.400000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (epswrite) %%CreationDate: 2006/06/22 17:45:30 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<> stream xœMP;®Ã0 Ûu Ïohõ‰cçÛ¡@H‡¢÷ž,:iÄ&DRýI|Äíë÷õMÇKI÷/Izùÿ$N'ÒZœ{“ù¹ø™Çâw.¼Cn¡Í$ƒJ˜D Õ0Háaƒ†nNwR-’´š÷P©cҜیM¤ÁU°ÐíÏ-/4ëeëäŒÑ¨ gí­¢Õ&ˆV-Ϫ§_Ÿàαb8¯[ ‹ ë bÙX'¼äÀ¨€Å¦¢{4 ÝÝ´ØËL¹§ˆ›`{Xcµlg:Ó?¦bendstream endobj 6 0 obj 215 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000508 00000 n 0000000626 00000 n 0000000449 00000 n 0000000319 00000 n 0000000015 00000 n 0000000300 00000 n 0000000556 00000 n 0000000597 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [<8F7CF8F2C2D4FF6135A25FAEF128A59F><8F7CF8F2C2D4FF6135A25FAEF128A59F>] >> startxref 778 %%EOF msm/vignettes/figures/p4q13569.pdf0000644000176200001440000000231414471426252016340 0ustar liggesusers%PDF-1.3 %Çì¢ 5 0 obj <> stream xœURËN1 ¼ç+|æ~äù=C?‰BÕÿ/áÄNv£ªÚÑzfì±÷ð•ûÏŸŸÏðöQàöîúÿ —ÀµQDx1ðè `Q nÐÊKòßá(2M "Y5æÖGܱs–Ö¼n¹è»È¢~L5IK½íÀ1QÇ‹ó_/*»»­Ëe–¯>ˆUOCÃfxp†áH;¹¼´§”f`Ä÷2°…ä*uÇÎYZ ,¹¶µÿˆ«fØôÒ ïØ9Kë^CcS‹0Μ†-çÁY‹³ñ¦ìXƒ…¥V+侇¾ß<ï—ŠÌÄ'8Ê&ðo£sYÇT}¦ ‚cñ9 HJÓ¬Ž;Ƶ\åEff¶ïµ—Œn¹)Ì´Ï¥VÛW™‹Ž.qø¬™ûñjt1‹$·<…RŸíØ‚¼ûX4£æ·–Ô4e›>+ÚùÐÆgóyÿÀµ:endstream endobj 6 0 obj 334 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000628 00000 n 0000000746 00000 n 0000000569 00000 n 0000000438 00000 n 0000000015 00000 n 0000000419 00000 n 0000000676 00000 n 0000000717 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [<49ADAC326405A727B34AB09603D356DB><49ADAC326405A727B34AB09603D356DB>] >> startxref 898 %%EOF msm/vignettes/figures/p3q135.pdf0000644000176200001440000000211114471426252016153 0ustar liggesusers%PDF-1.3 %Çì¢ 5 0 obj <> stream xœU;Â0 †wŸÂ3ØI¤'`†‰BÕˆûKØqRQUU>é8ñéÌHöµó±Áåžqþã¢ÿ¯JFæpƒè°dÊ ’é€.ï‘^0{sÜ5gOë1¹yö¬w0iMKmªäØÛþÐTw{’pn%‰Ý„$(GÓ{¸zVxž4¶øÓz*]\…UH"ȑ힃ľ3Ô.¯nþXº2vœ ©n9(’ŒÇj=Ë^ªî¨£hô–üç—ZVendstream endobj 6 0 obj 203 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000497 00000 n 0000000615 00000 n 0000000438 00000 n 0000000307 00000 n 0000000015 00000 n 0000000288 00000 n 0000000545 00000 n 0000000586 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 767 %%EOF msm/vignettes/figures/p5q1_6_11_16.pdf0000644000176200001440000000217314471426252017051 0ustar liggesusers%PDF-1.3 %Çì¢ 5 0 obj <> stream xœMQKNÅ0 ÜûY³’&=kèxðÔ·@Ü_Âñ$¡ªšŒâ{&ùIü,‰û7ö½¼×tû%Iwÿ¿‰Ó+i«^{ùzúZ¶ê{©|A½ÞI_td•‰N@ •óF¨9ÝHµJÒfÞC¥mIKé3:4‘'á¤Ï'—ÜÑlH”mŒÆ¹pÑÑ* Z-B´êy&{Ûÿ»øW–ˆÃyº@'¶+Œ2ˆe[Ûq“™qÛ«^a”!êÎ…/3å‘" R,º°1%+"¢ä¦fr1 0žÔ“_a”!€™à¢sÎ%3af–™H5%ëéz£?(B}]endstream endobj 6 0 obj 254 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000547 00000 n 0000000665 00000 n 0000000488 00000 n 0000000358 00000 n 0000000015 00000 n 0000000339 00000 n 0000000595 00000 n 0000000636 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [<7C8FD2A157BC7182115B5A22DDCBAA1B><7C8FD2A157BC7182115B5A22DDCBAA1B>] >> startxref 817 %%EOF msm/vignettes/figures/p5q1_6_7_11_12.eps0000644000176200001440000000655114471426252017315 0ustar liggesusers%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 28 643 312 814 %%HiResBoundingBox: 28.300000 643.600000 311.800000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (epswrite) %%CreationDate: 2006/06/22 17:45:35 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<> stream xœMŽA Ã0 ïû {h%;ŽÒôÜæ ¤ ΡôÿPÉJ K‹vGøK|b¯}Nn/¥å¡ÕÞL¤AÍÛ­Wë¥W›Eù¤Ü‰\Å#¤KÒ ‘Û&åî,›@ÐLKäÓý—D©¹Ì"ÇATÌCÖö‘ƒèï»7â‰?Î-endstream endobj 6 0 obj 135 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000428 00000 n 0000000546 00000 n 0000000369 00000 n 0000000239 00000 n 0000000015 00000 n 0000000220 00000 n 0000000476 00000 n 0000000517 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [<325056F4C9C207604170BC2D639E1D53><325056F4C9C207604170BC2D639E1D53>] >> startxref 698 %%EOF msm/vignettes/figures/illdeath.pdf0000644000176200001440000000327714471426252017023 0ustar liggesusers%PDF-1.3 %Çì¢ 5 0 obj <> stream xœTËnÜ0 ¼ë+tLTM=)ê>ŽÙ5Ðpm »@ÚC¿|Hµwƒé"A<”5$ghæÉzÖóO{ΫywÈöôÛ nˆöûÝÈ{ød¸hÁÞ®;¼˜!8ð±…À¿>ºRÖRèÞl¦Ê”E`†íÄ”¼•„ fƒX^ FN¥æ*X2ÒýÜ -‚{ýΕ¾4©ÀÙ|3G“ÓNÎ.XLZCÂŒ[BÆ]ã.Ipk¬“¹aͪ¢èlS>KBŽÀ×­AÓ%A&ÁælnOq<^H ž`Êôw=‹È Ò ”˜íˆkØš¡X››¸ÄCêD¦iÊ,]¦Z&#@çˆMé\Æ”P]ãêY¯ÜiÚ“&T¬zž «DŠd±yµÐÍ ƒ-7¼P÷TýtFZ_Jx^ZÒ?Þ^Met È PÜójßO´¶ÅFìôht•†©÷Ä‹<­ææÃ—ãxwßL?L Qo«ÌÍÇÃ(Gê<3øtwwœH÷k€): ¶±€CÏ"1Wm¡éƒ+d£9 C¡á>I™Þ£œ.mûä·±/ê­ßgÊ9a½L÷¬Üÿ|OUšîÍÓ̽ëòù¿Á‚·v3â®zI˜[õ&§Â&G·£Ë¹¤¬—)Ÿ•|½ ,ÅæXÙ$F%D£Ö¬Qôûw±n­§åõÚVE¯öõØSÖ—Ò–ä´×R¯[,$×vc¼›>ÿûÚïÍ_ ,bæendstream endobj 6 0 obj 596 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 11 0000000000 65535 f 0000000918 00000 n 0000001135 00000 n 0000000859 00000 n 0000000700 00000 n 0000000015 00000 n 0000000681 00000 n 0000000966 00000 n 0000001066 00000 n 0000001007 00000 n 0000001036 00000 n trailer << /Size 11 /Root 1 0 R /Info 2 0 R /ID [<8524F37507AD62BF2165B7063CA4B90E><8524F37507AD62BF2165B7063CA4B90E>] >> startxref 1354 %%EOF msm/vignettes/figures/p3q16.eps0000644000176200001440000000613314471426252016117 0ustar liggesusers%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 28 643 199 814 %%HiResBoundingBox: 28.300000 643.600000 198.400000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (epswrite) %%CreationDate: 2006/06/22 17:45:32 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> stream xœUSINÄ0¼û>s÷âíœaž€Ä¦á€ø¿Dǽ8Ñh”R\U®^ò›Ë#ärüìùö“ž^{þøK¿åÿ•J~N8zà’)¸ —. örz’{úL·ŒàgŠU-¾bã„V½JþHˆ]Þ1’ø!Œ–f=®]˜+88÷ôþ ²o³5òã›Ñ(ÝP±nÎ2\Õº¢Í“—Ü„µV/XƒX_Ö"qиbã„V ¦6fôŸKœ)V=ÍŽWlœÐš×Òhj",^§b­ss¢qÏe» Z,DÈ•âBŶÒ£+6Nh5 jô&æÊP±Üœ¨5»lþ4æ£h>‡ÚÉ[‚ÍGÐ,Òâ¢ôqífœkb(»D<Ýì œúÕ÷ôËÌm…‰k—UÍuj9nÌ×\buþl„ĹAQŸ#ŸùTq+õ €FX>—m\¥1¨×.ïÇ$11¢íæˆÏy…_wžƒf-š²=Ö—‰Ý»å„ås^áCôç%ý¤âÀendstream endobj 6 0 obj 390 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000684 00000 n 0000000802 00000 n 0000000625 00000 n 0000000494 00000 n 0000000015 00000 n 0000000475 00000 n 0000000732 00000 n 0000000773 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 954 %%EOF msm/vignettes/figures/multistate.eps0000644000176200001440000001525714471426252017447 0ustar liggesusers%!PS-Adobe-2.0 EPSF-2.0 %%Title: multistate.fig %%Creator: fig2dev Version 3.2 Patchlevel 4 %%CreationDate: Fri Jan 3 17:28:14 2003 %%For: chris@bumblebee (Chris Jackson,,,) %%BoundingBox: 0 0 263 254 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save newpath 0 254 moveto 0 0 lineto 263 0 lineto 263 254 lineto closepath clip newpath -35.3 288.7 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc % % Fig objects follow % % % here starts figure with depth 100 % Polyline 7.500 slw n 705 600 m 600 600 600 1695 105 arcto 4 {pop} repeat 600 1800 1695 1800 105 arcto 4 {pop} repeat 1800 1800 1800 705 105 arcto 4 {pop} repeat 1800 600 705 600 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline n 3855 3600 m 3750 3600 3750 4695 105 arcto 4 {pop} repeat 3750 4800 4845 4800 105 arcto 4 {pop} repeat 4950 4800 4950 3705 105 arcto 4 {pop} repeat 4950 3600 3855 3600 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline n 3855 600 m 3750 600 3750 1695 105 arcto 4 {pop} repeat 3750 1800 4845 1800 105 arcto 4 {pop} repeat 4950 1800 4950 705 105 arcto 4 {pop} repeat 4950 600 3855 600 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline n 705 3600 m 600 3600 600 4695 105 arcto 4 {pop} repeat 600 4800 1695 4800 105 arcto 4 {pop} repeat 1800 4800 1800 3705 105 arcto 4 {pop} repeat 1800 3600 705 3600 105 arcto 4 {pop} repeat cp gs col0 s gr % here ends figure; % % here starts figure with depth 50 % Polyline 7.500 slw n 3746 1050 m 3754 1050 l gs col0 s gr % Polyline gs clippath 3690 1080 m 3690 1020 l 3538 1020 l 3658 1050 l 3538 1080 l cp eoclip n 1800 1050 m 3675 1050 l gs col0 s gr gr % arrowhead n 3538 1080 m 3658 1050 l 3538 1020 l col0 s % Polyline gs clippath 1785 1395 m 1785 1455 l 1937 1455 l 1817 1425 l 1937 1395 l cp eoclip n 3750 1425 m 1800 1425 l gs col0 s gr gr % arrowhead n 1937 1395 m 1817 1425 l 1937 1455 l col0 s % Polyline gs clippath 945 3615 m 1005 3615 l 1005 3463 l 975 3583 l 945 3463 l cp eoclip n 975 1800 m 975 3600 l gs col0 s gr gr % arrowhead n 945 3463 m 975 3583 l 1005 3463 l col0 s % Polyline gs clippath 4170 3615 m 4230 3615 l 4230 3463 l 4200 3583 l 4170 3463 l cp eoclip n 4200 1800 m 4200 3600 l gs col0 s gr gr % arrowhead n 4170 3463 m 4200 3583 l 4230 3463 l col0 s % Polyline gs clippath 4605 1785 m 4545 1785 l 4545 1937 l 4575 1817 l 4605 1937 l cp eoclip n 4575 3525 m 4575 1800 l gs col0 s gr gr % arrowhead n 4605 1937 m 4575 1817 l 4545 1937 l col0 s % Polyline n 4571 1875 m 4579 1875 l gs col0 s gr % Polyline gs clippath 3765 4005 m 3765 3945 l 3613 3945 l 3733 3975 l 3613 4005 l cp eoclip n 1800 3975 m 3750 3975 l gs col0 s gr gr % arrowhead n 3613 4005 m 3733 3975 l 3613 3945 l col0 s % Polyline gs clippath 1785 4320 m 1785 4380 l 1937 4380 l 1817 4350 l 1937 4320 l cp eoclip n 3750 4350 m 1800 4350 l gs col0 s gr gr % arrowhead n 1937 4320 m 1817 4350 l 1937 4380 l col0 s % Polyline gs clippath 1602 1823 m 1561 1867 l 1671 1971 l 1605 1867 l 1712 1927 l cp eoclip n 3675 3825 m 1593 1856 l gs col0 s gr gr % arrowhead n 1712 1927 m 1605 1867 l 1671 1971 l col0 s % Polyline gs clippath 3962 3560 m 4003 3516 l 3892 3413 l 3960 3517 l 3851 3457 l cp eoclip n 1872 1578 m 3972 3528 l gs col0 s gr gr % arrowhead n 3851 3457 m 3960 3517 l 3892 3413 l col0 s % Polyline gs clippath 1843 3737 m 1883 3782 l 1996 3681 l 1887 3739 l 1956 3636 l cp eoclip n 3975 1875 m 1875 3750 l gs col0 s gr gr % arrowhead n 1956 3636 m 1887 3739 l 1996 3681 l col0 s % Polyline gs clippath 3706 1662 m 3666 1617 l 3553 1718 l 3663 1661 l 3593 1763 l cp eoclip n 1575 3525 m 3675 1650 l gs col0 s gr gr % arrowhead n 3593 1763 m 3663 1661 l 3553 1718 l col0 s % Polyline gs clippath 1380 1785 m 1320 1785 l 1320 1937 l 1350 1817 l 1380 1937 l cp eoclip n 1350 3525 m 1350 1800 l gs col0 s gr gr % arrowhead n 1380 1937 m 1350 1817 l 1320 1937 l col0 s /Helvetica-Bold ff 360.00 scf sf 1050 4350 m gs 1 -1 sc (3) col0 sh gr /Helvetica-Bold ff 360.00 scf sf 4200 4350 m gs 1 -1 sc (4) col0 sh gr /Helvetica-Bold ff 360.00 scf sf 4200 1350 m gs 1 -1 sc (2) col0 sh gr /Helvetica-Bold ff 360.00 scf sf 1050 1350 m gs 1 -1 sc (1) col0 sh gr % here ends figure; $F2psEnd rs showpage msm/vignettes/figures/p4q159.eps0000644000176200001440000000630214471426252016206 0ustar liggesusers%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 28 757 426 814 %%HiResBoundingBox: 28.300000 757.000000 425.200000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (epswrite) %%CreationDate: 2006/06/22 17:45:33 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> stream xœWK'¾÷¯à¸Éh à)²äÛzGÊ!Êi¢8‰šHNþû® Ý3+íD{Øúê«70_³Þ8úÓÿ×¶üøÌ—ÿ–h“ù¶xó×ÂëæóÇœun­&¤¦ᶬÉï/yb-ê„s4×¥C_À¡ê€Lb:•/©Ô ƒë’sDnKf~ЭtMxF3hU!;±MP|ìT@7Ãàºü¹¼.¾fG”ú.n(†n í ºÐ¬ 8\9R–È9ôv×4B‡CJÑkH¥Ø‚bÈ~W`™#a)s"ªÍ®( ¢::¯…òpŸ!{×Ó¡` ÅRY2ÜÕ9ýÌ«ebóZ#õŠ»ÛµŒ´2*‹ªÍ2ëT’ÞphH8ô#LíØó´ãC7zQs¾³ì}87áÜ£ýTµÃCïåCëuvŽ©ó¦Ú•mÆt…Äå+µÚ(hÃå¯ U3:\¢A¥ô­“ÀKùÂBë2$*(äJ VT¢gÄìûjÇ/?˜ÆàtRÞ¼tÚ[|lëý¾ƒ/bÒ%Ú; §tW1ãk‡°‚Â5V“AH{ÓŽ6 â ÔÞ¦dƒï#x-®/¸5$·£mGDî+å;¬AÖѺ~Qý±GÃé[yÈÚÐ ½*gÍvýƃ‡"«=,숉S@>Ã1šz'ÚÔã`…9ˆ:Gp¦;{À÷èéàò™³QäMeÑr,k ˆjÄ:}m¯nÌC»åd×§ýíÌu°óЏTxœ¥Š6 zhà«Ë&–ÈG>Š)ÈùíÉN…\H.ŒÒ¸™uÚÑdhd3OúPhw©ÄÈÿóšæ)Ouž9Fû@Ìk5'`pèå˜5Ú[lé±6Ê®°Öuµ”®TV›]¢ÊI¡s¬úÁQEñƒ—‰; *ÇêæÎâC6UbÍ.ØÂ$°Ú¨ñœôÚæ³íæÃakbc'OÝè"¿1ìZ ?!JÀÕ²îSî^±€fçõÔÍÅýÒ{ ¯Tö¹FÇùB@}ï#ür£ÞnùOöè·$©Ì1*·ÐâJ_pò–¡hÀÒ9Ryù>Ž÷€Kº§t_èã¹ —þº7áI­Ý£¾1ÿÈ™¤s¤”ÊM—qæÕKS`ÉÓ,e+sK™ ·ŸãÁ,0•×5,lD¹: ôO[?f¥vKz2úþ€"$½åø¬ŽXònö“4&}ÿ÷ƒv×?Û}£Ä³«Óû¤ØîPŸ¿ê§¿`x^dýwmæ§ þЇ·Ù\þXä×>ÉÀ‚TÌ¥-¿>­Ï ÈS|þíò‰Î4rË\~_žÂóåïå}ì ÿ|Ao_–ïâJ±¦endstream endobj 6 0 obj 1020 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 11 0000000000 65535 f 0000001343 00000 n 0000001560 00000 n 0000001284 00000 n 0000001125 00000 n 0000000015 00000 n 0000001105 00000 n 0000001391 00000 n 0000001491 00000 n 0000001432 00000 n 0000001461 00000 n trailer << /Size 11 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 1781 %%EOF msm/vignettes/figures/p3q12.pdf0000644000176200001440000000206414471426252016074 0ustar liggesusers%PDF-1.3 %Çì¢ 5 0 obj <> stream xœ]KÂ0 D÷>…×,ÀŽ“8=kè( f¸¿„ó« Š"â™çøtd¤rz½e8]—0¾ì>ð .)Ì µ®V™=™J{ٺÿÂf`ï¸y20‹ÓJZ´’ÿÕݳew¬8@qPÚ°ÜÉ8±§ —>Õ»² ÓdZ|MP(:Éö³âYá~°Ø«.—BLi2£kÎÍêì%7‚¸©Â ,q¬b¨¨?ŒˆVʾ+ÙLiendstream endobj 6 0 obj 182 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000476 00000 n 0000000594 00000 n 0000000417 00000 n 0000000286 00000 n 0000000015 00000 n 0000000267 00000 n 0000000524 00000 n 0000000565 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 746 %%EOF msm/vignettes/figures/illdeath.eps0000644000176200001440000001125714471426252017036 0ustar liggesusers%!PS-Adobe-2.0 EPSF-2.0 %%Title: illdeath.eps %%Creator: fig2dev Version 3.2.3 Patchlevel %%CreationDate: Tue Oct 23 14:12:53 2001 %%For: chris@blankenburg (Chris Jackson) %%BoundingBox: 0 0 110 103 %%Magnification: 0.5000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def end save newpath 0 103 moveto 0 0 lineto 110 0 lineto 110 103 lineto closepath clip newpath -17.0 120.0 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin %%Page: 1 1 10 setmiterlimit 0.03000 0.03000 sc % Polyline 7.500 slw n 705 600 m 600 600 600 1695 105 arcto 4 {pop} repeat 600 1800 1695 1800 105 arcto 4 {pop} repeat 1800 1800 1800 705 105 arcto 4 {pop} repeat 1800 600 705 600 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline n 3105 600 m 3000 600 3000 1695 105 arcto 4 {pop} repeat 3000 1800 4095 1800 105 arcto 4 {pop} repeat 4200 1800 4200 705 105 arcto 4 {pop} repeat 4200 600 3105 600 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline n 1905 2775 m 1800 2775 1800 3870 105 arcto 4 {pop} repeat 1800 3975 2895 3975 105 arcto 4 {pop} repeat 3000 3975 3000 2880 105 arcto 4 {pop} repeat 3000 2775 1905 2775 105 arcto 4 {pop} repeat cp gs col0 s gr % Polyline gs clippath 2940 1230 m 2940 1170 l 2789 1170 l 2909 1200 l 2789 1230 l cp eoclip n 1875 1200 m 2925 1200 l gs col0 s gr gr % arrowhead n 2789 1230 m 2909 1200 l 2789 1170 l 2789 1230 l cp gs 0.00 setgray ef gr col0 s /Helvetica-Bold ff 180.00 scf sf 825 1125 m gs 1 -1 sc (DISEASE) col0 sh gr /Helvetica-Bold ff 180.00 scf sf 975 1425 m gs 1 -1 sc (FREE) col0 sh gr /Helvetica-Bold ff 180.00 scf sf 3225 1200 m gs 1 -1 sc (DISEASE) col0 sh gr % Polyline gs clippath 1784 2729 m 1833 2694 l 1743 2572 l 1790 2687 l 1695 2607 l cp eoclip n 1200 1875 m 1800 2700 l gs col0 s gr gr % arrowhead n 1695 2607 m 1790 2687 l 1743 2572 l col0 s % Polyline gs clippath 2966 2694 m 3015 2729 l 3104 2607 l 3010 2687 l 3056 2572 l cp eoclip n 3600 1875 m 3000 2700 l gs col0 s gr gr % arrowhead n 3056 2572 m 3010 2687 l 3104 2607 l col0 s % Polyline gs clippath 1860 1470 m 1860 1530 l 2011 1530 l 1891 1500 l 2011 1470 l cp eoclip n 2850 1500 m 1875 1500 l gs col0 s gr gr % arrowhead n 2011 1470 m 1891 1500 l 2011 1530 l 2011 1470 l cp gs 0.00 setgray ef gr col0 s /Helvetica-Bold ff 180.00 scf sf 2100 3450 m gs 1 -1 sc (DEATH) col0 sh gr $F2psEnd rs msm/vignettes/figures/general.pdf0000644000176200001440000000463014471426252016644 0ustar liggesusers%PDF-1.3 %Çì¢ 5 0 obj <> stream xœ­XKoÜ6¾óWèX…ïÇÑF #=´ˆw‚œ6ˆ“` í¡¿ó"EÉPy<ŸÈùfæ£È¡öç G3hü“ÿçI½{LÃÓ?ÊaøW™á›¢ñáñA%=jíÊ`MLô„åÂh˜hÈpyL¥ÃÚgU¡ Fƒkƒ>ÉP™Œ÷À$QœUŒ°gxQ± }’©6ÉÑ4ˆA ¦@JáÒAΰ2Qú5 ³úªŽ*d§kå³}Q!L—aH15FT0ÙR-Ûœcõ¦ü‰¶Öéí\¤yÌŒ¢ÏÍ™m®Žl)Ml©‹¹,$íjò®´šfûv˜kòÎÎl¨&²¥&¶9­êMù­ÔäKn5mZMAûY²¹&²¥&±EYvæô´«É– aéãXJ„²ðÐPnõ‰Í -}.¢£‘³’1D]â«©(#<Ä‚/=†©à {Áûqk$Ì·>pQÏLjð$(9\J~BSs§ pñ?®aÖP8îYx‚î ºÀL›€6šO£)eÊ`Ö¡Ödóùx¨2”LOrlÆ G‚låÁWõ×Ûá‡úõ Ÿ âgH½îFm1n.ëBÕHñiM4=ô<“Uè/oË.ù²+H—ô¬í²äRS˜qJn¯^vŽž8;:™ë Kê”ç"BÄÔÌÞv¯2*¸b˜^ ò,‘uXðWíÑÐEç9@ÕÐÅàPC]5t ÎÙ^áZF.y[?sÓø×ú­¦—b,sX‡í®'Ù©[òºW©,ÝíeŠÆ¯¶™…3ÝfpÉbz6À–lÑØ¥lË»b˜žGXg°I²]K‚²Q«6ÛÅíDZu™Ú<P #[ZÛÜ…ª÷<.-Œü¤…a®|sOg›[ÙÒÂÄæ,ÄyïZØÿ}Œ7b¶IlèJX‰#¡*Q.©C¯¶ò)Y>ªqrÁÂË|\îÞgÚà[FfvXä׺î;C“mf„ã©ã‡­‹]Ç2XklÕ€ÛNƒÞaÚ [†m¼ÖuÞ–¦ÛÌè­îø=ôÁ9v[h@»]4ð6/4è¦ ²eئÁk]÷h’k°ÍŒ!úŽ?$ÓÅ®c ‚.MƒìBƒÞaÚ [†m¼ÖuØ‘i''‡½¡ÁX)Cƒ:T˜àh%˜LêGÑ÷ÅË 8yš öEiþÓ&û*ò\ã¾ë¸€kw Â6SZ[èÆÓ 59~݇ ‡’Y™…ó´I½Ê£)sû¾«…oʰ͔Љûا»ømtK>FX>^feÎÓ&õ*¦Ì5›2l3e€g]èù}ü6º¥ .¬ :³2 çi“z•GSæwT†ôùû $2lË¿ó4ÜÔ»G¸øà%öôEñ/GðqåÍøì³ÃiRßO·÷ý9¤Êè\{dn>~WwYØÄ@óæ¿½?ÞßïoEg;Cœ 䄦µY¹x‡¤ý> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 9 0 obj <> endobj 10 0 obj <> endobj 8 0 obj <> endobj 11 0 obj <> endobj 2 0 obj <>endobj xref 0 12 0000000000 65535 f 0000001554 00000 n 0000001845 00000 n 0000001495 00000 n 0000001336 00000 n 0000000015 00000 n 0000001316 00000 n 0000001602 00000 n 0000001702 00000 n 0000001643 00000 n 0000001672 00000 n 0000001787 00000 n trailer << /Size 12 /Root 1 0 R /Info 2 0 R /ID [<4772CDDC270CC9832170B8A6062C540F><4772CDDC270CC9832170B8A6062C540F>] >> startxref 2063 %%EOF msm/vignettes/figures/p2q1.eps0000644000176200001440000000576614471426252016043 0ustar liggesusers%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 28 757 199 814 %%HiResBoundingBox: 28.300000 757.000000 198.400000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (epswrite) %%CreationDate: 2006/06/22 17:45:27 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<> stream xœeK 1 @÷9EÖ.4é/í \«G: ñþ`ÒvÊ> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000470 00000 n 0000000588 00000 n 0000000411 00000 n 0000000280 00000 n 0000000015 00000 n 0000000261 00000 n 0000000518 00000 n 0000000559 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [<246D0C83F38FA09D6CA84E3971E1D234><246D0C83F38FA09D6CA84E3971E1D234>] >> startxref 740 %%EOF msm/vignettes/figures/p3q12.eps0000644000176200001440000000613414471426252016114 0ustar liggesusers%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 28 643 199 814 %%HiResBoundingBox: 28.300000 643.600000 198.400000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (epswrite) %%CreationDate: 2006/06/22 17:45:29 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> stream xœ]M! …÷=E×.´å¯p×êLÌ,Œ÷O¤ÈŒ!„/´ï½ÂéÈHºÚy_átœ>À8×ýÂ3¸,ÈWð‹‚TˆB;´ò,ð„ppÜ-˜ý¨›ºaÏ­ghÍ+Ç€©úhZj©Q|wÛ V­Û”„SK Îë$²/Q?‘ÇTÚ³ÀãPe³=­«RéU›F#W©I¬·™+EßÒm ê³ùÆL “ã?‡\º®øáµuØ~c!7,.ð¾•X¤endstream endobj 6 0 obj 196 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 9 0000000000 65535 f 0000000490 00000 n 0000000608 00000 n 0000000431 00000 n 0000000300 00000 n 0000000015 00000 n 0000000281 00000 n 0000000538 00000 n 0000000579 00000 n trailer << /Size 9 /Root 1 0 R /Info 2 0 R /ID [<18776D8BF95E9FF7BDC22AF23A1A5A27><18776D8BF95E9FF7BDC22AF23A1A5A27>] >> startxref 760 %%EOF msm/vignettes/figures/p5q1_4_6_8_11_12_16.eps0000644000176200001440000000717414471426252020051 0ustar liggesusers%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 28 643 539 814 %%HiResBoundingBox: 28.300000 643.600000 538.600000 813.700000 %................................... %%Creator: GPL Ghostscript 850 (epswrite) %%CreationDate: 2006/06/22 17:45:34 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2005 artofcode LLC, Benicia, CA. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<> /CCITTFaxDecode filter}!/FX{<2->3, with covariates included as in a Cox model} } @Article{gail, author = {Gail, M. H.}, title = {Evaluating serial cancer marker studies in patients at risk of recurrent disease}, journal = {Biometrics}, year = {1981}, OPTkey = {}, volume = {37}, OPTnumber = {}, pages = {67--78}, OPTmonth = {}, OPTnote = {}, annote = {Interpolation to reduce to common monitoring times} } @Article{gentlaw, author = {Gentleman, R. C. and Lawless, J. F. and Lindsey, J. C. and Yan, P.}, title = {Multi-state {M}arkov models for analysing incomplete disease history data with illustrations for {HIV} disease}, journal = {Statistics in Medicine}, year = {1994}, key = {}, volume = {13}, number = {3}, pages = {805--821}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{rich, author = {Guihenneuc-Jouyaux, C. and Richardson, S. and Longini, I. M.}, title = {Modelling markers of disease progression by a hidden {M}arkov process: Application to characterising {CD4} cell decline}, journal = {Biometrics}, year = {2000}, OPTkey = {}, volume = {56}, OPTnumber = {}, pages = {733--741}, OPTmonth = {September}, OPTnote = {}, OPTannote = {} } @Book{andersen, author = {Andersen, P. K. and Borgan, O. and Gill, R. D. and Keiding, N.}, ALTeditor = {}, title = {Statistical Models based on Counting Processes}, publisher = {Springer}, year = {1993}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, address = {New York}, OPTedition = {}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Book{macdonald:zucchini, author = {Macdonald, I. L. and Zucchini, W.}, ALTeditor = {}, title = {Hidden Markov and Other Models for Discrete-Valued Time Series}, publisher = {Chapman and Hall}, year = {1997}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, address = {London}, OPTedition = {}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Book{guttorp, author = {Guttorp, P.}, ALTeditor = {}, title = {Stochastic Modeling of Scientific Data}, publisher = {Chapman and Hall}, year = {1995}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, address = {London}, OPTedition = {}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{juang:rabiner, author = {Juang, B. H. and Rabiner, L. R.}, title = {Hidden {M}arkov models for speech recognition}, journal = {Technometrics}, year = {1991}, OPTkey = {}, volume = {33}, OPTnumber = {}, pages = {251--272}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{baum:petrie66, author = {Baum, L. E. and Petrie, T.}, title = {Statistical inference for probabilistic functions of finite state {M}arkov chains}, journal = {Annals of Mathematical Statistics}, year = {1966}, OPTkey = {}, volume = {37}, OPTnumber = {}, pages = {1554--1563}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{baum:petrie70, author = {Baum, L. E. and Petrie, T. and Soules, G. and Weiss, N.}, title = {A maximisation technique occurring in the statistical analysis of probabilistic functions of {M}arkov chains}, journal = {Annals of Mathematical Statistics}, year = {1970}, OPTkey = {}, volume = {41}, OPTnumber = {}, pages = {164--171}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{rabiner, author = {Rabiner, L. R.}, title = {A tutorial on hidden {M}arkov models and selected applications in speech recognition}, journal = {Proceedings of the {IEEE}}, year = {1989}, OPTkey = {}, volume = {77}, OPTnumber = {}, pages = {257--286}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Book{rabiner:juang, author = {Rabiner, L. R. and Juang, B. H.}, ALTeditor = {}, title = {Fundamentals of speech recognition}, publisher = {Prentice-Hall}, year = {1993}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, OPTaddress = {}, OPTedition = {}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{albert99, author = {Albert, P. S.}, title = {A mover-stayer model for longitudinal marker data}, journal = {Biometrics}, year = {1999}, OPTkey = {}, volume = {55}, number = {4}, pages = {1252--1257}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{albert:wac, author = {Albert, P. S. and Waclawiw, M. A.}, title = {A two-state {M}arkov chain for heterogeneous transitional data: A quasi-likelihood approach}, journal = {Statistics in Medicine}, year = {1998}, OPTkey = {}, volume = {17}, number = {13}, pages = {1481--1493}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{albert94, author = {Albert, P. S.}, title = {A {Ma}rkov model for sequences of ordinal data from a relapsing-remitting disease}, journal = {Biometrics}, year = {1994}, OPTkey = {}, volume = {50}, number = {1}, pages = {51--60}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{viterbi, author = {Viterbi, J.}, title = {Error bounds for convolutional codes and an asymptotically optimal decoding algorithm}, journal = {IEEE Transactions on Information Theory}, year = {1967}, OPTkey = {}, volume = {13}, OPTnumber = {}, pages = {260--269}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{albert:2000, author = {Albert, P. S.}, title = {A transitional model for longitudinal binary data subject to nonignorable missing data}, journal = {Biometrics}, year = {2000}, OPTkey = {}, volume = {56}, number = {2}, pages = {602--608}, month = {June}, OPTnote = {}, OPTannote = {} } @Article{aalen:deangelis, author = {Aalen, O. O. and Farewell, V. T. and DeAngelis, D. and Day, N. E. and Gill, O. N.}, title = {A {M}arkov model for {HIV} disease progression including the effect of {HIV} diagnosis and treatment: Application to {AIDS} prediction}, journal = {Statistics in Medicine}, year = {1997}, OPTkey = {}, volume = {16}, number = {19}, pages = {2191--2210}, OPTmonth = {October}, OPTnote = {}, OPTannote = {} } @Article{destavola, author = {de Stavola, B. L.}, title = {Testing departures from homogeneity in multistate {M}arkov processes}, journal = {Applied Statistics - Journal of the Royal Statistical Society, Series C}, year = {1988}, OPTkey = {}, volume = {37}, OPTnumber = {}, pages = {242--250}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{andersen88, author = {Andersen, P. K.}, title = {Multistate models in survival analysis: a study of nephropathy and mortality in diabetes}, journal = {Statistics in Medicine}, year = {1988}, OPTkey = {}, volume = {7}, number = {6}, pages = {661--670}, OPTmonth = {June}, OPTnote = {}, OPTannote = {} } @Article{leroux:consist, author = {Leroux, B. G.}, title = {Maximum-likelihood estimation for hidden {M}arkov models}, journal = {Stochastic Processes and their Applications}, year = {1992}, OPTkey = {}, volume = {40}, OPTnumber = {}, pages = {127--143}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{bickel:ritov:ryden, author = {Bickel, P. J. and Ritov, Y. and Ryd\'en, T.}, title = {Asymptotic normality of the maximum likelihood estimator for general hidden {M}arkov models}, journal = {Annals of Statistics}, year = {1998}, OPTkey = {}, volume = {26}, OPTnumber = {}, pages = {1614--1635}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{perez, author = {P\'erez-Oc\'on, R. and Ruiz-Castro, J. E. and G\'amiz-P\'erez, M.Luz}, title = {Non-homogeneous {M}arkov models in the analysis of survival after breast cancer}, journal = {Applied Statistics - Journal of the Royal Statistical Society, Series C}, year = {2001}, OPTkey = {}, volume = {50}, number = {1}, pages = {111--124}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @ARTICLE{bureau:hughes:shiboski:00, author = {Bureau, A. and Hughes, J. P. and Shiboski, S. C.}, title = {An {S-Plus} implementation of hidden {M}arkov models in continuous time}, journal = {Journal of Computational and Graphical Statistics}, year = {2000}, volume = {9}, pages = {621--632}, abstract = {} } @Article{oehlert, author = {Oehlert, G. W.}, title = {A note on the delta method}, journal = {American Statistician}, year = 1992, volume = 46, number = 1, month = {February} } @Book{lindsey:rm, author = {Lindsey, J. K.}, ALTeditor = {}, title = {Models for Repeated Measurements}, publisher = {Oxford University Press}, year = {1999}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, series = {Oxford Statistical Science Series}, OPTaddress = {}, edition = {second}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{jackson:sharples:2002, author = {Jackson, C. H. and Sharples,L. D.}, title = {Hidden {M}arkov models for the onset and progression of bronchiolitis obliterans syndrome in lung transplant recipients}, journal = {Statistics in Medicine}, year = {2002}, OPTkey = {}, volume = {21}, OPTnumber = {1}, pages = {113--128}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{jackson:sharples:2003, author = {Jackson, C. H. and Sharples, L. D. and Thompson, S. G. and Duffy, S. W. and Couto, E.}, title = {Multistate {M}arkov models for disease progression with classification error}, journal = {Journal of the Royal Statistical Society, Series D - The Statistician}, year = {2003}, OPTkey = {}, volume = {52}, number = {2}, pages = {193--209}, month = {July}, note = {}, OPTannote = {} } @PhdThesis{my:phd, author = {Jackson, C. H.}, title = {Statistical models for the latent progression of chronic diseases using serial biomarkers}, school = {University of Cambridge}, year = {2002}, OPTkey = {}, OPTtype = {}, OPTaddress = {}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{kalbfleisch:lawless, author = {Kalbfleisch, J.D. and Lawless, J.F.}, title = {The analysis of panel data under a {M}arkov assumption}, journal = {Journal of the American Statistical Association}, year = {1985}, OPTkey = {}, volume = {80}, number = {392}, pages = {863--871}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{my:cav, author = {Sharples, L.D. and Jackson, C.H. and Parameshwar, J. and Wallwork, J. and Large, S.R.}, title = {Diagnostic accuracy of coronary angiography and risk factors for post-heart-transplant cardiac allograft vasculopathy}, journal = {Transplantation}, year = {2003}, OPTkey = {}, volume = {76}, number = {4}, pages = {679--682}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{matrixexp, author = {Moler , C. and van Loan, C.}, title = {Nineteen Dubious Ways to Compute the Exponential of a Matrix, Twenty-Five Years Later}, journal = {SIAM Review}, year = {2003}, OPTkey = {}, volume = {45}, number = {1}, pages = {3--49}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{ahf, author = {Aguirre-Hernandez, R. and Farewell, V.}, title = {{A Pearson-type goodness-of-fit test for stationary and time-continuous Markov regression models}}, journal = {Statistics in Medicine}, year = {2002}, OPTkey = {}, volume = {21}, OPTnumber = {}, pages = {1899-1911}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{titman:sharples, author = {Titman, A. and Sharples, L. D.}, title = {{A general goodness-of-fit test for Markov and hidden Markov models}}, journal = {Statistics in Medicine}, year = {2008}, OPTkey = {}, volume = {27}, number = {12}, pages = {2177--95}, OPTmonth = {}, OPTannote = {} } @PhdThesis{titman:phd, author = {Titman, A.}, title = {Model diagnostics in multi-state models of biological systems}, school = {University of Cambridge}, year = {2008}, OPTkey = {}, OPTtype = {}, OPTaddress = {}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @article{titman:asympnull, title={Computation of the asymptotic null distribution of goodness-of-fit tests for multi-state models}, author={Titman, A.C.}, journal={Lifetime Data Analysis}, volume={15}, number={4}, pages={519--533}, year={2009}, } @Article{putter:mstate, author = {Putter, H. and Fiocco, M. and Geskus, R. B.}, title = {{Tutorial in biostatistics: competing risks and multi-state models}}, journal = {Statistics in Medicine}, year = {2007}, OPTkey = {}, volume = {26}, OPTnumber = {}, pages = {2389--2430}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{sweeting:inform:msm, author = {Sweeting, M. J. and Farewell, V. and De Angelis, D.}, title = {{Multi-State Markov Models for Disease Progression in the Presence of Informative Examination Times: an Application to Hepatitis C}}, journal = {Statistics in Medicine}, year = {2010}, OPTkey = {}, volume = {29}, number = {11}, pages = {1161-1174}, OPTmonth = {}, OPTannote = {} } msm/data/0000755000176200001440000000000014670544604011771 5ustar liggesusersmsm/data/msmdata.rda0000644000176200001440000025443114471426252014115 0ustar liggesusers‹ì]¼\Eõ~)@¨ )$@z¡åݲ%u’¼¶»¯lytQ:‚éE@ºˆAD‘ŽÒQÞ‘® MéMªÀ÷Îw朽wË{/ýçý~_6»{ïvæ;eÎÌæ[¶tVÙr•¦¦¦ÁMC j<¤øß¡ƒ‹ÿ jÚ´rñu…í÷Úù€}›š†Œ*}SÄêMM#Þ.ˆÆ` CB0X!+VÁJU0,+ ¬R«VÁjU°z¬ ¯‚U°¦…‘£€Ñ!¬Uc«`°v¬Sã«`°®Àz#0© & L©‚©Ó¦ ̨‚™X¿ 6¨‚YU°¡…B°qlR›†`¶…æ*p,¸UàYðXâUAÒ s«`^ÌX,T,X‚%hhÚ€v C 4©‚ÎtYèz,d#«‚7DàÆüø£ÀŸBppsn‰ÀŸ#p«…Û"p»…;"p§À]¸;÷X¸7÷Eàþ<#ðPþ‡#ðˆÀ£xLàq OTÁ“Uð×*øðT<]ž Á³Às!xx!ÿˆÀ‹xIàŸx¹ þU¯„àÕ¼fáu7€7«à-·CðNÞÀ{À¿÷€#ðQ>>‰À"ði>³ð¹† ­ ŠÀà ‰ÀP +¬¬‚a!X9«¬ ¬¬na À5#0R`0:cª`­*qXX'ã&¬ ¬‰À¤LŽÀ`*0-Óf„`fÖÁ˜lldac`“lÙh¶à„À 'à[ˆYˆ $"ŒÀ¹˜ùX…TYXlaIZBж´G #) d"Ði¡+Ýè‰@È… /Pˆ@o6‹ÀæÀØØÊÂÖÀ6ø °m|µ ¾fa;ívØ ØY`—*Ø5_ÀnÀî¾Q{TÁžØ« öø&°À¾öö880Eàà*ð-ÀÃ#pD¾#-£#p plŽ Áñ¾"ðÝ*8øpRNŽÀ)§FàûÀiø…Ó#ðC3€3#ð#à¬üØÂÙ?~jáœü,ç œ'p~\PVÁEUpq\üÜÂ/..³py\‚+«à—À¯€«"ðë\ß¿¸ø]®Àu× ü>7X¸øðG ŠÀM7[¸ÅŸCp+p[nîˆÀ¸+wGàžÜû"p¿ÀFà!¿„àaà‘<Ç€Ç#ððdþ üÍÂSÀÓø»À3À³x® žÀ ÿˆÀ‹/EàŸxøW^±ðj^³ðzÞxx+oï¼÷"ðoà}  |‚#ðIþOÏ"ð9cp0(ƒ!VŒÀJ•-¬¬Õ"°zÖ†G`DÖF£FG`Œ…µ"0Ö¸¬u"0^`BÖÀz˜I˜ L‰ÀÔL Át 3,ÌŒÀúØ ³B°a6 ÁÆ›D`S`6Ð'n<À@,ñ$"˜#07ó,ÌD`¡€²°H`q–D %­Ú"Ð ¤#‰@§…®t‡ 'Ùäò(D Ø,› l-#°U¶ŽÀ6ÀW"°m¾jákØÎÂöØ!;F`§ì ì쯇`·ìnáÀØ3{…`ï|3ûìka?` DàÀƒ‰À¡ߊÀa8<G|;GFà(àèc#p\޾cá ßÀ‰øžÀI89§DàÔ|?§EàÀéø¡Àg†àG8+?ŽÀÙ!øI~ œ‚Ÿ œká<à| Bpa. ÁÅ!¸ÄÂÏCð‹\‚Ë,\‚+ªàÊü² ~«~‚«kà7~[×ÔÀïúˆk#p]®¯‚ß Ü‚#ð‡:ðÇüi€p“ÀÍýÀ-®‚[ëÄmn·pG¸3w…àî:qO¸·¸/÷×ÀuâÁñPþbááðHx4Yx<ODàÉü5‹ÀSUð´Àßž©gkà¹*x¾¼`áx± ^ Á?#ð²À¿¯ô¯†à5 ¯7€7À›!x«x» Þx·Ÿx¯ü;ï |‚kà£|\Ÿü§Ÿø´ø,Ÿ—cHST'‡`Hja…*XÑÂJ†E`å¬R«ZX­X½Ö ·0B`Í:1R`TF×À˜*X«‚qX»¬S'Ƈ`‚…uC°žÀD “úÉu`J Lµ0­NLÀŒ*˜Y'ÖÁU0+VÁF!Øx)`“±i Ì®Í5àÔWÀë'ü*ˆYˆ[HTA² æÔÀÜÌ‹Àü,¨ -( ‹[XÒG´ÔÖD[m”Τñ¶ên þTö«Gïþ‹WÛTöÙ%›Ÿùâ‰*wôým©ïï©òC_~hxîJ•?î§;œͪ0xÿÃüê×ø¾íÖÚ×éùãâßÙ*wÄYOý-~·Ê7¡¼£v:íΘʶpôÈn€û&µÝ±Ó/‹÷íqßtzñ¾o|xàÏþ\¼ïø+7¾gtñ¾9 nÚtvåõ{ιæ«ïðç[ž´pÁ}ŠíÔõÈöø[¯Ï?^å>{çâ‹v{\å¿}Iÿ½_¿1­x_˨ÍÚ·.–7rÓ+÷¸FåÀëǯ¤OÓÅ÷mÛ±áË7Ž-–÷Ã[Ûÿ¼zñ¾±›¼õË‚Ê}úb¦ãá_ªüáxýø»Ì<¬­büíqÎþ­éÆ?nÿ`ñ9\ôÏËP¹ÿäö¼êécTþ0¼~´ÁW6~åÊþû«~ͳþð‘·Z”ÏS‡µMî;§ÿ]e_¸mèQ{7©Ü·ÉÿÅ{­Xþ°mÆõ~¯ÛüžBvåù}ïUwžØþºÊ>|á^›üúÖâø^;tøiÜ߇_·Ë?æüBå?ïÜkÏŸ¼È÷m1}ÂÚsç¨ìãO\yù¹›ïÓý’û rvx±{†­ ƒ^0z¦â>ó¾pàwï÷•ýËð].Î~Gå]÷ѯ›¹¿1þùÿh¹3÷å®9ç©õ)Þw樇ÇÿDåZãÒ—Þ¸Vå0.ùƒ' ]|ì³Åût{ø¾®?è¸ýTöÑø×¤r>wÛÑ›]¥rþçÐäуUþ 7'>ýê“Åñ=fæ®]k‰û¶ytäk{ðûžRw¹*û`÷E¿¸y3þ<¯ÛQñyW‘•f¿¬²üdÔZÛÎQ¹}ÎÝðÒ‡ÞW¹w¯v»Ï:T~ß+Ž_áëùúÎý†9ûO*{ÿÉ×ýþŽ5Uî›§=Ô=÷>•{G_G×çßuK|_÷?:æ£õTöî¿—R¯_,9ò„œÊíý÷Ý®\\ï·?|o¿¡CUþ›¯ž=vÏ¿©ü;ß>ÿ¼Æñ}™×6ôË‹ÏÛ²§s¯½*Ûsÿvl¾É*üyj½9‡_–UÙ»ô+÷ßàÕR¿ÿªÊ>¤_s»½¼`ñÖo¨ÜzÜòÍ=%ó?ùûüíÿñÁ.¢ŸïøàÐ÷U±ßôkîëW~~ô†R¹WîümrË*¿Û ›¾¶ùc¢ý¿/ù¸b½ôkn·íO}ê_Uî_úº<îÏ¿²èéu&¿"æÁæŸß<æ™â<(Škúžb9}á¥[o/Þç]ñ«÷.Þ73ß»ÝeÅûþ½W±çE?\¹øÏw½iú!÷õÞ’ïÓíËïzÞÅ3Î8³xß^7ñû·+ûŸçð|¯[>Œÿö‚¢|Ïˬü¯STn×¶§¶Ýñ•·ùÙ\‡y€ërÿD¹TþËöówÛt¯£Ïàçïòú¨6«xÊ¡òþyßw¿·É9‚6;¾%¿°ÈÏšos»Ü´é¦gí_¬—æs]vò™ù?Ì+ÊÛ£3_œ¼…Êítñ¡ï1%D¯-|ðÁ]OR¹®}dì’©Ü?2¿þÕœ1*¿ãš?}ö€Tþ…³&Mxôc¾o+­ù¾¡ãNß_è½­F¾öû+òR¾éðG©Üö‡Ÿ±Åèᮚ xÞöµÈÐ*ÿüWWí^ó)ÁKGüãù=;мðÇ)/þ}-•ûÚ¿N¾ï7‡ Þ{ó.)x+uñÎß¾¶(ÏšOrÛü¶;{Û«*‡~ÉÛöÂHô÷Àsë~ò‡oMrTîÜž=÷寫üzO¹û®Û«ò­†ÝZ"ù$·õ¡Ã¿æ*÷”õün-Ù{‹Os‹rkó|÷J«žôɊߵѠëŠßïsâñ ¾éúëÌõwx¿ø}‘¿~uñû–G]:KåþúðEËFå1^ùgßyƒÔÅ‚§î-þݧ²÷¬úìßÿò]•Û,ž¹ýço©Ü“·þ™sžÊo¥Ç©bÞl;~ŸN™RÔ×V;¶³ž¿Õ»;ìpÏÏùýö—rÕ7«ìó'¾yõe/å/øS¹—V;ço+•ß òƒ÷¬/_¶’„ÑW¬77>ÊÇõ¯sàþí¨r[ézçžÐ×Ûú6ûXiºy*»(÷øåE…ÞSom·˜ëÇéçeÏÕv§ù|³ÓÕ:\¼ßië W «à!~Ì?¦ÿò¥â<Õó<êóîË=¬õi¾B^'ÜÜôÒUb~êy™}ཿ=sj»ÊA¿åüÖׯ¿™Vy\Ÿ?0ë볌ÞùåLW9ðHz­‚OÓrX!oÇ ù%ž°œ­‚aù„þÍAÞó=‹Ò]n$®×rž½gçK1ôÌâõhç=ZŸå»µ^Í? ŸÃú.qÛ’o|_賃‡™Peï,¹~%Ï<ö³½^ý挢Üh^b>Ñü“}T7É Ç§±^øKå¸{Èê÷¼~oôçf«œV8ä“¢üiyÎo®ë‘ܲ¯ˆ‡ï×vA.ÿæS?íºTåÀs<®z<³÷iÈUØ;º³÷i½•ƒ•{D³‘Ø‘æ¾ïj; 7lijSFÏT¹ãÞßp÷>ªòÃ~trÏ3sUþ$=~h]•ƒœäÓó#ß;küW{²Âî4ó-÷üÑêÚ#Uz'ÞÎCÏò¸k;/û®ÏäA}!OùGµñ}–Ýj•ÏúbÆg|öWcgæ`åî+òñžSùÔEøý*y•¿×ßÌN)2sÑ>L¿÷Ö­!z[˯Ñs6Wø/O_ñƳï©ì#ºßrÐã9ôoÞæÓÍôçÙÇ4?æÎÑ~f~¼eW~…]…ûŒ¼ç­y =Íïõ<«èG² Ö<éÑüiøÆz?»–ç‰æ¯¬mwuj~Ìß¼úÖÛœ¹A¥Oþñ'æ{|YaŸÞ«õ{þˆßÌŸöÝ'vQ%ß’ýúæîÓr’Ǹs}´½½rƒöäîÕ<ŸÏhÞ6×§s½Òþ•þ®Ïaä`ßäÓWsÞ·ky4öä7w®W>õÙñÇÌÛŽ¯ïÐ|eëé,äÑÄA>¹û¦cFî­ò‡MûngËa*ÿ‰ŽTøcžÜï¥[oûQwѳý,­wŒßb]—ß§µd(ªü[;½ö¯ Ä|2zü€¸”±Û —òO\?õ‚ŸŠøŒí?“ùÖ¯¹ú‘bÿïùÖ·þÕ!•òKþÂ>û¶·&Šãö¶öcóûÀ|¯h5ÎüA~ò?>_²èg³Un¯ôSŸ+Ú¿¯½°àóµ³*ÿK›¼2¹’ÿïׯ¹=ß5lÂ&ÅëKá¿èïiÎ\ßöXÉaä÷»œž¾ûó=Uö壯¯ûƒëL»*ìÕ{!Ï»[~™±ga7ÿñ”Yÿ¹Jy¿[ËYîS kN\­è—Žþðš^Pyû¹4¾Ä—ð/Í÷í':ï¥FíŒ[÷ùíÁ‹‹þ‡e7Úö›Ñ×ZŽ+ú›â9¤¯`§äÁŸyèŠú—+ý÷Í·ÏÂï»süÄYsÏœZ @‰y«ã†Gº4˜y‡ïówi;ËÜ×¢ãºÙ;t¿TØë/¥tpFå˜<ä¸Û‹óÑ–;²žÖ~FîkÚÏÊý~â“ùç²W½ó­ßð}·üÛwv{m£íÄ!ñœ<ÊÏÛí„ý`âx¤¿žÔþKvDþ)+Þ¸Ó_¾úô íœrâ>‚Ç×0íÜm¥;3ÛÞ«r/ëø·qqŠ{"™C¼8½j®ßã»úÿ\¢²¯ýnë³L©üM:nm¾Ÿ¥ã"Ù_ β‘žw¹Ëõ<Íoüçß¾¿Ö¾*ÿË‹f½>ê‡ÂŸGü“ü¨ÍàG?ªýÁ<âŒùÇ,¹ÚVûÁßæçéþ3ñTŒ§ù~w=ϲˆW˜¸ â¿0×ãûì‹Ú¿Î'Œß¸³îgs=ÞÓ¸°ú¹×Í{Wåw°ÆËŒãÐÅÇ>s¿ø\û£Ùç‡Øví?.ï•G|‚¯×Ÿ3Ÿéúe_‚Ÿ»KòèA÷m§r òwY~)~¹‡<çl¹Ûy£™—ÄãÅþxæúÄOò*·óV«­òà‚b½t;xþj¾ÊÞ®y6·%Æ×ð‰ö‡+Ƶ}öîŽ]¡8¯»åók«ô}îÍ3doäï±ô|KQ=V±¼ž÷¼µ‹ý; w×C¬w¡ðçIOÞÛBûá9¬7ä7ÏÿKÏsßt´û"ÝÎÜú›Ÿ[q®--}IöÆ]ÚŽ0öüÑ<ü׊ö¯Ûü>ÊBžr;âïÍu‡~ÿ¨[^X¨²]µê=/íÏCõúEî“s®Þx¢ßwˆµqÈSoÍþö4•E<;wèÊœ1®èç`½$ð÷­ú»×ùúƒ8ã‘—?QÙ÷¿óŸë§^¨rqÔŠÓžæïϾ?èÃþ|ž‰³›ï¿þÿâLø1£1߬ã?æúÛ¯ÿÝÞ§«,âù¹CЮ6_2ø·Ã‹íѯæúý¬øö_)*ô¢?‹¸un¯_ÜnQQ®Þ8¨í„COVù½ô«¹öEö_Ðã{€Ï^í)9t*oëaâèûÜn:þ›{·(m;/*Ú9ãŽ8lÅçÅüÔóÑðô®ïùæyZËU¼ÃóNϳ,ængÌ?Ìïg{lm÷åÞÕöm~Ÿ{G¬±û§|=ú/‹x5é=þ^óº±'©ÿþ±Þ}éó×(òþ~7ÝüŸSŸê¸s¼Fãi¾ßqÁ… _ãy>Í!þÇóY_é¸Aöi­·x\t<™ãxÞs:^™ßI×—ûQ¯/fÿ¦ûÓô;ÖYó°;øùú¹Y¬GäNÖ~Ûzž™õhÄksOXq'ŠŸ>7õÞ“Ÿ¿¢XOÝþâ)_©Ð'$Ûh?™ü‹ŠxÅGÉÁ:j…¯9~†¸+ê_!Gˆo™xüj_Þæk¬#f?Ò|˜;tÇs¾šN¨Ü‡šïò‡Xë{T²7èùˆUÔŸüãû¬q ¿z.× üŸ‡ÁzqM;ÙþBIÀX¶k=Êþ€^§2ëyøqˆ'rüÖŠCÀþæ8ߦëœûǃTî!íßåáæ±VáкøÖ3ȯñ3a7³ßmÅyZ÷>bþ„¢üÝ~Øg]ýŠÊÁÉÁ?¦øWÞ–[òWQOŠŸäF;ÑŽ¼oC\û[‡‰PÜqosÝ’¿ø›Ž­¬÷­Ú/ɵÜðÚe×]R¬·îwÛn7ï÷ßsŸwwر¨µÜ™¼èïŠy û1·£ž&î‰ùÏö Ö3°þ›Û·èu šÁñ‚}­øæG… {“í\âZ/Óõbþ£uØ•&ŽŠu/²»þ®ý’Jÿ@×ÃÌ/įòˆÛåÁõ†<ä¶B>‹¤¸9­ßR¼Žä*kÅGiþPÜë]ìGcÝÙ^ßî±â ß1qqȧWËÛñSøÓäWÈ9üúâî¹û-ÿ›â>ø<ûÓÄçlž¡uŠÿ¿Ìõö<É•Ätç ýÂÏwY¼NñCôWí«ðKìøüž?Öú¶–^­X§@W¥=¦í/¶# §±®š·íGØ_Yا¹=tÀØÃß´â‹g!Þ¹6æÝÙ¶Þ×~~ö1kþÀO4ÌzÖÏsZë|ˆ{3ÏcÿêØóþ1âw*¿‰Ž·ç¯,™e‚Ï/ûÉÅ/>T¹™ˆŸýBûgù ´ß›¿ÄÊŸ¸Ôò›~aÅ!/Aoóó^ëþ§Ž"ÿ½¡?Ïa]%‡û+ÖeöÔñØì:kò ßZuÚ¤o^_¼þÌO;ü‚ÿµ|d_ן›u”W1(Þòúü¢#þÕbh{¶Â ùc;"ÿÔŽcíªãkYįsˆËäì8†‰wêçUøñ°Ks»XòIqÖç‘GfÇswG\û–Ž<³,xÆä"þCù‚ñ‰Wÿ×Ü:*·âDoèq«èoŠóÁ^¶õ¾‰Û“½ÿºß<Ö½¸žº?³/až!ž`êiÇI7•E^Bë¹§´?ŸßΊ ™ëáOÒõOòÏ=¾×Ryý:^˜ÅºKî[zÔÖÿf=q„ÜóÍ3þuð£•~ü¾ìC°mžòÈÎÙÆZ¯§üøq9ä˜xŠO üä©åàOÑúó²Î0þ‡‰3#Þµ³•¯Gö­ƒP~å¥l«ûÓö'L^ò6̺ îg;JûóÙGoEžBîim'æ¿æÿgnÏö¢_u?Ø~·OÛmÙGÐ_ˆççàåm¿ˆüÊ;³óºhWbì<¬Gæ7³òM(ò“'lì;Å^''ÿë¹~ŒmÇÓº±ûñÛ?£üvèýH¹F<Ô¬óÙëm¦¾ðÓhÝþb¾Ûòk(~dì:øw"_ ñ¢H4¥ýß@ÞD~fEž‡m'R¾©eŸrÿYv¨ç ¿,÷°÷<ÆÓ\û˜å“ò‘oм8×Á|Ê#NXó>Êωºòž)ŸËÎÓ1óQû!‘r„ü—Šø_»ö?²wkÿОg̈—Úñ#ÃO̯òÍ:ò“ŸQ>!ñ'åïÚò»½Žûf±¿Â¬'a=†öMÔôëïÐë{þ-òh²ðÃr7š_&_ÍÎ¥yBqS#·ÈïD¾aÅ}oo¾öšE{æV½Ï%‡xcþw󩢟(…ò(Ázä*ÿ°¾®BÎí¸hÎ’Êo³ó2Ìz%öØrgÏ Ê¸ÝÊo~°ß›|Bè+“Ÿøum׳#oòC L¾\Þ’GÊß z#ÎBqÏ ¾µó¦àOWøÝä¿Vô“õ<ò—‰ï19Œ_’|R>:å…oyœ´|dïÑó8‡çäPNORür’³ó iH/R<z0oï{¢ý0´‡âUˆ×ç¡7#yžÖ+L\Të“lÛOG žFþgEüÅì#@~”Íß$?öúâ#y{´‡öw™x¦îï ù!¹ÀúVn5ä÷‚õõ5ô<ÊŸjó‡•_hÏ'Ú'CvÙM‘r¯óº*óÁ_v>"å‰ßc×CçgïÔ<•ƒ~6yˆÙöË òî(ÎEö!ä&ßeÉõ<ÍëÙ?èýw¹ùÚæþ¥¼I+O“ì-ûy&¯Óây;NF<|‡nO®cþ­Ç_¹IÑnѯùÖ1×ì÷ŠÈ³JYqSê?ʯ€~ÍÝ¥õIeÓ>3ð½-w”/ÿ Å—¶<Ó<¤oóŸ-WÄCd_Úvo:BïP^µó6Í£yÛ®£y{›µŽiïS3v‰µOŽÖ­í¸˜±C < Z¯G¼%oçåP?›x,âÛ”ïnÇY(?ÃΟ 8­ëšý@Úo¬Ðt½mœÑú/Öƒ+ò(>Gñ^ò‡(ÿÊ^ÿµãNä‡b}ßìO õO›w©~t>­L^xŒøÕî/²Ï)Ïó²bþO“=Cù¶’¾×â;>Lú”äÊÄ7,ÿÖŽCSÓÖct¾ ÎSÉ}ë/´Îa¯+@û·jùév¼táÄWüw•½YŸ·“[ ×ÅY®¬¼Ê ²ùm3Ý~³^Aû¨ÞЯ\¾®Çw§úFíë¥}`¤`UèÛŸG¾’ñçÁÌ“–}AëÜ”†¼e“·ñ¨ˆ«Å¾ð¾ÏݦõN~É/Ð3EœAë¶<Òü„Ã<3û Ю »àN짦¼*j'âÏ|=ò‘ÈÞ¥ø센ß5qX¬;ØñÛ>£çÐþ.Ê+³íi;þ@ñaØ]vŠ9·ÂÚ÷xdÞžovò=ÉG}hÇÕ¨~ߦx2î¯ØÇjÇoì÷ÈCÊÞªóE+äíV½ß%‡<¡â'ãŽz˜87âÃv>Ö¡xöµWðìyÚÏjŸO@ñQ3ϱ.gëc:O üRO·÷R–Yƒ]HãiÇáHï>`åïÍÕçBeÿ0ôÑÜc'©Ü¬cÜ€sÆlž¥ö˜u1Èâ4ù~FN!/àeÎë´âaf¿4äÔäWbÿ³×3ó zöpù’ö©m÷ÑúåOa]'÷‚Þ?’Çû {ߨ ÚO4vƒí7R~éÊ7@þAÅü7ç¢èøAå÷ˆØy$×”·Iëöt®Š½~M|‰õAÇEÞBÞöKéù$Ç&¯Ê²é'ЇÐ:¦G#Þ§u6뺊8ÙÛä‡Rþ€½~Gò£ÖûÈ^³ë[qŽì"×@Üâ“¶8{ÖÞÇhâXWÃ<¨_;Ÿ>·Ïú‹u^†9/…âÌà“Ÿa?ÁË.$~¢sÈ. ;Ô>g‰äŠúÁž'à¿ì3°G)_‰Î‡±ó5ͺ3öƒP|ì?[?Øví?SœËäÍPüç97*ôÙùfÿî× ?ØœSWÞ_•vü7Š[Þm­»Øñ8Š«½¡÷ar{±ÿר7º_Lœ¡ÝÚ×Oñ1²ƒI?Ûûfi?-â2æss~)ö#O’ýcçË’BúÎÍ <­m¬}LدÇòJyïXG±×Ñ£ò=*ÎgB||‘ƒ\~µãŽ´ŽI×ã{s}…LëÖV\ŠÖ‹*ôæé+²û(.X°ò"l9¢üÚÇ„<¿Ü?õ¾ÌüîúÜÆJûò û!‡8KE{"ôKEÒ9Yd·Eéâ'ŠT¬w#NAß“¾¨µ~MúËØ°mŠìò·èùtN™ío˜| : q^Ô¯Âδõ‡m相ü7òÍz°åO‘>´×ï±ôˆÙ_Cû= w‡°÷cÁ5zÙŽƒÙ~-üªÜF:?9wòÞ߯99ûéýÚæzÄ9)/Ëø´/3mojäþ ñœí‡`?š‰gà^Ê×b¾Ç9U4oM>,ö;ì ób+â[¼oÎa+÷·¹kÝñ”ì3:/”öYTÄsL^Ry^HE<Çœ«‡qB¿E^Oyz”Cû6iÝжOM~– u)²ãÍ9vȯ±í<:?k/ëœø§&ë¹'Wgûÿ3ùÿþB{ÝɬÃÔy½±GíyŽs7(Þjò˜À#öü!»ô²áä™ÚòmÇ¥ÉÎ7zë¼öº¾ñß)_™ö/aÿ­×F|ù¨ˆ?Ùñ!Šßšë¬°ƒ¬<-*/jß4Ùm°í_’3òg­~ÈÛþ-凨vå9liíS%; v]…}M|‰ñ5ëeöú器ùcÔ¯zqÇÆxPÜÅÎ §~¤óø(?€ÎÜÜÊÛ0~ øƒÎÛ¤q³ýb³Î\žOgò†ísQíó@^?SÅMí¸5­/Vì£Ãþ{;ÿ†ìe³Oœö×Zùж¿JqsΨ_‚üPÒŸÖ¹8,Wˆ{Ò|¤|ÒŸç÷Òy¨Ù=öú Å#p>4FçE3?Xë©æ;Œ/ík¨8—zÎ>_ÔêÿÊ<«ý&îgÙ3Ö¹ &Þ\‘ŸýMüIëÆþ)ô™YCüÎ~í“€_nÖ¡ìÇÿzìëù ä9ðûæ¾Ùz?[çå¯ùùU¿9í*ÿ¾ÞïWˆëý}æú™ðKp=}^¸N—[ÀïEô.^ç·×n”W½GÝôêë‹ý;‹?™õË Šz¿ï@qþÜ }þfîÝïùôxä­¸}þ"œWýGì—ýçÚ|x·X'Å~¤ÜDÄ%hŸìOp˳8w=}.»y.ö}ÆâùÁ…Ÿh?¶pÞ/Y@} ”Ûm$?gÌáüî~!÷©Î/ͯ¿å›ý¦~×?_ùÚq*¿DÿŠÉ÷£}½vÿFï‹,à<‹^Wï¿ìÅþÄÞwË÷MÒ9…ñÚß/ÌÐû’ ØXøƒÞ?jÚsâ—G}^ï6rIçÂãwL9Çëùš·òÇi_rç‰pNdáçåçÎN×ñáüïΡ*| g¢€ßQ1õ„œ»çI¾Šs÷h_îîzßnþ œŸ‰sü ésýŒÜ\×ñòÏ×ý'Ÿ6W¯‹˜ßSÁ¹8¦Ü£õïæäþ¬Ï=Éã¼fsŽï‰tN#òqÉ^ÆïÐþîÂJ:ÎUX[ç{6Ôû$ X¯)À+ nQÀ¾Æ‚å¯å±O6ÿk¿,Å»èœòè\ýsô:~î<äÃýç£Ü¢ç/é«ýÞÏ[à‹!z½6¿"Æ{¥òøRþ»h÷iåñƒÜOo¢s‚ ù‰8×6ÎSÿ¹ø‰Þ7V@|ªw-Ͻ8±ýÞ‹óz/ÓýÜ‹ñîÅyl¦äoй-k–×3¿2êu°ü)å~H.¡Ï…3ç±ÝˆßÁ¸æ1~tÞ\þ:œ£ôá¿þfûKù8~?û¨ó7èópóŸê<ôÂ|½^gúç.Ðó±ð’>O­w¦•WMúm­ïrJÿŽQî=r7¡|ú}#Úÿu6ÆóÅ´—òN†¾£øÉØÿ?'2Ö±aG¬üßÂúw ¯Ö X‡-àw@ |}ß«&ݦzWÔú·w-í_ôÎÔ|ß‹~ë…=Ð 뽸üü±ü\ô'ýÑ-úwª Cµþ1íƒÞÊ/ÁïT~ÞbaUmw`ON.ç·Ü~ØÿþkÄSð{XyE¿ß„ß»BùyØiœ×R°ârt^hžö™ã÷ª Ð…‰z³°é7~û _‰zi»±€ßÉ(\«Ï'¤~7õ…¾1yä?m^¾ÿ-?Cï+Ï㜋¼Å×yœŸÿ†æ­ü5œ1nÖ‹öÃ&Û>÷•ŸíðØbÍ—üž˜ì/ïdý¾Å‹OÇz~&7 ö7öÇç.Ǿrúý˜YšïM;=œG°@÷_näߊëäéœ[œó–»üœ=sn³»b÷ýgo¤ò Ìçcµ=Ç~b#çðç §éxH¼WÀyi½Êÿ"‡óûòÓqN)öÅç/+?¹°¾¾®€}ô…ýt} ¿Ñç-¬s} _Ž×q¶Þú€^ü~MïÏËí§ÜušŸr°ÿ(o6ÿsÍ/ôû6…õËÏi4ûl,?º¾+`ÿ¤éoø!fž…ýw8—°0zvFáÍsæ¹ô:Dë ´§ðk=N…w¦?ñø9«¨^Ø·½Ö~3_é|üÎBîGÈü¹¶si>›r±O°wœŽ ÷â<^Ø!½¿ÐãÓ{£no/â½Ïév˜öÿá{GûüóUaš¶giÍ÷XŸ¡sÌü;\ëƒüå¿ïU˜ß;Ï…>êÅï©õb{-ç½ü98‡ ~Rzµ°uù¹EœgTX_ŸïP€þ+À?.Xç]åðû=¶ßšÃ¸æ=>¹Eú÷ÎrX—6ç7ѹjøÝ®ÜÕE¯0¶fÑ.Ñü™£|#ú=5: ú>‡ß1Ëã¼íü}ÎE~ýòßu2vÎÈÿ^Ÿÿšÿ³Ö…¡š Ø×R­ýõÂ4}>füWhÖçœi?¦€8ha;mW-ÿ½ÖG çj*À_èÝ ü\Š<òGŒÝüÝò}`&^¹üI¬OåÏÀzΓ¥}C…Q:>RXKÇC àÙ™åyG¹kµþͽ§ÏoÉ/Âï&¡y4!οü%ÎñøørIç(Úçæà‡æð{w¹Ûô¼ÌÑýM×õ6i}Ù;BÇzÇèzö‚{q~t/Î!îE<¦÷ÕGÿqá13‹þæÃÞk¶÷CíŸnÿn³¸nßfÖyt>é¹<ÎÑ/l¨ý‹ÎÃ-\a7‚s^rÖ¹?´ÿº0BócñÛìïÂ…:ÿ¨p½ö/ Ò¿CX€}Zxz~M/ì©ÞµôxöÆô¹"½ˆoõÚçMÑ:ÙʈŸ˜|>²ß×gìoØ÷–_W@|§ö@/Î5î=¾<cìÄKËÏÿ/Œ‚_‡u‡Âٚ߈OM}Á“¹)˜Ï8ŸÖð1W>“~¯­üüÚ~±;ºþU/Öz­ýbFàܶÂßõ¹é½5ôbþöžW~žKöKÞŠCå¯Ö¼–G<<ÿúˆ©;^½…* Òó§°HÇCŒtæ%£¿ÿ¬ýÿòs ð» ¯éu»ìÀ^ØÝ½Vž…9Wûx½Þ—G?ç±¾VXv6λ-ìýëm¶Xp¹*¹Ñ?vúqQOƒ|^ ¿qÖ«ÿOµ~1ãMüýmý{—9äýäWDÜêøòu“Â÷ð<ø½kYqYœ¯ŸC™sCI?Ó:üi:ߟì?SÎÁ*œÞ†Zø™ßâHè•­ø½Qœ#S€_ÈvŒæÞ„¶gzñ;§½Ðçs›þø>*÷¡Öù8—‘~`®>ÏÔœs‰óóGé~ÌŸŠýës¯MùàÙŸôïǬßk2ç|’MySñ {—xÛ<yýœ{]°Î‘*|¢ã ½IDzãyôGç¤RxIÿÎaïÔòòr‹µÜ›osÉÁ³yË¥x"­·ÙëÁ&¾q3ä–Î!¤|ú=X:v°®o~ ÖM§à<&¿'ŠsoÿŒß Èãw68Þ€q]yÈŸÉŸƒ|)œ[XWŸÓW°~g·>,à÷þ ø=™ÂÑú÷? °[ 8g®;¾û €¼,Ò#ä'ôÕýÕ;JC¯«ãG½ˆ÷þ¦Ü.- ~T8UÇ? Ï•çÍp^báÅòóÄò¿ƒ?øæòý Çêø®‰«"Ÿ¬ùk½ØßkïmÎÛ?›r6Á¹ötŽòšó ß[yyÈ»‰wã÷°M\Žì¤°Ãìx4òeóßCœˆö‰R¼çÔïšúѹÐçé¸tî}.Co~· ßÛ»v~7ë¥ùo¢½àñüYVžÎYÎÁ?ÏѺ†õ;lùtªÐñPZ/(`=¡`ýŽtîüž ÷ŸÔñ0Ï¢8౯ þ‘YŸ€Ÿ”¿IÇIŒx1~7¦ó¿wž¶/{ë]¤ã½Èëé…¿Ýkí?În“´Ö›7+ÏW.Ì„» øÖµü²+µ_^@ܬ°öšÍ‹ð« Ÿ–Ÿ'aúöyÚùï ø$ìu“7MçÞÁ_ÌáœÆôFî,¬?\Šñ¾VCŽöÛÑ:ýËå¿ãЋßî©å·w’æ™ÞÙÚì…ýß‹xQ/öÍõZú$ÿCäcݼ€ßµ(@?ΆÝõˆÞõÊÏ-àü?ã÷ã÷rÍ÷hçmà÷õâ\L³2WÏ£^ŒO/Î;콨üüVs^ÆjÐLj'æ¿‹<§{Ê÷ä1®yü®@ñ”ìnâß^K/åá§äáO ? û¿7qòÆE»„~ï¿C×;DÛ½#µŸÐkûiüOœëX¸úá…òër8Ôħ±•Oj#Ó³¼ÿiQ߬`ÅGð;'9Äsïiÿ&¿ºµ®{º¹) ?©€ùV@^d¯_7ñ«_è~*¼¢ãv½þ¡÷v(òÀ¤}ø]…·4Ïåš4_äPnþKn ~O‚Îáä®Ây¢wb½yt޳‰Û¯ŠsfïÈ#Þ˜ßP~¡ïš{¿ïÓœ«ºÎÙßç×Óög~:üLZ·…_FçÚç××PÀ9Ã…x[Çz×ïm¢ãƽ{븰©_\Ÿ»šC^µÉ÷…ßOz ?–ÎCÂ~‰YúÖ_©üiˆ×ùZ¯àW7Tئü÷ ëh}Wõœ ÚÎ)LÕövÁ×úÄØ•ð/ Ö¹af} ë/¦t¾?W¼¢öòˆkå×ǹ½s¡Wi¾#ÞEçyçáŸåOÀù?Æ~é«a÷ýòr“Ö·F^qÎ’É·^~ž ÓnïSÏ—xçœRžwcâR´>dí/Ï÷røƒÜ¯q.ì­<âmùÃËõQç©ð{žüÞñ“ïÝk­—›ý"äßÐï£"®‘Gܳ°&ø Pž¿•»JŸ·›ƒ¿kìoû¼YZ^ç»Óïœ ÿz­òßm.À¾(à¼v/‚齤|?–‰çàœöÂõz½®ð±>§»wU=ßÍü£ËïE^]ïåû¯Íº/ô{aDy^UneäëƒGsÃË×}z7Ðz»×ú¥Þaz_J/æo/Ö[L¹ßÖz.Oñ£Aˆ3`¯Ñ¿ø½¤Î-. ~S¸]ûéìk*À.)üSÇý °Í¸àÜä,Ö³×ìù8§üWš²ð«išöß™zOFä.”¶çò7ëú›8"ƒƒs„ÉNÍvÖS‹ß]ìg-‡ØÿØ-Ø-ä‘=Q8<õØùg•ûŸæ\Øÿ&x“ɳ9ëà?Äù¯š‹X½©iÄÛÅ×u—ãKǼ®W嚉Ë@=—UL^ê°ËѾŒù¼É—T‡j¼¶ÿ}˜ZçuMË@]—&?ÿýñEpD²Ÿ÷o´ ôÓrüÿÁ ¼.×kË!±\þ÷PMÿUïÁË@Ý¿H4÷ãÞž7_¦=%/õÚÌIxRçõÿMñ“iŸ×ÛÖ/ a2Å ëÕø¾6XÚ[/ÒË@þ—Ñ´”®ý²@|ºá2P—å(Çô/ ŒZºé‹Ô«ýAÓ2P‡&-uø_ïãåøßë_`YËã õ!Ê7XŽe“úpOOËjú’Úøe•»´ÐWîéïšÎr4†ÿ¦β†/[¿þ‹/G4Ȇ™¹ Ôe ±¬Åh—£r½âËæÂ/“–:Øø"ýËÿEô•k(žØ´ê´¬æp»u\óÿ‘_T¿•ÊY½ˆ‘EŒ(b ^KßMÄ÷ôùÚEŒ/b¼®-ž7 Ÿ­…×Òç%^šl]Sz&>[÷¬÷ãE™ëáþMÅûÑ(Ÿ®§:”ž¹~³Š˜-ààûÒ3\¼áãÿ¥Ï<ñ9]“e®”ê9V|Nß•ÚEëSi¨Ëƨ‡lϺhçÛTôŸlû$QŸ ñ,ùÿuÄ³æ ”îm+"cÙúVÙëâ³ Äç³E}JÏšëf”¯¾žèz?užŒÏ'£ï6h*K7#’±‰ÖóÖCýfˆ²&ãyö3'7•×úâÙ7%ÙK¥¶Í)ba‹€Å¢ß¨ïIÞiLÆãu†øn}1~cšx~OD¿Ê±¤y>K<Cñ<’ºè÷Òü)Åp|QÍiYßéâÙàÕÁýžÕçTGšc³›xn“\-(b úJö?Í—ñâsz½J¹™ÞIJD—ãK\Ms†Æ›ÚD}²¾xÞ4`¶kÒ9¥W)£ë41GPÙÓÐÎR[ã*ÑRDi—g›Õâ+9g&‰ñ¢Ï‰_7lbrß*«Tç%M,3¥²Æ ¼Ñ*xVÖÚiÏsª×$«þÔëŠ2K×”ì©7'‰çOåÌhây»¨£Ô;¤·6F¼ÌÆ+ŧ'5•ÏyÉÛŠçHݺ.>:“~¦ö¬ÝÄüAu—ÜK\KüHós¶xÝIJ5§‰çÖT´™úø–¸„8xƒ&ÖáTçÒ3Û›4¯mbž"÷ÊùH2hó¥´mÖmb™#PŸ”î%ý1¶‰íŽÒ8ÌãAvŒœÛ³­1 ~‰£‰ÏÖGD9k7±ß%yGÚIò•Ê—¶Í9H¾KýÔ"úˆæõ†M,£ÔG¥ñ$[‡Ú‘A»5•Ëåø&¶E¦5UêEJ>&›Gr¶mââ™~SùØ­‡gOG¿Nõ“óM>svS¹ìŸÒ<”}½©¸Nêj‹Ô…²>RV¥wšxÎR›È†£q߯nËÚ&¨ñdéÞDsÍC/’Wâ:â7i?’|”Æt¡¨ë¤¦r½cCÚ.¤GäçdØs–Æ|BSù¸KIý,eJöa©oÇXÏ%ý-Ç…ÚL2A|M߯sˆÏ7n*çVz&étš—ÒpÄgäÓ%›˜I.¤¯çc܈#ˆ_Öï“bLJs7Ò&Òã¶H6 ù’»Kß“½J(éñÅøœlý‰¢¯È7•m!¿–|W»ÛÖ$[†Æ8búŠú«õ!?AÜOMrKm&Œn⹿žøžbëˆrinÍ}O21¯k5±!9$Þ¤ºÍjb¿l"žYê7òyé:’Wjó‚&Öqd‹“Î&{@Ú“›Êmz¾”Ui7Ó\"þ “ÜAÏ•úfCzO¼I<äZ¯’cèÞYM¬WJÏ_gy ZŽ/ƒ­×j×,Çò¾YŽÿ~|2;äKªÃòùù¿…åãùÿ§¾ˆ6ý/¨ãr,¡{}9þÿa¹<üïa¹O^lßb úxYxÞ@”ýEÖ©Qýôß$ÇËBÿtŸö·îËZÛ«¡¿¶þrüÿÂr[{ÙÅ1&µÊX.ËÞ˜-Çrü¯ã˰ç—cy?ý7£/ã³Ü_øï³åãöß3N˱¼ï–cÙÁÿr¼ã±Mÿí°Çäÿã-‹m^ëôß„¾ößÒì÷euLëY»]V뾬cYȱ‚zï©öy=Ï´?§k‡Ô¸Þ~þ ƒ¬÷CC®±?Qfµ¶…µSÖ!ªŸêéûj¨§žÕúdž}M­g±þ/û{¨À ëÿau û°qÚT9®ö3Ãd©Þþ kk=cÑȘ íjÍ¥jm ëóFê]m^ m —•FžYÏõasÙî˨>ªwŽÕÒqµú8ŒËªÍz8PÖÍ~VÔ\‹š§Qý-ŸWëYa}WÖ‹(ùŒâí°2íÿGñ\µ¹TÜÔ#G²í±«Vï°1m”ªQ”L„ñ¬]Ž]÷zx$LÿÕº'JvÂæL_å­ZûÃlZ²ZM>kqDÔså³¢l—0Ù ë {¬Âê?(âyQ|(ëTkœ«Í˰{ír¢t­ñ“ó¯Þ1©%Õ&ßõÌÕj÷„qIµ¹Ö–¨vÖ’½°¹P‡£æg½}ÖHßʾªgÞl™«g=2¥7ëåg{¬mž­‡kq_˜œ‡Ý_O?WCµúE•5.Êf5> ûÎ~škÕÆ²—ÈúÚòÙˆN¯Åw¶¥Âtb˜ìÕÒùÈCµÏ«Õ³–lUÓ1¶ Õ£OìçU›ÕÐˆŽªÆ;v[}V†ê6mZ¹øºÂ^Ûï¹ó~Mú סôá7÷ßë€=ñfÈö»îŒÿÝi·íéãöÛûýw¶Ÿ¶ãÛïGO£WÙiûý·ßd—}‹Y—¯¼ïÞmBX½T»#‹ÿ|þù›Ã‹/ŸYÙaïâeCF¡¡ÅËÑ4dõE!X‚%!h³Ðt„ m!t† +=²!È… ‚°™…Í-B°U¶¶ ÁW€m¯ | ØØÁÂNÀ.v Á×ÝB°{¾‚=½B°OöÁ!88‡ß Áa!8Ü·ŽŽ ÁÑ!8FàXผ ð]-|8ÉÂ)N³ðàtà‡!83?ø1p6ð“üÔÂ9!øYεpp~...¶pI~ü"—…àrà W¿~ü:W‡à7~ \#ð;àZë€ëCðàÀŸBppsnnn¸=w„àN w…ànàà>à~ààAàaà àIà¯ÀSÀÓ!ø;ð¬…ç€Xx xx%¯¯ ¼ ¼üxøHàcàà?À§ÀgÀçŒ5š€AC€¡†žþ¼ÀK^¶ð/à5×CððfÞÞÞÞxøÀ‡ÀGÀÇÀ'À>>güp…!ÀPVV¬,°*°º…5B0R`”…ÑÆkcqÖÖÆëéÀúÌØØØ˜`ÅuŽ Á±!88ø.p"ð=àdà”MMk”ì?5®)øS]S¦,·Û1ªpý‹g«mmypÔ¥³Ô×Nº·øwŸ¹nÉC#þ½Î]W©LN¿fskN\Í»Eåî-¿nÝ5ל¹÷U?PëNØë݇ÏX­;óÞ›â§V .»ìù%÷4×-Ü%øS[¸ÁŸÚÑ™òõ•9Ã|¿ýþK>ûÊi™÷›´,yä3nRÞ 7óÀF©Å'\tį¨ÖmŸ¾ùŸgn®›4eÊÆ¹}^PSð~ÃÍ6»m“}ÿj¾ßz‹ƒ‡´=µ­y¿èØ–õ»þó‚ZôÊe§üvÇ”jÙJ÷Ã6û¬ùÓgø€¯»D×7³Ùfûd~z­ÚlEý~K´Ã”×É--ÉÑï«6¼áÆ ø¤2ßÇÖ\³ãÓsV¹½ÞxöÝ{¨¯à¹Û -oïFxMÎÕíûc]¯-u|úo£¹ºœÙo¼qíàí6V-º]¦?o,§ ñ¼.»lÎC'ÏP›L™rÚ' n¾ßfòëÓ;h9É ÕÏ횥ûë«VûÕšZ>Ô·nxüê!ë*u¸ŸÅ¿|s•cYs³—®§=¾ÉƒúÕN+ÎQ›ýF·kÛÁ“ÏÌÿaž¹nÛýôçæý^oì8ñÄ•yœ _ùH·>ÿÊåãþ•Ãÿ¾Û•‹o5ï§CŽgžp‡Û_²ºÚÀ’ëm~].SßxããõüJM;è •~¶Õ»*~ ٟ|t»ù¾ýÔñ´núƒƒ¶9jöZ*gÕk«þÙ¯ŸpèÉ;=¡rO?ý꓃NQ¹¿k9ÙÆêçñ÷uŸ~ú½y‡MMÄxvoRÞÏKNÀ<¹@_ë­º^mO–×Ã…œ™q¼L¯B½¦ÇuËst½èºS&¿âŸ¾Z0C×oáiZ¾Ówêr麭.»æï¼Òç­àÍ6ÈS~hyû7ûä†+o:kUžtܾ?Y_å¨ï×ó€¾oÃx´¿ÓCËù.‰þìOm1ª¼›Õϧ÷s6ÓãJïg€g€¿gCÍ»¡|žd¯ÕÏÉ^§Ç%û~ß»¦Öt] äº×âÕÅ¿)¯×úMåò²!ú#ŒÉëÜ ´œšyŽqmÃ8¥v×í¦ïI®gC^›ÑÞÍâåý°ýºø&<Ïɬ]Îô<ï鿹{óTáÚòçö)oÿz--[_ðÂmj2æñæÆkŽ8?þîI¥ë6?¸-ºü9à‰® ÊûCÁì¦ïÏ^QÞ?ÙãËçyø¸Ûâù¬Õ®ÅÐÙB¹œgU¹œOƒ|OG}×ÇüÛÈÒÃÝO—Û{‹†•—ß>JAŽÒ°ƒºŽ,/¯«©ü}òœ˜öѶݧ^¥3|pדŠrñh9_vÞT~_çeåóÌA?«½ÊõðBÈ×ÂW4(²'-þy©PoÒ»ÙÊåcøw1ä ƒëèû ˜oz.˜¹â£+ª [þîî··«Ô¬òúf×(çU[o§­þMYíê°Æ±ý¡òz´Yü6çƒr½Ðn=¿Åö;n-çõ…Ð+Ô¿j]Þk\–Xúo^ãè¯V«Þ‹¯-çÅVÎÿ-DýYã¾ØÒ?)«>dwßÍÆ|U–|/øq9ÏŽÇûy–}6×ò§’G–——œR®“ŸdëuϪgé;Ϻ޵êá@˜yv+·\f[÷Í€ý?Û²6µúcS\gžçf_+¯×:S¦¬úç£Ï7þØë9-Ë6²—¾^nW-²ä¸ú¤`ñØÆè¯%sµÞ ¿h³cËy0gõéÕ%°ZáWçß.×›Y‹z±ôð½áíŽo[>ÔÏðú£óÝ®.U.?]ç”ólç±åòÝfÍ—Ìåúd}nÙǶ±ã—²æ[+ù÷è·ŽuËëCzÔÔú¬Ýò{gÂÿßÔŠ´}RÞúËþ¼m³rþŸ=Õfµ£Õ’—8éeê?ëûµÑîõa_ú¸^½RÎ+æý«]³­8H‡ÕÿæQú¨Å²Û¬þnSÞÎÅSÊŸ× ý徚cñÂØ7†_àû²¿lžSV}’–};~IÌâµ7ÛlÁû×<¢6¶ž7 ñ—¹–þY8¬ÜÏj¶ê=Ûâ/í5ýý´ø”Äñ[¥ÿ­ŸzÑÂïZWe-½5õlƒýÐö¸ž/Ý–žˆY~Çb+žµèHýjäÊŠ›ø–ÿåYÏ›­Ç­‰Ö}ËèK í+ôñ3zo/úW»¶¿eÉkìdªZÏ û®/uªö]µD¡°ïd=ìÏë)g û£Ñ2ë}F_û:¬/­ÿÐ{kµ%êÿ2Y¤Z²KØøÙe÷¥/[÷öuîÔ3Ÿ¢ÚYKÞÃú¢?rõìZu¨W¶ÂÚV¶=«ÕµZÿ6ÚŸ}3ÕÆ ª¼Z¨u=í­uo_û²ž„ºF¯mT&¾«—ju#rW3jÍ£zeßn_Ø<’×4úÜ(¹¨Åµú;J†ë½®ž~ŠÒ!µžU¯>ïÃü-¥þ¼Ig ËWºÿn{R¢LRBwEæ%ÅEûR_1¨™þãÐ\úGÿñé?1úOœþ“ ÿ$ñŸÁͳÍÿšÍÿó?×üÏ3ÿóÍÿbæqó¿„ùŸ)Ã1e8¦ Ç”á˜2S†cÊpLŽ)Ã1e8¦ ×”áš2\S†kÊpM®)Ã5e¸¦ ×”áš2s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ÄÜR®_Åá;n`“>|c•¦ kÕõšA\há¢:qI¸ÌÂ5pe?pUüºN\‚ßô¿µpÀïÄ,ü±Nü©NÜÒþÜÜÚGÜÛ-ÜÙ îî#î«÷×À}Àƒuâ¡ñ—x8ôÖÀc5ðxžÁ“Uð·x*ÏÔ‰gëÄs ày /ÿ¨/Yøgx¹ þU'^©¯†à5×ëÄ[uâí¼S'Þ­ïÕ‰×Àûuàƒ|(ð‘…ëÄ'uâ? à³p|§ Z+TÁJ5°rX%«Ö‰ÕëÄu`¸…U°fŒŒÀ¨:0:cêÄXµ#0>,¬[&WÁÔ:1½̬ B°qh®§ÜxUàG D $k`N̯…€ªE5°¤´´Öö訔@ºdê@gtמ*ÈVA® ò!(D ·6À5°eت ¶®ÛDà+u`[àkU°À5°S ì\»ÔÀ®_¯‚Ý-|£ö¨=k`¯*Ø» ö©}k`ÿ*8  ¬ƒ"pHÀ·ªà°:px¾]G má˜*8¶ Žޝ‚ïÔÀ uà»uàÄø^œœSBpj|ßÂiUpzü0gTÁ™~œ‚Gàìü¤ü´ Î ÁÏBpnœWç \P†à¢¸ØÂ%UðóøE\Z—Eàò\QWFà—Uð«:ðë*¸º ~ß üε®¸ÞÂþ›ªà?×À­5p›…ÛCpG»Bp·À=Up/p¨‚"ðq>‰À§Ñ8aP ©‚¡À !XI` « ¬ÕC°†Àš50Ò¸¬‚ñU0A`ݬgaR&WÁ”L ÁôÌ Áú!ØÀ¬l‚C°‰…MšCàXð"à‡ f!)0G`næ…`¾À‚, ª‚E‡`IZ,´Zh«‚ޤ2!è²Ð‚\ò !èØL`ólaaK [E` _ØÖÂ×¶¶Ø1;[ØE`WÝv·ð { ì‚},ìká€láC¾‚ÀÃ-!pp´À1Ç ‚ã¾#p‚…ï |ÏÂÉNµð} § üÀÂéÀÎ8KàÇg[ø‰…Ÿ œ#pnÎÎÁZ¸Xàç~aáR — \náJàWWYøµ…«Cð[k,\+pÀõ¿¸¸QàÀŸn²p‹ÀŸn¸ ¸¸Cà.»î±p/pŸÀýxÐÂ#À£xBàI¿ üMà) O <#ðœÀó/üxø'ð²…¯¼*ðºÀoo ¼¼káßï | ð¡…>øDà?Ÿ |®ñÝAƒ!ÀP ++ ¬$0 XY``U`5`u k F¬ ŒF£ÖÆ ŒX[`ñ€uõ€‰À$`²À`šÀtÀLõ €YÀ†›l ÌšpðÀ<ÀB%°hÚR@躺, @/°™ÀÀ–ÀVÀW¶ø°°½ÀÀNÀ.À®ÀnÀ7€½o ì#°/°°?ppˆÀ¡À·€Ã#€£€c€cã€ï'§ßN~œœ ü8 8ø ðSààgÀ¹ÀyÀùÀÀ…ÀEÀ%À/€KË€Ë+€+_W¿®®®®~ÜÜüø#ð'àfàà6àvàà.ànà{ûîþ< <<<<<üxxxQàUà-à}àcà?'Ž&“?þ²êz*½ðÍ[nø@¥ÿôð„›OÿTeâõž¯~rkT'¾ïüÓÄSïxámÕµÑ ö|‡šÔMÏ~3±žZpõôgn¼|²ZxÌß¾³mÇb¥pÿ¢w®øîAoÎR‹÷[±ç½;f«Åïºð=‹Õ’ýñúîõO½qÐ<ղϹ±A»ŽS-ÿ>ô_ýÕÖªõ€Iï?÷x¯j-Þ´Óçݪm—ÕÎý×)Û©xé²µ?V‰ ®½¥ýĘš3Ôïúë¤5ç’×GL¾l{5÷ª?ÞvWfe5ïôÔEÙm5¿t×Ý+ª…ôzÕª‰ÎþTÅ}¥XÒn*þä¿Ûfã‹U"(·S%‹­™°F“jýË-ŸŒîª¶ûO¾rþÐWU{áÀF<Ú¬ÚŸ?ñ™•×›¦:ð¾ãÁ_ôÎ3\¥zŸ¾`¨ŸR™Ÿ{@e¦Þ6æ#“ªÃùö%ÉcfªŽ?ÿ²ø¤…*åÝ5ãôŒJý楛6za¡J—ºkÉ*]¶ ÃUúõÝ^žÙöwÕúõ™Å«ZŸ¸~ƒíÿžjÛ}Ñëþå/T[é¶{¨v*ÚþjÏ¢9±ß«ŽÞwäV·¡RÛ— ^M¥¿¶Ã?.>î •™¢Û³ˆ^/»óGG¼ókµxæyÅ|K-F{ÒOwÌ¿î€'UõN_ºÒµküþt•Ùø­Óž?ñI•¹¼ô€kUçÔo tUç9%xJuMÓýÓ…~è.‰Ã»;ªîŸ¥­ùAÕƒï{Ð=ÿ9báÄSoUsе™þÌujÞ°Ýò[õ}5ïÃÒ'¨ù]óóóΙ¬æýVé ­jþ œ±Sæ.5‡(/Zoý+ß:íeµègÅÇ-zO-ž…ö”šsèµdÝûÿ¹ßõÏ«%çè×– º-?;zÿ=w{Cµ&‹â=÷Gª÷·­úÚW~xÕUžÛºÆï¿ÿ­o¯û~I@VTm˳ë£&Õ¶¸(~¹ª}ø^ë0écÕŽ~ëñhüëGTgŽ-ŽÔWUjr¶(€Eù;飢d?¨Ò#ßüûf§ÅTf¥m‹üM•9©mêš'ܪ27›×²rQ~›ÇÔ¶žêد/¼]ì‰y*…ù•*Mëûg«ôöE1ÞkœÊ ¾ß}é¦Ù*³MqZÏ¿Aub^vgeç~CTÙm÷Réªý¬ @Õùï@»SÇÔÏ?Þñ,ç(•. _þ•F¿eÐo=˜Ÿ-«–ç‹bõþ,Õºƒžw­¨Ûn§lw×g?UmÏþ½œ9Rµ£¾›Øñv랪ã1ýš*ݾI‡J£½ÍûæoùdŒê*‰çôÕ’›‹b~ÑdÕÒzWfÕ×vT-·è~o]¤?oÅ÷mKJ<©Úþ¬_Û9¹AuÄ~[d´½UÇ¥Ží‡|fJ³í?VÈ'xµíKmQlÖºû©Ô#%b]¢Ò[¬Ò¸î€GŽyR¥æ–:ð•ú­žçéù_ýÕ—?\ü~èË}ø¾"k¾Îü±8¬î‹ª³Hïxšê¼öëG­^ø–ꊗðÕ~0óé[z¾Ì-Ñùü+Õ¼’Ÿs«š_¢¹®ÕðæÂbe6ùô)¥ö.ýçc¥J—Ýÿ¼Z´«æ‡EàÅ¥â­{{êHÕ†÷í{i¹é§û¡ãß¶?ôÿ%A?¸Ø¯?-Üvª£i«Û{bEÕñÍW‹¬¦:>*M·STª$–gÞªR¥fí}¢J—ÔùJE}óNqÚ¦2°3:/Õ󮻨ÏM½Y©ƒKúàL¥>Öò¶èýP-úP¾ø`ý¼%ƒµ,9¨ÔàcU‹£íž¶Ò´{ômÕV¶×ï(òxéïúóŽK }ÕÌ—WUêÑâË‹›õ¦îoãŸÆKjiü¶*ñS-§Iðä¼ÓJ³–j- ãsEy,²æ½kÏQm£JöNQÏÐrß~˜Ö{‹~X`¥¯S¤‡Ô%j1É7ä}É%ØRµÐ|YzjëIEÆ»PµýU¿¶o(xÕþׇì>ùWª£4ü·Ý§:;j›¢ý£ù)u¡Öçmçk½Ôî• ¾Û5ÐWÐç)"Ÿ.M‹µöUéê×Ì‹E³ów[«Îµ~ê„^ê‚èzNó}7Þwã}Ư½DÏ:Bu|Râ|ú^KÓéܘJ¤¿OC®2ïÌûÚ~ë.JçèÍßSs_Öò=óaê±°Ôì¯þV©ÃJ†Û•‚ºòµ¸4¯ZM->RóÁâ·µ¼·ŒÐz>õr©#¿¯Ò¯Í‘ã©2¿>¬ºÏÖ<µ¸X›Ÿ4]­X2t¿¯Ôi'ܺCózjÆoñôø/Y2f«–5Šê⬗U ƳòÐ yhÃõç‡óü¢~=¡d­ZO(‡©¶ï– ’¢þ^KÛóVR$¸ƒÕ‚’Zúþ±jaq 9êV¥.Ðvç"̃EßÓöÌbØ5‹KÝ´þjII½ßòZrkIQÇz¬cËŠýmÕ>I}¬y;×övú¡ât¼m¼Êäô«W‡-«Xà?LQ‰`>¯¡æ”hõú)jn©y›/VóJÃê¬æƒŸ@žT¢¨&ÿv²Zÿ¥óŒú!9L—>~è:•†ÜfÐÞNØÝdö@Ÿ·mRè‹ò­õnǯKÄU´Ã6*¹;¨Ôï´íP%þ¢R¹ÁE 4¦Xž. ì·ø3­%õ÷ÝUì·¶KE­Úç¶-Ö_©vø!Ëê¨ã=Õyè„=Ø‚yÔ {®m;íÇ´=P4×[l÷ŽZnÛÿQ4ÛVìVûj¿¬ã%Ø}¥isIq^”Äî7§«VØm7– ñ"Ÿz£èÀ~Híþ‡ýІ×ö­ÇÛ£íŽ"Ëm5²Xït;RN`8¨ÔÕÚOI{ÚîN¿ ËOž§û{nÉ]Zç5ÿ—ºŸ”¦Wçžj!ž«ÐŸªä.<³¢ZôM¼î«y¾cmw¤àw¦a·¦ad 'Ø#{kýÕ ½Ö}Õ ¾ZŒú.ŸÛRR3÷ì¦ZÁÿ­¿Óv`ä­ öUêc­÷gC;xõJ_þœŠ•¦Ó†G©8ìÇDi8WßV%ñü9xU°¿Sà›4ø=;-ó™¶‹:KÕ™²­êx Øê‹rW2Ã+úY'°j;RëMú±”Ž£a‡|OóÍœ!Ú®™‡×óKrðOµp-m7©aE±w‚RE«:½å.jÑ*ÚîY¼bѽVô{aß´à¹íoj»°ã_%"½@¥Þ‚>&½\rÛ÷º[e0nðhçÎàØ]àË9ð;æm¬ýè%±úm\-œU2~¤ÔÍêG%Gö0µvÞ¢’ºº«M-†Þ[|ªžGK. j±ÒþÑz½¥D«–BÉœOªèÁðtªdû=Õ=[û+S¾_R0+«ðûf•¦ëË÷«MJf÷K·«Ù¥é羫š¿b”r:ÁTs»ë5ŸìéR·mô¢RºýT©§´ž];kì»”ŸêÖ×§Hß^zà®*£´Ÿ)‰Ç—ªÎî¢ùðÔÛªóH­—ÚÀí»éqit=Œy‘B¹©GJ<_¥wÒþT&˜« âA-Üö¨Ö¿j{± v±ƒ`uœ~aÑôTj”~MCOe 3ßÓörçhm·t^¡ù´ rÖuª¶{»ÇêñíFüh1ä¤vaË¿´ÿÔŠöµ~Ë3ª r׆8F;ü ’Sò·œ’ùÞ;Qyß·¡Šá}"®çu²[óñœ–’~[RÔCšWç•ÔÖ˜ß(ÕRr83ª vgÇ0­g}?±uíÒ~¨ÚG0~>â°ÿRcµ~È<[Tó/­¨–Ü~a+ô„ámø‘mwj9é8@ÇÕ(>Õy°¶+:Q¿.Ø-]ˆ‹ô`~µ€?ZÖó íÖÒ|kež¿­¤ ‹|ƒ÷¥ê­vŽJµi9L¯\2”hêÓNq-z½½žØ­¨7õ÷©ƒuù›zl+ÕŒøØe;)/°ë¾©|Äsâð·%u}Ó#*Øý‡©dwL¨ùˆG¶Ÿ®åÌ”S2Ë_)Úå‹Jôx•Z\¤áÊúöJã—¹³D€ß.ö‹î¯ìt0¿ŸR™AÚOÌàóÌc%Ø^-þÅ•EÍt²Zè±ËU ât­ˆƒ´b~µÁnm‡]ÙÞë€\§ W)Ä=ÒðwH_¶#nÐ8[êç:Ζ¾XëŠ fè})\¹ÊwTø¡¯à½Ä?RíˆgÜ]2ü/TiÄCÒ·¢_`u'—À®¡øW+üì6øm°wÚÇ•”Gýn-Ïäÿ¦'j;¨~ùéݤ·P™ÚÊ ~Ô9£¤8öVè×ÄOçÀïžw¬öÛçGÝ;{+µvÅ"øósÈŸB\xAPn—ZX¢³þªìQõ°æÕEYç]ô`iâõÃvz¶>¡íY'¥ø½–Ì©“Šv&éoÈGz3íÿµ£°÷RÐß)´;8júOË Ÿh[`¿µâµíem×´—Äî’—U;â‚­à­¶™º¿ÚauÀnë¸NÛ})ÄÓm‡[¶·rJᘇ‹vxп ä©]ÅÁÏ ØIèå–Í4ï·ÂlO¶•†¡kcÕžÇë:þ·zpqi:þûµ?î¶rØR(ux\µ`¢5«û¿õ¾’B~F- ônÑÏú¶›—ÀÏiYAÛ'-§h¿¨u”ö“[KݾÕ8ã/·b^´‘Ÿr ÆvDüñìÔìÊÅ%³lçkÔŒk â‰-Ïj?¤ú¸õ­ÇÛàç§ çÖÆxL;KÇM͸ hâ§ç↩‹´œ§'j¹Í`ü– þÙ²⥈綾‚8>xÄÈ)ÙÁ°‡ÚÚµ}ÝÞZjøªöµY߀<¤À‡é]NÛO¥a—“ÞJv&ôtçÍš_Ýßñ¼òKÝuÝ*;6øEñ±9ð÷æñ•Õ¼@O­"¾×²ºæ]ŠïµÁÿmƒÝÐŽ¸H;žÛqïÿ·#Þñíߦ`¦aצKÍ:ø<•YSûWøÇˆ§›x½^V²;/VˆË¥n¡xï¯õüÉüJûÃð;a×wQ¼ã˜B¼,ýumïfö,íc*û·sOm/»ë4]°¯»¿¡íš ut•š]š_ÛR9Г.â­wÑúHÀ/³TöDö\'xªï»rz½¤ ö`7üônØ=˜ï±€ÎÎU‰’Ù÷çkÕœ´Ö#sƒxôçjìƒùx]P \ù²Jc^dðÚ¹ d輪:¯×~gø¢ ~i7Ö³—Äs×»ÕÈU âÂ-°ZÁ‡­ðÇÚ o´’¼IGÓXÏKÃï^4¨H«'ŒT‹!oK`Ï-Á:T âf-ˆ—v ®”z¿$@{¨4âék?45ƒþïܧdx­§º ‡ÿMWs·W2÷¾ršY—Z»láí¥†o¯: Sà¯ô奎ø¯§Á>ètB¿tÁ~0úåB¬·gº`u'»7ÔÏíþ©ŽôÀNÈBO,ÜS¯'*øµ‹ Oa~,F¼dñuÚO^‚õ‰ÔQºÓðO2è/Ó?ð7;ßïÂøvCž{ð¼ xŽüÇ.Ä»îþN)žu ê~F¯W¶žW2,WVmX?l‡]Ðqâ6ëj»†â6iüÈg¦TÝ©ÎSôúñ·álØ3Ts°>ógåbž{W?öïÑñ™Ö‘2Xïڵ讽q°êzSÇ!Ûáÿt`½;>JÁÏN¯¦y7}l‰(Šò5DÛ½ÄãâпɒšX÷(5ëó OówX€×…䔢õ^ø )ðpzwÿL£¾¬_dwïD|<ƒøT'ú­3ˆ_ý ¼ï‚þëFÜ¿þa7â' {s¾Rà=û¶ã=?ShWó!³¹^ÇÈÀÿì?õ”ÂPo>eüÓöô:B;Öù;¿HÝU2T|ž¶/2÷”›¿RàÎ{Á?-Ú^èB9ÝÐÿÑ<”Âk𯼓9JÇG:_é<\׫ ññ€xg?Ÿã@¿·™š ~š‡ü…ùÈWPàú%ý„Ž×g×vU'Ö ;±¾ßµ%^)~ô9ì¬ Ö/;3ºý]iGè‚?лaãOõz]3â>ô}ã£>üÊ8ú}.âIm°ûÚ).¼U)ò#ÕQjþ•E{ õN¡=i\Gü”ÿÖ‰8k'ü‘.Äáºn×ãÒëºo.N·÷ƘõŒä%;)¸fqÓÌ“¥œ£º~_ºàRÕ ÿ¹ þ^7â‹Ýˆc÷`½ªç}Í_Ùo•Ö[T.ˆý©Øïºþݰ{¶Õë©=Ïhû0 û/÷zÑÌùë#EYÇ?;`?P9}•¶·»`‡¶¢ù­¯iýÓý“úViÀ®P)¬´BNÚà‡¶#¢ó¥¼*`à÷´#ÑA¼ˆøZª´ŒqiÑ/^ñt¬»f/ÎÜWt/zXu_‹×ôÎ¥îUiÄm2ˆ›e/ózº6, ìŸU×oõºÅߺï¡ø;âÂiÄ3È?1ù4ˆû¥!/Ä_:áwµêùÖ…vwq›U7â´=ÈÏÈ–?äHµåµ@î[go…|´b=ª qèv¬¦¡<…¹ð§æc]`a`þÒÄ“â{‹(>‰8pûôºä;…|Š|øñ&ñ¢Nøƒ]ˆówcý¢ë&=°ã³X'É‚?²Öó;·D¿.)?êÕ2WçG´úz³÷·Åµ]Ðv½Î‹iwa7c¾¦é{øÍ툇vÀ.MÁþLÁ/OÃÞJ#¾˜Á:¶ñ‹±ŽØ†|%u@Îh$Cë=_Æz¶‚»ëZ‹PÿÅ›ê8Òbä_tn«ãŒ]XOéþŠ®W7â7=°73°;?ÒëŽ]xí†>è†íA>Dvøœxë¯]ð·»°ŽØŽx±Y_C|" žMƒÏ2¨'É{ë¯u^L^Ûá·t`ü:®Æº æa öª»9V2G¸[%ƒú«æüö˜šÔój^·ZGµ€ßZ§•wFµÁ¿mŸ®íÑö‹ôçäÿ¦`w¦7ËÀ/ï\OÇÙ{àÏÍ>š{892v ä=;« ¼–AžPçCšW»àçt#Ü~Ì"O«z¡òiò‡o¿'Pœª#£õ¨ÉC‚dü+ðI¼kü,Ø#]×j°z¦ë•]°»»‘7Ø3CóXì×ìˆR‡SÙ =k¨nð{ÏÓZßdgkžÊ‚²X×JA/¥{µ_—Á¼ÊÀ¾êĺcó¨qË.èÍnÈ‘sø¯ÙÒ2ñÌ3O3_Ñë'Ðóèß.èᮿi}Ö ;­ñîVÄ7ÚHžÍ`]½y£]X×ïBÞi7âÉ=ð÷²ó5ÎÅxÌ/…³æ¥ÔBŒƒB½aý·q6ðs;ÚÙþOmŸwPÞò"RXg¥¸LçÛðëwÐyŸ…½Ò>KLJ;W˜">$ý„ñ5þüî6ðs;üŠvä‹tÀJ¯RX¯¤uÝ.Š;ÂŽé€>JÁn {Õäýa} ñ´4òí2¿^´ç3ãˆqî‚=Ó<¾nŒã¼ OæyµñS•ÔëY‹ÐîEˆC¶l\¨ûL¼1ø¿RI¬·Ì âe»ª¹ø|n/ZÔÈ'Ê൓ü©R8êý¢ýž–Çn´»¼›†ýß »¿ z¾ ßwÃߣ¿’µ»š‹¸Õ¼ Îð¾šxÄä,€?ßvöÿÚaOvÌ)0/T7ê<¤òES˜ÿi|ŸA|ŽìÏÎ×u\¨ z¬ë7ݰwzÐÞIJÁ:ü;*ýå¹hû´ëBX?îB^@ä´~KìÍnøõ=°Ãzà»à÷K!ωì¹N²whýýŸ½Á¼n‡Þ5órŸBýÚ±žÒQr×v?Wu ¿*;HÛ=Ù î·Håàwä¿îª y¤íð—Lâg&Oyˆ·é8hì®.ÄA»±n‘B~‰Ó!?:ƒþ§övb]± öW ìðVðQ+ì´VÊ›Ãzk;ÖYͺÊéÀó ÿ}8¦Ê üâ=•_Ró‡^£âgéu–Ö=’X™ƒüæX]ðÁŽ*»¨òÚ…qêºAç—.Bf âfñšVÄw;à‡›|UèÇ ÖŸ3Èïé„<§ÁßøOÈ¿êBü§ ßw ó{°þÓÖûöÉǯӺxì€î9z¾åZ]¥¡g‰O;Q/߄ս•¶—²°W2ˆ³d[ ¿e âL”·ÜŠü›VðeÛ¶:ß½q¿Ø¥©'µLÃ_È î“A\'ä¢q2A¾¡‚=0ë©óƒõ£o¨…Aœo?¥°Îaò¶°¸ëMÝ蟞fí?e¡÷²[ë<´ÜuÁÀõ¹^WÊóþF•ýüÛw´ýCž_þ m?™uÛ`ü&)¢ö»zÎÖëYăÉNÉ­¡å$‡q͢ǯyjäowÑþä¹µQ\ÿLäÑ"®Ðï)þŸB¾@ëiä»ÐúG'òçâÐOÉ.ÿ™ƒxúÜÝŸ±·š»~>ìÛȃX}@ùX¿ê"{ë$ÝûnÊ[†]Ý|ÔüÚ4â¤iä;õ€³kéõÃ,ò42ˆ·w".Ðû­ v[7>] íàlà¾ý@Ńøïq*‰uй=~ˆš‡ü:…õÜŽÎ QA¥ZôúºU¯û§Á“¬žCÜ©vBÛß´½KyúíØÿ‘AÜò‡– ÿ­e·lA<³yÖ-´n¬÷?¯Ú‡mÃz|;ægG©Ù#¦©â Gã=ü)Ÿ;F?7ƒçw"Ÿ4ÿµq5ŠËÓzw7Å›ÞÐë ]Èí~zëKYø1¹ ÿŒ|‰6Ä Ûà;z½öAëšï.ÈsÅIÑ_ݧèþè­×³2¤×‘ïÒ;ÜØ¡Èwë!? z­ë_X§ï€?–BÜ?=Ú‰õ„.ìgê†|v_¡ó+z°>܃üÈ qõ4ârì«Èüë<Ї]È31qì·h[ ãmˆƒ´“ýû,õ‰Ö¯íxNîKa_[z¾îï4â%ø™è<Ò4â |Ÿ†¼d¾­õl'òr;!7Ÿ–‹vÖ™ºñ¾vDê]äB.Œ}€uª.ä»uCïõ`}3…¸Výš¡WĹ:auR¾3åY“€ïiÜ:·èÁ|Ë¢Ù“tœ¯ ëÉ]ànŒùÙØÅ¼Ë^WŠO£r%…tjQ?kyëþ@Çù ßl€¼?¬ß¤ÿMc?Eù9X×èÁ:l7ò'ºá÷ £çqí—gƒ|¿Ÿ©ä-¸_òš¯v¢ý]h7â5í¿‡Ü@NH>:H!ß#? 8yüº„òº;„òAZ ßh_Kü†6ämµCß¶BÚ°¾Ñ†õÁvðSô Åo3ð“Òä}û¼VÖùÛà±nð_ây©æÖUÒØ7”¦| ØA-XÇj…=Ô†ïÛÖííÀ>š.ìkì†~è†|ô`='»ŠnÖQSˆ+§‘·hò¬^Óû5Zá·Ánl‡ÿß<ƒ9Á£·ÔBøå´þÛû°õÂÒþƼ¿öåyu~_¯Ku}WÇ_»‘ÿÞû {!…}X´.¡øò@;‘Ð…¼ò›– Ü¬¯¶ÂŸo›¤÷ ¶ƒo#oa òQ[?ÑJëQ´x_†ö™"Eq«nðF ü¥Ö_êö¶!¾ÓNóûPÛwÕ? ƒòWÓùB‹°v1òä–ïþA?uÔvB ì÷6¬¶“ü Óö[ û Úèxë:XI!ï:s²Öç]ˆPܽ‡òÖßmGü­ù7f ö¡¶-Â:üi’£íkÄzu+â5m[ëøM;ìÜÊ€½™F+å¿¥GHc}–âP$ƾ$=8eì—.Úo‚¼ Nø_]È/ê&{~V r–Æ|3ù'˜o´_~"Å=3Xï_‚õþðc+ø¾~@â²íÈ¢ý=È?Ë븫ªlàGl¢r ´ýšƒÞ^„ù´øØ‚ø‚¾r7MÅ)žó„Jâ5ƒ¼æNðr×ïK†óåE;J¯×wÒ¾_ìíÆøõÀÈžVâuT2ˆ?ýDÍÕ ˜j>xXA,¢O;ÖC;H`^·cßhÇì·†_Ö;ßÈ]JçŶ¯çu+âlmØ÷Ûý+)ò 'RÐiäÉvÂ/É@ïwa¾u‘ßý›A´öKìÃîSõþâÈ}ò3Ã(ÏIÏÓnäg`wb½*‹}‹1/–Ðþ}ðcû——Al'â6]”ÿO~9Ú߉þè‚>ëF>zô!ÅM{°/0ìÛ»Se_- èUj.ö ÏÆíQµqŽÅ¨Gø2E~?å½A¯µ£:°îŸB|7ý*ò±0ß;°n’¢õÒ °:ïJcØäG«í›4Öó)o¬ ó­q:³þ|~QÇRÐiädߨMëÀ¨g;ìÊØÃ)ìƒ3òHù¼mZ®ÒÈë£õ³vjôjŠökP{±/šòûº°/:…}ªiòCÖÔù–1ŒOy%sà7Ï ò1WQ öHú qäx9~Ocü3Ø¿ÁzC'âL]ˆï™}'X¯ 8tø6äE=«2È»èÄúHôR'üÚíÔz± yhí¿Ñù;hW ç¤ÑØw‘B üü x§óœòª2èßNØ{]ˆv—ÌÝfªt¶Ë2ˆsuÎÓüdâfXeG•…£È·œƒ|¨yÁ<¡íç„ÝÖxa ñ²3}Èey)I¬¯Í êQ´CÁûäS~O v‰©7âÄm;±~Jñ‚âõ4ÏHŸv#^Ñû5»n)nðÕ‚øh+ô]Ú×Mù°£²ˆ.Á~ÖØ ­hü:Ç…í¤u$ŒG'üË.¬tß5ç ;ñýœO2/ȧ[¬àua ^ë«Eȇh§<3Ä-;¡Ÿ»`?vÓ9°›²Ÿ­ Ú)Šükšç°{Ò´ÿg±ŽWtb¾·À>1çQ žÓ=Ù<§¼f±.›þªŽ—gðÚ‰W:G!s9üQŒ/åiPžK7ÖÇ{ WYš×ˆë’¾Ê@u!Þцu¬vðC'ìû.”׃}‚´/2ûŠöd°O¾ ylÆÏ†ý§ó:`/¤_žÆ¾EÃ7˜­ÐcmAþú]ªë!øwˆët"nØõ3}ÎG'ÖŸ»`?t#¿¦qÙ.ŠóѺ5å7!.Ø ¿·ûöº‡××%°'[ð>ƒ¸Sç$ߨ…¸­{S^٣݈›vCï´À_iE;ÛÀWíˆ v ÏԬϣ=°'³ÈkÌùK¯©9AüâB5ù »ñ#^7Çú@üè.ÌçæIyŒä»,€ß§`7/‚½Û…}ºÝd¿R=)î ¿.ƒsV:/${¼yŽêJ½þH~Ð:_óÄì“A¼—òQ:‘ß×ýFçh_؃õ“l`gí£²ßy†ÉÓ¥<'³/âKXÏê^IÛÃi¬ËdðÚýé)ØiäÉvwh½Þý—Ý_ljºà÷uCO÷P^âqÆ>€½œÂº}šò²è\Ê‹D¿tÂ/îÂzx<Õ ÿ­ |ÕùËâ<–æ«ÉÓÀüìÄ>§4ü “—ˆ÷mˆµãþÄ» /(_<Žu´$Ö#ºaÏv#_cì0Ú¿¾r½ûá;È/Dc ñä4òµ2°+Û?×ãžZEÇQSØïÒ†ýíØÕ}¢êü¼.¬v#ÿ2…}e)¬t@O¥”Fü7 {>ƒý°:°¿#…s5hU|5y>󱿰þ@ì£îÍÿ;¦ yXÝdG“~‡ÜSû;‘؉|ò.Ì¿nÈ)í#¡8Pûk ÏÀžìø±öo[q_ì„vðfû[z}2…¼|²¿(ÞÐA¼yê†]Öû¶ó9»§¶[hŸ(ìÝÎÏôzfÍ#äQf×Ñv„É+ßžE¾F7ö£µ"¯Æ¬W¢½´/<ƒxÚbèÙ%ÈSmÅuâ¹1ì×H#¿Ï¬[ÂßêÂzãbØEK°ß¡qÑVÄ3ˆsvb}¡ òЊ¸FåBÿ¥çœFü.¹þq'些ò¸)~ =ÙIëÈ”?‰õ•ÄZi~!”Î½É OBÁ.XôÝRÅÎV‹0?:0oSXG ü¿VèÇ6Ä›ÛqNBæY ûy28¯¢ëy=´ÿ™â¥°ëÍ>Løáí4Iã ÚšÆxe°.Ö‰ü/㦱ÿ,õbÏúR'æ}'ìÓ®Ýu^_ê':¿‚Îi£üŒs yžæœøAÊ¿ÖuænÄ­ºàßö ÙÖ€T'âo]ĤװÞOëô݈CQ¡ ~DÖ{S7Š/ÌÃ>Šy°›é|…}™i¬ƒÑùFFÞé|-¬ë¦Á[ítn úÕœ0T¯Ò|£ý˜]È«ìF|=;¹D£Tú‹âe ü°û3#ŽBùÍzÅ9]ïnø mˆçÐ9<íàéœÇ“ƺS'Ιê‚}œÂºåaÑ8’]– âÅ·«¹Ð# (OñÙ4ÖÍ(ÿ½r5/ˆ¼¤ÀÌÀÞëD^Å1;±?‘òèº1Þ=´>¬þG¥ çK7Ó}@ë–Ù-°_ñ”N¬G“ª°ojân‹1ns±¹ûÄ(·q 4sùÛµ¹–»ž©:Þ߃sÇÚ`’Þ|¶ö#/ÖiNV z°ó EùJð/ºè|:‡ ûK)ÿ£ötò42X—¡õÚNœoÑõ”4â¹]ð‡»a_µÂþjÅyCÑz¼ qý6Ø&®Ž¸J7ø¿q Eçò`Ý3 ?’òmhßIø$ÿªç÷u"Ô…s!Ó¸.MrFû%WÓñì4x!C|¹¤ýí¨/B牚<èɲDZ¨z¤ ó¼û뺱¯²ë)ĽÒÈÿhÝ@ÇeÛfa_&í‹Ç~£ÄR” ;ÐÄ0ÎݸO!c^»ŸÎ눚|»nÜßùêAMüÖnì'HáÜÇ4ö tàœKŠCÓ>¬ùØG“Bœžö/Æü^¾I€/çâ\¾Š;ÓþC\—ƾ /˜7÷*û¡:'!¯˜ö¥BovÁÿìD'ås¦‘—IùËæPØ›&ï‚Î÷@ü,{¹ þ\í'ï§°^ІxA;íg/¥á7µaÓ>”.ìƒí¦s¾H^QŸN¬Ò¾AsnöËRþjÏDåÁ¯Ha^Ó~–øƒ)øõ­ß6ŒsÇ/a7ͦ¸ –›.äwÑ9º$ï´ŽÎ;Á9TsŽâ¿=ˆçô€WÓˆf ÷ͺ9ü™fœ›å–ÄöŸ©ùØ—»y–&_| ö÷"OŽôY ø´ãDûŽ;ÿ£ó!޽ó¨ ë]È/QðWÎ9QØg“Á¹{™¯éü cŸC{ g=à£Nìó$þ¢y”BÑþŸnäg^ƒŸŠüœ¬ËôèýFtîqþ¾äCܤš°^5,ð/ßU#0OGaŸÛX×1÷éôŽíUS°>¶²Z)èŸ*ŸèÛÝÔ0¼Žü”ãÔ¨`_зÔ8|>!˜7I5 ßOÖù”ü¼`¿ÑT°Ì†qê§Ôˆ Ÿ¶S£°_iæÉ$è›IÁúÛ¸Šç4yz¨a·šï?Äô5,¨ÿ¥jDßù²þ«Û©& Ý3´|™ûß ôèO~ŽuûaA˜í‡jDpÿfj4ê7í¥çLB^Ää€vTS±Î5ë„ëã¾€ÞÏÿºÚH¯W™rß ò÷QMA{Gqãut0\5&ˆ§`î{-˜ÇKÌ}+õÿ‘ÄSâjt ¿?Vã!aN âªA|pó¼·ƒ¼´[T“îWµR`>m¬Ü Þ™çqâ"'ª¦À^™¥†ßo©†£Ý£OKã9!kÔ¤Àþ¾šŒxÏ4Œó ¼ÎÔë×\Ž>—gáç¨ÇŠÁºþkü}°~xÝ·KîÒ¸Cùó ß ª çú òî÷ãúѼÆ9£&Ü~É«j ÞO òÙ¿©¦5•ý-|+8ça3†ñèù<žA^P3ÏøC#NÕ„9*0ïPã}ûG51p ßS“ƒ<7WM üÚ.ó¹)¸þ.ž?4Ñžµá?ŒGüc âÃÓµ½ÌrôgláçA>ùëjX°¾»½è…jtŸù¢¹›ûiRÐÞájJ ×÷)GŸKT9?©ÝèŸA|®™çæãÄÀ~xUMÖr­fyZo©õ‘Wµi°.0U5ëü{ÜMÿCÿŒÀëhÈÛ8¼N¿LÚíªiA<õ,5ç2݂̈́y©6ÖëEÜ_AžÒi•í‚\ÔýÁ×a¯;Íx­¨óìÍ÷o~Â{<ž4ß!£ñžøj|0NÏ«‰Á~•?¨ÉÁþ¨‘j*æût­g*応ßÕôÇh|Nã0ýCü09È ý•šŠy<=(çH5ë=›ZúäRï<êBFÜF Æ{žŒç‹•ãØ9»ª)Aù[s½ƒõ„´áÓÏ\}GÆóÆá¼Æ÷yï«&ðÿ°€oŽ«¬ôÎø`ŸÓx5)øþ5ã9ü4ö×,-•rŽv ΧF€oÇâ¹~ýžšØ%½j ì‰éÁ:äT~^É\ZñCÕ<÷05,8ÂQ# gF£^ãÁƒ$Ï4+äYçuVð¤ÑkÄG¤× ãPÿ ú=˳֋ ïÕJ\ܯÖÔçðuA|í.ž'ÐÓ#0ž£‚}ü'Þ~´rÀS“!ÏSƒþ›¬¦rû¬š…8îì`½öïÜ.âaoÔoxÐÎ-Ôè€ÿnRca¯¬«ã\ß@ßÄTžcx$ðCÿlxÕÔ3ƒÅ|ÉËþðsÕ„ý +A¿ŒÏa¼*å†x ã<* ¿É|]`Ç=ÍíBýÌüïO°ìŸ·ðúy0÷b;r4 <2r¸}1o½ä[o^ÑÃ|¢i\ñ žOýMzm,æ÷xð”á­`½e55ˆï=cžG¼AúŒÚ7|4rA¼1ãBr²±ÎϨxÞJ7Óo¶óê; ç½LA¾íTØëës{鹆¯‡ziu5E¯§›r? ÖßþÅ×c>›y†vG;Œ> ôξjZ ÃŒ½8[Çë¸]˜¿æyÁ¹5syäÀ>èÍsüO€†]­¦ÏLM üÃéj¦¶øy$à¹1Á>æmÕXŒ§Ñúµ¢Ÿhèôí›™¿´<©É¿©Á<Û´{£ nò8?øß¿Ž Ú±žöM“]9;oÑ?ȳù`üÀ¼Â\,ÏŒxR­Prûžz‰ïÄw²‘§QÇqÿ¯¦Ö ò¤&ûŒ×3v.ä]ÍÖë!<žAo¼Z ûÝ‚íD/?ižkìSÄË&Bî'ãóé¥Uï7ü<Øs¦Ÿ0߃a~| n^G`\Fõ\¬ÆÂ€~ˆû'£þ4/fûsçóó`/=ýRãÀ¿Ð'jÎKšB¯ÁºÆ·ù9àѰ;Gãs£ï!?F~¡gfúãjFW:©r¾òô†ás’› ˜ï“ —º)÷IE? ÿŒELÀó&Á^ž ™Š×Mƒþº³b^’ÿAöݘ /’ýd’‡Uûý·•í@=Gñ’*ê9öé½qÏIA¼y¶š<'«6„}³‰eß|»›äˆìö±èãïã•ì÷©èß™úT~ÆmäÄÈ7ú‹üSâCà ؟2=à›»Ô,ªh÷0ø¿#à§ŒÆzëè ¾3×OÕqY¾üLúk,ôüxè c§jÞæû0~Ã{çV5*˜¿+ª±Á>¤_~_Oû“|ì c̼ƒœOB¾Ç¤`Ú{|?ôòJ¨ïšÁ:þj?!ý‚uÿ‰èßiàéz}§²>¤OpÉͺÚ­Ãá^>VB½IŸN@~ÙDôãdðú´`\'©™A}§˜òi3I5úzT_Ô/¥4Öƒª hÏDØSà7MƒÄ•íP\føÌØãèÿIxþÝ^sÿ Ø£&þðè{j,ò3&À~\¯\ÞY?P\õ‹q2vRpïd5K¯›ûa'ðó`w>F}ŒI~+â?Ót~@¥<£ÜÑðÏLõ›9ÙD¯³ò¸òú7cW™xøô'­§@óªY¶_ »b#«½¤çHÎGCÏQ|k<Úeür̃™:ÅÏA¼–â¥d÷ŒÃ|=: ñ1ØõÜNèKŠ#ù$ynüm÷TÌ·•ƒuÞµùó }`·ÿ‰ì|jŧ`Òº×âOâQŠw>AÿLò1OQSµýmê3¯$—ã¨]˜÷³°ž´aÐßàvŸNò{Îð9űH¯P=tÞFÅsL¼žô7ô*é×Éú|ÍŠþùoøq3>Ö:ãçAý®d xëS5ãkÝÇíÅ:Èpðݨòõ#5(<müÒ1A¾ãH5.؇ûªZGçuTÔ‡ôÉÃ(¬§Ðxžž\J—Ù·—ïGÜô“=ްïùzÒ›4ÿÑ¿%¿™ôÐ4›ÏÈ>?ŒAƒÑ‡à/FžÒLý{€üZ'€?3úÀÌSŒâGõ¸k©QÐdïQ|üÉð7×ò>^¯OÃ3XW\ñ&;ŽJë¼Ã‡‡8—‰7âur_>KMüêfµa`?³_úDÀ;ðsƒ|‰¢=„x ­cŽ%@Þ+âÔ¦þ+á<³áÚ>ççÑ稧±WÐß&Fëuåv‘Ñ“Ãa·Vð ­«ÂÞ›Vn—±ŸÈéÖ<>8ɬ Ûv&âB†O`Ÿ˜ø)æÙuëê<#¾¿´tâ+jhyœÂÄ7ÈÎ0ë9ä·‚×7Ò¿kaž78°?&¨áÁïct¨5õþM.Ö›Èþ$ÞÂ+Ùcf¾Ü¯Uô: ñAš÷ƾ'þC=§ñ´ß;` ?éŸjìHê'ßÀ<äÏÎåû)NLv øÀÌãr¿‚ï#þƒ9šxü3 ý1]ÿŽS¥\`¾›õÔìZ[_ûÏ|?ÙQÄÛ˜oF.)Þ»c}n8Ëäžä+0߆ùåXë{œ×€uôq%ux×Çf}†ìý ùú¹oPp.ÆhZÇ0~£Y_…þŸ‚y´A g·r1vÒhôûXèY–GíZ3ˆollâ:ëÛqSjéšßÄ·vÜ ñQÃ'VÜ–ìn¬·ð}ˆýeä qcoëx¬šŒüÞ)Á¾ƒÝ*êkâ‚4?´~åñ…]JþÙ?¤u׉Vžé“!Aþýp.¿Ÿ¸f ÏO¦ø?ûwXß½·äÉ¥FCïßN ÎÇyŒïÃõÃö0ëÆŸFûbêùI°Ïk—ŠçTô/xƒìÇYA¾åP¾ò8È^ÀçÆÏ#–øÝÖGãP¹°§Çƒï'‚w§bÄLýÊÏ¡xâK£aÇÙñYŒ—š‰ýDê¼ ?ŠóR?Øqø´Þ6-(÷çãoÖëqŸ±‡(Ž×Tö§šô¹ü²ÐîѰ¿h¾N°ï'Þ‡|¹Ö¯|ù­ä·“½Fë±T?ÿÍ÷Qœóv´Ö¯\_Ìꯣx;åÕûÆðsñjæ#?x˜xm=;¾OñV*‡Æ™Ö%u0_ðóûlŸƒï|Á>šÌËæ¾Ï‚ý ¿5ã0]ï'6õ_!Ø?v­y?¿/Aù dN æÿ®Ö'Œ> uFŒÛd½¿ƒû‰Ö_hšÚþ„ÝÈχ1ýcâŸñðŸÈßœŠýtV¼ÀÈ¡‰Bî©\WË®7v¨ÉG »FχŠzšõ}Ì¿1Áyº'Tô—¹ŽÆâãTr9aû“ìrZ—Çø“ž7}”÷ÅEtŸë¨íë/ø'”‡gül+åó`[à <Žïµõ~.®7ì“yaâtçÃõÓƒ}¿«¸ŸòáOª§ð¯Èþ1ý‚úO ör~À[Ôk=ÆÍÜògù«œŸjüKÒSo}¬&€¿hvJó—Ö™±oÂø7ˆóšxN”?@~åRÜí¯ˆ÷@¯­,XRÁçké¼¾žäœúóÃÄõÉ>)åý_ Öl;”òNñ=æ)÷ñ,úƒÖ›,{K­ì‡Ü•Ëý4ŒÖ7h›ôÝy™¢$´ýlÎO&½Oz„ÖW1/Çö—ˆû°†ÿœäÒŒ屨þòriÝhΟ"šX>?M\w´Žðçð¯Œ~²òI>O¬ìG¾”¿G\ÅÊ“Uƒƒý‚'«dççÝÀ÷‘¿Xn—p½(ï€ø‘üäÿ¯§÷+óó(.Nþ]Oã‡q˜¬ýv¾óµÂŸµõ6xÌØo´…ß#ž´÷ ®?ñ$xÜØó”÷ì_£¦aß×tý;­æ~;¾5Rçðóá‡Ûv©‡2öµÉ¿¢äŸ‘ÿ3EÇ͸ß)«íßÊz’ŸKöŽÖÜX1ûœÊyA­„xùý´^2Ö²ßÄsŒý ½91q®éAXú?Üß´_ö É×D+þðvpNà®FÏSû0·Âí!ûÖë‡!}gÅA¾ì#ÞÊØëðÏÕ(}þ?—Æyî”_1!ÈKãõjâ³Sïçâï)~@ö ÙUåñržo¨ù'Sô>f¾Žâàoò¿fù÷WÔËä³è}Ðü=ü¸Õ5+òh_Œ¥Ï&k?–¯£õÊ?ÑãÃßS¾Þ“¾#ûrŠ•—jú‘âÕ´n4%¸Oø”ç ? 8g¤°ÿh‹üÈóT}^ —Gú4ÈWŽÌãë)Ίx×z8ûf*Ç›ö=kùá̺§ÍTÄaÆÁ.ˆõÿÉ–ýGñòÏÌßc¾NÓëÞ¦œA:ÊÈÓ”`¿›WÈ…5Õä`Ý]¬?ÁÞŽmmyõ4N$¯”ÿdÛÏÄ?´n¢÷Íð÷»‘:–?'½bçÃî®X"»þÍ8K £|Fè…ÑAžYß7~ÿ˜RóÇŠýXÄ'°Œ½nû?”'Þ›ªã°•rGþнž ÿÛ¬OQ¾}pÉ üÚ‡Où”z]¼¢#Êó)¹~å<«ók±Z#8_îA5 ó`j`÷ ?AÛ \̃•Ki9?¢Fè}æúàxÈ'.£~ã~ÖüËÏ¥8n?Ÿòì|2ØK“Ë×9ö5­ãLÒrÄבž‹SøÑü9í#;?èî·ù{ÈïVžÙÛäOÒç³pÿ nCyU“,¿ÁÄ1±n=AçÙñóáO¬œãt‡Z;8׎íeÃg–?AûwWÂsWÆé&n¶[+Æy¸½^€¸£-O&OÇÊk̫՚Áùbòõd·`~­­÷×ñ÷ä÷Ò¼ÖñþžüÍ“ü9åg竼Qq=ñ÷šÐƒ“ô~6s݈òø8Ç©1¿×ŽáüØ^W4þ Vž·?oÇ‘hkM{]‚x¶|??OõÅëX[ïB’¿>¦|}™Î‰¨/snÊ_ÛŽh>å÷˜¯ÐSü9­+À¾gÛ­8…òH&ë¤ü=ôϽê©1AžÏÊ´ï¾¢¾ˆpûÁ/ƒƒß;ÛI´óܱße„µþGûCG—Ï;3¾kês½¸Z¯߯Ä×AŸ ~—Rø+ú|~ÿqõ`¾ˆuK²°klð³Y+V<ñQþ¼g­?i­Ò2ÖN¬O Îc7yÔ ¯/™c§s^û 䙌(ÏŸ0v;ü2.‡ì&m_ñç¤ç!cuØn_¾Å~sΧP+!Î5Ló6?ëª(‡ÛAvRðû;©q:¯È®7¿'{†öÑÙ|TþÇö³µ¿ q%5FË_OñD;€ü²ò¸ˆ±ß×ö}nÈ×cÞÓúìh{}›xµ\?ÿxŒµßl0~WpÍ(~¶ÛMŸk?ÒÔëÇ ýY¾Oaá‡Á<æõ¯Áúü5þߪñ 2׿,ôqœÆyäqA@ŒËAžú úwZøsâ×òs o Ö÷÷5ÏÓ^7¤qÑþ"®ùžëœ?¸›ÄçöP#õ¹²|=å%ë<^þœâ4-öu’¿•¿„õŠ‘v|˜âYåñP¾ÏœC¦?øÏ_Ucõz*_OrüNÕOùz̧Õ;—÷Á_ÔçÙÊzhÿÇ|>Fëc~žÇFúöÍÚÚþ4åü1àÃùzâËr¿–yª<¾¢Yû5Á>X;ð«ïˆ¾®¼ž$‡\ÄVÃyeãì<{ò3´Ì÷•ïâ}«:³øÅš× ¯ ô7Çã> ì¢ÇÕð ~x6?GË¿‡gÉ ù +”ë'ÞÇcó"ÅuËóâÌúöèà¼IŽOàœ¯rÿpáÇÁü¹‹ŸoùóŸqP±ù›k–Û1 Ÿ Êÿßä­<§V°â-/çŤV,__ø´­Ç1ÎkåoÇýbéÕz2q{|Ô -oj´µ~ò™U>â@æ¾ÁA`µ–þÝ ó9Îo3ïW²ü²]Êõ=ñ7?×ÞG[ngÙï^ðªÉÂ\xSù{²ù=켑–òI ç+óF–û[Š^WÓçúðçšÇ¹_5ÿV”;FŸ³n>¢Ï¡äël»Ûn?ì(ì?âò,þfë ÍcÜÏÁ9,'ƒí}ÅðGG¿ƒÀ~×PÃ×Yû? ÎoãKûþôz8=9RÇÌçö<¯àYÄýF–¯Ó-|.hÿ[æýÕÁþs³^¢箚8Heþ¶cøzk üJ~>±Î­R+ã‚59a>RnOØþïƒó9Nôtp^Ì+ܯO.稕,_µ|ýE­R~.“Z¹¼ ?-¹õ¾Ã×qWe¾Üÿ?_eÞ¿Ä*ò´Íûà˜ë‡fñ°ý~à÷žY_i/3ÌÒ/Çý:Ø|?$°ãÍy~dךë_ æµÈcÓþ›ùþ?Öz­µËt„éŸòù°ðÈ@þ æýI¶ýaÍÃÿýy _®Þ¬÷ˆý¶ÝlåǬT¾µðý ¯_È™Ž››ï±~Âßë¼ ó~P°Sœ£cµpp.Žð{-¿iPy¾Ä£Ì>… ï3íosÿè<óþŽ ®mÖíÔ `¿¨9Ϧ¢þCµeîÉŠ¶ÆÏŠ7.¼+Ø6¼’¹~Hy<ºâ\®A%³n,ÇÉ)_¹É²+žì’wùº@_L'~äú¿ó¾.ø½.ë¹Ü~KÞ+øÒ^çÕñóþê .ÏyioësJÌûw>9˼¿>XWbžzÙÚ÷øí˜÷7穞´ðö Qeoóypü3¾¢8ļ¿3Ø÷5ïÏ äf¢yoëý_DuSäõ—š¸Âê8÷xL¬iaDX«Ø÷Œ®Qý@µ6ÖûŒµC0²°Ÿ1V`Ýa?»Þñ™R'&4€¾ŒK=rRììç7:6Õ䤦Öq5Pï˜HÔš3„Fû¡Ö¸…õ}_æÂÈÚÐhÛåÉ}Àø:Qo_LjöœX˜V'ì²ÇÖ‰™U`ë‹(Œ¨a³¾Àô:Q/§„•Wï½1§µxdx¨5ggY¨wÜêá¹6l#@cP3«Õ¡Ö˜Õ+?Q}QïÜQ'úb;T«js¿?r¥‹ê•¡zÊ »ÏæëzÆ.J¶J¨w>®S&Õ@XÝêáÚZu«Å3BP­«D J÷Öª-ûµÚÜQ+av¹D­çØc† êáßZ6K-n’õ(;zµ*¨gÞ7ªoê±¹yVÔøúj›×££ªù=µêU­nµ|‚q¢ýõΣjöÙÌãQB5¨Õ—RÆ«ù-¶ýQKöjñH-~®WÙˆâC‚Ý}åÆZc…õBum5άǮ ëç°ò ò:»¼M« žøT5Ù©V§ªÉ)a£:PK†×¨‚Z6S£:d’…jü\­Ý#"°AØs€ä-¬Ï¢æFÔxÛí Ã@ø%³« Úü“}TË6 ³Íª•;;¤?ªqÞÆ5Pͨ6Kˆ’»¨~·ÇH"ªþÕd¶žx¤SÕ¸7ªÍõÎå$¿Øs¹Ö¸ªÉ±¼nv Ô²Uíù6®Qvl52)ÍÕøŽø§š TÓM²Õ¸*¬ÞQzBÊH”¾¯ˆÒ µø¨9µ|ÆZvQX¿n¨y&SÕìÙFâ1Q×ÊzU‹HD=+JkÅ¥]©‡«ÝȾ³ÇºZ<—°~ä®6?6¨RWa2SM¤|‡q´ÍyaÏh”ÂtnT¿…•&ë¶ PïE=¾ï°çÚýÝH¼Ýæ.ùÉYa2ö<Ù§au ëÏjs–õ°ûkñt ¶ÍYÍ.›Ó²ÝaòcsVØÜ³'lŽk‹¬‡ì˰µ([¾ì1 ã7ä¾jþœô HÉïÃúÔ~~\@öÇl[vìøµäã0ûË#[ÖÃ|[·J.‘Ï_ª‹ýŒ0J–)Û,ç_˜œÉ±–¼h÷äd›÷kÉ„Ý'ò^{>R½£øJÖ£Z Éæí(ÿ&̤¾ ³µ¤ ް 9Ä·`Ëžg¡š­8;ö<µe5Le}æZíò'e}I·Äh\dÙ|$ÇLê9Þt/ÕA¶AþUÓÙarkÏ/9§ì>ŸØsœäk„€œ’[£ÖìºÊ{d¤¾‰Ò T/â ªŸs™ Hžœ$ ÇEÎ{ê)4fó-DýɶV‹ÍåÉq ³!dŸÙñæ¸jWB@ò>ÍÙÇÄvœÂn‹ì7’aY7’ª˜_O²*9J>WÊ”lƒä‚0™™!Ê£ïeÝ©\isÊç‡Åhè9v;$—ÐØï…Ù4æ“wjß%²¹kujƒGÉ_ôLÒC“š*ç•Gc)åÄæGêêGâGÙÔ‡TGz®¬—¼žÆœäG–Oí³eŠæ?ñõ5µMêù¼!=‡Ú)å‘î§zѳi¼¨Ôï4Om”î·åä‹t}oËíwR[éùTŠ?ÒXQ¿ÒýÔw¤Çl;ÁŽëغÌöùm{šú‡ú2 P_“¬PÙvõ'qµ‡ÆŽ>§¹Få’LQyô|ê©»© ÉÇsêšoô9=Ï^û¢÷Ô>û¹T¿0Û‘ú€úšÆh6@mYXùÇËÿ–¿A â¿ý¯Ñö.ív/kõYþ×÷¿åc¸üoù_}ËòYÖê³üoùßËßÒž3Ë"_,ÿ[:ËmãÿËÇòÿÇßòqÖˇ}Ùå/¿ÿ…6Ôû÷ß4fKCÞ—%ù]n¯üÿý[ãÙè3ÿ¿ÈÖ@µóÿK äßs_Õªû²( ËšŒö§.Ëu`}Ëû¥ú_æñKßþ¯ØŒËB½ûZ‡e¥ß¿ìò¿ì¿ÿïí§¿ê‡Feº/×Ö*s ìö¾Þ·´e©¿œ3å×SN=åö§ï––oüEÿõGîêyFûwiôI#Ïíoú"—}¹®ÖülôóþÖo ž[/ÿ.­¿¾Ž_=×÷óÙC(ÿxh²±4Ën¤_4²]ÿ ýQ¢xëK‹#‹ÿÔÂÒ*{)ዔ㨱$ dš¾ˆ9Þèܯ՟K£_—ÿ ”\~È9õEÌߥõÜ/«o¿È>ø2ñe÷iµ:,íö t_|Ùã6ýÓŽ_Vú¤¿cøE×õ¿¥_úÒ__V7RN_ë·4úr ú~iÈ{Ÿ3P2ÐÈs–¦l÷çùK³¯—eyêëýÕtÑÒƒ¾Èå—ÅýiÇUÇF忞º.‹ýüE÷ɲ&‹ËR,­2V¬‚þÖ³^™¯gLû+ KSÿ[åUÖq tR£íHYïkËÒ|\Zuù²e­®>:²©®µþòÎÒe»Ì²ïþ¹¦‘ºDrn5Â!}YOèoý—Vö·ûúŒFïëïóúRÿÃjíh´Ü/rÌz,ÃæQ#íˆu¼°y¼‚…jåôw ¢žU¿j÷öG®û#ÏQ÷¤,ˆìÙTfoôu^Eõ]#íîK™õÔ§ÞÏ—ú2žUÇׯzæG#s¡žúö‡W¢ž[¯ìô·ö3]ëk¿õ·_ªÊÄöG_e¤–Îéë\md…É#튊…•E×V­Ç‘MUý¸¾”[oû«Í§jòT«lÒÿQmˆš_õÔ©‘¹Þè<\‚¨ëöu_Ǧ¿ý66æ³*íµ¯-+WÜW¯œ ˆšƒuÎù¡ƒƒû†6­\|]qÜyýšè—õ§C—l¾¤ ÿ_¡ãoî¼/Þ Iµ,1ÿíh¡Kzöÿº¹d…üÎûí¿¯.fÈçx°)n—íwÜïâ·MŸ5•ÄÖÀ!øŽ:8äÚ(45UväJE hÂg9 auiMMÑAñÒŸí„!¬ívåõõ–'ûªV„õ‰ýWïøÔ{]#}\Ï3£žßè}öd]Éz^›ÊþmC­~ª·/ûRv­gÊgS]J}Um‘¨ž9VîÒü«&¥¿!M•ó®ôgÏ˰z÷µþÞSï8ÕR¦aÜL÷Ò¨÷ÏÓZrAýÚßú×ÓtÔKMÖ3êýë+5rï@´yP×õµÍ¥¿jzÃÖ_Qó¾¯å÷¥=ö÷ÕÆ'¬¿ûªë·Fþ±/áÝÒß°Ø×†µ½Ñ>«u/•Õˆ Õ«ßÃÚÞŸ¹TO[뵕šêhs_ìÙ°ûìg4:VÕî)ýEq~_8­ô·RÔªK­?{ëµÛû¢‹ä_=vy=Ï«ç{ù×;°VyõÜß—9Òh¹ÕþjÕ/,¨PëÞ¦{ªg˜üÐ__d¹V0$ìÚ°yØ»hiüÉ~­×—®ç¯?¶•]^£²[;jýõÕ–j„ª•õ¬Ò_¸·/Õžß.ŸÝ(7ÖûרŽhäY}¹·ÞëêáàFê6&Õl¡¦{l9¨¦ÿìÏ«ÙdST㉰¿()êõp‰lC­9%«µìbûúFúªÖ_=º6¬o¢tX_x0*¦U~#ãÔ¨.i²Ê“ù°‰ü³Ç½SûÃâËMM•2W­=¥{ªù‰µú&ª ÙÎzì1»ÞQ÷Û}TÏ\°ë%ÛWí/Ìש%Ãt-›MMÕe4ªÎQeʲkÙ}Q±{¾ÕŠóÒ_T‡]¿Jÿèéj5Ú#û¨ÄC«a÷TkwØ<©Un#>tSseµu«FtOÔºÕ!ì~»}Q󲞾Šê3ªG­8R˜íVËf¬×g©Ç­WEqST9õÊKéä6jÌÃêU—Fý¢Zó#¬}QöŸü³ëhÿÕêÇ0ÛªÞ¾oÔV«eWØe7úWË>.•+ù‹îߩְ?ã(Ù¨'VÕdý?JŽ£êUŒF•%¯ösKµôìÊôWKéû°zFÍ1y-]¦Kí×0¶Û[ͦ¤ï›DyöxØ_­9fë%ù&'Q×Ôóÿ0¤:†Ù‹Q:¤ž¿(. û«Æö½õôI½ó­gÕÃgQóÊþ¬)ä³zÚIÿ¯‡ëä\’a:«©©r\Ã8½ô•åÊ¿¨9%Õø/ªO¢>¯V¿(ù¯5¯jéȰ±›cC¬ïìvÔòÝì2í?›óí¿¡Öw$/Qö„ýÌ(¿Œê*ï³ç´ýû396v=ªÉW=º;¬lù|ûÙ¥¿°¾Œ’‰(Î û ksØwQõ³ëYë/jîØßWû“þ¶-+²?ÂÖOšÄçC­ÏÃ8Éî¿0½ÕÔT®£éÙQóyëÕ®»—±ÿo×É®sX™Q튺>lþ”þêgû/ª\{üªq ¼>ª>öˆ’ߨWú³¹É¾Ÿþ¤îªv]T»£x<¬Þõèû¾ZõªõÅSQŸÕûGùÇÔ.Û¦*¾³ßÛ {j]ö¬zž]ë™a÷HD}_ÏsíëÂú'ªmØ÷ ø=Ï­ö¬°q©g|¢Æ¿VûzV£÷„µ3j,­S_ÚÐ_ ^ eÛ²?϶Ǽ‘¾‹Š/ÕÓîFê^«ÍCC®‹’ßjßW“yº§ÿô¥­ÕÚ7´ÎgD•Öþ°¾»ÎS»®}‘·¨rª}_—ªqr#ãÛȸ ¯¶þÉMÔØ×S§Z²oÿ¿Þvö…ãåøGµ9j|•çjí•}Ûˆ\TãÎþʆÝG}ig˜L…µ/JÖÑáÕôÔ@Ô?LƱ)«Õ¹Zÿô6ÇÕÛßý)¿™©—¿å÷rõÒ²—l^èËýµú™žfËDµ³9¯vM5ûÉæÉZýPo¿ÔÛZ}]lÔ+‡Û^è¯Q­}µ?¢Æ?l~×ê³Ftˆ-õèÁ0;#̶ˆªo_P͆²ç@-=Séç¨ùVOÿ×’ùÖQrc“=†ö3jÉS­ùÔ9°mÔzã&aœfkGo=åÔcU«_5¹¨—óûª§úã#ÕÓµäßþ®Ö¼ªÖOÕžÆKQ>g5^ìÏ8„éаëbÞ÷GÕã£ö·ž}™¿Õì[±ÁúZ÷zì•0hóO”lDõ}µq¨¦kõ{£\PPß­__å+Lçõ•×kñÍ Ê©5÷Ãlò°g‡ØºÏÖQvB=ý×—q«&'õ–5Nµ¸­Þ:†ý߯°yÖ.Û¡ëjÙûµPï¼b]_Kîê‡FbÕd¬[:l\•‹Õ(y²Ûb_W/¿ôwœè¶Ö«ÃkÙSý©s5~¨ÇG “»¾Øýõô¡Í¥ök­~þ•”µ¾ŒI#vje'Œ©o=eDgÔ=QüPÏ6´ÆµvÿUÓ×õòZ½2U‡þÆ]ê³0ù®÷™ÊáÒŠýÂì¸Fe-lì£|Žzû¼/²3ý^M~¢âQöu=}ÞèØõµ­aå×ò[—ÆxÕÛ¶zõ^-_ziŪjÅXëéŸFôu#¼Üè85ê3׃¯·]ÕêÓH9Q6|=m ‹Éõ¥?ëízÚÕ´¬¢šœ7¢oÂ>ëÏߨ_+64Äú¼ÞXR£}õüZv^½åöWþ¡Õê—js¡?¼Ø×ñ¯‡·£8¬Ú«Ì?Žú³¿«vm£×5úìzËnôÞþ´©/uªÖîFŸ·4ǧ‘ë½¶?÷T»¯¯ýÑ×ë¹oiÈ÷ÒÇz®¨¹Ðײêù¾Ñ:.Í6ómPÄçÞßè}ýŒj×ô…+¿~ˆù_ïuK£ï–%9¶?﫼 ß6Â/KûºFÆ­/ßõGŽûÒÎþpwçÜ9·ûÊ-KC7¤\,-ÝÝȽK³a×|Ñã6Pº¥¿saiðp#ò9v`#ß׺fisf£zpY˜“>giÏá/ˆø¢Ë¨ù46fµïÚŽYÚvàÒæüZíè¯ÿ"íĨ²B6—W”d·4lÂ×¥uï@rͲf¯4Â_}½¶žÏk=¿‘çÔ[Ÿ£F탥=ûÚÖ¾^óEضK‹ƒ––nêo]ú3Öùù@|×èx6*“ÜWO™”ÓhúÃK\ßßöôµž>«¯e÷·¬¾Ô}iØY5­³–V=«•=íî«íÆY%gý±¯½¿Ñ2ªÝÛŸþj¤M}Õ ýyõ]£íék™ô{#e~‘}RÏûFîoäÿÎݾ<»?ãßßñZò9P}VŸ¥UïZŸõåÙý©O½uëk?ô§û󜔯z_)·¿íéO=—f{ª]õÜ.¿¯e}‘ã¶üõËy­÷³/£¾®QÊ?^ø–~C¯ª)â'‚«å×›ûj|_ëµ¢œ~>¯Þz X½ûYϺˉxmøþªo­ç™ïìçŠúÚÏ©õZ£œÈúÖY¿>×·õª{¾ Ðü‰lG£õ‹zÎÏóFÛµ´Ë©w<©>æµÖõ5¾_Úõý_yUMÖëˆe£^uÏ£e¬Þõ²æ÷Ò’»ºõÁ@Ûý¼¿áñ®³<ûºÈç5ª—úx_û=²œˆ×e…ÿL½í×Ï­·~Ö£Ñv5<þQ¯ÊSãYwù¯K½ÿ¨¼¨ú×{¿ýZ'Õ}_ƒ|¸´í´FŸ×pý›|í#¯TÜQŸ†ŸWçsõgz<¿(;^5 ЫUÏŠïkÍ7ëýÒ~­Û¿þ’ùbiéÕ~žj²^¸~}Gz­wüú:îK;^Pçs½~iË©O£ý÷EÕ¿©F½¿äúõU^œ×–‘ö›úÐkëa?§æ¸×YNÅýMá×-+¼ý¥ßˆˆÏ|ísùýÕ¿v}ÈoŽì—ëWo¿÷µ¿ú:èuiɃýü>gƒÏ1÷¨ï¹õ¾~Q|Poyµâ _özD_ûA5}±õkxþÓk?ãvϳ_­òªŸ-·¿ñë y´Ÿ_«>K9.Úo9é£_©šÂ?¯Å÷½Þ:àí¨õÔ>ÖŸîo¸Ü>–·ÔäÊ®_ƒ|Sq¿ýœu^_çý óiåæ âÕd½.%}Z«œzçwÃöÀÒjOTýš¬×¥§és¿ÓkëÑßú ˜ü|Aå´|Ôû}ŸŸ»´å¾©¾×ºyÒ~õÜõoôú–ãþ>§Ö}>YÑ÷ýŽw4õ±Ü¶ç¾´8ä•«š¬×:û¥¯ò[³¼ý«ÿÝïvù¾Ö|N_×õkÅI¢ž_«œˆÏk}ßW°¿ònžñ:`óg€ê×çvÕ(Yáýºå¤~À€Õ£©¾×†ËàöÔ[¾¶³áù?@Ï09ë§¾jÏ@ÙÏËÜ:yS}×t;*Êx­{\ûYŸ†çQŸÛí©õÚßñ0{à Š?›z4 Ðó¢Úñ:`¼Üà}K+/°¯±ïïës–úxGÔ+ªþ_´½Ûh{Š/¢ä°îë,§æ< ¾ª·¿£î7õ‹¨ç—5ßú,ç_r¾‹]/Sß}{N-þðzÖùü¾–¿¬ÅÿÛ^kÙë ó`Äój~Ö[¯¾Þ÷eÍëeUÞízÒûF×ùkÏÒ–ë’ó¥=ï¾èq¥×zç÷Ò–ï/{~ ô¸Q=Ìkƒ÷Tù%w¦Mõ]ÿEõ÷@×Ë~ÎÒò¯ûZΗÍK{y òàz¼ú:ŽK«= ¯Õ¨g_Ë]Z~Å=Ž=^ªié^¿üµo¯}^÷¨ó¾oºîËZç_ÚëðýͪX_QýýݾFå áú7Õø¾Ÿõí¯]óEÏ祇Ö_yQM Þß~ß²’·3àýSçýŽóÒzßÔ4tpSÓàÏ‹ÿ)}²JÓЦ•‹¯+d{»7ë›!Ûïº3}~ÈÎÛï»Þ ݉¿²ßÎÓ5ßÜi·íwÅ›w<`Ï}wÞ¾Úoÿí÷§[†í²Û¾ûí¿÷ô¸aÁ—{n°®ÓPÔiÕõðý fúCÿqé?ýǧÿÄè?qúO‚þ“Ä7Ï6ÿk6ÿsÌÿ\ó?ÏüÏ7ÿ‹™ÿÅÍÿæ¦ Ç”á˜2S†cÊpLŽ)Ã1e8¦ Ç”á˜2\S†kÊpM®)Ã5e¸¦ ×”áš2\S†kÊðLž)Ã3ex¦ Ï”á™2s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—øÌ%>s‰Ï\â3—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIŒ¹$Æ\c.‰1—ĘKbÌ%1æ’sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—Ä™KâÌ%qæ’8sIœ¹$Î\g.‰3—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI‚¹$Á\’`.I0—$˜KÌ% æ’sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I2—$™K’Ì%Iæ’$sI’¹$É\’d.I.Ú<ÛIéÿÍâÿŽø¿+þï‰ÿûâÿ1ñÿ¸øBü_”Û,Êmå6‹r›E¹Í¢ÜfQn³(·Y”Û,Êmå:¢\G”ëˆrQ®#ÊuD¹Ž(×å:¢\G”ëŠr]Q®+ÊuE¹®(×庢\W”ëŠr]Q®'ÊõD¹ž(×åz¢\O”ë‰r=Q®'ÊõD¹¾(×åú¢\_”ë‹r}Q®/ÊõE¹¾(×åÆD¹1QnL”åÆD¹1QnL”åÆD¹1Qn\”åÆE¹qQn\”åÆE¹qQn\”å&D¹ QnB”›å&D¹ QnB”›å&D¹ QnR”›å&E¹IQnR”›å&E¹IQnR”+øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯š_5 ¾j|Õ,øªYðU³à«fÁWÍ‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å¾r_9‚¯ÁWŽà+Gð•#øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯\ÁW®à+Wð•+øÊ|å ¾r_¹‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_y‚¯<ÁWžà+Oð•'øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯|ÁW¾à+_ð•/øÊ|å ¾ò_ù‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯b‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯â‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯’‚¯D~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»#òÛ‘ßîˆüvGä·;"¿ÝùíŽÈowD~»óí}¼UUöÿí{_Ð t ánºáuÓ`Ý-vwçè¨c;æ?u°c ì»»û¿ÖÞßuØo¿wyI8ŸŸåbŸ³ÏÎÕ{süvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»ròÛ•“ß®œüvåä·+'¿]9ùíÊÉoWN~»âüöP, E§rk‚0îe/_²ç’Í·Ù}ÉN+¨ô›­Ün³boú;n„ E(Ô1enÿ ÈŸð‡„h3BìOhvˆÿ ¡ÄFÉ&Bj=BÖŸÐ(Èþ ä¬gÈýƒC‹?áÿhùVëZ7´YÏÐöOøÖí6h¿‘B‡?a½Â&B³AÇÿAèô'4:ÿ@—?(týƒnÿÃÐ}Á¦ÿãÐó½þÇ¡÷F}šúþ Í ýþ ÐÁ€?!4ðOøŸAB“ap°ÙŸP/òÿ1 ýB›o@Ø¢‰0ì Ãÿ„?4¨ #þ„ÐÈ £ê [®#½a̶ZO0v=À¸?0l½ŽaüZ`ÂF é?èõ ›“˜¼`Ê‚©ÿÃ0m=ÀôflD0³0«0{Üu s›ó62˜ÿ„¼ ùë Ö16ŠÖ¯g(ÙPº‘CÙŸP+”o ¨XP¹ž jÀ‚zÂÂ&À¢u‹3À’õ KËš–oX±`›&À¶Í ÛmD°}3ÃÍÙ°ã:‚švn"ìÒL°k3ÁnÍ»¯öhìÙØ«`ïu û¬ØwÃ~„ý4l"Ô8¸‰pH3ÀÊf€C›‡ÕoQ™ŽªŽn8¦plpÜZàøf€š N\ œÔD8¹8å§6œ¶áô pÆz„3ÿ`pÖ„³ÿ@pÎz€sÿ€p^áüÀÍ®'¸h=À_×\ÜLpI3Ãß6b¸´á²u—7þÞÌpÅ‚+3ÀUë ®n"\Ó¸vÂuÍ×oäðu74n\GpS3ÁÍM€[š·®Cøg#à¶FÀíÜѸ³‰ð €»êw×îñà_`UàÞ p_áþÀ „72x¨ðp3Á# €GÕÿ®<^hï„3Mÿ …7!Øà™P(2”`!Á ‚í ö'8ˆ€|£ù²ó#ý!9BpÙtÑ7B¡Ø,‚=V\†ÏàN ˜H0…`:Á\‚½ èù89Aý':ìN@2'ñÁÛï‡BÉö]¶ Ø‹`u(”¢¶RÔ~êèP(«-Az>‹êeõ"HL"˜F0“`‚C ' ÞÈV߆B9däOK2–à…P¨%±å.4¾–GÜlI4ߒןÆnE°€€Ö.Ò™ 'Í9BíDŠ Ê,#Ø•`O¬Ñ@ä?´FãȆŠþJë3™€ìÚÑRìE‚×±^4Ÿøf£ æTP{qZçøÉ§'Ú?Kð&Í'þ­Y” F  ñ%FŒ" 5KиÛì@ðZÏÄ´¿ ZËÄ1gÐ>'h\ ²U4¶=AóO¼Fð%ÑLâ'‚Ÿ ~¡=éMÐ`­mrK‚1´¦Éñ´IÚ‹ä‚‚"‚‚r‚JS’Ɠܙ€Ö' u ·$èF0‚€ê…óh,aGx?ìí»´O4î(ñBtGK8—€ø"ü,x…êGhí"´§‘'>¦zD³Q¢×(­A”è)º˜`;Zï(ÑZ”Æ¥½Ž¾Gð í;Ñl+‚ùÔ^Œx1Ft;„à ‚U´±ç hqCœÖ1N¼§µŠ“~Œÿ>ê^êJ@4” ZMÝ$/Ñ8’ǧˆ¾R¤ãRDÿ)’§)¢…­cŠö4Et">MQY´~Y4®,j'‹ÚÏîž&Ý‘}&í{.ÑÛ¯fOIÞ…i®aâã0ÑY˜h#B{9˜Öƒt\”tG”è(z–]+F(F÷c} úamH.ÆNŸÑÞÄIÅiÏãDqÚã8ñe‚ø!Aú!Az-Ar!±=ôë"’ñ ² ,×[CÐ3)â³É‚T>æKóHM@딢½Ë¢ý΢ýÉ"› ‹ö ‹Æ˜u­_5›ö=›ìì…XÒÙäŸåå,! =4þÛ’´~!’7!Ò'a8 4LvF˜h0Lûî Úßúƒæ&™ž =RŠ5dú£ñ†‰æÂ¤gôaÒea¢‘Ћ°»¸éò0éÚ0é…0íK„úŒìÛ‹ž‰Ð|"$Ï"4îù´‘UÐ3´–Qj#Jû%zj¢‰(­m”æ=‚àÿ¬ž‰u„ØÆÊ¾8m`¼{’$ þHüFëM}¦H¥ÈÞH‘¾Ì"ÝMõZÐ8[\lAcmÅgŸìC‘ŒwÂZðü‰¦ÃÄŸa’»á;!¿ˆ§#4Î3BãŒ=!9!ù!ÚŽÐ^GXîÓ>EÞ¶r?òÉÕíC„ö!ò dGQZ›hð2Ñ]ts’QÚß(­”ø3Jr7J´¥µ‹’\‰Þux<þ…åóX.x|6­[ŒÖ-VAP ~f™I6HŒÖ vtéÃØ¿¡CDûr“è6Ns÷õl7Úÿ8ñRœè3Nü§=“ŒŒ“LŽÓã´nñ!HÄIWÆi}â´Æq’#qÖû|m»°ïhí$$[4æÄE!l³$‰~“´ÿIÚÿÉÔØF,Ohm²ˆç³H—gѳHvdÓþg¯e“>Ê™_çKÈ Ò³ašCø ‡fI—„IÇ…I/†Iç„i¿"´7ê#BÏG¨ßÛT€ŽiŽZ»È±Ç¬ã~oº=ò™®ÇZCþþºêØ@d?ÇyÞt/q±õ‘Âdë„IæFI6EÉæÒºÅÆ[½ß—ê µ¶¯±YÙvdyIÊ;Ås%9’KãlA¶YKZÓVÄË­/±ò \ž&»,Lô¦ñ…Ï'¸kÀ¾Ù a¢‡H<ÜëÀvâ8È’AaÒcá·¡×/ÂÜÉ‹oEY_­ÄH6ÇHïÆÉŽÓâ7иwƸÙþ JdѸ²IWeÓýW.ÉÉ\’g¹ÄO&Br&ô>úV°]‰¦Ã´Ža²ÃÏÙ1³í¦>ÃoÚõ‹ÄÀ·Ägâ‘éœñX„lõÙœ’¿ZƒÈ-ØËÀÇl¼>¦ñGi-¢ä‹D[À.f¾íŠýá9“Ý%‰Ò˜¢ÄQ²'£´–Ñ¡›©íèkÖ·4¼Kôýþµ#Y##™#ú_Ån‚GÏňnãÔwœú‹' ú—Xº‰ŸÇÀ%½§1Ç…Íú˜ö'Aþj‚üºÕIì_‰Æš¸ÒvÇMzB'‘|‰lfu“Ñ‹|vð€•Û&¾Jó Qû&Æú©•?!’/!Žïå@®“=eìß•àѧ ÃYïÎ…ž£ùrÌ!r:ôµÍ¾`´5|<ŽAÜY4qñÛH~ÄG<” YŽ}"&E2-‹êeÑZd“m‘}ì'k.ño‹ gî±v û·!’k¡÷ì¼Âè(¶QHî…ÖÄØ)¤CŒÿ? ¼Æ{H¼.MàÊ+ÞË3°_ìÿÜ[ý~ëĈŽC¤+Â$KÁgd?š¸÷5 2é€ýígaGlu¤þ#D?æìäVäpøl§¿jírö¹¨ik—3s¼štt”ø7:Ýúͱ!°©ŸBìŠÖ'~7|NŽ)“¼LÒ|’¤§RG⬅h*›taíq.µ×‚Ö¨ÉsîÄtBr/L¼&¾®gäI˜ú21Ñïƒ0~ê3JóŽ’Íý—õ bÄC1Ž};æ”$Ÿ(y#bÚt/Er2‹h#‹Ö'ësø´Ä»9$sÉË¥5Ì%ùׂÚjñ4ö€÷þ>ì™hÅÄ„HV„>mmejˆxÇØ­m~º Úà9’,kðöBð4Û±ÿÄÞ±mJûfûͱEi_"$LÜ—Ö0Âö Ñ‚‰ùt…ïĶÙáQôYëŶ†ïØñ‡“¬¢u ±î'›ÃĬDo²ü`;œc24Þëû¶°'Ÿ€¿E|#ù£úæLâØç!.Bûbâ|†EÏÆIŸÄIçÇIÖÇiîæìlPc{Ýú¤!kè'ðU kÈô= k%¼CrÛÄI_EH„h¾&& ­‰Kw_bN,+†¼äµfŸýTÈË+Á7ì'<ùÈ~/é“0ñ:û¿áo±aÇ/b›œ}všO„Æ9Óú@Æï!›ÍœUÐZFIFÿ ?–x:JrÄĘ߇D´ýÔúúÆb{t•9â8]'È7¢¥ÉM_~Ô°UKaÓsÌõ`ìõ»ÃÚ«q¢¡8É8Ùm ZÓÉŠɲdWœÕ‘]‘êM¼phžc<ïX¿&ô=ø“í©‹íšZdÛéøðl7‘.ŒÞŒ¹2®†Ï1tÂçXûÀÇ`;šÏHg˜øí}<´Â6õ'žŒO‚ýÀc¿ãdýp“kÁ¾ëQ»±a8^Jt!»7ò¹]ÿØ­ÖîHPD¡ƒ%÷ƒü'=Í1_Zçâ‡Ü“áß=y/q_>Óà˜ Ç}ö ±½tdÔ5à›ëBÖÿ$dlNö;Ÿ_¿ûšÖÄÄÁø ‡Ï†iÏ";`ÌKá8Ê%–ïä\ÝÄE_°vxäØbl‡q\“tUt|ì'a›ÓZšXñ]pFFã7g+¬‰̹ü¡ðýh.1ò©b´ñtú«ÎúnN0rb ä4ѹÑol§°ncß‚mq¶UX¯qliÇPõØ÷^X?êÓøẪ$³Œ?ÇkÇqâ»aƒ°1Ôò¸9K_ {€ælbá$ëM ñbØðÿ°ôhâ‹ Ž™³0Öm{"Û#š yÆñòÞÐs$WM¼˜Ï5–À®X¿e*í³9§']ý/ø4‰õñ(«ƒbd‡Ån€,giì‘<‰Ñ³æü'Š˜0­kœüÞø–ˆ Ósñp.ÂçÔF‚ãF$ç“4¾$Ùy)’a©oç@¼‘µç94†lZÏœ>ð‰Ïs‚½É±…Vàcæ•!{ÎMkkÎxØÞdbd+Û$Bfž²ñÍ /YO=ùôõ!9¡yD¦Àæ Ý¡ý7g,É·3ç´Ç&^Äüð#ö¡+ö‚c¾Ã'¹¥ù˜øÑJ”ÖÕÄY¶ü2óÈJÞÚרPÐ÷ Ð5Çý86Üþé€8Ù¤ â›$ñGòEZG¢¡Û´ïÙäçä?Kú?w[’á¹$ÿrY¿M]½ƒGϼV§‡ÖäX=`ýg}<ô:l¶¾€- ­±ÿ9ËçHݱ?|ŽÄ6ÛÇdÓ{(²§ûDs Óí°öŠæbliöy9î}"dÔ)à/>WZee¤‰ór¬ÆþÚÑm,ŸøL†ÖËøÇå°Ã zŒÐ#Ï@ÑM|—eµù¼Õ>Ñ&Çj8ÍêœÐSX^Ú{s†0sÛú…íà·,m™q傯Ø'í‡ñ‘܉̃ÍÃXK@s;@Nð™ÑA„xÆÄ,ÿúû?ؾ¯`üLK1Ð Ë‚1°¥8Ö1 ö/­”Ö!J4¥uŽÒGɆ6qéGàÓ88· Nº9Nã‹—:4Ç1­[;ÇØ'c¡OÒØ_æ­1×ý±Ö$7"¯AŽý [okƒÅÈf31Ó! y²qÍyÞþV†Ùúgø†þÀyɈ8­sœtKü.œ/ñI>&ÈÆHôE|Füßûp˜¶þn*Œœ…Ø5ŸÑÞ¦hßRãœÖ3«âØÄ/Y¤ó³x?Ù¶Û tËôÈçC|¦ÇþÒØ¢…ÐQ´—6óÚsb_ï.ØOYþŽ}˜þÌ‹çô!b ä·pîXj€Õi&_‡þm|3ö£åÌŠlic÷±_βòuÈ7¶ÿÈo`¿ÔÐ.í û±áñàMñÁimGkj|oÞ;öû=ñy¡OÖ]´ÆŸe™HkoÎÓ‚íôdñOl"æ~‰õcDkhÎÐI®ÆÁY-Ç+h½‹mÌ)Ikœ$*Iò#I4˜\emã?²œaŸ„ý¶gÿX®ÐØÌ¹ôÁ%'@~Ð8}#ä¿ÄÖyÝ8†-þ ÛK?€oùŒˆíäÑÎpl–ψ·ÌyÇùìˆó ØÿzõÊ·ÐÙ|nG<­„^f›‡ÖÐÄ!ÙÆþìê'a[ó™õo΃:ÁnfˆäªÉ×(Ÿ°®¾ÏòˆñNo¼ˆ]Ä©Í8Çô¾£um ¿òvÿ1üÀ±Û>à‹9È[;ùjd/$i’ÿ¿O¥hŸRÔGŠìëÙ$YáŒõ>䯽d“ÜÉÞÏæXålŠÜ!âus6Ã9 ì۾آuß>ŽdcÍymiÏŒŸO¶i´hkwÈ'’ âÁľðÝùüŠdY‚ù†tBr3è4¶H¾IÌÃÄoølƒmÒÕæ ‘仉Á-Ý~`YÎgÁ§Èf21#ÒïæLc”CvžÐËvÒsæ‰aDßÑ=[€è2ʲ‚ø(z9è€ø.Jëdâ÷Ô–É1Y¸<­Eœm[²1Dœ«hâôl’tB’è8ù„ÍÍæ³‰i6^aôÇ(¢X{öEE7³ ̶û¤ ¼+d Ÿ÷ˆŸùWȆk Ÿ‚¬ùÔêß æÖ:íØ#aÿ“ãLÄ÷&~À¾í±±¿‚}÷¨õ׌ÿÛ<Íü{"dŸEsüýæ±N°ÙX¿“Í9 :žÆ!™%Ylb|nÀ6¡œ±±Œc_™ítò "'ÀV{>-ñ­‰ ÓúHÅI/ÆÉnӚĉ/´Ö)¢AóþÇ Ÿ]!~b英8.Ä1¶‡†c¾líƒõd9ûì–^°* ?ï¶s0yšL+×@gÞ3ÞOp¦{ªÕoÉ­l>ÓBŠè3Et—Eë˜Åç¬mpþÐÞÚqÆVÙ {Ëk|!èœm j;ò½Õׯïà1,†ßÀvÇ©HßÄ/·9NIâ«ÑPŠÏwiÿ³ÈNÊ.Àú=šØËTŽ)‘=eì¼ í>š³.>¼ ö ïǵù cóDK1Z7s†E{grVXžM³ù"¡UXÿw@3¢xn4o“ÓÊ:lð,ó$ÇN­Éýõ*«Ë"¿Ážçø!Íܱ·fþ&Ï•}'’&—†ø—óÂMŽÜwˆ+rœx8Á±xš{2Ïê°TW»VÙOC.½uÑÐcL—Ô†ñw²ö“ñáØâø ñ$çç˜s’—œßœ$Y$O=gí‚\ð£­ÍnâòÌoÓ­Þã\޵û•myŽ‹ä¢ÛsEƒ¼Žå‡,ܘóÑ _–Ÿgã³·äãØ·y°XR[&‡|[Ø·´®ÒÕ&7–Ïhîµ{ob_AVl…±/Ǿrß—x²‡ãÿoÃöÚ²¸û˺ƒ}è¯aÓ¢dŸG‰>£|ŽJkoâP4—­]œh7N´§9rYœx9±òShÍ“/Û¸°Yk¢£ñMéþÐÏà'¶—ø¼áD«ÿ N2,JmFÙwæóWêל½²=Kíš|ŸEˆCsŸÔV‚ö)Iý¦†#§éxœÅìwìæÐ9û|ÖÏñ<Ò¿&Fα……LNÓrl)lH–Å ?ÅœýçàúàÓìÿ᛼ç|ÆÁ1’1&Ö(z€÷ã=ì?ÛÿäD˜ŸÇÛþŒÞÏÆ>î‰6ï¾Hƒ>8ŽÄ1þ]!ÃÉVf¿!º)öŽô|”ìº(Éïè V>D9>ËqÄ©6öcâ³´üî€Ñù¯ÁÖe>àxÛ†¸tËþ#çM|±óþñùMÛPp6dtütÐ.Û$ÛcŒ+!»Î°ò‹ýœhKŒ—}­+`óyÇ o´{ob„lû¾ˆ8àˆçÍ‚>'úNå"'”djŠö(‹dXÑvÖEöLÎÄ‹y^âdzÝÉq¦0Ž® uŽ¡˜<#>þ ±öõJgØrŒ×ÚM ·¶¸‰Ÿ¾ÙÊtAõŒ?˱»(öŽã”3!WÙ/`?•÷•ìè,ø—?¢ÏBK&W³ ì>7'¿ÇäõËùË¡xïaµµù m’ýdb8ßZYmb]ÌÇsþvòø®|>Kö´y‡ý(j'1¹ ;"׉d~‚ä}‚Æšxg¸¼þ$·“ÔfŠôRŠh-E|›E²$‹ô`ð¾ÜK¡5gƒ¼6ì²?Âqþ­Aãd„‰~ÍùË' }¶w8nÈ´Bý™s Þ¢Ys>d6ÇS6…äøÇŸÂþŒÎbûæøí“ì8Ô^‚ÖÈäè2ß²œbûÆcì™a wŽóqýlö‰AÆ_š<†•ðwm]g׋ã÷Æg¥}Oœ‰³ÐƒÛJ¶VÖØ—¤ûÇ6Ë.íl·’ ük“c;ã4Kƒ1’][5yN4O“¯O<–\û©IóÙ¢9¿›nyÃÄI–ð9ƒyÆ”¸ùå$¿R[Ø|Ȭ‡a—2ß³MºµYŒ~fŸcS@G4ßÉ7“7J¶”É >¶ÈÁVŽ%VàŒ‹drŠì•Í+‹žçج9»a»ƒíÛÝÀg“á3p|ü›ÓÝ7ïÖ}ºg½sr ˆ¿’_"Ý—j¸Ùƒ)’™)²ñRoÛ<㿳Lc3þûÁ–'Ì{=¬>_Ðè†É°Ã¶…Ì¢=3ñVÞŽWòùµcâ~~ ë+ZG“C¹)dÓÛ³À‹4NsÆ´khMþ5ǧ.„mr l,ŽSqìÏ€¨i;^»îŸÖ>b_ÍĬûÃg™y.P›æ|å­sl_Ø¡ß#ÆKºÊäàÓ¼’D£ÉeöŒÆäz‘ K²N&[ƒÔŒ]ÒÖÆ"SƒÀ/³l®“¡•GlŽ‚±áŸ‚Þã3·yŒmøÓ-?½6Óê3ãgZˆ>†¸áÛXÿmíÚ'”Íc2ºúi›ŸÁ¶qŠÏ“ˆOø=!¶e¿Í>Ÿ·—‚^h\aâu›`›Žl2óþTþñ¬y/ŠäG<‹`„·˜\?ê?ñDtlbE°½Ø¾Îê{“çÁq¿lÌiñ&ØCÿ¹±<âÍɼ8ÙÁ ’ ’uÉki•˜Ó›ÖÆ0tIJ”c|¶Àg¨ÄŸ&‰},ªolý«Aë¼ßÇX[ÏÄŸßÇ|ˆæã´Æ‰¡ïŽÁ“žà÷ISdצƒÝÂëDsãø¥‰9¶ ¾HÐx“»ÀŽ`:O`y=zÀf™_‚ý>:€÷ìS“ƒò]hMn1Û8,ØcŸõÙ²&Àg/´&¯ÆdÞ3ùÂêí$õmÞÏ}ÐÒ£‘K¬£;––X½Â¹Ífœƒ0&>ÿéuc¿hÄtÈä ›Øâa°¥8ÞÆ6åsVv}1´8ºƒäH‚ö+9Ò®'Ÿ¡6ðö‚œ#›“ßW2ù\|F:ÞÒ4Ë3Fß]ûÔoä3ð7]3y“àõásZ¢usN6-ç;™ô&tëÅý!K˜çhíM|ÖÇĬ/¶ºØµñ؆‰’ì3¹1$;͹;ñ‘yÆiÎz‰LädG6v1Ÿ ±ˆÃ`ÙÇçC;B®=þ«‚þ'9br˜ù „æ#ÕäÚ…o@kÉùnüLâ~Ä©‹“~Ùò¡y…ãS Øæä¼Ž‘Ž.x:‘c¬wYŸ‘Ï@;›Ïr4dÆn–FÿG2-òìÖÀvàñ½ó{,æ¥]BÁ{)æ|b«PÛ6ziO«ÌÞ_˜3¸ÕXkæÓ0dç6ÐÚ˜w¤‰b´‡qÒÉq¦’_‰i°»ˆçË`㓬HP;Iz6Iz6ùd/ÇEøœ„í|– qKƒ|ÞièÏÿHVš\¶w²6jœh;þWø¦Ü^¡µƒLÍ·àuÖcûaùN2Àœ³R{Î/ ûÅĸÙÏÜÙÚôÆ×}öJè¾c@|6Èg+ó$ŽsDÌ;p¤ßLþ2Û…­ Ã篧1yÊlgsö,~|;ÖÉt?I{cÞ½çѨ‰Ï° ± ø‘å?ûðD¯&ÿ’eæ)Žžd;]bmTæ÷–Ì;¼Dü¾ ë«þ rîVÈäÝ-¿rÌ#J6œÉ·ø{ú,=Ÿ½¤uKM˜8ÒÊ ŽÏÉña¶9¶Íq¬³ 9—`;ðÉXG`þ06ÜÖç2òtkØ7Y=aü"޽]Šqm ™ñ>hî-øÊÙñ˜<ÓpwÈ Ž“s\‰ú4¾ ˈ.à>¿øÌÚhœ3'9ÌçL¦zÆøkŸa9^ʱ ’­c7ï6/ÆÛC’.Ž“,6ï+±ïS¿Œi„Ï,hÌ&ßì7¥uç #×+¬}dryÙoåý%Ú‹ÒZòÙŠ™gð,Ÿ¯ni÷€Ï…Œ¼ÝÏ—Y»Ô¼ÏÅq;² bDæýmªÇß#`¹jèŸÏIÈfáóýHoèwŽ]ŽÀs­œä¼As®Ë´C㌟E¶Éw8Ùê=~gÇ䜰Oú™Ïö£´&¯ûKæÝ0’&^™È>&ǂɾ4ç$SÌ7~HWrÌÝȶ Óx iMÜãD´_&>{¼•q&9 ¾ã}åsk¢>G4ñBÎï ÙÆãŸ›d9Úæ³ZwóNÂÁvæ^“VÇš<¤0âó^ùϯCvò˜g¢M¶>‡ íýåÜ>#ûƒåì Q>ó¡½2çkÏÀw%2ù`´÷&g…mPŽ—²CuŒOÆvû(DOÆa_„è‚órBúÄœc½ì¬Aúâlksð¹”Ñ|¶ðîšµä³Z“‹Æ¶ù&ŸŒý&¶ÝÙ¼z÷~ø}\Ÿ}þ,ø>}ÐÓÛ—|^Àçm|É>é-“Bc5gðLôhìXŸ9 ä—˜w”Y°¿ÀçLg|¦!g^¬Ûø¬™ã‚SZimx£cùŒ°c¿ÒÚX&¶sdÔ°~€-Õ²j’•æü‘åSdÃзìºçX É=sĶÌ"ØRÌ3sÑ/ë1>ï{6Þ7ÐOlw°¿Åö>Ç8ÞC»Ûàs=ÚÇh™/ç¥ß|0öcJÔŸ±Û'Ùù˜µ‚{oG§XÞ2gÇLwdK™s;¶Ã°2ÇÈb®ß²éèIÛ샱g,iOùcg³½Ëþ­§9âþIpŒÎÄX·ó0þ=­£9àÜ#Ž‘ñ¹ñÉâuaZ_À¾CAhMÌú¨ÐšØ1Óñ‰cý0öÛÙö_ºâó1’?&¿ˆmP’m|vblŒ±æ¢ÏI‡~ d ŸE ‚}°7乡 ÔŒóÐ)õküµ=1Ÿ$üŸÈ>‡f_Ÿã}O@60/ðÐ~™X=ïõõÐëd‡˜ø¯#ûiÄü^ˆ9‹xkðŸÐš÷yOYïÉ9íÐëxÐÈ,ìGø€ÛdßeqÈÆ%­9'g™@²ÍÄ'¯ÙÜ>çeÉôü´•Y&– Û¡/hc8Ö¹]o>o2ñ¼û±VYú2öØû?Ÿã}nù”ÏóØÞ1yüìƒp,–}HêÜ“òºuÿ½néÒÄËzBК÷׿ƒŒ`ûüðК÷_Ù/ ;‡c™&†ÉçÀô|’æœ"…¿Ó‘M{b¾ÁAs2ò›äHt{«ƒÍú?þKb­··òЬÇ8;ws6K4j|f¦>Óx6ñ–6c¾5ÕÆò“=ðžÄÎȉ&9nò˜ZcÎD»&ï€õë-‰'ó¹—ã}Ù1›ÜöÛølêð¨­ù&C)ìE¢uùƒ9‡: ö)ëe¢¡8Í+N:ž¿‡bÎù‚xƒß±N]ñ÷ ø0Ù›`mÞ ­ÉÕpÏx¼|öI:ߨuL+¤óMŽ@'Øów †ñüuâisN<vÞÕð9fK¼›$[Ê|{…÷c5ú£9_i–ué!㋱ásiö)^…=Híñû&ןϑÈn4¹û|&~l(Ú'“ׯc#™(Â9'Ù.I¢#óÞLjΒ⼕cNxwôjäæ½ô!äï+Ç"Iç=Lôa⎷YÑÄT#ð¿€?ErœóÎâ¯Ã'+·>CŠüÝÔÝ¡5ç9–w‚w½H'Ûy™ã™í°6Ã!ß8þÀñÈo!Óy=ÚZŸßäú‘þ0qtêÂä•,°v¡YŽõÒ|Ì7ÍØïå8;ɦ$É%ó ²Óœœ¬§¯íaÏ,²Î…LÃy]ƒd¿‡}p¶v‚Œ:òéÚ-²,úÁ‘/¬¯É |=Ö1l‘N1zׇd°É«§ù›ûO»Ú¶c£Bk¾ï@ëÊßu0þÐ.ð£8öJý›3 =›ØØîB6ïðzØ_¬/Hß™x?é ó!ŸuÐzð÷!ÌÞ>Zó û0|~µ ô3у‰QÐÜjõß?¶qs^Àg#w[›Ë¬+ÓÀÈК|ÒCkr|˜ÆØ}¶ÀTÐû41øg¢?jμ›<}óþòYѧy†üaóNú÷ˆ»°ì§zæ½kŽ[“¾áÜ^û`»yä;ÙSÆÎ§q™Xñ窚/ŽwE|™ö×|o†è5I÷’´GÆÏg¿m%ö¥þ†}]ù|á7¿a_˜hË|_ýØÝp~Å´B:€¿ýebs¤GŒ/rµ‡¢gcÞ¿ZÁ¼w|”õ¿øÌÈç0ä3ŸÃ³ïH{bü"¶øyx£ÜúnFîv·±s–Fr,Arˆs¢*ôÊM™3Ö}dßDÿ‚þø žøÎÄé9[ãØ5ïÉ0óͲkø}ñ!°.ýDòÛä]Þ‹59ÆôzPhÍÙÙ*ÈÇdÑ›ñ±ÎÅøØÏás> ä3ÎMa{™ÖÂÄØ^e?—mv®»ÈÚÂ&÷‘Ï ‰͹ ñç–a_È7¶3…\.À¾ÞŽB®2žz&l‚ý±€‡x¿76=Ûñ´æ;/o[º0±0¦7zÞ|Çöÿ o#§'ZÞ4ß`Û…Ï!n‡­2Ç‘ƒ4_sʱ‡ýç"»’ÏMÌ”Ÿ#šŠÝlÎqÿŽý%š0¹™0~–5?Ñs­Ïc;ŸãOì7‘¬¾+Ë:xÊ|Ï„õÇÛÆØ51ߣ ú3ç !ÿO²òÔä›°#YÇïG=¾<ó|hÍ7kY/r ­ <Ããeß¡7äø{XO¶k†€ïVXº1ç죾 îZc{ê7+7ŒÌ Z0çÍÄæ=<Ößíï ß1øf í=¿§52qU–«|þÄça$‡Ì™¹Ä­Î¶ûaxœm{@klO¾î±®ÆÞ3mgínÇa[ümk»™Øû¦¼Æäc™ðí°Õ‡>c—ÖÅœG“œ‰½j÷Ãøœ,§ø,•}}Z“ßt&èˆ÷. {‘ä…±•ٯⸯ!É!sÆÊq>ÓÛ|Èq/¶/…J:Êœ²Œ9Í®‰Y/–Cì—¼Zc]pChͻς/XŸr|†¿©gl1ö>Ä~󨨶<ÀÊ{c“PÛ59¼{AïñùÐ"«CÍ;*쫽ò7|S4';x´ô%ø„e9ûNlo·ƒáu]ùD:Ñøÿ/…Öœ½ ½ÊôOt}rcÕ|ÞFÏ+„|fš­°kiÖð9ÈgŽOœcû1íO„Ì”x÷N[3nÉß ×¥ßõÒ³uÕVçÒßyº|Ûl¾ +ÿrdÛóÿ\¯ºdúõí÷K—ü2ðÛûN®ÒEßsqFP¿xáíùŸ¹i€‹N¡VÇï¦ç]Þƒ/è¢A¶¼Ï«¸ ß⇶ῠ²á¶)û¸tÙþ«Q,ýJ¹äŒýߢƒqK¿–z¸/õ‰êùoM(ËxK†òããƒúÁu”kôïÕ“õœO{®à ®~@ ,ë'õürC±<Ÿ×Ë®{P>†v­Çíz6è`è@Ê3Ÿ´ÏÏĺÌÎÕ ôô¥'S÷ë“ÇØë•¶¼àP{aKû\åë–N æÙrÁ+v?òï³õó–ÛõÊûÂî§à‚”—ÜŸßß®çümûóεã,õ °þegƒž¶ãí¤ËûØ}*¼Öîá6¶½ à¢ÑvŸ ¿´ýlÇ]t? k×Ë‚ñÉxò®¶ûŒåÒCìúJ{ò\þÓßA½¼à#©‡qH=gaO»Î2iO®¿j÷KÆá¯ËÜÃìzÏÙÁ®Æõ–벞Ø/¿]G0o~³ÆÚùýažr_Æãã`]Ñ¿ôç{fïêô#÷gçÛqI{R–ú‚§}méAêùíÔ¿O§Þ>e‡ŒßïÏïgêk–.ýçå¾`á·qIK/“>±û>ùi[_ðÔ‹ìz ž¾£礸•Ó»[¹&åÑà÷­Ð´? ÏûXêKYƵ`7ÛåÖÿªÞ±|#Ø¿^9Æò§<·ð$ËoUÅv\r½¢›])—£žÈë@Žã¹ô#¸Ï— ¿ºp‘èð© Æ«>ß ýÙv^Áó^¿2Þ`¨/ûXv¢‡´/ã”çƒë‹­<_{%o4èó]ذ g¥,÷åºà9K`_áþüöÐ(ϼúBúñ°ÔŸ{'èûÝêeiF¡Õ'"ߥ¬ÑŽ\—þf'¬^­ ûí¿ä·ëYÔÁîSèdn+kç̉q¢Lÿ ö奖OglÇ-Xú/]aû­˜aÛ ðy¶Á•ð Wa\U/Ùú‚ýû•oƒ?¼z  ßƒëÒpÅ­ü‘ñø÷ƒv¥>Æ)óZ¸/ÆS†ç?°ò«êpèMàsl?"¯*ï²åà9Ô“²àŠS°~»VÇ%WØ~ʰO‚å¾_–úÅoÚrÁªÚ±ÔÏÛþÎé°›Qž92÷»þ³Ný`Þs0?¹>e¾ÅÓwµõ3añOËuy¾ðhÛ~¦ç§b^“0¿ì_¯ KýÉè×Çrâ0Ûë²Æ/å­a7Ky<Öm,ÖGîËs#1_~ôoÑ>ðK‡Xú®ˆ[þª¿¼ŸÕÛ‚Ë„Žþ¿þ'øÕ°{ ß²rQÊÅ-,Ÿ_ ýü~1Êòœà`\Þ}y® 'üðƒÿ¼Üœ¼•ËyßÚù žÓr|±×|ø>–ûsŸµó˜÷›]ïÙÂîxߎKððÉ\‘s–ûÁóyàà™Xo¿]Á3°ïS¡¯&b~‚'Á¿×˜ç¤Ûì~O†Ò˜ÐCÙDØÓˆ”L‡šoÛ)9 ü´7íA;N¹>táã¼;n©7OüwàYc3ÀR<ûè`¿¾\ŸyÝ_0¿Õv]Ëÿké¼ôæêvká$».ý|숳A¯°;¤^ÑÝv=äzèPp!âgR?? zOì])Ï©n·Šý+eÁROžó±ßÿ‰“ˆ½ìÛåsjÇÒžÌ+“=.×Å®žŒyNÝ~,°èÿ ~"ñ ‰ þ#þ³ø¿3·ñýõÙˆ#ùþ³àé°jøùÐ;3rÏÂõõA¯³·ó¯ûþúDðïÄ…¤=éoò5àGÈé_êO†ž“vô øå(ûxâRÏ/gz^úol{r}køû‚Çb2]—çåúxì›_ÏÇ£@‚3ÕË„·Dœeâ'‚ývëÂ#° }®®çåúðƒ¬‘ëc²-}ejo$ämcÇ£@Ò¯àͱ¿R ¾‚},õD®q—/a/ìkå§àbøgE÷‚|™ý4vÏ4Øý3`ÍŸM~ÊòÝDÈmýöã‘r Œu< rcKô3ýJ;~Ùo_î×…¥)ûãÊô\õ<Óîså‡ð?`§,?Iyá8;NËý­_ÄùNaõs )W@_V‰\óbéfKØ;cv¶úCð(œ;xÙ>'¸ü-KW°sWâ|¦vhè¯ò½âÄ{÷«úÀ¯’ú¸Ÿ©¾ô`éú2xn 쮋aŸöæØ1°£Jß³ëXŠu*9ÕÖ/>)ÝÃöS>®èbé¯ q±Bø›ù7Ûqå-‚;©øzÄið|ùUX_à `i·F=Œ/Sý"9çB¿‚ δôTô8â­ÚñÛË´™°ô_ »\ú-üÈŽ¿0 ? õd½dýä~0î¾°q_Úóç<ïÕ“²?.¿\ßyI{þsÁzÊzyÏËuyNæíãy?Â?ÁÊ9rî‚8‡”gJ\vøñØ7¹.xöQðtŒCêKy*ÆÜÏ€¥Þ¬‡”'c]äúDÌGÊ‚¥Þ$ìÝ¿/íLèhéB°ÆþÅ:ÉuÿyÁièk¹/íúõ¤]Á~ÿÒN _ WËð|äqÅœ£à|Tê .½×îc₃z߃ÿ$¾…v˧ðÛ Ævj´½"׋v³ü,¸rtêOëlép:úŸŒûút;Ÿ-;W×[¥°3ŠÎB8ÿr».Åà Ä1¥ìcÿ9)ö°ë9r\Ú îã<5rFêÍþrzAÆ)ýI?Ò¾´3w;Ø[2î#vüyÈóþüýùÈz•܉ý”!®,å’2Û¿Ô ÊÀÅ?@m‰~öĹ)Î# g(jg÷KêןÇy“¬‡å9ÁòÜ<É7ØùþówD~H ?÷ić¼ëҮܗydzÞ¯/ýÉu¿<~±”Ïž†8=°<—iœÓñ±ß®ß¾ôï#Ó|jœÓÍ„ûA½ ×ýve^Ò¿Œ{:üV)O]Iy†è¯žà) »I›Û~»j?Ø+í¬Ü(=ˆ8€”,õå>â‚þõrÄUËß„üEYêõ¼û2<5Ú{Ó'ú\ˆs•"øŸCûÈ úE;þsÁõ ãñëÕ˜§‡+N³û,íUleŸ\~”}^Êó¡óý„qM‡\—øæ_|âÐÀ"§JwBy±•RÆr€½},ÏK»…ð³ƒþä>ìÅ@NŠ}‰qû×ËVÚçʆÀ†?W1ÐÊÕ øë•ˆWV=iå\%ìÊ8/Þçðc¤ìß®Ëó‚ѾÔúõ˨/åòg±Nà7©Ì XîËüäzù`¬çë cèÃ|Äåz!ô~POYz*}Ésr½øHèkØGÁý£«·+õJ Æé·"dû©ÿåRÄK*¶ýâzPöp9êí•à~‰W¯ íeÂ¥x^Æ”‹q½èqËwRöqpÏùy)…¸.8_žóîgz.(ã¹ =)`þàà¾×n²<‡ë>Î÷Úñ¯çexÞnÆ9 x:úŸ <õ§ ¾\Ÿ‚öå9í•'â9Áå7€žÎ³ò½ñ¡²<ÈWÄC¥\ö Øåk/—®ôïûXúõ¯Ësrß/×õ\qg¬§Ø‘ŸÃß[½=|ý,¿J¹öÌ?˜—·Á}¬Ÿô“ižÒ\¯l yµ óY ª£^p%p™÷|…W?®”úÚ­ô®ûýøã °7/KÞjÑлˆÓß¿XΧòáwˆŸy­Õ~~¨œOÉ9”¥ž”§¡?9,ç"rN!çR¿ÖÇþùF]Xž“ö‡-³úØÇr?öÛQI«'3Õ—vKa”€}#çªØ7ÁÅ«±Ï¨/×å¹2Ø;rß/—‹½ vüE©'XîÃΑ~j<úRÏ/Ës~ûA¿^ÿ°kK 7K½ ä ®„½á—}<'vx`7ANù'ã“2ú æ‹ë²ž…m·HÙç¤\p9òjq½¨ö«àû-Ýåu? ~ðŸËG\wÖT{}ìFÏÆ9±´#×§¡©[ žx§ïLøáòœŒ#èÿ-»or?È…¿ ùÈe»!>v!Ϊ°oRöŸ“ë>^9´øj;)/ÙÎîßÒ#츥¼$Ëê?ÿúâÙ¶Ÿ¥ý­¼òë/yXò m½ _”ƒþ»Ùõ—ùI^D9Ö³ä;+%BêK¿Ë&Ùvƒñ!obögé-¨ÿŽ}ÞÇ˰nË!ǃçŠ-ýÉó2éGÖYÆ%y¥rî$záœ[xz­ çò% ;¿ÒѶ}Ár¿Æó(W ƒããG _ä9×UOúͽä}üô/xânÓ1ß)Ï[zœŠs±É óÉЇ‚'N²û>iØ¡¸.eø{!Ö¡í¯€Ÿÿ[îç€ü¥vöù™EVÍ‚;þïdÔŸÒÁ¶3NôÓ­¶<õFŒ²å‘ßZ,å-vµë6þ¾`ÿºÔ¬ ä¾´ë×—ë2¿{Uǽ<ìßß qEÁþõ¡7ÛùËøû~»öçýyúívýÖ‹ÓB¾•nù¤qÞ ÈY)—ïhùKÊ• 7¹.Xžìß—þJ!¥_¹.r·Pò°/ÅÃ`ÏeÀR?ô"r]Ã/¹? íOD¼;8çÀùréfözÑÿY\x8üÀYv¼r½hSÄÇÑŸ<'¸ öŒ`©ç_yáŸçK>z ‡º¢}‘;(K=_.åµ…þ;qTì—äÛ^†xâT‚ƒÁÁõaωœxêýþjõùdš¯¿>‚ýydêOÖAú•u’ë>–qI½YÇÓѾ`_î 9+õDÞN|ÅÒ“]·±û%÷Ëuÿy?ÏØ¿î·ã·'xB•¥ÿ­A/‚Gí\=î~,¼Ââ9ïã|úE®éÃüy_6û\ü}u\ ~’û3qî+íOAû“¯°zd*ž<¡UõûRÖàû4äóDŒêR»ŸROÚ—zã°~ÃQ4ì?©¿5ƵÖGÊrß^Ê£pþœ#À?+Ýöpü˜RØër]êÏÉ}ಠAÿrr¸äFk?•Áî+þ/☿Åè¯ëÄÝï(nŸütÿý¸ƒWôŸ+ÉPÞ£®—xXÆ[à•3Æ9¯¬~½Ä«WCÎyãÈ´~}ÁÎÔ¿>.öÊEÞ<侬Cðlàiž< XOðÊ5ò΀Kqþ^…såŠ>Ћr.ïa9·çåüU®Ëùžœû –ër>[Œ¸‰Ü÷Û‘þæ}#çÈ9¶,ÏûíHÙŸW¦ygº.ãö‚sñíøýq öÇ#Xž÷Ÿ“²¬K08Îÿ¥]”eþ~;þuiÏ_/¿)ûç³ò\ú«ì:ùõò/‘så©èOêÉ>ʹìôÿXyçŸ×ND{ÒŽ_ÏïWÎwå9©'z\Úõχe|òœ_oVoä¡ÿÀ/óžÎÑq_ž›º“ûþzÊó>¹~#ôU)Ú)}Ëî¯à’eàO¹Ÿ¡^!Îa‹ÞCœ]ìF`¹.íe¬×çQ¨'¸p[ð…w=h7 ÿÀ»/ãõû÷Çå£àJœûÖs>Æ8¤žôïדöý~|œÿ¡Ý×¹/[:˜ ÿcì°C.£ÞDœk¦Å~¹ÔŽgüˆéد™‹ísR®…Q–ç§`\S°O“`GI¿AÙþ‹¥ÇÑho+Ä#*¬ÂÐ%ÐKRô®až"„Ž 1ÁŰ ‹o/Ûq^àrœçg,K¿X¿Òm«?ï—WÂÿ\!ñûíÊx¥)K½ >Ω‚çp/õýùÏÿq\—õ\€¸I¦þå9ig:úÿ˜- ·ô xÎG†>lë –û#ЮàÑ85q\—ç¤=¿ýLýøõëÂýЯÐSï"´€<Ðîß¼°ðh»NAõ+Zýàß¼q)ÁÛþqÕ¼êíÊýòÉWGEž•Û2¾’.Ö¾÷Û•ñ–ÁOñÛ•ë™æ%óë~=¹_¾–²´;s²•2Ný¢mw<âM‚庿®ú!‡BÜQê C½­ŸLcÞR–ú:ÏòSüŸŠã¿Æõ´ij¥ž`yÿUž«Äùˆ`y° þ®_OÚ­ºú ýV­°ó,ýÉ}iOÚ‘ûÅs¬žyɹB%Ö)hý•Ê9÷Ev?K޶üQ±µmGê—î…¸æ+Ïý‚|ެ¾ ê߸!ú-Ä9È‚(ÖýIÿÁwDP\¸ÊÒ!ô“´3ÄÝ®·íÈu©'ïÎÁxæb¦âœ=Èßõý9DYìÒþ,üÁ}?ñ*Øã]/ë,ræMÈͪÛϳnÁ¸DÞ î¾¹àù b·K½RÐ}Ñ]vüb'úyŠå·nC^¸²/Î+/+òÖ!÷ NÃþÌÀyž'W%ÞØ£ÿ„¾Œu,=•ž‚zÞu)Ø{¾|&ò™p]ÊEÝǼíí€ýú_ –ë>.}¹z{A}´”¥ýžß°güü5àb‘Ÿ7T¯Ÿù<;‚ä¿ >B{‚ó—Ûýž‡~¥^1ì`i·dØ1h¿ðœ—£^é0;éOîûýÈõ¢Yv~Áw€ºW¯ŒGêûó˜ó‹•gþ¼ä9)K?RÏ·Ü—ñ –ö¥\#í ž{l>äŒ#yËsqŽä[°Ü÷ëÏFü:˜7ôŸ\,×§aŸ¦³ó,õf!þ)ã•ëS°ò|ÐŽØÀRÏï&ü™¿ô3t8ë-ýJYÆç[ž›Œý’~ËóAû^?þs“ÀÇ~;ROøMêM¿ –ëR/ ?¨ìz«ÿËqîSoŒ8LÅ™ÐãmûAù%ب_{Ço§ÆóïA/I½KÇâ•¥½’ðp~<zx>ÎDΈß6¯|ð=äÎM于Rã;0sw­v~#ç3¢OüóÁrŽåŸ#Éu9’²?>¹Œ÷ƒs!`ùþŒ_ž«1žŽ¨‡ú2O]¤©/÷ýu­±žÐ÷A»(çÁ’z²®þx‹~¶ØŸ·¬cðœŒeßä¾¼ÿ™é½Dy¯OÞÿ“÷Gç#Ÿ:ù9ò ¼Ï'ïÿùïûÉûƒþ{u¡ŸËûlR–÷é2½_'X®oçGHÊ}{4°ÿQ{(Ó÷íä;3v«n/ÉûTe‡áXÞëò¯K}NÈ®ñžZñ©ˆçá¾ÿ¼ß~áù /´û-÷ƒï`zå ¾‡ƒï~žqv±õåûØ’?_ú øXÎ!¥|Rü$]½\ú-ÎGžÇ¹Ì›ÕïφœŸÁï,íI~c¦zr_ÊROÚÏô]>±ï¥ŸéßVogî`ø¨/ù7òý=ÁR_ÊáÏ_Êõqí-}ôÿ'ÀÐÏþõò°óýúå!~˜’82â„Øç ø¡‚Å®‘røFÊ~?UC?õúË4~¹_º=âØ ÞŠû2Î ¯â<Ø3Àr]ò\ç.gaœ3À·r_òYƒ|îÕãý‹`/ Èuùn®ÄÉÀÞ¯„¼/ƒ<±ÒOm½yˆ¿•HÞp9Ú/Å~”]V=.Y6£º_T„úÁyÊAœNÆ'ñ\è=Ár]ôp)Î! #-ñZ\/ŸŽ}.»v¯‡Kýx”¬ p`?BO-ùñ¥‹Åe–N?kÛYt§ÏÄÕË}©/í• Î#ùN‚ ÅNŒøáLðó,Ä饬Ël{“¦â\b¾¥Ÿ V÷ƒ«¾²ë½ç6Kî·û°r`iG+?¥,÷ƒz¸/ßÉ,+…~ÈÃ:À.XÜv²<¿‹Ýy^ú¯‚&ÏÉõÅaýdœx^Î"o¯â»ÅO¥I[/øŽ“Ø£ˆÏøå@Ï@žùß¡þüLø­~ÞêLœIÞ¥\—¼Éið+g`>’o)8øþªwÝÇSà÷J»5òã=ì××ß×þœÔóëKÙg¦|NÁ~{‚ýüQ)Kg@§hWäT ×Dîa¿w²¸ø”ê埿ð‹êíÈ÷‚+W{xîëêXäUÞ)ÕñŒ/Ðç[¼5®‹~y+r48§9,ñ9§ðäbö!È“8 ÊAftõ¸LÞNµÇSæaù˜×,ìkGýJ=iWðlì¯<ï?ç÷+×%¬~¾œSUž„óGÁˆS׃s­W,¿Êõ*œWù|r.ƒñËùSåTè9¿Aœ·üä×Áþ•ü­Bèíyi°kå\+¿ra8ìvœ»ãöæ]Žýžþ¥¥û9°«¦ö´ë*X®ç}`Ç7ùv+çg¿˜ñw+g§·ë.íMÙ±ºÝàûG>–ïãÕÈ„Ÿø]…¿Wº^€¸Ô¬ß¢§í¼áf!òr¤,÷â\3¸ë‹{[zËXÏoãêIYƇqUmnç-×E .G^”àâOÁÞ̓¾’ï(çßoסùr?òÞÇÁ}<ç?/X®ûíùßq®ì{v;;Þß¿^ôè©ê «¿¥^ÑŽðOœ7~©Â¹ ä·»ß[¿Šˆ½ ù$’§Qÿ.À]ÄŽFÂËóð±ôW ý`<'8Ø×Ç`‡ Æx¤,ýK¾I±—ÏÔ—y`~‚åy™O¿ƒý)E¥¬%ä!òYõ€åû£eGÃŽ•ç<>•ëò\Á »y?!¾þ:ä<Ê3'–ï‘Ê÷Iç̱ÏËwK¥ž\—²|ßtîÛ¯`ég*âØòÝÐ)÷ÚyLÇüýï¡JY°ô/íL†?$÷åºà€¯~òzAÈ9¹.ñ‚k,-ûXêõìµW)ûø,èÃÃ¥ˆK—Áï · ¿‚sØûsÑϬÅÐbgN³òxö~Vþòý}øÙ“`·¢Ý äµ8Óuô³\0âÞQ=¤ìRÈ]ðA)ô•äo/¶ó,À~K¹ñ oâ ØÕð?ƒçàõïöžC}Á~>JÁþˆ¿½ }½Ê¶+t#y’_Q†ù‰|cÁúLÊc÷°û å /þLü8)Bo”Ⱦ †\÷Ì‚÷­ð\ð~Ú,߃«.–ëse觸/ì#´[„û%âÏÊ8P–ú=(XÚ‘qã9i¿Ô¯'ñCñWe\·DYž“zr¿óÎ÷Ê…^Yæ|Künñ·¥ô3ÏÏAýÙð³g_áú4‰— ¬qäÄV O‰ŒA½ñÞýqh_p`‹^-þÃu) ½<ïÛ ¾½€ójÑßA{OW·¤ÿ@ßÃ.“ú™ì…‚[ ¯áÏ Ι‡s=)‹øŸ?¯ úC®K¹BüTßÌà×JYú­¼³z|¿ õJp¿íJÙ?.ÈÓ¸zëäyã|Np'á~pñÿº´ï_/“}„>,ö“ä]K^¶ØW=…8·ØC™üñS|¿F~WAü¤{þSñXøkðgËï1.,ÃÊÇ<ó÷°ã”ëâ·eûõ¥ñ§ü|ê€Dn!$q0)yÞ»UÉï$ÀŸ}:7iËóq®,¿w,÷'ã9ÁS$΋òÄÆáÜ`Ú¾³ƒ\>Ù¶/X®Ë÷êJ`çÈ÷ì‚2êá<ÇÇ…wT¯_{PÚñë< ¿ÒÇe–¾$Ïp)æ·ôÛžäàzà'áÜF~·.øýºÐ{ÞõÊmíúöëIÙÇÒO ìâRÄ+‹÷S€sš|œÍǹ‘œçße`û•ë“ÇV¯œ _þ–ïŒúßM•rU?;ÿû©r=(cÝ<ùá~9è¹çp•WD¼ äy[o:ìÛéð×å;þwä;þwäú0è§A»Úñ ~o°Çâ-m½Eˆ#,>×ʵ…ÈwX¼­Ü¼úõÅ¿Ùç¥=ù}Bù=Ãã~Å× ã7¡gÇzöD8ø]C`9ú~»2Þ㾜‡ ^€õ—ß^€úÆýEˆû¿{*íÈóÁ9,â‚+; ޼ þÐóÕÏg¥Ÿ >®rñFÛ¿<_†|q9·-êS½ÝBèÑ|èËèk¹¼wŽöý÷º¥~ðV¯½(Ïôôpeó_–IÜyx~¹ât;îà9ÈÕªçl»‚+áW@žÎÁõ¥(ËïUû¿Síÿ^é"èÅý/úE¼Dð’Ë­¼ç|?@èé ø“„Ÿ“7Ôâ9rN$~,Î[fIXž›¿|ºÄù¼û‚ƒ¼õ‹a×¢ÝÑxnèBÊãàIy‹%ÕýÌ’#í<åwoe?üõ¯±/sÆs²¿Eײo50Σ3ý¾ó¼Kì8ÅŽO#.*~³”ÇaäÜ~+ô+eûÏûåñˆ#Jý± íõ ŸvMÕ8/‘ó©Rè½v=+°… ŸR¼Ç$Xî—á¼DÊ‚KpŽVü±]¢·ƒëò\ñ8;^éWÆ!ýÈu)çí ; ÏK»“¡'‚øC»î’ÿ࿯äülû_6| ù)Xî×È£|<ü Äe‚|†«½ú¨çc©'qC‰ëIY₃ûÿª~_ê×°GQ_¾ Ü—þ´½ïO@p%ôzE[<{¢âÛŽà ø3¸ÿì…ówÀý >îKýrÐe9âÏåˆ?‰>]pCuý*úTêúUô¯ø‹Àò¼”ýíÕ—z5úCÜMì½`=÷GüXì¿û|ɪñý}Ør?ÀbWJ=\/‡+ƒ]”' ž\ ½X ý`‰¯¢^!üÜ¢óì<ä÷K¤~à×BŸÂ“ß»<å…8/ð!üøJس•—TÏñ;øÝéS ß˪`OIõ$Ï*اPõvËaÿÉóAþçŒêvV•Øm^yá\ýVM„yì)Ü—¼f)/€>/…ž’ßm-»ò×åû+r_ìšbÄ•ý÷zK¾Gþ(œ‚þfCOÍ…~˜w¤½_†¸•üÎÿ{wAyÖÛ+—bŸ¥\ޏ[Yôâ¿-žûrô·NVÇþõqàÁþïå –|2ØŸÁ>ãºä Š]äù@?ûõj|Ï£¾”Å\¾Cõþ¥ž`Ékò¿3R yRŠûŸŸéwÈ}\¸¸:òsÞ´8Èc~Óø> ØÏk’û½{8°@¯‹G[zXú‰åoÁÛ ?OðŠ¿Úç/ÿÊÒÍrØ9R–úòýÎ…8ïZÜ8Ïòç’AˆÛAÞ/‚¿/÷~†°jëÉyDô¡œ7÷ñ\ì2Á•ˆWa^  _ª0_¹žw(âǰGfN°ã‘òl´3òyެîûÏU ñ£¥ìï«øéWA=øÛò¾Ù¢ôÆ X'ÄÂXÜÑ>/åÃß]<òü¼r2ýK¾”‹F þ|Wð:ð)ì7ÁbçNG;SFX:¾Ó‡s ù½ø™ízK}¹î¥`5Ö# { ö^ÅÖX?ÈÙbøÁR.z óyÆÎsú}Ï=çÚy"Ž+õK¿A9þÛîÐ/ï{3ÏŽ+~Ú|èAY·*œ÷U%@ŸˆW`>Å%[³ì¸µÆ8°_3aÿM½Â¶?úbâp+ï¦ÀœÜ þ¿È}ø‚«à,ØãBY¾s"ï%Àî\ˆs­âCr}>è´úuFŸê×¥þÜùv?ýë³Aïr_°ÿ\&,ÏK}ÁÓ0ŸLÏÉ82ËÇr¿®y ž‚u•õ(@=É7Íýxô,â’’÷,yÎó~±õå¾´#×gÎ幹Ђ%Uò§ƒ¼ Èçš»!Ï qkñä~ñшo¡\ÐÒò±è7±ÏK÷’ûA;óÊòÜlèQyoo›á_Ã’ë“w«î7‹ý/8øžìyÿû†ò]™2œïVl~ݤz\ÿ܇]'8¸¸gåèO\—¼ªRÄ#K`·Éõøß‚‹Áçr?ÈßêŠs”å~?ø6âÆòùÞ€|7 ñhÿ{Áw à—JY¾30±íGâáÒž`ùA7è•gc\‚¥ÁAõ¥¿à÷rϯwöŸ÷Ûõãïþ}ig2ø`âå–ÒØ'‰»ñö¬âò]ŽLe©/×å½?ÿw—¿kï¿/:ôëÉýà}F\¯ñ;ïVï/Ów«ýïùûyJ’ïXã9è¿’7pNìÏ2?ûy’|WØÿgÑ=ÕïûßÛœŒ~fbŸæb=f_‰ýÇuO„: óûekÍ;ú»HÛò\œ;äa]Ëu©”G’ïs½uGÜNîKþŽôSŒøIÁ/àgÄçO{¤z»Rž'ö+Æ%t–éwZüß_ñߥÆï¼dà;_¿È{Ç™~''ÓïÇ¿ÿò}u9)qj?Þ]CyñlÁþu)K|;ø¾…”Ñž”},õƒ¼ ŒK°ØObg‰]&eÁb§UAÎJ9ð×p}ár¬;ì4¹¿HÎ=3´|·ö²oïgÂ2¯À^†8wÝÿ.Dð=‚Lûƒû2iO~Y~¯Yò¹J ~×çÒò;ÎR–úů`ÐŽÔ\Gœ[ž—ó"é§v}€ß„üCž‡ünµÜÏCg~OÐ1äyð»Õè'_âÆGá±ö9Á2Žý¢¿à÷®Ñ~YÄ9=|—Ì/ß‚õ€^ðq1â¹ÅˆÓ–T@œeåšØá‚çl 9Žç¤ýà»·BÞuŸ}œïù¥‚ Þ±ýÉý4â “p},ò@Ë}Á[£^ âÓeˆ·åa½oŸ § ½Îʶë2o”]9?’üÿ;7A¯È{¶¢ý÷oË{¤ÁsÒŽœ]R=ÏC¾/!Xž/YXÝO¾÷tWõø´/§EOÈw ýëeÏT·¯2ÉùLöU`ßyz$øÞá*ŒzÌÿ¾¡ÿGÿ{—~YÞÓ—~ä»3sO)@ü^Γý3¬:–ïëïS‰ûòÞ–ÿœÿ|ð¾•øù²o^ý N ÏÁNÊT/êÕxŸ«È®g~ tØ òØ»¼§‰¸ŒÔ“8r䙼oåãõð|Î# q~\„ü›"È»ØÝÅU/‚‘ßà_—ç$¾?¯ü:ì³Äñkè9øùòÝö@¾ˆ¾ðäNþÙ¶K;Áû•"¿p_¾.X¾Ÿî÷ãçÑÍD¾s™œOÁ^÷ËE°·¤\üôô‰àbœ·Èýyíìº<Žù#NY{´ñEÁbç—_ º}'eð¡ØOÁù¾ì+ê‹V¶¸z;¯,íÊ9¿N/e9ÏŸ½²zYpð=1ÜŸ¾ªúõ©ºúu¿)Oó®¿ „²¼×$õüßô¿Ïëï·|ïÌÿ.Zð{G^Y°ÄEåy¿žè¥LßW“ïœÉ÷m¹‡s7Á%«a/ ß .D¼Z°ð±ð¹”ó¿E\ü:·§}¾b5úÅù¹Èµàûä°ýï” îï¥z÷ýçüï{Ëw¿gàÜÐÿ>wo­B~1â’濇%ç˜A~øHžøÝ"Žø4䦸ïhWÊóP/Îwªö¶öÚÈßàý.œŠ\._jçœkå´³v©´#çÇòþ¬Ç*› » ùO%8¯-–8(ìH¹|Ïvª”}{3°§ðÜäÕý?.`œ –õ•ßí’óL‰súùeÂ?3Æ[º“<µ9Uoo&ìÿ¾<'õ‚ßÉ{qàRÔ+?Xø ú[Îä|G΃äÜH΃ä»8A>ði¶¾øå™pw†=&×ý神”¥±§Òž‘ý(¿×ŽKøÁ?ï—s~Á~\Ëß'Y_ÿ÷ƒïWŠÿ1ñ%Œ¯øØ°óäzPÿ׌ë°/о†],õ¤\ú-ýÒγþT]Øß_ÿ¯¬ì‰“®+—ü.Ü/=ú_ìÁìóRÞ#_”\ ó? þ½`¹`Ôö¥ØÎ;ø~öá°‡Ûaßf÷aÊá¶ìŸcþŽW–ø‡¼Ç!ïmÈ{Á¹®ËyÏ”³íøËyOÐo¨:â¡ ÷ÁŸ‚+á×T@¯IþXUƲìƒ`9GÌÇøƒý9À¶'Ïù8ˆ«‹üõü+ß“úâ_ù¿÷ìë5ÑWòý(yØ/‹\›}`ŒKò=¤Ä —8ƒÄüø‚¼W#åi?=‚vƒv°ï‚kôçÅ=$N"e©Wÿ6ûâcÚ•òLø9r}>æ#ÏûXæ!88g„¹ÌO®Ëw‚ßÓF}ÁKúbÿN«~ްçË•}§Žçý÷äÂ^*›;å èE)/βó–ïZúíä!?B¾ë5q™YˆkÈw‹ä;þ÷‡ä»!òýùþÿ]#ÿ{GA¼q»@ŽüûÇ‹› –z"g|,ñØ_ qγï7,>ÚÁ®Se%äÂ;èú^®Ëw¯ä½l)—Èyñ™X`¹|_ëhÄ[¤^7;ßàýr”ñÝ-Z‹P¨c*”ù/ì@m×ü{uý5´~CþjWcÇé·Ù”z é߯S[¹¶9ÕÖ~Cû­k­2õÙXX[ßm#Ó˜3Í¡®5ðçÛÔ¿úìI¦õ­«Ý¦Ü¯«NSx¨¶öÚ^}xk]Ë•úŽ¥>í¹õ×Õ¸×Ö·ßCh¿±<º!þÖ5MÔ5߯ÈàÚÚ_Û3™ÆÔþÖv­¾í¬ýnˆ¼hê˜6}×wÏ3ÑJCÚ ÕãþÚú_[uñC¦º ]ßõ±7ÑUõÝ¿µÉÛuAc™è¤¹ÛßXäÿºúû#è¾úþÕ‡›ÚVCž¯o»þõuõ·>øòô×”½m*dz¶¾üX^­,®«ÿæœGsý5e šÒgCƶ¶{Í¥·êZãú®}êÕ5Ʀ¬osÐFsÈèúÒ캙ÍÝo}x½1íÖõlcÚi ®ï›«Ÿ E é¿®g|:¨­nsŒ­)²¹)ú¢®¾êª“i\Må¹P-åõýWßý¨­~cÛ¨ÏÖV·®v2•këo]þ­ëýÎijk«ë_k,®­µ!Õ%;ë’™þÝY§úðG¦{Í5>ÿ^SÚllŸÍ™ú¯íz]óÈt;!û[Û_CÖecþk ½×ölCú¨ë^SèÍo»1m4'M7¦NCÆ\×ZÖö·¶gëÛNCùem÷ëKCuÝo¯5e}ëj¯®gêê§¾ ]“Lý®oÚ¯ëþº¦¿†ô³¶vÓGC×±!ãlH;õi£¶{uµU[L}dê³¾<“©æú {¸¶ûk›_c÷±¶1ÔU§!t´¶qfj»¶g:ÎÚÚ®ïµÆðI}ž«k|õy¶1÷ÃóÍAßÍÅ# i£¶ñ7”ÖÖv]mÔU§!´ÒXºj( ÖG®5¥ß¦ðI]kSÛ<êË# ýk.:ª«ýL}Ö—^6¶¿úìm}ÚØ˜ÿ» i'ÓµæøÛPkÚX¹I¦7FF6fœ™ÆÐ\ëZ¾lè¿LòZþÝP:hè:5ô¹¦è‰Lý6dn‘ÍA;ëJ7úó¬O½µ]kÈߺ’Ÿk“u齺Úl.9Vß¿µñgs´½¡æSZÛPkÞ”¿úÈ’LϬ‹14µuÕöúøóù~m÷ÿ(u¹.¾Êt=“|¯O›™è»©¶A]ã[—uéŒúر)ê;×õ)¯ë;¾úèÙuýW-7¶Íºú[ëJ¦7GëRW7´õÕïºÚ÷?Š~õÿ;îææ×ÚÚ¯«¿?Â_&ÞZßsYß|ÝÜõügþˆ´Ð˜¿¦Ø_ëë¯.[k]ö»¾û\[ÿ™®­ë>ëóLC|Œæ²YþáÑõùל>F}ü¥†¶ù¿ò×¾ï†è»1m¬‹½]›ß\ß>ê£7Ä?_>Os9Ê<Þºú[Û¸3—õýW×~ÕVw}Œim÷6&ù¸®ÇSß=ØXÖccýk,=×&Sÿ¨ë{ìëZ­/V›nÙ4´±íCsÙ[ ¹^ß¶þ”­ÿ[ësïÒWcx ¡Ï4–Ï3®†Ôý#òSsŒ¹>¶F]~GcÇÓÜöËi7æq6–§7äœBÇM纈4…‡êjsc¢³FŒ% …"¿Ó?ZsþË"ßuÏ÷Ú …Øò%ûíG·Y±·ÔY²l¯=WØ¢Ò@7³—/ÙsÉæÛì¾d'Ôˆq‘•ô¿ßÿðB¿Ù{ÁS±]÷Øewj­7oëGû‡ÖBĸ‰µ@ò Ë\ZZ9ÐÐÖv´ttt  ³]ÝÝØÐÐ ÐÐÐÐ0À€A€Á q`¨›;°…Ã#£[F;0&l ØÚñ€ hÀ¤Z` ```&``6`N-00߃¼Z P(¬ŠÅ€Je€r* ‹‹KKËÛ8°-`;vì Ø°`wöt`/öì Ø°?à€ p Õ;°ÒƒC=8 p¸GŽ8Úc8p<àdNuà4Îðà¬Zà|À…€‹þ¸pàrÀß=¸Êƒk×®\¸pàfnÜ ¸ p;àîÌwyp«2À}€û8ð öàQÀc€Çk'«Ïž<xðàU^üǃ×3À›€·ïÞõà=Þwà>tàcÀ'€OŸ>|øÒoßyðàG~ü øð»…Àz ¢€X-$H²<ÈÍ--­jÖ€6€v€ö€µÀ&€N€.€®€î€M=½}èäÀ`6 lî€r``¤£[Fƶò`` ˜èÀ$&¦800½˜áÁ,Àlæææ;È:P(ö P (s ÂJ@• ‹‹KËËXáÀ6l ذ=`þذ“;{° `WÀî€={öö`?ö8ЃV8܃#8pàhÀ1€cÇŽœ8p’'NœêÀé€3g9p6àÀ¹€ó.±ÀþA´¿îüâGÝ×ÿP=¼Ý÷O¾¼ÉÑzlAÅgË6=N?àÍן9æI=áôcVœñùé›§½¶`Ù1ÛèA^7éþG?׃ïùñÕÞ«ßÓCnÞöâ³vÔ-.xs¯ï~í­;µÚ{ÑK×]«»ì0¬X-9PÂOk nÿù-Ž˜«‡á'ú†O;ï¹![ÿUw¾è¿ÿº±²T÷¸÷ÅW¿9úWµç/MYÝ^w:ý?g·Ù_tA¶¿^ãVuÙòíOtŸSMGºÏã웳¯Öïú÷‡ÿpIú‹uVÒ<¨ÛÞ¼úÀ#nýî½Ýî7ô|à|oñÄcGÏÑ›}9oÜ£®ÔÉ¡×üµøüñºmŸ7¿ñºßqßpǺoçoËo^}Ñ)J3^®GÝÿÏ©—ãÃ+t =¡7=²°Ç{ïÑ#Ï8³Óàs‡ë­¯¹ã©îóüw¿öú}s=hüAÿšqÈãéßößwÇÞÛeë‘;Jøé©zTëžœù;º{ç'“‹vyFþ€z¬ôJ=?¹åA3ó»êt½õU›½Y$7ýîÖfát|onv¦îTÔ6~WøR½ÅþÝ®M  û—]ÇÔ#>÷ë×ÿœ¦GþwË6#cë–ÏoóÔįÚéK/Øç¼¿ä§½êçv<~Šîµ?mÇEŸjµù×swؤ‡·Ýï.K[uxÛ]ôf_Ñ2žÿwÝéÝ= Oúz®¸ªE×Ýö:)ýÜ/y36ù"™~ëåC–þóúƒt¯›/hyÏ—é½û¯¼pfŽ »§Å§OÔýºµ,ž¤û_@Ãëÿ‘=úÙ¿îp«î{þ9¿}ØD=uVVäõÐ3zÚ¶³ºâó‹Ò?Òf´»j°Þìò3˜pôоé÷íÞAºÆÒåf7[zúûŒCþ}ÚXÝoËó÷^ô²Ù“žV¬G~ü×{ö~ä=jߪN}zžîûÌ—4Óô€/¸ø”¡oêAǾuñЩÆt§Ñ­Ji[¹CJ;¬¼POên÷kÊeïÜõlÅQºmâŠÏ/¼i¨n¹Óƒ/l•þšv‡8GÞ§//Húóãìøû¿š:/²W?=|ÉYwo½¥ñÛ$b¨žzä§DÆŸ=®'|xTù¬o¾ÔéYŸ³Åáh½‡·µž¸Ç–û·:ål=yú½w_ÞæB=µ×’w¿_ñ›n÷² H¹ò„¢ÿ¸=ýÁu¶¬ã'Ÿyh¢Ÿ}è]_Éï¢G¯¾á«nú]w>çô=ïÚá=pjìÐ]BÛk…ëýf¶úq÷éSõàCx a½ùTËÃζü2jgÚµôûzÌÑ{t¢-ÕYø ä~³íz÷<øðw‰ÅtÐóo,Ÿ;k³>x~[=<‡ÈhòY:þÓµ/8a’´×I½hÒ˜íÞO·8 Ã­{||³ÞzŠ•Ÿ¦i^ðfú;âÚ‹OÙ\oöm¿iÙŸC|n×oÔèè?nû¨µnYyüµ»åÞ¬w™Ì™~çE»OmoæavÔí—®fÎÖ}ÚÛŸ¢ëóÒ·þ÷ Ýkèíü=û¹ú\¦Dµ½•'-yU_­;œ;‹f2UG–09èÄ.¡í^=þZÝš—û¶twmxœî9ùoÌ0ºuÑ£G~±Ëöº[Û±ƒÞï ½É¸-þ[òüj=,ý /¸Îy‹¶í×ãuKfŸgê~h4 /Ò›E~}ËßFê!˜ŒZê)Ÿw,{»ó =u{»Ÿï÷÷[sZ Ô}^3|þz§*^I{h’8ßêžOØrðSnúíÁèMæ½ÌAêFd4î‰ôC%±NDé—ß)$é¨ãX÷Þ‘Î+6{ö~_¼¶zÊØŸ>5¤;ÜtæGoÝpœîÖ'N‚ë>=èɳOœÿÆ8=è÷˘átö/‘ )уN²?ý×n_»¾ƒ—ŸtÜn¯ï Ûðt{UÙþ9xéŸ>é6yÈåûëÁÇœ¶¿89Cwÿ~øÉ´BéÕƒí>lqáû¤ÆëaÏØué:v qg‹®é÷O¶?Ú’g¤³B’¼Z·\håå&×Ùmó”úÕÞmo½ù’vzÞeWé±gÿmÈ :q?õ¾ïŽzÓÃìO ö½›¨|‡õˆ|#ÿÓ?ïö:QÂ:«ÈÊéöŸÛ}ïüÅW¼²zà¯ËXñiµØòûoxà-u´‡ÕW›L³û2Ä,Ç"½ôÃô«˜<¦è9Gßò·´Ò¦u$†n«'-ø *5l¤t¿3Ÿºú‰‹ŽH}åûðh#÷ti…¬çÎÔ³z¸Ç)àßówcŽÒ£?´ã˜ØÙòóÄÛïÄGX¬µÐF‹þ û|CŒ{¬î˦½†î£ôˆ?xÂ1=¨íÅz‹Ç™M+õ0üôùð;­¼ìñ"oÿrÝ{¢¥ãþ…V¿G¹ýL¾%º×´ïΘ¶Çaº·2„¨ûÜÏp¹NmyýA%;~£{C¯tzgS8ºóJVßÝô å÷ñ†ë¬Y¤Vv>G÷|Ë0”îùúLpZ}õzèéÛ:êó¸™Mµºn"œ¸žø³±CôÔW,½Në„ð™t9/÷¶zD7«ßÆd“ZþÏ9éö1ô¦ϱò'aÄèÝmœÕ7±ÕmwyfÓ¯Þ=Y·¿ëˆ[_{(­»\Ìân×ô×_NìY¹ªKúWÚ¥Ãßí¯;•Œ!Áýmúi¿ÿþYç|<ë„sÎÑ]Î<|ò‘Ùé7¹›}Ÿ×‘;I,üýVÝagËG½z|5¥'}ñùÈ.Yª§u «¨ë+zz»?ÓÏañÐUÏèD½mùŽîû“õ$­Ì2”ëÐRË·[“šMœ¤‡Ï1|®·Zfì’ô{¬íÔ=䢼Áº+~’zóJK/]¦‡ËöEúë{¼¡ýå W¦?zÉÚ ýæßöQ”î<ý—;úüíÝó,»ƒ6³zfxȬ‹z¾ƒ]ÿQ§[ûhKè³Îÿäm˜­‡œbåTEÔQõ³¹t.ià_ôÀ;x:KôæÇmB {±î0ÌÊ¡a±¯¨ÎþœvsLwÝg‚å³ÖÉ»á«uÏÜo˜ÓŸüÅêŸ6?|Êïg÷Õ ›déþ},ýA?ë¡ÿn5€$Ö—‘¶ès©ž<ÓèãôÏdDå¼ù†î·tÓý7kÇö^hq­,ô<Ú®ÃÀ/Ù ÛU«B³_鯖Yz%,ý'ÂÖnm·¿å£$\Êö› ;ši¬·èbí¼- W†MÊyçÂQz̯Fþ¥ícôJú=£†¤¿î{r+sC÷›BZe»×tÿcé©ôAZÝÌä·‰1ÂÊ÷¾@„9[œOÒºý»é÷&°@9U÷[níÑŽ·Y=Ók¬ÕËyyÆ¥a}‡+·eóÆë¾‡‘õW²“nÝóÇ,Ú"ÝŸ»ÍÈxúv6w¾xI÷ýÎê¥/?=•,ò^ºÃËÖÎíôµýÉÙ._2¹ê13îô×ú¶•#wzHG {-Lÿ„Ÿžï=¥‚ \½ùEDV?]§·`ó঳ôˆ‘Ôªè®Gã§œg툯ȅô÷4¹1ŸÒm~,k½tõÖNí¶™Ñ#é/AO=¸û˺÷ÛvŸúBÏ·¹ÖП4Èð[úóo ]¥˶?¡oæ«{þdׯõëv}ÛÂÞm·»)Ýq¾Õk]ÚX»¾;ö·_7³0zॖ>µö“îkç›þégk_õ|Ï(v؃Íôù:'—øºõ¼ãX£év½¬½ž}“Q=òÀs©ê‘ß3a´Ö£Þ4?aœ~ÿ>cŸ§¿3ì”Cò<Ýž<=tÙ?Xèͯ°vð°×X難w+ª»ïBæÎS×èA‹¬]0d[c§¥ok寑þ¡À€Î†<ì:… æ£uwk¥ßˆÚ~:ù2ý¢™ÎÞºWúl2¨OÖ½þÆj°“>Àêô/ðãÚ´±þ[»>[­úäÓŸt‡Ï?`VŸ±ºÛ9´­Ï|¥»|g¦»Ÿmç»éj ^fí­Í–oË —þ/›mß“þåRë÷ÿáÉ]Çþ|ˆ9ž´gôzÜòKö$3ÞôOl´o«Û5ú.ýl•ý)õ6¿)ýË[øm>²r¿ïÉÖžÌYFîã‘ÇèžÖ>Öwoû"yXºë®é¦˜Ç¦éžVÎé^§X¯ç.ÖŸè“cõX² WËÑ›dmݹÜbúÿøº?9RÇØ åNÝÞʇôj^ý¥·¥_™a×eìÅQ+­ݵÂfÏé~ç^÷Û‹Íêíôð#¬½ ôØ·?k¿¦¿koã -Ú¸Î&+Øm¦[±¹Rö¶nÿO²ò&Õ‘)f½uÇߘ÷Ô]º’YúýSºw wrxg3NÝëÚ/›Ýêzäj럂]¾ž'òî|£µÛ[ÿdüAÝ~R'f¿=>ѽþoI†ÿê¾Xï!{ïÈ‚['5ŠM÷H™ýìÃÎg1»ÎÒmŽ~dö‚Ç—ëÎ;Ý!‡²µµ[;D¬Ý° â.}O´zl 6î5‘1B!ÝîW»?}`/õ-±ëÑ¡ÔúÕÝ>±?©¾ ü“®à“îWY}µ)Æßk›¾$).Ö[N#ójÕázÌO6¾°ÖmlòíÃHRè,Èáv¹ö'ÔûÊfëh=hSKÿCæ°ùY¥“¿Ýº¿&ý‹å½‰•»éoÉøßª¬µÎ~Îú·-/3qžôW ¬Ô:ÇÆ"QËOظI¯~¬{‡¬ýÚÿ(k7„5IçÉ¿éÖ“Œÿ•þål#ðtÛÉVî·Ÿhí¦Ž1K'[ÿbùZ/³q(m>¹ ºí£ÖŸêõªÕOµöØ £¶á?ÝnôJ¶htÒþ¤(õ¦åV~ô]ö{ŒŽ[ÓŸ#~™µi1sšÎµú[·^ný×vûÚx_ϸy.ýã?­ýçíøä3=ë½¹µÒ_Üký–NÐÇÑó¬Úz<›×{§|ÌÒq»³ž'Gﯺí[Ö®ë¾ï:õh zd…õ‡·Ü­²”4–ÝÉú£[[~½5ÆÚ¹éïÍ0FêvY¬ÆrÓßj ¿¦O977H¸sÇhm÷]·y“Ä"Ýeœ]Ï×2£÷Ñ#O·r>{¦=â—m:[}Ö ú½ ìŽî Ú¿s׳•ºãpOëŽz=^#ë%ïFÝël£;¤3yçWÞ[œþõ#ž}í!eÄC‘î`í«ô—†-wÑ­z›ø¤¼ß¹ôwžÞ¢ÿ­, u±G·æìz0èv³c‰=_6}ÇéÖN§¯¥ßo.0ãIÿ¿º×滲áûÚx\úKôŸÍìÜóA½ÃÚÝ-¬¿¤7ù|>ýýÃøéßa7ý¾©£µ6ê}§ô#†ýCé_MØiPú›J¯Î‚*âVé(è3r˜µ/ßð0wÐÙCÈŒ=ócÝöt·oH«·ü—î…yö;ØøƒéŸo2ú3ýë¶ÖNÖŠrD¿ÐÚg˜8¡ô™ñŸÓ³¹võ“éßGX;»Ýëó÷^ôÒõºã+&Þ›þÙ,ßRmý†ôïY9”;ÙÆM[t´ñȶ[}ÐíkOõ‚ÛnK+ßÚ#¾Ú±ÂÆ:cÜýŸ±v÷àaö¹Á$eI"é¡·Øù‰¿Ö|Üy¦qðt/ÄŸú|cõÍà=mÜPÎRWö+ù,tËߌ}šþÅÎWG¯eñÚ;ý;[á®Ñ±|koGï¶~DÒ˜étöZgõѰq¼äÛ~Žó¤¿Eœ?÷go ÕÌëbˆ†8ý,T#×Ë/Gº»×£^{~9Sa§M÷~,T=÷¬¶qúcõÓ×vOÆ—é™Úêûëæ®Omcsë¹k‘ikw¦¹g}ÖŶ¶}®«ÝL÷kk£¶1×F?µõëÓ^mëVíÔEÓ>dº_Û82qmû请¿µõ[[_™Ö´®²»~k[ŸN×¶ŸÒV}ú¨Þê¢×¦îÁÚø;fj?ÓÜëâåÚÚóeG&^¬×—ëÚ£úðy]c®‹·2§¾íû:¨¾íúíÕGÕgM2µ[ÍÖµŸ™ž¯ jÓAµñR]t´6}ØPÝP]PßùÕ6†µ­ÃÚæ^Ÿº ‘ïõ¥‹úŽ!Ó~¹ãªKÎûí­m¿Ö6§†ðA&]P[¥_Þ6”gëê+SýÆòc}ú­oÛµÙ›¾Ýöê4tþ [m4X®­]ñOšú—©ßæhocøÛ˜Æ²1ü5ÇzÔ—'6ĺ×ÕïÆ:®áocÛ˦ü­¯±7wûõ]ûi_2uCÒÏÚÖ°9e`sÕÛcC×tc\‡uAé¿©<ÒÜ<ÖTùߨ±ÔGÞ­¯¿úêµkCÌe}ɶºÖÃ??iH[ëBgÔÙÞJ@#Ú¬­íúèíu%{ê»~Í!÷S§!ûÝ1®+¾2í® ÕJ#õ•õºïöáôÕÜò·9ø¬Aϯ Õ˜S}Ú­O_5Ön]ü9m¯u¾+Cõžg¦öT?Ó¸Úžó×\t‘©ÍLý42††Œ½¹tPCÛhŒNhnÙÐú×je(#}Ö«¾÷l£ÿü6ji³>k^/zXªsÜM¥‡µµW/ùWË›Êsk[¯µ¹!õšŸs¿Ö±¯ eÜŸzÑb†¾Öú·–¾$k2©¾ãðþÖ*‹3µYG ¢Õµ@}ÆÝP™TË3Õ>)¯í“b‰vÙyÏíä£bñ=ö\²ç RÛm¿b›möÚcg)ï²ãŽûì±|÷=û¥±_^ ™/…~û*üïþumsm/data/bos3.rda0000644000176200001440000000604214471426252013326 0ustar liggesusers‹Í›]t\Uǧ(TÀ(¨¨¨gÎÙûÌ ¨\¥ B¬¨“B+Ò¦m ¥mèWšæ£MšÒ´– T ŠˆŠ‘‡.Ÿ\.úàƒ<ô\bÊÝsþûlÉ"i”µþœ³÷ÌùŸ}ïœßÝ(sçÌs³æÍ* Ó 3¦þ}ÆètæôÑ¿M+Ì,œr,˜¿d¹/fœ1:?öái£½þÆçÐt¥J3•N½CéJ'‹NQš¥ô.¥S•NS:]éÝ¢¥÷ˆÞ«t†Ò™¢÷)½_ôÑYJ}Hôa¥³EQú¨ÒÇD³•>®tŽÒ'Dç*}Ré<ѧ”ÎWú´Ò¢Ï(]¨ôY¥‹”>'**•”œ’‘+¥²RETUºXé¥Ï‹¾ ú¢Ò¥J™Ò—D_]¦4Gé+J_Uº\é Ñ×”®]%ºZéëJ׈®UjTú†h®Ò7E׉¾%ú¶Òw”æ)]/ºA黢•nݬô=Q“¨Yi¾è¥[E D •¾¯t›Ò"¥(Ý.ºCÔ"Z,Z"j---µ‰îÝ¥´B´RénÑ*Ñ=J«E÷ŠîSº_Ô®ô€hh­¨Cô Ò:ÑzÑÑFÑ&Q§ÒfQ—ÒQ·¨G©W©Oi«h›R¿Ò€h»Ò h‡è!ÑN¥!Ñ.¥Ý¢=¢šh¯hŸÒâýJ”=ªtPé1ÑãJOˆ)ýPô#¥'•†•žRú±ÒODO‹~*zFég¢gE?ýBôKÑs¢_)=¯ôk¥ÑoD/ˆ~+zQéwJ¿ýAô’袗E½":]ÞÞø+lÏÇCô_Y÷†|ÜÝ“æ/“qýì4¿þp>>uUšrn/Í×e½•4­ŒwŒ¤ùG¯LãÎ|]vÐøv®ÌÇ+Óü52¶´§ùû¤ŽCµ4¿XÆÁä›òqûpšò¯iÜ’åãÒBš?xM÷¿šOœ•æ7äuf]·¥ùi\¿½œæ'ÓxÓK²î…4ÿ؈‰M½ó›òqÑ‘4pKß”ûdí­i~ëÓù¸ûïf}cï|MòW¤y9.ÙŽÕi¾[ƾ¡4¿òpo¬åãCi~ä®NóLãÍrîzM½«‡¥ÞsÍ~ÏŠÏGÓüíGÒxiî—m7×Õq¾ä·¥ù=ùyÉö-Lóùïžíz%ÍßYKãþü:³¡bš_’/Ûÿbšœ“;þ–æ÷›ºæfù(÷#æolÏÇE³Óü½2®5uôæq¶ûŸiþas®‡^”ü¬4ß—Ÿ›¬ßÔ·¦Qê¾8Íï»9×6¤ñ­2>Øhö—çã^ÃiO“äŸOó]­i¼°=[dì0ç¾[~ïþ™i~y½~snºòú³Á7ÿþÞ3Ó|íÏi|y^W––;º¿9µëÒx¥ì»Çœ¿õùï˜õ˜õ{æ¤q÷°Ôדæ»$_» Íï:šÆkä÷°çßyf]“‰Íóweî›m6ü/«åã 9—$?Ô–æ‡L?íýW>>tjšßùjw%o®c§©§i$—´§ù‡f§ñ¦Æ4ÞÖƒIóƒMiü€ŒÝ=æ{æ97ØÆ+dÜXLó„Ës½ÉÇ!³Og^O¶ýä4ŸÉ¸í¥4¿Ó<¿íó¼ßðÐo|·šº¶v¤qŸy¯Xk~>SO9Ý­i¼þˆäÍó£Û¼ÍÉÇÞ³Ó|—©GÎMŒ×ä¿oÖÙžæ7ŸŸÆý†céOÙÆ#¦Þ†4¾DÆsŽ:MæyöÀÑ4n7<Õßm¹gÄĵ4^u8ï6Ÿ¯œÆMùçÙã›þl…ì–,—¿eM&nHã›sßlÈœ«¢Œó̾=ùùÌöoJóæ\íÈÏ]V{&Í·çã>óœÝeêÞ"ïµÒüáa¯y¯lËÒ¸(c»ù}žMãÁúhÞÏ_Kãíæ>õ™¾6`Þ?:j’ßo¾g8_7œýæÜ÷æÏ±l«yÎn5üõÝ&ùBš_åã²ÙæûÏ¥ñª£ožï3ëæ×¤®˜:Íõµ ׃æ}è7™~¶j8·´§ù¶|ÿl›éG÷H¾Ç<ú智Ì{üæ¦4¾«1×¶¦ùµæ¹5×ԵɜCûÜÙhüÖ˜ççõ#ùx–æ¥me­f¿F;Ìõ­7uÞeêhkJã=iÜ%ïïCæ<­+æãsï«¥ñæÃiÜYLãvSïê#i¼ÊÄm­õéÿüéQÉ×?—Û>Ùy;NØwŠêŠùÂÕg}O´Þã¼ßcÞÿÂø¾?ÑucÖ?ÎzÇÚg¢¾ÿós;ÖuLõy>Ñû`ëãû“vÆYÇT“ÿòªçÊÿËsÍäÇû;ïóa¼~c}oÂëíþÇ{Su^ó:ŽÛoŠë}»Ÿc~‚užèx¢ûÇë(Œó{“ô;Lúùx‹ïMø¾N‘ïTóø¶õ§)Z?Ñó} “ó½·Úÿ„ù±ûOÖú)®sÒž¯ã¬ÌüŸw“å3YçbÌzÆYç„ûÁDëx›ú—ùó'-nnYpì? 5Žý¡?I¶¶-¾³¥þ'Ûµ,¨°¼­¹m±8eÙ’)›i¯ËÓJõ‰«O¸> õIY&ÓKÅ8+Å™‹3޳gX[­Ï\tqÑÅEçã,º¸èâ*õ™.>ºøè⣋§8‹..±*Šk)®¥¸–b-](ºp¬€£ GŽk9®å¸6ĵ!® qmˆ„xwCt p‰×QŽ÷¥ËÑ¥]ʱªr\[‰k+qm%VU‰UUâÚJ¬¥k©D¿jô«F¿jô«F¿j¬¯ë«Æ=ªqjÜ£ZßcF©XÂÔaê1%LÓ2¦Lá[‚Y f%˜•`üèñ NQ¤ƒƒƒƒƒƒƒƒ‡ƒ‡ƒGe•y8x\›ÇµBe„ÊH9 2Fe †ÃáÀpp¨, ²‡€k ¸¶2Êp(áŒrÊ0+ì¬ÌPdEV°E[Tà[o¾8TáP…CEVqûªð­Â· _{W,bZÂÔaê1%LÓ€iSlQÂ%l.¸p€ÁW‚/¸pà ç`Dq@Ä9øÆŽ0:Å@Äçá Dq„"Ž8à8€ãŽ#Ô pÀq _0äÀC 90äÀ ppCำ3à䀓C 90äÀC 90ä*¸}Ô œ\f˜'œprÇpÀñÇp<Àñ ÅƒZäч€ùæ˜`>€ùæ˜`>€ùæ˜èèøàzè  €tÒH €tÒH €t@G ;€îºÃ(Ýæ_ßrGóòú¿ ®'gÝÚÜÖ|ÑÂeÍ-ÇþÐÓņ­w>msm/data/bos4.rda0000644000176200001440000000675414471426252013341 0ustar liggesusers‹Íœ_”•eÆ€…¤6¥™•™™ÙÌûç;ç¨å)IMI'4CóÏ€€’ 0 êF`†fd€¢¢RŽefeFfeæ«ÕE«ÕÅ\tÑ…\xáE«øîóþλ•5 3˜¬õ°ßýíï<{ßùžçýÆa9}ê 3iƤ\.7.7þ¤Ã?¼œ0îð_'å&äN9’ÌZ°ØårãÏ8¼>R<íðIÓÞ©§§0^a‚ÂÉ‚)|Xa¢à…I Q8Uá4…Ó>*¨Sø˜àã g(œ)ø„ÂY‚O ήÁ§Ÿ|FáÁgÎUøœ`²ÂçÎSø‚à|…/*\ ø’Â…/+\(øŠÂE _U¸¸_Ô+4(˜XSð5ÈjW(Š —(\ªp™àë‚o(\®PªÁ7ß\¡0UáÛ W*\¥pµà; ×®LSø®Âu‚ë¾'˜®pƒàFÁ÷7)ü@a†ÂÍ‚[jðCÁ­5¸Mp»Â‚&ÁL…Y‚;f ææÖà.…»æ)üHáÁ½‚fÁ|ÁA‹`¡`‘`± UpŸà~…%‚¥ – –+¬<(xHáaA¹+««m‚Gj°F°VÐ.X'X/ØPƒAg 6 ºÝ5ؤУ°Y°¥½ }‚­ ý‚m‚GÛk0 Ø¡°S°KPìì©Ác‚½5x\á Á“5ØWƒ§O×àÁþüXð…gkðœÂO~&x^ðsÁ ¿¼(ø¥àW‚_ ^ü¦/×à·58 øàÁï¯*üAá‚? ^üYðºà/‚7§Ë{Ó;JýåwŸâþ‹rµJ]í!ö½âÎî´~…Šk'§õµCÜ;#Äç®MëÏNOó…áó¥å•7Òúõo’¹ï=ÖŸ¼&Í7$¾â>ÕoÃÒûdÎÇ—¦õë$Þú”šËiý!™wÇPˆû+i}¾ÄU…?Sõ&‰r=[Óú³ÿHóæRˆ $.Ì¥õ}×¥yï›!öµ…øÌÙi½]ú®»:ÄλÓú’Æ4¯~?«¤ÿS¯§õ§ÊëÓ|ýkò¹WÒãOP¹ºŽYM!Ω„8o(­ïۘ淾ÒË-i}óó!n)‡¸ó_Н1Í·¿%ç Jýê´.iéJ‰ÛV¤õ.‰›äyëHëK¦ùºJˆëëC||Z_SIcß´´þľ4ïtì“9ÓúŠAé×â¾óÕÓÝ$Ç_Nw¶¤ùÜrš7K\p Ä6¥Ë.yŽz$öNHë‹UÜ£žÓÎ:‰Õ}°ÿ½?¿|Hæ?3­WþšæW…ùK7HlÉ¥õ^õüUnLó¥2ÏŽSCÜ¥žÿµ²Ï­“óºß®©iÞ5(çÍ–ù»Óz§Ô·Ü(ó\˜ÖwJóUrŸ6‹ßh}î¹@}¾IåjZøKËêCìP¾¶¨"ç …Ø¯tÒ.õmòþ1КÖÔûΦÿ„øè©éñío¦y§Ì³]]ßv5_Óg•C\PNëNNóõi¾¥NâßBìÿ{ZïoJó•*vu«ó•¯÷×¥ù‰ëêÓãíâía¾RŸº I]â€ê»!ÌYê qëÄ´^RqËki}»Úßô~׫tÙ«ø7«y7·¥yzï[­¾Ç5O·zŽºZÒ|íPˆrK]ÊïºÔ{í¬!–E7›ÎIëj>yþb¾*<¥vyÎ7”ÓzÇ”4ïU¾"ûwÕJë†ÒúÚº4¿Tb›zÛÕ\ÊWJó²Òkõý^ïŸË¨¼’æË¦ùª¾trš7…z©]ñ¦_k®tg)ÄÅŠoQ“ÊëÒüöÀ[PÏ]½ÄêÏ3TÿnÙ{. qïú´¾A=‡Ûä}®òBz¼e0Ä-!îQûÀŽJšo”÷ò…ï–´> ô´[½÷·–Ò¼^bY}ÿ}/¦y5N¨Þ‹ûßJó­ê~ö¨ýºO½§µUäø^užò‹5ƒ!ö*l:_¢¼¯nV~¿Yé¸çn9žKÏ)…¸h²:ÿ¥4_vè½÷¨ÏͪÈ\ÿVóªë,‹/”‡BìWïçI¼KêëÕþ»l0Äåôxk˜'þ<±Eí—Ë¥¾Rb·ò›žjnõóWGSšßßâ-!®nIë«•?NWó®Wϯö³uŠo•ò뛄øp)=.Ûi©Eõk”ئ®s­šó~5GkSš/éNóÎ)iPÏßšú{ÄG¶©ûþP%Í;¦ù†ú4/«ùW ¥ù2•·¶T—ïüw¦ËÉñj]¾†R]ˆïW]ÇQ÷{ŸçW}âó´ßhçiU.ÆÏçŽósG¹î±~ŽFÚ´ý>ðºÒõýÜk]mŸ£}¯êsÇ}GzüxŸ÷1~>ßÕo„Ÿ?æzn˜>'ªïXùû(}i´>8RþáÎ5ß0>1âëá|ÃÍsÔ~ÃÌÏËnþëêýz¾†›c´õ‘úÓ¯c´q´ýK9‰ÿ/_æócöœåF6ç1_Çóžhëçâñ±öÛ±â9ÞççhýsÇxÞqîcîÓzÞaæ1Ï žw¤ßë1×sG9>V?ï¨|Ä×1B¾±zŽâqÝÿhÇG9Wäý€ï£ê߈Ÿ<fóœ#¿’=Ò~|õ`Këüûš«ÿмu^óœjaqëÌÖ9Šâ”E –\\C3nšNj¨.Lua« _]dÕE¾º(Èb\C}\5Ä•‰+W>®²¸ÊÇ|ÅêÊDf™Md6‘Ù¸¸ŠÌ&2›Èl"³Ì62ÛÈl#³Ì6No#³Ì62»Èì"Ÿ‹|.ò¹ÈçâÌ.2»Èì"³“úÈì#³Ì>òùÈç#Ÿ|YäË"_ù²È—ÅI³ÈœEæ,2g‘9ïA>öÈÇùÈœÌùÈœÌùÈWˆ|…ÈWˆ|…8s!2"_!ò⤅È\ŒÌÅÈ\ŒÌÅÈ\ŒÌÅ8s1ö(ÆÅØ£Xí1¾¡¾žeKÃÒ²t,=ËŒeže%ÝèÖ@‹Z4Т ´h E¼^ÃUZx ¼^¯×ÂkáµðZF·´°ðZx-·ÄÒÂÁëàuð:x£;Z8x¼žÑ=-<¼^¯‡×ÃëáÍàÍàÍ=£EooÆ-Éh‘‡7oÞ<¼yFÏÓ"O‹<-ò5-¸ŠÝ t+Э@‹- ´(ТoÞ"¼Ex‹\E‘EZiQ¤Š5(Ö Xƒb Š5(Ö Xƒb Š5(Ö XƒbMݯA¼ñÄk¯A¼¦nèØ cƒŽ :6†nHÚ iƒ¤ ’6†n¨Û nƒ¤ ’6HÚXZ iƒ¤ ’6^ÔmP·AÝuÔmP·qtCÝuÔm<-ºAè¡„nºAè¡„nP·ÉàEè¡„nºÉhæ š7hÞ tƒÐ B7Ý tƒÐ B7Ý tSà‚мAó¡›-мAóÍ4oºAè¡„nºEè¡[„nºEè¡[„nºEè¡[„nºEè¡[„nQ·EÝu[Ôm‘´EÒI[$m‘´EÒI[$m‘´EÒ– Û¢n‹º-궨۲w[„nºEè¡[ÔmQ·EÝu[ÔmQ·e·Ý¢n‹º-궨ۢn‹º-궨ۢn‹º-Û¸Eè¡[„nºEè¡[ÔmQ·EÝ–Ý¢n‹º-ê¶ù^®u[ÔmQ·EÒI[¶q‹º-궨ۢn‹º-ê¶ìè¡[„nºEè¶H74ïмCóÍ;4ïмCóÍ;4ïмCó¡;„îºCèŽÝ¡y‡æšwhÞ±£;äï¿Cþù;äï¿Cþù;äï¿Cþù;4ïмCóÍ;4ïмCóŽÍÝ!‡üòwÈß!‡üòwÈß±Ï;œÀá'p8à Nà<Ý0‡)8LÁa Sp˜‚æà0‡)8LÁ±û;üÁápøƒãEÀa«pX…Ã*Vá° ‡U8¬Âñ"àp ‡k8\Ãá×p¸†Ã5®á° ‡U8¬Âa«pX…Ç<þàñ?xüÁãðøƒ¯¯i¯ÂóNà± Ux¬Âc«ðX…Ç* 0) REprintf("Lapack routine dgesv: system is exactly singular\n"); R_Free(Acopy); R_Free(ipiv); R_Free(work); } static void padeseries (double *Sum, double *A, int m, int order, double scale, double *Temp) { int i, j, r; int N = m*m; FormIdentity(Sum, m); for (j = order; j >= 1; --j) { double s = (order-j+1) / (j*(2*order-j+1) * scale); MultMat(Sum, A, m, m, m, Temp); for (i = 0; i < N; ++i) { Sum[i] = Temp[i] * s; } for (r = 0; r < m; ++r) { Sum[r*m+r] += 1; } } } void MatrixExpPade(double *ExpAt, double *A, int n, double t) { /* Calculate exp(A*t) by diagonal Pade approximation with scaling and squaring */ int i, j; int order = 8; int N = n*n; double *workspace = R_Calloc( 4*N, double); double * Temp = workspace; double * At = workspace + N; double * Num = workspace + 2*N; double * Denom = workspace + 3*N; double l1 = F77_CALL(dlange)("1", &n, &n, At, &n, 0 FCONE); /* L-1 norm */ double linf = F77_CALL(dlange)("i", &n, &n, At, &n, Temp FCONE); /* L-Infinity norm */ double K = (log(l1) + log(linf))/log(4); int npower = (R_FINITE(K) ? (int)(K)+4 : NA_INTEGER); double scale = 1; /* Multiply by t */ for (i = 0; i < N; ++i) { At[i] = A[i] * t; } /* Scale the matrix by a power of 2 */ /* The expression below is not clear because it is optimized. The idea is that sqrt(l1 * linf) is an upper bound on the L2 norm of the matrix At (i.e the largest eigenvalue). We want to take the log, to base 2 of this to get the smallest K, st ||At/2^K|| <= 1. */ if (npower < 0) { npower = 0; } for (i = 0; i < npower; ++i) { scale *= 2; } /* Calculate exp(A/scale) by Pade series */ padeseries (Num, At, n, order, scale, Temp); for (i = 0; i < N; ++i) { At[i] = -At[i]; } padeseries (Denom, At, n, order, scale, Temp); solve(ExpAt, Denom, Num, n); /* Now repeatedly square the result */ for (i = 0; i < npower; ++i) { for (j = 0; j < N; ++j) { Temp[j] = ExpAt[j]; } MultMat(Temp, Temp, n, n, n, ExpAt); } R_Free(workspace); } /* Tests if a vector has any non-unique entries */ int repeated_entries(vector vec, int n) { int i, j; for (i=1; i 0) AnalyticP(expmat, *t, *n, *iso, perm, qperm, mat, degen); else MatrixExpMSM(mat, *n, expmat, *t, *degen, *method); } void MatrixExpEXPM(double *mat, int *n, double *expmat, double *t, int *method, int *iso, int *perm, int *qperm, int *degen, int *err){ int i; int nsq = (*n)*(*n); double *matt = R_Calloc(nsq, double); if (*iso > 0) AnalyticP(expmat, *t, *n, *iso, perm, qperm, mat, degen); else { for (i=0; i<((*n)*(*n)); ++i) { matt[i] = (*t) * mat[i]; /* Check whether any of the elements of Q have overflowed. If so, Fortran eigen function will hang in a infinite loop, so bail out before this happens. */ /* Could we return loglik = -Inf instead of halting by setting error code? return all zeros for pmat in that case? Doesn't help convergence with test case in test/rory.r: lik stays at zero. */ if (!R_FINITE(matt[i])){ /* *err = -1; return; */ error("numerical overflow in calculating likelihood\n"); } } expm(matt, *n, expmat, Ward_2); } R_Free(matt); } /* Returns i-j transition intensity time t given vectors of intensities and transition indicators */ /* Calculates the whole transition matrix in time t given an intensity matrix */ void Pmat(Matrix pmat, double t, Matrix qmat, int nstates, int exacttimes, int iso, ivector perm, ivector qperm, int use_expm) { int i,j,method=MEXP_PADE,degen=0,err=0; double pii; if (exacttimes) { for (i=0; i 1 - DBL_EPSILON) pmat[MI(i, j, nstates)] = 1; } } } double pijdeath(int r, int s, Matrix pmat, Matrix qmat, int n) { int j; double contrib; if (r == s) return 1; /* absorbing-same absorbing transition has probability 1 */ else { /* sum over unobserved state at the previous instant */ contrib = 0; for (j = 0; j < n; ++j) if (j != s) { contrib += pmat[MI(r, j, n)] * qmat[MI(j,s,n)]; } } return contrib; } /*************************************************** CODE FOR DERIVATIVES OF P MATRIX. ***************************************************/ /* qij exp (qii t) dqij exp(qii t) + dqii qij t exp(qii t) exp(qii t) ( dqij + dqii qij t ) or exp(qii t) if diag */ void DPmatEXACT(Array3 dqmat, Matrix qmat, int n, int npars, Array3 dpmat, double t) { int i,j,p; for (i=0; i 0) REprintf("error code %d from EISPACK eigensystem routine rg\n", err); if (repeated_entries (revals, n)) { DMatrixExpSeries(dqmat, qmat, n, npars, dpmat, t); } else { MatInv(evecs, evecsinv, n); for (p=0; p #include #define USE_FC_LEN_T #include #include /* index to treat a vector as a matrix. ith row, jth column. Fills columns first, as in R */ #define MI(i, j, nrows) ( (int) ((j)*(nrows) + (i)) ) /* index to treat a vector as a 3-dimensional array. Left-most index varies fastest, as in R */ #define MI3(i, j, k, n1, n2) ( (int) ((k)*((n1)*(n2)) + (j)*(n1) + (i)) ) #define MI4(i, j, k, m, n1, n2, n3) ( (int) ((m)*((n1)*(n2)*(n3)) + (k)*((n1)*(n2)) + (j)*(n1) + (i)) ) /* Macros to switch quickly between C and S memory handling. Currently not used */ #define USE_CALLOC /* #define USE_SALLOC */ #ifdef USE_CALLOC #define MSM_ALLOC(length, type) Calloc((length), type) #define MSM_FREE(var) Free((var)) #else #define MSM_ALLOC(length, type) (type *) S_alloc((length), sizeof(type)) #define MSM_FREE(var) #endif typedef double * Array3; typedef double * Array4; typedef double * Matrix; typedef int * iMatrix; typedef double * vector; typedef int * ivector; struct msmdata { /* for non-hidden model */ int *fromstate; int *tostate; double *timelag; int *nocc; int *noccsum; int *whicha; int *obstypea; /* for hidden model */ int *subject; double *time; double *obs; /* observed state or any other HMM observation */ int *obstype; int *obstrue; int *pcomb; int *firstobs; int nagg; int n; int npts; int ntrans; int npcombs; int nout; }; struct qmodel { int nst; int npars; int nopt; double *intens; double *dintens; int iso; int *perm; int *qperm; int expm; int nliks; }; struct cmodel { int ncens; int *censor; int *states; int *index; }; struct hmodel { int hidden; int mv; int ematrix; int *models; int totpars; int *npars; int *firstpar; double *pars; double *dpars; int nopt; double *initp; }; typedef struct msmdata msmdata; typedef struct qmodel qmodel; typedef struct cmodel cmodel; typedef struct hmodel hmodel; int repeated_entries(vector vec, int n); double logit(double x); double expit(double x); double identity(double x); int all_equal(double x, double y); void MatrixExpPadeR(double *ExpAt, double *A, int *n, double *t); void AnalyticP(Matrix pmat, double t, int nstates, int iso, int *perm, int *qperm, Matrix qmat, int *degen); double pijdeath(int r, int s, Matrix pmat, Matrix qmat, int n); void Pmat(Matrix pmat, double t, Matrix qmat, int nstates, int exacttimes, int iso, int *perm, int *qperm, int expm); void DPmat(Array3 dpmat, double t, Array3 dqmat, Matrix qmat, int n, int np, int exacttimes); void dpijdeath(int r, int s, Array3 dpmat, Matrix pmat, Array4 dqmat, Matrix qmat, int n, int npars, Matrix dcontrib); msm/src/hmm.h0000644000176200001440000000320714471426252012600 0ustar liggesusers typedef double (*hmmfn)(double x, double *pars); typedef void (*dhmmfn)(double x, double *pars, double *d); double hmmCat(double x, double *pars); double hmmIdent(double x, double *pars); double hmmUnif(double x, double *pars); double hmmNorm(double x, double *pars); double hmmLNorm(double x, double *pars); double hmmExp(double x, double *pars); double hmmGamma(double x, double *pars); double hmmWeibull(double x, double *pars); double hmmPois(double x, double *pars); double hmmBinom(double x, double *pars); double hmmBetaBinom(double x, double *pars); double hmmTNorm(double x, double *pars); double hmmMETNorm(double x, double *pars); double hmmMEUnif(double x, double *pars); double hmmNBinom(double x, double *pars); double hmmBeta(double x, double *pars); double hmmT(double x, double *pars); void DhmmCat(double x, double *pars, double *d); void DhmmIdent(double x, double *pars, double *d); void DhmmUnif(double x, double *pars, double *d); void DhmmNorm(double x, double *pars, double *d); void DhmmLNorm(double x, double *pars, double *d); void DhmmExp(double x, double *pars, double *d); void DhmmGamma(double x, double *pars, double *d); void DhmmWeibull(double x, double *pars, double *d); void DhmmPois(double x, double *pars, double *d); void DhmmBinom(double x, double *pars, double *d); void DhmmBetaBinom(double x, double *pars, double *d); void DhmmTNorm(double x, double *pars, double *d); void DhmmMETNorm(double x, double *pars, double *d); void DhmmMEUnif(double x, double *pars, double *d); void DhmmNBinom(double x, double *pars, double *d); void DhmmBeta(double x, double *pars, double *d); void DhmmT(double x, double *pars, double *d); msm/src/expm.h0000644000176200001440000000024614471426252012770 0ustar liggesusers/* Interface to expm package. */ typedef enum {Ward_2, Ward_1, Ward_buggy_octave} precond_type; void (*expm)(double *x, int n, double *z, precond_type precond_kind); msm/src/Makevars0000644000176200001440000000006114471426252013335 0ustar liggesusersPKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) msm/src/hmmderiv.c0000644000176200001440000001146414471426252013631 0ustar liggesusers#include "hmm.h" #include #include /* Derivatives of PDF w.r.t parameters, for each HMM outcome * distribution */ void DhmmCat(double x, double *pars, double *d) { /* f(x) = p_y if x=y, and 0 otherwise df / dp_y |x = 1 if x=y, and 0 otherwise */ int i; int cat = fprec(x, 0); int ncats = fprec(pars[0], 0); for (i=0; i ncats) || (cat < 1)) return; d[1+cat] = 1; } void DhmmIdent(double x, double *pars, double *d){ d[0] = 0; } void DhmmUnif(double x, double *pars, double *d) { d[0]=0; d[1]=0; /* uniform parameters are not estimated */ } void DhmmNorm(double x, double *pars, double *d) { double mean = pars[0], sd = pars[1], f; f = dnorm(x, mean, sd, 0); d[0] = f*(x - mean)/R_pow_di(sd,2); d[1] = f*(R_pow_di((x-mean)/sd, 2) - 1)/sd; } void DhmmLNorm(double x, double *pars, double *d) { double meanlog = pars[0], sdlog = pars[1], f; f = dlnorm(x, meanlog, sdlog, 0); d[0] = f*(log(x) - meanlog)/R_pow_di(sdlog,2); d[1] = f*(R_pow_di((log(x)-meanlog)/sdlog, 2) - 1)/sdlog; } void DhmmExp(double x, double *pars, double *d) { double rate = pars[0]; d[0] = (1 - rate*x)*exp(-rate*x); } void DhmmGamma(double x, double *pars, double *d) { double shape = pars[0], rate=pars[1], scale = 1 / rate, f; f = dgamma(x, shape, scale, 0); d[0] = f*(log(rate) + log(x) - digamma(shape)); d[1] = f*(shape/rate - x); } void DhmmWeibull(double x, double *pars, double *d) { double shape = pars[0], scale = pars[1], f, rp; f = dweibull(x, shape, scale, 0); rp = R_pow(x/scale, shape); d[0] = f*(1/shape + log(x/scale)*(1 - rp)); d[1] = f*(shape/scale*(rp - 1)); } void DhmmPois(double x, double *pars, double *d) { double lambda = pars[0], f; f = dpois(x, lambda, 0); d[0] = (x/lambda - 1)*f; } void DhmmBinom(double x, double *pars, double *d) { double size = pars[0], prob = pars[1], f; f = dbinom(x, size, prob, 0); d[0] = 0; // fixed d[1] = f*(x/prob - (size-x)/(1-prob)); // printf("f=%.3f, dlf=%.3f, d[1]=%.5f\n", f, (x/prob - (size-x)/(1-prob)), d[1]); } /* beta binomial TODO d/da B(a,b) = B(a,b) (digamma(a) - digamma(a+b)) d/db B(a,b) = B(a,b) (digamma(b) - digamma(a+b)) d/da B(x+a, n-x+b) * B(a,b)^-1 = d/da B(x+a, n-x+b) * B(a,b)^-1 + B(x+a, n-x+b) * -B(a,b)^-2 * d/da B(a,b) = ( d/da B(x+a, n-x+b) B(a,b) - B(x+a, n-x+b) d/da B(a,b) ) / B(a,b)^2 = ( B(x+a,n-x+b) (digamma(x+a) - digamma(n+a+b)) B(a,b) - B(x+a, n-x+b) B(a,b) (digamma(a) - digamma(a+b)) ) / B(a,b)^2 = B(x+a,n-x+b) (digamma(x+a) - digamma(n+a+b) - digamma(a) + digamma(a+b)) / B(a,b) and d/db B(x+a, n-x+b) * B(a,b)^-1 = B(x+a,n-x+b) (digamma(n-x+b) - digamma(n+a+b) - digamma(b) + digamma(a+b)) / B(a,b) */ // FIXME this doesn't match num derivs for meanp, but does for sdp void DhmmBetaBinom(double x, double *pars, double *d) { double size = pars[0], meanp = pars[1], sdp = pars[2], shape1, shape2, dens; double pd[3], J[2][2]; dens = hmmBetaBinom(x, pars); shape1 = meanp/sdp; shape2 = (1 - meanp)/sdp; if ((x<0) || (x>size)) { d[0]=0.0; d[1]=0.0; d[2]=0.0; } else { J[0][0] = 1.0/sdp; J[0][1] = -meanp/(sdp*sdp); J[1][0] = -1.0/sdp; J[1][1] = -(1-meanp)/(sdp*sdp); pd[0] = 0; // fixed pd[1] = dens * (digamma(x+shape1) - digamma(size+shape1+shape2) - digamma(shape1) + digamma(shape1+shape2)); pd[2] = dens * (digamma(size-x+shape2) - digamma(size+shape1+shape2) - digamma(shape2) + digamma(shape1+shape2)); d[0] = 0; d[1] = pd[1]*J[0][0] + pd[2]*J[1][0]; d[2] = pd[1]*J[0][1] + pd[2]*J[1][1]; } } /* not sure these three are tractable. don't support */ void DhmmTNorm(double x, double *pars, double *d){} void DhmmMETNorm(double x, double *pars, double *d){} void DhmmMEUnif(double x, double *pars, double *d){} void DhmmNBinom(double x, double *pars, double *d) { double size = pars[0], prob = pars[1], f; f = dnbinom(x, size, prob, 0); d[0] = f*(digamma(x+size) - digamma(size) + log(prob)); d[1] = f*(size/prob - x/(1-prob)); } void DhmmBeta(double x, double *pars, double *d) { double shape1 = pars[0], shape2 = pars[1], f; f = dbeta(x, shape1, shape2, 0); d[0] = f*(digamma(shape1+shape2) - digamma(shape1) + log(x)); d[1] = f*(digamma(shape1+shape2) - digamma(shape2) + log(1-x)); } void DhmmT(double x, double *pars, double *d) { double tmean = pars[0], tscale = pars[1], tdf=pars[2], f, xmsq; f = (1/tscale)*dt((x-tmean)/tscale, tdf, 0); xmsq = (x - tmean)*(x-tmean); d[0] = f * (x - tmean)*(tdf + 1) / (tdf*tscale*tscale + xmsq); d[1] = f * (-1/tscale + (tdf+1)*xmsq / (tdf*R_pow(tscale,3) + tscale*xmsq)); d[2] = 0.5 * f * (digamma((tdf + 1)/2) - digamma(tdf/2) - 1/tdf - log(1 + xmsq / (tdf*tscale*tscale)) + (tdf+1)*xmsq / (R_pow(tdf*tscale,2) + tdf*xmsq)); } msm/src/hmm.c0000644000176200001440000001010014471426252012561 0ustar liggesusers#include "hmm.h" #include #include "msm.h" /* Response (emission) functions for hidden Markov models (probability of outcome conditionally on the hidden state). All of the form double f(double x, double *pars) */ /* Categorical distribution on the set (1, 2, 3, ..., pars[0]), Baseline category is given by pars[1] (not used any more, to delete?) Probabilities are defined by pars[2], ... pars[ncats+1] NEW IMPLEMENTATION in v1.3 pars[2],pars[3]... are absolute probs. covariates applied in R. used to be relative with covariates applied in C. */ double hmmCat(double x, double *pars) { int cat = fprec(x, 0); int ncats = fprec(pars[0], 0); if ((cat > ncats) || (cat < 1)) return 0; return pars[1 + cat]; } double hmmIdent(double x, double *pars) { return all_equal(x, pars[0]); } double hmmUnif(double x, double *pars) { double lower = pars[0], upper = pars[1]; return dunif(x, lower, upper, 0); } double hmmNorm(double x, double *pars) { double mean = pars[0], sd = pars[1]; return dnorm(x, mean, sd, 0); } double hmmLNorm(double x, double *pars) { double meanlog = pars[0], sdlog = pars[1]; return dlnorm(x, meanlog, sdlog, 0); } double hmmExp(double x, double *pars) { double mean = 1 / pars[0]; return dexp(x, mean, 0); } double hmmGamma(double x, double *pars) { double shape = pars[0], scale = 1 / pars[1]; return dgamma(x, shape, scale, 0); } double hmmWeibull(double x, double *pars) { double shape = pars[0], scale = pars[1]; return dweibull(x, shape, scale, 0); } double hmmPois(double x, double *pars) { double lambda = pars[0]; return dpois(x, lambda, 0); } double hmmBinom(double x, double *pars) { double size = pars[0], prob = pars[1]; return dbinom(x, size, prob, 0); } double hmmBetaBinom(double x, double *pars) { double size = pars[0], meanp = pars[1], sdp = pars[2], shape1, shape2, dens; shape1 = meanp/sdp; shape2 = (1 - meanp)/sdp; if ((x<0) || (x>size)) dens = 0.0; else { dens = exp(lchoose(size, x) + lbeta(x + shape1, size - x + shape2) - lbeta(shape1, shape2)); } return dens; } /* Truncated normal distribution. Infinite bounds are allowed through a parameter with a value of "Inf" or "-Inf" passed from R */ double hmmTNorm(double x, double *pars) { double mean = pars[0], sd = pars[1], lower = pars[2], upper = pars[3]; double denom = pnorm(upper, mean, sd, 1, 0) - pnorm(lower, mean, sd, 1, 0); if (x < lower) return 0; if (x > upper) return 0; return dnorm(x, mean, sd, 0) / denom; } /* Satten and Longini's truncated normal distribution with normal measurement error */ /* To parameterise so covariates go on observation: Put in a dummy parameter meanerr = 0 for the measurement error model xobs ~ N(xhid + meanerr, sderr), then covs go on meanerr. */ double hmmMETNorm(double x, double *pars) { double mean = pars[0], sd = pars[1], lower = pars[2], upper = pars[3], sderr = pars[4], meanerr = pars[5]; double sumsq = sd*sd + sderr*sderr; double sigtmp = sd*sderr / sqrt(sumsq); double mutmp = ((x - meanerr)*sd*sd + mean*sderr*sderr) / sumsq; double nc = 1/(pnorm(upper, mean, sd, 1, 0) - pnorm(lower, mean, sd, 1, 0)); double nctmp = pnorm(upper, mutmp, sigtmp, 1, 0) - pnorm(lower, mutmp, sigtmp, 1, 0); return nc * nctmp * dnorm(x, meanerr + mean, sqrt(sumsq), 0); } /* Satten and Longini's uniform distribution with normal measurement error */ double hmmMEUnif(double x, double *pars) { double lower = pars[0], upper = pars[1], sderr = pars[2], meanerr = pars[3]; return ( pnorm(x, meanerr + lower, sderr, 1, 0) - pnorm(x, meanerr + upper, sderr, 1, 0) ) / (upper - lower) ; } double hmmNBinom(double x, double *pars) { double size = pars[0], prob = pars[1]; return dnbinom(x, size, prob, 0); } double hmmBeta(double x, double *pars) { double shape1 = pars[0], shape2 = pars[1]; return dbeta(x, shape1, shape2, 0); } double hmmT(double x, double *pars) { double tmean = pars[0], tscale = pars[1], tdf=pars[2]; return (1/tscale)*dt((x-tmean)/tscale, tdf, 0); } msm/src/msm-init.c0000644000176200001440000000140514471426252013545 0ustar liggesusers#include #include #include // for NULL #include #include "expm.h" /* .C calls */ extern void MatrixExpR(void *, void *, void *, void *, void *, void *, void *, void *, void *); /* .Call calls */ extern SEXP msmCEntry(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP); static const R_CMethodDef CEntries[] = { {"MatrixExpR", (DL_FUNC) &MatrixExpR, 9}, {NULL, NULL, 0} }; static const R_CallMethodDef CallEntries[] = { {"msmCEntry", (DL_FUNC) &msmCEntry, 8}, {NULL, NULL, 0} }; void R_init_msm(DllInfo *dll) { R_registerRoutines(dll, CEntries, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); expm = (void (*) (double*, int, double*, precond_type)) R_GetCCallable("expm", "expm"); } msm/src/lik.c0000644000176200001440000015164114657705556012614 0ustar liggesusers/* ***************************************************************** PROGRAM: lik.c AUTHOR: Chris Jackson DATE: July 2004 Routines for calculating likelihoods for multi-state Markov and hidden Markov models. ****************************************************************** */ #include "msm.h" #include "hmm.h" #include #include #define NODEBUG #define NODERIVDEBUG /* MUST KEEP THIS IN SAME ORDER AS .msm.HMODELPARS IN R/constants.R */ hmmfn HMODELS[] = { hmmCat, hmmIdent, hmmUnif, hmmNorm, hmmLNorm, hmmExp, hmmGamma, hmmWeibull, hmmPois, hmmBinom, hmmBetaBinom, hmmTNorm, hmmMETNorm, hmmMEUnif, hmmNBinom, hmmBeta, hmmT }; /* MUST KEEP THIS IN SAME ORDER AS .msm.HMODELPARS IN R/constants.R */ dhmmfn DHMODELS[] = { DhmmCat, DhmmIdent, DhmmUnif, DhmmNorm, DhmmLNorm, DhmmExp, DhmmGamma, DhmmWeibull, DhmmPois, DhmmBinom, DhmmBetaBinom, DhmmTNorm, DhmmMETNorm, DhmmMEUnif, DhmmNBinom, DhmmBeta, DhmmT }; /* MUST MATCH order of .msm.CTASKS in R/constants.R */ #define DO_LIK 0 #define DO_DERIV 1 #define DO_INFO 2 #define DO_VITERBI 3 #define DO_LIK_SUBJ 4 #define DO_DERIV_SUBJ 5 #define DO_DPMAT 6 #define OBS_SNAPSHOT 1 #define OBS_PANEL 1 /* preferred term now */ #define OBS_EXACT 2 #define OBS_DEATH 3 double logit(double x) { return log(x / (1 - x)); } double expit(double x) { return exp(x) / ( 1 + exp(x) ); } double identity(double x) { return x; } /* Good-enough floating point equality comparison */ int all_equal(double x, double y) { return fabs (x - y) <= DBL_EPSILON * fabs(x); } /* For models with censoring: */ /* Return a vector of the nc possible true states that a censored state could represent */ /* These will be summed over when calculating the likelihood */ /* Compare one-indexed obs against one-indexed cm->censor. Return one-indexed current (*states) */ double * GetCensored(double ** obsvec, int obsno, int nout, cmodel *cm, int *nc, double **states) { double * pobs; int j, k=0, n, cens=0; pobs = (nout > 1 ? &(*obsvec)[MI(0, obsno, nout)] : &(*obsvec)[obsno] ); double obs = *pobs; if (cm->ncens == 0) n = 1; else { while ((k < cm->ncens) && !all_equal(obs, cm->censor[k])){ ++k; } if (k < cm->ncens) { cens = 1; n = cm->index[k+1] - cm->index[k]; } else n = 1; } if (cm->ncens == 0 || !cens) (*states)[0] = obs; else { for (j = cm->index[k]; j < cm->index[k+1]; ++j) (*states)[j - cm->index[k]] = cm->states[j]; } *nc = n; if ((!cens) & (nout>1)) { return pobs; } else return *states; } /* Calculate p (obs curr | true i) for hidden Markov or censoring models If observation is not necessarily of the true state (!obstrue), then this is just the HMM outcome probability (summed over censor set if necessary) If obstrue (observation not misclassified) or censored state. e.g. censor set 1,2,3, state set 1,2,3,4, pout = if i in curr 1, else 0 */ /* New obstrue facility On entry, obstrue will contain 0 if state unknown, and state if state known But how do we know if there are any extra outcome data in the outcome variable? If this is NA, we ignore it but still use obstrue, by setting pout = 1 If this is a state (eg in misc models) prob of observing it cond on true state is 1. If this is a general outcome, get prob of observing it from HMODELS */ void GetOutcomeProb(double *pout, double *outcome, int nc, int nout, double *hpars, hmodel *hm, qmodel *qm, int obstrue) { int i, j, k, ind; for (i=0; inst; ++i) { if (hm->hidden && (obstrue==0)) { /* HMMs with true state not known */ if (nout > 1) { /* multivariate outcomes. Censored states not supported */ pout[i] = 1; for (k=0; kmv ? MI(k,i,nout) : /* different models for different variables */ i); /* same model for all */ if (!ISNA(outcome[k]) && !(hm->models[ind]==NA_INTEGER)){ pout[i] *= ((HMODELS[hm->models[ind]])(outcome[k], &(hpars[hm->firstpar[ind]]))); } } } else { /* Standard univariate HMM (with or without censored state) */ pout[i] = 0; for (j=0; jmodels[i]])(outcome[j], &(hpars[hm->firstpar[i]])); } } } else { /* True state is known at this time, and appears here as "obstrue" */ if (nout > 1){ pout[i] = 0; if (obstrue == i+1){ /* "state" data contain an actual observation. get its distribution here conditional on the supplied true state */ pout[i] = 1; for (k=0; kmv ? MI(k,i,nout) : i); if (!ISNA(outcome[k]) && !(hm->models[ind]==NA_INTEGER)){ pout[i] *= ((HMODELS[hm->models[ind]])(outcome[k], &(hpars[hm->firstpar[ind]]))); } } } } else { /* univariate outcomes, obstrue */ pout[i] = 0; if (hm->hidden && nc == 1 && !hm->ematrix){ /* no censoring, non-misclassification HMMs */ pout[i] = 1; /* "outcome" data contain an actual observation. get its distribution here conditional on the supplied true state */ if (!ISNA(outcome[0]) && obstrue == i+1){ pout[i] = (HMODELS[hm->models[i]])(outcome[0], &(hpars[hm->firstpar[i]])); } } else { /* "state" data contain the true state (for hm->ematrix with obstrue) or "state" data contain a censor indicator and true state is in censor.states here obstrue can be any nonzero value, though the docs say to supply 1 */ for (j=0; jdpars, calculated in R msm.form.dh) We assume there's only one of these (true for standard dists with one location parameter, and for categorical outcome where f(x) depends on only one pr for a given x. */ void GetDOutcomeProb(double *dpout, /* qm->nst x hm->nopt */ double *outcome, int nc, int nout, double *hpars, hmodel *hm, qmodel *qm, int obsno, int obstrue) { int i, j, k, l, r, s, ind; int p=0; /* indexes parameters up to totpars */ double *pout, *dptmp = R_Calloc(hm->totpars, double); /* will only use hm->npars[i] slots for each i */ #ifdef DERIVDEBUG printf("GetDOutcomeProb:\n"); #endif for (i=0; inst; ++i) { for (l=0; lnopt; ++l) dpout[MI(i,l,qm->nst)] = 0; if (hm->hidden && (!obstrue || (obstrue==(i+1) && !hm->ematrix))) { if (nout > 1) { /* multivariate outcomes. Censored states not supported TODO. This is fiddlier than first thought. not considered what hm->dpars should be, particularly with constraints */ pout = R_Calloc(nout, double); for (r=0; rmv ? MI(r,i,nout) : i); if (!ISNA(outcome[r]) && !(hm->models[ind]==NA_INTEGER)){ pout[r] = ((HMODELS[hm->models[ind]])(outcome[r], &(hpars[hm->firstpar[ind]]))); } } for (r=0; rmv ? MI(r,i,nout) : i); if (!ISNA(outcome[r]) && !(hm->models[ind]==NA_INTEGER)){ (DHMODELS[hm->models[ind]])(outcome[r], &(hpars[hm->firstpar[ind]]), dptmp); for (k=0; knpars[ind]; ++k){ for (s=0; snopt; ++l){ dpout[MI(i,l,qm->nst)] += dptmp[k] * hm->dpars[MI3(p+k,l,obsno,hm->totpars,hm->nopt)]; #ifdef DERIVDEBUG printf("dpars[%d,%d]=%.2f,", p+k, l, hm->dpars[MI3(p+k,l,obsno,hm->totpars,hm->nopt)]); #endif } #ifdef DERIVDEBUG printf("\n"); #endif #ifdef DERIVDEBUG printf("MI=%d,hm=%d,fp=%d,hp=%f,outcome=%2.0f,dptmp=%f\n", ind,hm->models[ind], hm->firstpar[ind], hpars[hm->firstpar[ind]+1], outcome[r],dptmp[k]); #endif } #ifdef DERIVDEBUG for (l=0; lnopt; ++l) printf("dpout[%d,%d]=%f,",i,l,dpout[MI(i,l,qm->nst)]); printf("\n"); #endif } if (hm->mv) p += hm->npars[ind]; } if (!hm->mv) p += hm->npars[i]; R_Free(pout); } else { for (j=0; jmodels[i]])(outcome[j], &(hpars[hm->firstpar[i]]), dptmp); for (k=0; knpars[i]; ++k){ for (l=0; lnopt; ++l){ dpout[MI(i,l,qm->nst)] += dptmp[k] * hm->dpars[MI3(p+k,l,obsno,hm->totpars,hm->nopt)]; } } } p += hm->npars[i]; } } else { for (l=0; lnopt; ++l) dpout[MI(i,l,qm->nst)] = 0; if (hm->hidden){ if (nout > 1 && hm->mv) for (r=0; rnpars[MI(r,i,nout)]; else { p += hm->npars[i]; } } } } R_Free(dptmp); } void normalize(double *in, double *out, int n, double *lweight) { int i; double ave; for (i=0, ave=0; inpcombs, int); for (i=0; inpcombs; ++i) comb_done[i] = 0; for (pt = 0; pt < d->npts; ++pt){ for (i = d->firstobs[pt]+1; i <= d->firstobs[pt+1] - 1; ++i) { c = d->pcomb[i]; if (!comb_done[c]) { qmat = &(qm->intens[MI3(0, 0, i-1, qm->nst, qm->nst)]); Pmat(&pmat[MI3(0, 0, c, qm->nst, qm->nst)], d->time[i] - d->time[i-1], qmat, qm->nst, (d->obstype[i] == OBS_EXACT), qm->iso, qm->perm, qm->qperm, qm->expm); comb_done[c] = 1; } } } R_Free(comb_done); } void calc_dp(msmdata *d, qmodel *qm, double *dpmat) { double *qmat, *dqmat; int pt, i, c, np=qm->nopt; // int r,s,p; int *comb_done = R_Calloc(d->npcombs, int); for (i=0; inpcombs; ++i) comb_done[i] = 0; for (pt = 0; pt < d->npts; ++pt){ for (i = d->firstobs[pt]+1; i <= d->firstobs[pt+1] - 1; ++i) { c = d->pcomb[i]; if (!comb_done[c]) { qmat = &(qm->intens[MI3(0, 0, i-1, qm->nst, qm->nst)]); dqmat = &(qm->dintens[MI4(0, 0, 0, i-1, qm->nst, qm->nst, np)]); /* dpmat is nst*nst*np*npcombs, leftmost index varies fastest and DPmat returns nst*nst*np */ DPmat(&dpmat[MI4(0, 0, 0, c, qm->nst, qm->nst, np)], d->time[i] - d->time[i-1], dqmat, qmat, qm->nst, np, (d->obstype[i] == OBS_EXACT)); // printf("calc_dp: i=%d,c=%d,r=%d,s=%d,p=%d,dp=%f\n",i,1,0,1,0,dpmat[MI4(0, 1, 0, 1, qm->nst, qm->nst, np)]); comb_done[c] = 1; } } } R_Free(comb_done); } /* Find the true state that observation with an exact death time * represents in a HMM. This should be the state with outcome model * hmmIdent(obs). This function also works for non-HMM censoring * models, just returning the observed state. */ /* For multivariate HMMs, the hmmIdent observation must be in the first outcome */ int find_exactdeath_hmm(double *outcome, int obsno, msmdata *d, qmodel *qm, hmodel *hm){ int ideath, ind; double *hpars = &(hm->pars[MI(0, obsno, hm->totpars)]); if (!hm->hidden || d->obstrue[obsno]) ideath = outcome[0] - 1; else for (ideath=0; ideath < qm->nst; ++ideath){ ind = (hm->mv ? MI(0,ideath,d->nout) : ideath); if (hm->models[ind] == 1 && hmmIdent(outcome[0], &(hpars[hm->firstpar[ind]]))) break; } return ideath; } /* Post-multiply the row-vector cump by matrix T to accumulate the likelihood */ void update_likhidden(double *outcome, int nc, int obsno, msmdata *d, qmodel *qm, hmodel *hm, double *cump, double *newp, double *lweight, Array3 pmat) { int i, j, ideath=0; double T, *pout = R_Calloc(qm->nst, double); double *qmat = &(qm->intens[MI3(0, 0, obsno-1, qm->nst, qm->nst)]); double *hpars = &(hm->pars[MI(0, obsno, hm->totpars)]); GetOutcomeProb(pout, outcome, nc, d->nout, hpars, hm, qm, d->obstrue[obsno]); if (d->obstype[obsno] == OBS_DEATH) ideath = find_exactdeath_hmm(outcome, obsno, d, qm, hm); for(j = 0; j < qm->nst; ++j) { newp[j] = 0.0; for(i = 0; i < qm->nst; ++i) { if (d->obstype[obsno] == OBS_DEATH){ T = pmat[MI(i,j,qm->nst)] * qmat[MI(j,ideath,qm->nst)]; } else { T = pmat[MI(i, j, qm->nst)] * pout[j]; // printf("pmat[%d,%d]=%16.12lf,pout[%d]=%16.12lf\n,", i, j, pmat[MI(i, j, qm->nst)], j, pout[j]); } if (T < 0) T = 0; newp[j] = newp[j] + cump[i]*T; } } /* re-scale the likelihood at each step to prevent it getting too small and underflowing */ /* while cumulatively recording the log scale factor */ normalize (newp, cump, qm->nst, lweight); R_Free(pout); } /* Likelihood for the hidden Markov model for one individual */ double likhidden(int pt, /* ordinal subject ID */ msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, Array3 pmat) { double *curr = R_Calloc (qm->nst, double); double *cump = R_Calloc(qm->nst, double); double *newp = R_Calloc(qm->nst, double); double *pout = R_Calloc(qm->nst, double); double lweight, lik, *hpars, *outcome; int i, obsno, nc=1, allzero=1; /* Likelihood for individual's first observation */ hpars = &(hm->pars[MI(0, d->firstobs[pt], hm->totpars)]); outcome = GetCensored(&d->obs, d->firstobs[pt], d->nout, cm, &nc, &curr); GetOutcomeProb(pout, outcome, nc, d->nout, hpars, hm, qm, d->obstrue[d->firstobs[pt]]); /* Likelihood contribution for initial observation */ // printf("\nlikhidden:\n"); for (i = 0; i < qm->nst; ++i) { cump[i] = pout[i]; // printf("pout[%d]=%.4f\n",i,pout[i]); /* If d->obstrue[i], then initprobs is now set appropriately in R (msm.R:msm.initprobs2mat) */ cump[i] = cump[i]*hm->initp[MI(pt,i,d->npts)]; if (!all_equal(cump[i], 0)) allzero = 0; } if (allzero && (qm->nliks==1)) { warning("First observation of %f for subject number %d out of %d is impossible for given initial state probabilities and outcome model\n", curr[0], pt+1, d->npts); } lweight=0; /* Matrix product loop to accumulate the likelihood for subsequent observations */ if (d->firstobs[pt] + 1 < d->firstobs[pt+1]) { /* person has more than one observation */ for (obsno = d->firstobs[pt]+1; obsno <= d->firstobs[pt+1] - 1; ++obsno) { R_CheckUserInterrupt(); outcome = GetCensored(&d->obs, obsno, d->nout, cm, &nc, &curr); update_likhidden(outcome, nc, obsno, d, qm, hm, cump, newp, &lweight, &pmat[MI3(0,0,d->pcomb[obsno],qm->nst,qm->nst)]); } } for (i = 0, lik = 0; i < qm->nst; ++i) { lik = lik + cump[i]; } R_Free(curr); R_Free(cump); R_Free(newp); R_Free(pout); /* Transform the likelihood back to the proper scale */ return -2*(log(lik) - lweight); } /* DERIVATIVES FOR HMM using notation from Titman (Lifetime Data Analysis 2009) */ /* Lik and deriv at first obs */ /* Don't support random initprobs for the moment */ void init_hmm_deriv(double *curr, int nc, int pt, int obsno, double *hpars, double *a, double *phi, double *xi, double *dxi, msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *pok, double *dpok) { int i, j, p, n=qm->nst, nqp=qm->nopt, nhp = hm->nopt, np = nqp + nhp; double suma, sumphi; double *pout = R_Calloc(n, double); double *dpout = R_Calloc(n * nhp, double); int cens_not_hmm = (cm->ncens > 0 && !hm->hidden); GetOutcomeProb(pout, curr, nc, d->nout, hpars, hm, qm, d->obstrue[obsno]); GetDOutcomeProb(dpout, curr, nc, d->nout, hpars, hm, qm, obsno, d->obstrue[obsno]); for (p=0; pinitp[MI(pt,i,d->npts)] * pout[i]); #ifdef DERIVDEBUG printf("i=%d,initp=%f,pout=%f,a=%f\n", i, hm->initp[MI(pt,i,d->npts)], pout[i], a[i]); #endif suma += a[i]; } /* printf("\n"); */ *pok = (cens_not_hmm ? 1 : suma); for (i = 0; i < n; ++i) xi[i] = a[i] / (*pok); for (p=0; pinitp[MI(pt,i,d->npts)] * dpout[MI(i,p,n)]); #ifdef DERIVDEBUG printf("p=%d,i=%d,initp=%f,dpout=%f,phi=%f\n", p, i, hm->initp[MI(pt,i,d->npts)], dpout[MI(i,p,n)], phi[MI(i,nqp+p,n)]); #endif dpok[nqp+p] += phi[MI(i,nqp+p,n)]; } } for (p=0; pnst, nqp=qm->nopt, nhp = hm->nopt, np = nqp + nhp, ideath=0; double qs=0, suma, sumphi, ptrans, dptrans, dqs, dhp; double *pout = R_Calloc(n, double); double *dpout = R_Calloc(n * nhp, double); GetOutcomeProb(pout, curr, nc, d->nout, hpars, hm, qm, d->obstrue[obsno]); GetDOutcomeProb(dpout, curr, nc, d->nout, hpars, hm, qm, obsno, d->obstrue[obsno]); if (d->obstype[obsno] == OBS_DEATH) ideath = find_exactdeath_hmm(curr, obsno, d, qm, hm); #ifdef DERIVDEBUG printf("update_hmm_deriv:\n"); #endif for (i=0; iobstype[obsno] == OBS_DEATH) qs = qmat[MI(i,ideath,n)]; for (p=0; ppcomb[obsno], n,n)]; if (d->obstype[obsno] == OBS_DEATH) anew[i] += aold[j] * ptrans * qs; else anew[i] += aold[j] * ptrans * pout[i]; /* typo here in Titman (2009) */ for (p=0; ppcomb[obsno], n, n, nqp)] : 0); dhp = (pobstype[obsno] == OBS_DEATH){ dqs = (pobstype[obsno] == OBS_DEATH){ qs = qmat[MI(s,ideath,n)]; #ifdef DERIVDEBUG printf("s=%d,ideath=%d,MI=%d,qs=%f\n",s,ideath,MI(s,ideath,n),qs); #endif } ptrans = pmat[MI3(j, s, d->pcomb[obsno], n,n)]; if (d->obstype[obsno] == OBS_DEATH) *pok += xiold[j] * ptrans * qs; else *pok += xiold[j] * ptrans * pout[s]; for (p=0; ppcomb[obsno], n, n, nqp)] : 0); dhp = (pobstype[obsno] == OBS_DEATH){ dqs = (pnst, nqp=qm->nopt, nhp = hm->nopt, np = nqp + nhp; double lp, pok; double *curr = R_Calloc (n, double); int nobspt = d->firstobs[pt+1] - d->firstobs[pt]; double *anew = R_Calloc(n, double); /* alpha_k(i) = P(X(t_k) = i, o_1, ..., o_k), X is true, O is obs */ double *aold = R_Calloc(n, double); double *phinew = R_Calloc(n * np, double); /* phi_k(theta_m, i) = deriv of alpha wrt theta_m. */ double *phiold = R_Calloc(n * np, double); double *xinew = R_Calloc(n, double); /* xi(k,i) = P(x(k-1) = i | o_1, ..., o_(k-1)) */ double *xiold = R_Calloc(n, double); double *dxinew = R_Calloc(n * np, double); double *dxiold = R_Calloc(n * np, double); double *dpok = R_Calloc(np, double); double *qmat, *dqmat, *hpars=NULL, *outcome=NULL; if (hm->hidden) hpars = &(hm->pars[MI(0, d->firstobs[pt], hm->totpars)]); outcome = GetCensored(&d->obs, d->firstobs[pt], d->nout, cm, &nc, &curr); // Get lik and deriv at first obs init_hmm_deriv(outcome, nc, pt, d->firstobs[pt], hpars, aold, phiold, xiold, dxiold, d, qm, cm, hm, &pok, dpok); lp = log(pok); /* for (i=0;inout;++i) printf("outcome[%d]=%f,",i,outcome[i]); printf("\n"); */ #ifdef DERIVDEBUG printf("hmm_deriv:\n"); #endif for (p=0; pfirstobs[pt] + k; qmat = &(qm->intens[MI3(0, 0, obsno-1, n, n)]); dqmat = &(qm->dintens[MI4(0, 0, 0, obsno - 1, n, n, nqp)]); hpars = &(hm->pars[MI(0, obsno, hm->totpars)]); outcome = GetCensored(&d->obs, obsno, d->nout, cm, &nc, &curr); update_hmm_deriv(outcome, nc, obsno, pmat, dpmat, qmat, dqmat, hpars, aold, phiold, xiold, dxiold, anew, phinew, xinew, dxinew, d, qm, hm, &pok, dpok); for (i=0; inst, nqp=qm->nopt, nhp = hm->nopt, np = nqp + nhp; double pok; double *curr = R_Calloc (n, double); double *potential = R_Calloc (n, double); int nobspt = d->firstobs[pt+1] - d->firstobs[pt]; double *anew = R_Calloc(n, double); /* alpha_k(i) = P(X(t_k) = i, o_1, ..., o_k), X is true, O is obs */ double *aold = R_Calloc(n, double); double *phinew = R_Calloc(n * np, double); /* phi_k(theta_m, i) = deriv of alpha wrt theta_m. */ double *phiold = R_Calloc(n * np, double); double *xinew = R_Calloc(n, double); /* xi(k,i) = P(x(k-1) = i | o_1, ..., o_(k-1)) */ double *xiold = R_Calloc(n, double); double *dxinew = R_Calloc(n * np, double); double *dxiold = R_Calloc(n * np, double); double *dpok = R_Calloc(np, double); double *qmat, *dqmat, *hpars=NULL, *outcome; if (hm->hidden) hpars = &(hm->pars[MI(0, d->firstobs[pt], hm->totpars)]); for (p=0; pfirstobs[pt], hpars, anew, phinew, xinew, dxinew, // discard, not used for updating d, qm, cm, hm, &pok, dpok); for (p=0; p 0) info[MI(q,p,np)] += dpok[p]*dpok[q] / pok; // printf("k=0,j=%d,dpok[%d]=%f,dpok[%d]=%f,pok=%f,info=%f\n",j,p,dpok[p],q,dpok[q],pok,info[MI(q,p,np)]); } } outcome = GetCensored(&d->obs, d->firstobs[pt], d->nout, cm, &nc, &curr); init_hmm_deriv(outcome, nc, pt, d->firstobs[pt], hpars, aold, phiold, xiold, dxiold, // use actual observation to update these d, qm, cm, hm, &pok, dpok); // Subsequent observations, using forward algorithm for (k=1; kfirstobs[pt] + k; if (d->obstype[obsno] != OBS_PANEL) error("Fisher information only available for panel data\n"); qmat = &(qm->intens[MI3(0, 0, obsno-1, n, n)]); dqmat = &(qm->dintens[MI4(0, 0, 0, obsno - 1, n, n, nqp)]); hpars = &(hm->pars[MI(0, obsno, hm->totpars)]); for (j=0; j 0) info[MI(q,p,np)] += dpok[p]*dpok[q] / pok; // printf("k=%d,j=%d,dpok[%d]=%f,dpok[%d]=%f,pok=%f,info=%f\n",k,j,p,dpok[p],q,dpok[q],pok,info[MI(q,p,np)]); } } outcome = GetCensored(&d->obs, obsno, d->nout, cm, &nc, &curr); update_hmm_deriv(outcome, nc, obsno, pmat, dpmat, qmat, dqmat, hpars, aold, phiold, xiold, dxiold, anew, phinew, xinew, dxinew, d, qm, hm, &pok, dpok); for (i=0; iintens[MI3(0, 0, obsno-1, qm->nst, qm->nst)]); double contrib; int i, j, k; for(i = 0; i < nc; ++i) { newp[i] = 0.0; for(j = 0; j < np; ++j) { if (d->obstype[obsno] == OBS_DEATH) { contrib = 0; for (k = 0; k < qm->nst; ++k) if (k != curr[i]-1) contrib += pmat[MI((int) prev[j]-1, k, qm->nst)] * qmat[MI(k, (int) curr[i]-1, qm->nst)]; newp[i] += cump[j] * contrib; } else { #ifdef DEBUG printf("i=%d, j=%d, pm=%lf\n", i, j, pmat[MI((int) prev[j]-1, (int) curr[i]-1, qm->nst)]); #endif newp[i] += cump[j] * pmat[MI((int) prev[j]-1, (int) curr[i]-1, qm->nst)]; } } } normalize(newp, cump, nc, lweight); } double likcensor(int pt, /* ordinal subject ID */ msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, Array3 pmat ) { double *cump = R_Calloc(qm->nst, double); double *newp = R_Calloc(qm->nst, double); double *prev = R_Calloc(qm->nst, double); double *curr = R_Calloc(qm->nst, double); double lweight = 0, lik; int i, obs, np=0, nc=0; if (d->firstobs[pt] + 1 == d->firstobs[pt+1]) return 0; /* individual has only one observation */ for (i = 0; i < qm->nst; ++i) cump[i] = 1; GetCensored(&d->obs, d->firstobs[pt], d->nout, cm, &np, &prev); for (obs = d->firstobs[pt]+1; obs <= d->firstobs[pt+1] - 1; ++obs) { /* post-multiply by sub-matrix of P at each obs */ GetCensored(&d->obs, obs, d->nout, cm, &nc, &curr); update_likcensor(obs, prev, curr, np, nc, d, qm, hm, cump, newp, &lweight, &pmat[MI3(0,0,d->pcomb[obs],qm->nst,qm->nst)]); np = nc; for (i=0; inst)*(qm->nst), double), *qmat; qmat = &(qm->intens[MI3(0, 0, 0, qm->nst, qm->nst)]); for (i=0; i < d->nagg; ++i) { R_CheckUserInterrupt(); if ((i==0) || (d->whicha[i] != d->whicha[i-1]) || (d->obstypea[i] != d->obstypea[i-1])) { /* we have a new timelag/covariates/obstype combination. Recalculate the P matrix for this */ /* pointer to Q matrix for ith datapoint */ qmat = &(qm->intens[MI3(0, 0, i, qm->nst, qm->nst)]); Pmat(pmat, d->timelag[i], qmat, qm->nst, (d->obstypea[i] == OBS_EXACT), qm->iso, qm->perm, qm->qperm, qm->expm); } if (d->obstypea[i] == OBS_DEATH) { contrib = pijdeath(d->fromstate[i], d->tostate[i], pmat, qmat, qm->nst); } else contrib = pmat[MI(d->fromstate[i], d->tostate[i], qm->nst)]; lik += d->nocc[i] * log(contrib); #ifdef DEBUG printf("obs %d, from %d, to %d, time %lf, obstypea %d, ", i, d->fromstate[i], d->tostate[i], d->timelag[i], d->obstypea[i]); printf("nocc %d, con %lf, lik %lf\n", d->nocc[i], log(contrib), lik); printf("%d-%d in %lf, q=%lf,%lf, lik=%20.20lf, ll=%lf\n",d->fromstate[i], d->tostate[i], d->timelag[i],qmat[0],qmat[1], contrib, d->nocc[i] * log(contrib)); #endif } R_Free(pmat); return (-2*lik); } /* Likelihood for the non-hidden multi-state Markov model, by subject */ double liksimple_subj(int pt, /* ordinal subject ID */ msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm) { int i, from, to; double lik=0, pm=0, dt; double *pmat = R_Calloc((qm->nst)*(qm->nst), double), *qmat; for (i = d->firstobs[pt]+1; i < d->firstobs[pt+1]; ++i) { R_CheckUserInterrupt(); dt = d->time[i] - d->time[i-1]; from = fprec(d->obs[i-1] - 1, 0); /* convert state outcome to integer */ to = fprec(d->obs[i] - 1, 0); qmat = &(qm->intens[MI3(0, 0, i-1, qm->nst, qm->nst)]); /* use covariate at start of transition */ Pmat(pmat, dt, qmat, qm->nst, (d->obstype[i] == OBS_EXACT), qm->iso, qm->perm, qm->qperm, qm->expm); if (d->obstype[i] == OBS_DEATH) pm = pijdeath(from, to, pmat, qmat, qm->nst); else pm = pmat[MI(from, to, qm->nst)]; #ifdef DEBUG printf("i=%d, %d-%d in %lf, q=%lf,%lf, ll=%lf\n",i,from,to,dt,qmat[0],qmat[1],log(pm)); #endif lik += log(pm); } R_Free(pmat); return (-2*lik); } void msmLikelihood (msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *returned) { int pt; double likone; double *pmat = R_Calloc((qm->nst)*(qm->nst)*(d->npcombs), double); *returned = 0; /* Likelihood for hidden Markov model */ if (hm->hidden) { calc_p(d, qm, pmat); for (pt = 0; pt < d->npts; ++pt){ likone = likhidden (pt, d, qm, cm, hm, pmat); #ifdef DEBUG printf("pt %d, lik %lf\n", pt, likone); #endif *returned += likone; } } /* Likelihood for Markov model with censored outcomes */ else if (cm->ncens > 0) { calc_p(d, qm, pmat); for (pt = 0; pt < d->npts; ++pt){ likone = likcensor (pt, d, qm, cm, hm, pmat); *returned += likone; } } /* Likelihood for simple non-hidden, non-censored Markov model */ else { *returned = liksimple (d, qm, cm, hm); } R_Free(pmat); } /* First derivatives of the log-likelihood for the non-hidden multi-state Markov model. */ void derivsimple(msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *deriv) { int i, p, np=qm->nopt; double *qmat, *dqmat; double *pmat = R_Calloc(qm->nst * qm->nst, double); double *dpmat = R_Calloc(qm->nst * qm->nst * np, double); double *dp = R_Calloc(np, double); double pm; qmat = &(qm->intens[MI3(0, 0, 0, qm->nst, qm->nst)]); dqmat = &(qm->dintens[MI4(0, 0, 0, 0, qm->nst, qm->nst, np)]); for (p = 0; p < np; ++p) deriv[p] = 0; for (i=0; i < d->nagg; ++i) { R_CheckUserInterrupt(); if ((i==0) || (d->whicha[i] != d->whicha[i-1]) || (d->obstypea[i] != d->obstypea[i-1])) { /* we have a new timelag/covariates/obstype combination. Recalculate the P matrix and its derivatives for this */ qmat = &(qm->intens[MI3(0, 0, i, qm->nst, qm->nst)]); Pmat(pmat, d->timelag[i], qmat, qm->nst, (d->obstypea[i] == OBS_EXACT), qm->iso, qm->perm, qm->qperm, qm->expm); dqmat = &(qm->dintens[MI4(0, 0, 0, i, qm->nst, qm->nst, np)]); DPmat(dpmat, d->timelag[i], dqmat, qmat, qm->nst, np, (d->obstypea[i] == OBS_EXACT)); } if (d->obstypea[i] == OBS_DEATH) { pm = pijdeath(d->fromstate[i], d->tostate[i], pmat, qmat, qm->nst); dpijdeath(d->fromstate[i], d->tostate[i], dpmat, pmat, dqmat, qmat, qm->nst, np, dp); } else { pm = pmat[MI(d->fromstate[i], d->tostate[i], qm->nst)]; for (p = 0; p < np; ++p) dp[p] = dpmat[MI3(d->fromstate[i], d->tostate[i], p, qm->nst, qm->nst)]; } for (p = 0; p < np; ++p) { if (pm > 0) deriv[p] += d->nocc[i] * dp[p] / pm; } } for (p = 0; p < np; ++p) { deriv[p] *= -2; /* above is dlogL/dtu as in Kalb+Law, we want deriv of -2 loglik */ } R_Free(pmat); R_Free(dpmat); R_Free(dp); } /* First derivatives of the likelihood for the non-hidden multi-state Markov model. Uses data of form "subject, time, state, covariates". Returns derivatives by individual and parameter for use in the score residual diagnostic. */ void derivsimple_subj(msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *deriv) { int pt, i, p, np=qm->nopt; double *qmat, *dqmat; double *pmat = R_Calloc(qm->nst * qm->nst, double); double *dpmat = R_Calloc(qm->nst * qm->nst * np, double); double *dp = R_Calloc(np, double); double pm=0, dt; int from, to; for (pt = 0; pt < d->npts; ++pt){ { R_CheckUserInterrupt(); if (d->firstobs[pt+1] > d->firstobs[pt] + 1) { /* individual has more than one observation? */ for (p = 0; p < np; ++p) { deriv[MI(pt,p,d->npts)] = 0; } for (i = d->firstobs[pt]+1; i < d->firstobs[pt+1]; ++i) { dt = d->time[i] - d->time[i-1]; from = fprec(d->obs[i-1] - 1, 0); /* convert state outcome to integer */ to = fprec(d->obs[i] - 1, 0); qmat = &(qm->intens[MI3(0, 0, i-1, qm->nst, qm->nst)]); /* use covariate at start of transition */ Pmat(pmat, dt, qmat, qm->nst, (d->obstype[i] == OBS_EXACT), qm->iso, qm->perm, qm->qperm, qm->expm); dqmat = &(qm->dintens[MI4(0, 0, 0, i-1, qm->nst, qm->nst, np)]); DPmat(dpmat, dt, dqmat, qmat, qm->nst, np, (d->obstype[i] == OBS_EXACT)); if (d->obstype[i] == OBS_DEATH) { pm = pijdeath(from, to, pmat, qmat, qm->nst); dpijdeath(from, to, dpmat, pmat, dqmat, qmat, qm->nst, np, dp); } else { pm = pmat[MI(from, to, qm->nst)]; for (p = 0; p < np; ++p) dp[p] = dpmat[MI3(from, to, p, qm->nst, qm->nst)]; } for (p = 0; p < np; ++p) { deriv[MI(pt,p,d->npts)] += dp[p] / pm; /* on loglik scale not -2*loglik */ #ifdef DEBUG printf("i=%d, p=%d, pt=%d, from=%d, to=%d, dt=%6.4f, %f, %f, %lf, %lf\n", i, p, pt, from, to, dt, dp[p], pm, -2 * dp[p] / pm, -2*deriv[MI(pt,p,d->npts)]); #endif } } for (p = 0; p < np; ++p) deriv[MI(pt,p,d->npts)] *= -2; } else for (p = 0; p < np; ++p) deriv[MI(pt,p,d->npts)] = 0; } } R_Free(pmat); R_Free(dpmat); R_Free(dp); } void infosimple(msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *info) { int i, j, p, q, np=qm->nopt; double *qmat, *dqmat; double *pmat = R_Calloc(qm->nst * qm->nst, double); double *dpmat = R_Calloc(qm->nst * qm->nst * np, double); double *dpm = R_Calloc(qm->nst* np, double); double *pm = R_Calloc(qm->nst, double); for (p = 0; p < np; ++p) for (q = 0; q < np; ++q) info[MI(p,q,np)] = 0; for (i=0; i < d->nagg; ++i) { R_CheckUserInterrupt(); if ((i==0) || (d->whicha[i] != d->whicha[i-1]) || (d->obstypea[i] != d->obstypea[i-1])) { /* we have a new timelag/covariates/obstype combination. Recalculate the P matrix and its derivatives for this */ qmat = &(qm->intens[MI3(0, 0, i, qm->nst, qm->nst)]); Pmat(pmat, d->timelag[i], qmat, qm->nst, (d->obstypea[i] == OBS_EXACT), qm->iso, qm->perm, qm->qperm, qm->expm); dqmat = &(qm->dintens[MI4(0, 0, 0, i, qm->nst, qm->nst, np)]); DPmat(dpmat, d->timelag[i], dqmat, qmat, qm->nst, np, (d->obstypea[i] == OBS_EXACT)); } if (d->obstypea[i] != OBS_PANEL) error("Fisher information only available for panel data\n"); for (j=0; j < qm->nst; ++j) { pm[j] = pmat[MI(d->fromstate[i], j, qm->nst)]; for (p = 0; p < np; ++p){ dpm[MI(j,p,qm->nst)] = dpmat[MI3(d->fromstate[i], j, p, qm->nst, qm->nst)]; } } if ((i==0) || (d->whicha[i] != d->whicha[i-1]) || (d->obstypea[i] != d->obstypea[i-1]) || (d->fromstate[i] != d->fromstate[i-1])) { for (p = 0; p < np; ++p) { for (q = 0; q < np; ++q) { /* for expected information, sum over all possible destination states for this fromstate/time/cov combination */ for(j = 0; jnst; ++j) { if (pm[j] > 0) info[MI(p,q,np)] += d->noccsum[i] * dpm[MI(j,p,qm->nst)] * dpm[MI(j,q,qm->nst)] / pm[j]; } } } } } for (p = 0; p < np; ++p) { for (q = 0; q < np; ++q) { info[MI(p,q,np)] *= 2; /* above is E(-d2logL/dtudtv) as in Kalb+Law. we want second deriv of of -2 loglik */ } } R_Free(pm); R_Free(dpm); R_Free(dpmat); R_Free(pmat); } /* Derivatives of the P matrix, used for the Pearson test p-value */ /* Returns a ntrans * ntostates * npars matrix */ /* Panel data only (obstype 1) */ void dpmat_obs(msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *deriv) { int pt, i, j, k, p, from, np = qm->nopt; double *dpmat = R_Calloc(qm->nst * qm->nst * np, double), *qmat, *dqmat; double dt; j=0; for (pt = 0; pt < d->npts; ++pt) { R_CheckUserInterrupt(); if (d->firstobs[pt+1] > d->firstobs[pt] + 1) { /* individual has more than one observation? */ for (i = d->firstobs[pt]+1; i < d->firstobs[pt+1]; ++i) { ++j; qmat = &(qm->intens[MI3(0, 0, i, qm->nst, qm->nst)]); dqmat = &(qm->dintens[MI4(0, 0, 0, i, qm->nst, qm->nst, np)]); dt = d->time[i] - d->time[i-1]; from = fprec(d->obs[i-1] - 1, 0); /* convert state outcome to integer */ DPmat(dpmat, dt, dqmat, qmat, qm->nst, np, (d->obstype[i] == OBS_EXACT)); for (p = 0; p < np; ++p) { for (k=0; k < qm->nst; ++k) { deriv[MI3(j-1,k,p,d->ntrans,qm->nst)] = dpmat[MI3(from, k, p, qm->nst, qm->nst)]; } } } } } R_Free(dpmat); } void derivhidden(msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *deriv, int by_subject){ int pt, p, np = qm->nopt + hm->nopt; double *pmat = R_Calloc((qm->nst)*(qm->nst)*(d->npcombs), double); double *dpmat = R_Calloc((qm->nst)*(qm->nst)*qm->nopt*(d->npcombs), double); double *dlp = R_Calloc(np, double); calc_p(d, qm, pmat); calc_dp(d, qm, dpmat); if (!by_subject) for (p=0; pnpts; ++pt){ hmm_deriv(pt, d, qm, cm, hm, pmat, dpmat, dlp); for (p=0; pnpts)] = -2*dlp[p]; else deriv[p] += -2*dlp[p]; } } R_Free(pmat); R_Free(dpmat); R_Free(dlp); } void msmDeriv_subj (msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *returned) { if (hm->hidden || (cm->ncens > 0)) derivhidden(d, qm, cm, hm, returned, 1); else derivsimple_subj(d, qm, cm, hm, returned); } // Information matrix for HMMs. Only support panel data and misclassification models void infohidden(msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *info){ int pt, p, q, np = qm->nopt + hm->nopt; double *pmat = R_Calloc((qm->nst)*(qm->nst)*(d->npcombs), double); double *dpmat = R_Calloc((qm->nst)*(qm->nst)*qm->nopt*(d->npcombs), double); double *itmp = R_Calloc(np*np, double); calc_p(d, qm, pmat); calc_dp(d, qm, dpmat); for (p=0; pnpts; ++pt){ hmm_info(pt, d, qm, cm, hm, pmat, dpmat, itmp); for (p=0; phidden || cm->ncens > 0) derivhidden(d, qm, cm, hm, returned, 0); else derivsimple(d, qm, cm, hm, returned); } void msmInfo (msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *returned) { if (hm->hidden || (cm->ncens > 0)) infohidden(d, qm, cm, hm, returned); else infosimple(d, qm, cm, hm, returned); } /* Return vector of subject-specific log likelihoods */ void msmLikelihood_subj (msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *returned) { int pt; double *pmat = R_Calloc((d->npcombs)*(qm->nst)*(qm->nst), double); if (hm->hidden || (cm->ncens > 0)) calc_p(d, qm, pmat); for (pt = 0; pt < d->npts; ++pt){ if (hm->hidden) returned[pt] = likhidden (pt, d, qm, cm, hm, pmat); else if (cm->ncens > 0) returned[pt] = likcensor (pt, d, qm, cm, hm, pmat); else returned[pt] = liksimple_subj (pt, d, qm, cm, hm); } R_Free(pmat); } /* Find zero-based index of maximum element of a vector x */ void pmax(double *x, int n, int *maxi) { int i=0; *maxi = i; for (i=1; i x[*maxi]) { *maxi = i; } } } /* Calculates the most likely path through underlying states and "posterior" probabilities of underlying states */ void Viterbi(msmdata *d, qmodel *qm, cmodel *cm, hmodel *hm, double *fitted, double *pstate) { int i, tru, k, kmax, obs, nc = 1, first_obs; double *pmat = R_Calloc((qm->nst)*(qm->nst), double); int *ptr = R_Calloc((d->n)*(qm->nst), int); double *lvold = R_Calloc(qm->nst, double); double *lvnew = R_Calloc(qm->nst, double); double *lvp = R_Calloc(qm->nst, double); double *log_initp_pout = R_Calloc(qm->nst, double); double *curr = R_Calloc (qm->nst, double), *outcome; double *pout = R_Calloc(qm->nst, double); double *pfwd = R_Calloc((d->n)*(qm->nst), double); double *pbwd = R_Calloc((d->n)*(qm->nst), double); double dt, logpall, psum, pfwd_current; double *qmat, *hpars; double *ucfwd = R_Calloc(d->n, double); double *ucbwd = R_Calloc(d->n, double); i = 0; GetCensored(&d->obs, i, d->nout, cm, &nc, &curr); if (d->obstrue[i] && (nc == 1)) { // obstrue contains true state, or obstrue can only represent one state // if nc>1, true state taken from censor set, then lvold is set from initprobs below for (k = 0; k < qm->nst; ++k){ lvold[k] = (k+1 == d->obstrue[i] ? 0 : R_NegInf); pout[k] = 1; } } else { outcome = GetCensored(&d->obs, i, d->nout, cm, &nc, &curr); for (k = 0; k < qm->nst; ++k){ lvold[k] = log(hm->initp[MI(0, k, d->npts)]); } hpars = &(hm->pars[MI(0, i, hm->totpars)]); GetOutcomeProb(pout, outcome, nc, d->nout, hpars, hm, qm, d->obstrue[i]); } for (k = 0; k < qm->nst; ++k){ log_initp_pout[k] = lvold[k] + log(pout[k]); if (d->obstrue[i] && (nc==1)) { pfwd[MI(i,k,d->n)] = (d->obstrue[i] == k+1 ? 1 : 0); } else pfwd[MI(i,k,d->n)] = exp(log_initp_pout[k]); } ucfwd[0] = 0; first_obs = 1; for (i = 1; i <= d->n; ++i) { R_CheckUserInterrupt(); if ((i < d->n) && (d->subject[i] == d->subject[i-1])) { dt = d->time[i] - d->time[i-1]; qmat = &(qm->intens[MI3(0, 0, i-1, qm->nst, qm->nst)]); hpars = &(hm->pars[MI(0, i, hm->totpars)]); /* not i-1 as pre 1.2.3 */ outcome = GetCensored(&d->obs, i, d->nout, cm, &nc, &curr); GetOutcomeProb(pout, outcome, nc, d->nout, hpars, hm, qm, d->obstrue[i]); Pmat(pmat, dt, qmat, qm->nst, (d->obstype[i] == OBS_EXACT), qm->iso, qm->perm, qm->qperm, qm->expm); psum = 0; for (tru = 0; tru < qm->nst; ++tru) { pfwd[MI(i,tru,d->n)] = 0; for (k = 0; k < qm->nst; ++k) { if (!first_obs){ lvp[k] = lvold[k]; } else { lvp[k] = log_initp_pout[k]; } lvp[k] += log(pmat[MI(k, tru, qm->nst)]); pfwd[MI(i,tru,d->n)] += pfwd[MI(i-1,k,d->n)] * pmat[MI(k,tru,qm->nst)]; } if (d->obstrue[i-1]) kmax = d->obstrue[i-1] - 1; else pmax(lvp, qm->nst, &kmax); lvnew[tru] = log ( pout[tru] ) + lvp[kmax]; ptr[MI(i, tru, d->n)] = kmax; if (d->obstrue[i] && (nc==1)) pfwd_current = (d->obstrue[i] == tru+1 ? 1 : 0); else pfwd_current = pout[tru]; pfwd[MI(i,tru,d->n)] *= pfwd_current; psum += pfwd[MI(i,tru,d->n)]; } if (first_obs) first_obs = 0; ucfwd[i] = ucfwd[i-1] + log(psum); for (k = 0; k < qm->nst; ++k){ pfwd[MI(i,k,d->n)] /= psum; lvold[k] = lvnew[k]; } } else { /* Traceback and backward algorithm for current individual pall = p(data at all times) pbwd = p(data at future times | hidden state at current obs) so that p(hidden state at current obs) = pfwd * pbwd / pall */ pmax(lvold, qm->nst, &kmax); obs = i-1; fitted[obs] = (d->obstrue[obs] ? d->obstrue[obs]-1 : kmax); logpall = 0; // compute full likelihood. ucbwd[obs] = 0; for (k = 0; k < qm->nst; ++k){ pbwd[MI(obs,k,d->n)] = 1; logpall += pfwd[MI(obs,k,d->n)]; } logpall = log(logpall) + ucfwd[obs]; for (k = 0; k < qm->nst; ++k){ pstate[MI(obs,k,d->n)] = exp(log(pfwd[MI(obs,k,d->n)]) + log(pbwd[MI(obs,k,d->n)]) - logpall + ucfwd[obs]); } while ( (obs > 0) && (d->subject[obs] == d->subject[obs-1]) ) { fitted[obs-1] = ptr[MI(obs, fitted[obs], d->n)]; dt = d->time[obs] - d->time[obs-1]; qmat = &(qm->intens[MI3(0, 0, obs-1, qm->nst, qm->nst)]); hpars = &(hm->pars[MI(0, obs, hm->totpars)]); outcome = GetCensored(&d->obs, obs, d->nout, cm, &nc, &curr); GetOutcomeProb(pout, outcome, nc, d->nout, hpars, hm, qm, d->obstrue[obs]); Pmat(pmat, dt, qmat, qm->nst, (d->obstype[obs] == OBS_EXACT), qm->iso, qm->perm, qm->qperm, qm->expm); psum=0; for (tru = 0; tru < qm->nst; ++tru){ pbwd[MI(obs-1,tru,d->n)] = 0; for (k = 0; k < qm->nst; ++k) { if (d->obstrue[obs] && (nc==1)) { if (k+1 == d->obstrue[obs]) pbwd[MI(obs-1,tru,d->n)] += pmat[MI(tru,k,qm->nst)] * pbwd[MI(obs,k,d->n)]; } else pbwd[MI(obs-1,tru,d->n)] += pmat[MI(tru,k,qm->nst)] * pout[k] * pbwd[MI(obs,k,d->n)]; } psum += pbwd[MI(obs-1,tru,d->n)]; } ucbwd[obs-1] = ucbwd[obs] + log(psum); for (tru = 0; tru < qm->nst; ++tru){ pbwd[MI(obs-1,tru,d->n)] /= psum; pstate[MI(obs-1,tru,d->n)] = exp(log(pfwd[MI(obs-1,tru,d->n)]) + log(pbwd[MI(obs-1,tru,d->n)]) - logpall + ucfwd[obs-1] + ucbwd[obs-1]); } --obs; } if (i < d->n) { GetCensored(&d->obs, i, d->nout, cm, &nc, &curr); if (d->obstrue[i] && (nc == 1)) { // obstrue contains true state, or obstrue can only represent one state // if nc>1, true state taken from censor set, lvold is set from initprobs below for (k = 0; k < qm->nst; ++k){ lvold[k] = (k+1 == d->obstrue[i] ? 0 : R_NegInf); pout[k] = 1; } } else { outcome = GetCensored(&d->obs, i, d->nout, cm, &nc, &curr); for (k = 0; k < qm->nst; ++k) lvold[k] = log(hm->initp[MI(d->subject[i]-1, k, d->npts)]); hpars = &(hm->pars[MI(0, i, hm->totpars)]); GetOutcomeProb(pout, outcome, nc, d->nout, hpars, hm, qm, d->obstrue[i]); } for (k = 0; k < qm->nst; ++k){ log_initp_pout[k] = lvold[k] + log(pout[k]); pfwd[MI(i,k,d->n)] = exp(log_initp_pout[k]); } ucfwd[i] = 0; first_obs = 1; } } } R_Free(pmat); R_Free(ptr); R_Free(lvold); R_Free(lvnew); R_Free(lvp); R_Free(log_initp_pout); R_Free(curr); R_Free(pout); R_Free(pfwd); R_Free(pbwd); R_Free(ucfwd); R_Free(ucbwd); } /* get the list element named str, or return NULL */ SEXP getListElement(SEXP list, const char *str) { SEXP elmt = R_NilValue, names = getAttrib(list, R_NamesSymbol); for (int i = 0; i < length(list); i++) if(strcmp(CHAR(STRING_ELT(names, i)), str) == 0) { elmt = VECTOR_ELT(list, i); break; } return elmt; } double *list_double_vec(SEXP list, const char *str) { SEXP elt = getListElement(list, str); return REAL(elt); } int *list_int_vec(SEXP list, const char *str) { SEXP elt = getListElement(list, str); return INTEGER(elt); } double list_double(SEXP list, const char *str) { SEXP elt = getListElement(list, str); return REAL(elt)[0]; } int list_int(SEXP list, const char *str) { SEXP elt = getListElement(list, str); return INTEGER(elt)[0]; } SEXP msmCEntry(SEXP do_what_s, SEXP mf_agg_s, SEXP mf_s, SEXP auxdata_s, SEXP qmodel_s, SEXP cmodel_s, SEXP hmodel_s, SEXP pars_s) { msmdata d; qmodel qm; cmodel cm; hmodel hm; int do_what = INTEGER(do_what_s)[0], nopt; double lik, *ret, *fitted, *pfwd; SEXP ret_s; /* type coercion for all these is done in R */ d.fromstate = list_int_vec(mf_agg_s, "(fromstate)"); d.tostate = list_int_vec(mf_agg_s, "(tostate)"); d.timelag = list_double_vec(mf_agg_s, "(timelag)"); d.nocc = list_int_vec(mf_agg_s, "(nocc)"); d.noccsum = list_int_vec(mf_agg_s, "(noccsum)"); d.whicha = list_int_vec(mf_agg_s, "(whicha)"); d.obstypea = list_int_vec(mf_agg_s, "(obstype)"); d.subject = list_int_vec(mf_s, "(subject)"); d.time = list_double_vec(mf_s, "(time)"); d.obs = list_double_vec(mf_s, "(state)"); d.obstype = list_int_vec(mf_s, "(obstype)"); d.obstrue = list_int_vec(mf_s, "(obstrue)"); d.pcomb = list_int_vec(mf_s, "(pcomb)"); d.nagg = list_int(auxdata_s, "nagg"); d.n = list_int(auxdata_s, "n"); d.npts = list_int(auxdata_s, "npts"); d.ntrans = list_int(auxdata_s, "ntrans"); d.npcombs = list_int(auxdata_s, "npcombs"); d.firstobs = list_int_vec(auxdata_s, "firstobs"); d.nout = list_int(auxdata_s, "nout"); qm.nst = list_int(qmodel_s,"nstates"); qm.npars = list_int(qmodel_s,"npars"); qm.nopt = list_int(qmodel_s,"nopt"); qm.iso = list_int(qmodel_s,"iso"); qm.perm = list_int_vec(qmodel_s,"perm"); qm.qperm = list_int_vec(qmodel_s,"qperm"); qm.expm = list_int(qmodel_s,"expm"); qm.nliks = list_int(auxdata_s,"nliks"); qm.intens = list_double_vec(pars_s,"Q"); // TODO name qm.dintens = list_double_vec(pars_s,"DQ"); // TODO name cm.ncens = list_int(cmodel_s,"ncens"); cm.censor = list_int_vec(cmodel_s,"censor"); cm.states = list_int_vec(cmodel_s,"states"); cm.index = list_int_vec(cmodel_s,"index"); hm.hidden = list_int(hmodel_s,"hidden"); hm.mv = list_int(hmodel_s,"mv"); hm.ematrix = list_int(hmodel_s,"ematrix"); hm.models = list_int_vec(hmodel_s,"models"); hm.totpars = list_int(hmodel_s,"totpars"); hm.npars = list_int_vec(hmodel_s,"npars"); hm.firstpar = list_int_vec(hmodel_s,"firstpar"); hm.pars = list_double_vec(pars_s,"H"); hm.dpars = list_double_vec(pars_s,"DH"); hm.nopt = list_int(hmodel_s,"nopt"); hm.initp = list_double_vec(pars_s,"initprobs"); nopt = list_int(pars_s, "nopt"); if (do_what == DO_LIK) { msmLikelihood(&d, &qm, &cm, &hm, &lik); ret_s = ScalarReal(lik); } else if (do_what == DO_DERIV) { ret_s = PROTECT(NEW_NUMERIC(nopt)); ret = REAL(ret_s); msmDeriv(&d, &qm, &cm, &hm, ret); UNPROTECT(1); } else if (do_what == DO_INFO) { ret_s = PROTECT(allocMatrix(REALSXP, nopt, nopt)); ret = REAL(ret_s); msmInfo(&d, &qm, &cm, &hm, ret); UNPROTECT(1); } else if (do_what == DO_LIK_SUBJ) { ret_s = PROTECT(NEW_NUMERIC(d.npts)); ret = REAL(ret_s); msmLikelihood_subj(&d, &qm, &cm, &hm, ret); UNPROTECT(1); } else if (do_what == DO_DERIV_SUBJ) { ret_s = PROTECT(allocMatrix(REALSXP, d.npts, nopt)); ret = REAL(ret_s); msmDeriv_subj(&d, &qm, &cm, &hm, ret); UNPROTECT(1); } else if (do_what == DO_VITERBI) { /* Return a list of a vector (fitted states) and a matrix (hidden state probabilities) */ /* see https://stat.ethz.ch/pipermail/r-devel/2013-April/066246.html */ ret_s = PROTECT(allocVector(VECSXP, 2)); SEXP fitted_s = SET_VECTOR_ELT(ret_s, 0, NEW_NUMERIC(d.n)); SEXP pfwd_s = SET_VECTOR_ELT(ret_s, 1, allocMatrix(REALSXP, d.n, qm.nst)); fitted = REAL(fitted_s); pfwd = REAL(pfwd_s); Viterbi(&d, &qm, &cm, &hm, fitted, pfwd); UNPROTECT(1); } else if (do_what == DO_DPMAT) { ret_s = PROTECT(alloc3DArray(REALSXP, d.ntrans, qm.nst, nopt)); ret = REAL(ret_s); dpmat_obs(&d, &qm, &cm, &hm, ret); UNPROTECT(1); } else error("Unknown C task.\n"); return ret_s; } msm/src/analyticp.c0000644000176200001440000015711114657705703014011 0ustar liggesusers/* Analytic formulae for P(t) in terms of transition intensities, for selected 2, 3, 4 and 5-state models. These were derived using symbolic algebra software (Mathematica). Increases speed and stability by avoiding the numeric calculation of the matrix exponential. ### The numbered label gives the indices into the matrix of rates (vectorised by reading across rows) ### e.g. the 3-state model with qmatrix of the form ### well-disease, well-death, disease-death transitions allowed. ### *,1,1 ### 0,*,1 ### 0,0,* uses the function p3q124() ### Some models are isomorphic and use the same p?q? function. ### See .msm.graphs in R/constants.R for permutations. */ #include "msm.h" #include void p2q1(Matrix pmat, double t, Matrix qmat, int *degen); void p2q12(Matrix pmat, double t, Matrix qmat, int *degen); void p3q12(Matrix pmat, double t, Matrix qmat, int *degen); void p3q14(Matrix pmat, double t, Matrix qmat, int *degen); void p3q16(Matrix pmat, double t, Matrix qmat, int *degen); void p3q124(Matrix pmat, double t, Matrix qmat, int *degen); void p3q135(Matrix pmat, double t, Matrix qmat, int *degen); void p3q1246(Matrix pmat, double t, Matrix qmat, int *degen); void p4q159(Matrix pmat, double t, Matrix qmat, int *degen); void p4q13569(Matrix pmat, double t, Matrix qmat, int *degen); void p5q1_6_11_16(Matrix pmat, double t, Matrix qmat, int *degen); void p5q1_4_6_8_11_12_16(Matrix pmat, double t, Matrix qmat, int *degen); void p5q1_6_7_11_12(Matrix pmat, double t, Matrix qmat, int *degen); typedef void (*pfn)(Matrix pmat, double t, Matrix qmat, int *degen); pfn P2FNS[] = { p2q1, p2q12 }; pfn P3FNS[] = { p3q12,p3q14,p3q16,p3q124,p3q135,p3q1246 }; pfn P4FNS[] = { p4q159,p4q13569 }; pfn P5FNS[] = { p5q1_6_11_16,p5q1_4_6_8_11_12_16,p5q1_6_7_11_12 }; void AnalyticP(Matrix pmat, double t, int nstates, int iso, int *perm, int *qperm, Matrix qmat, int *degen) { int i, j; Matrix qmat_base = (Matrix) R_Calloc( (nstates)*(nstates), double); Matrix pmat_base = (Matrix) R_Calloc( (nstates)*(nstates), double); for (i=0; i * Bug fix to prevalence.msm with factor subject IDs 2016-10-02 Chris Jackson * Vignette sources moved from "src/doc" to "vignettes" on CRAN request. * DESCRIPTION: Version 1.6.4 released to CRAN and r-forge 2016-06-03 Chris Jackson * R/utils.R: Bug fix for qtnorm with vectorised arguments. Thanks to James Gibbons for the report. * DESCRIPTION: Version 1.6.3 released to r-forge. 2016-03-09 Chris Jackson * R/pearson.R: Bug fix for dropping censored states. Thanks to Casimir Sofeu for the report. * DESCRIPTION: Version 1.6.2 released to r-forge. 2016-03-09 Chris Jackson * DESCRIPTION: Version 1.6.1 released to CRAN. 2016-03-07 Chris Jackson * tests: tests updated to work with the development version of testthat. 2016-02-18 Chris Jackson * src/lik.c,R/msm.R: Bug fix and documentation clarification for models with "obstrue" and "ematrix". * R/draic.R: Bug fix for initprobs, and only allow expected information if all panel data. * R/msm.R: Bug fix for printing CIs with pci and all fixedpars. * DESCRIPTION: Version 1.6.1 released to r-forge. 2015-11-17 Chris Jackson * DESCRIPTION: Version 1.6 released to r-forge and CRAN. 2015-11-10 Chris Jackson * src/lik.c: Several bug fixes in calculation of the derivatives for multivariate HMMs. * R/msm.R(msm.form.obstrue): Better detection of when obstrue is supplied as an indicator or a true state + NA. 2015-10-07 Chris Jackson * R/outputs.R(msm.form.qoutput): Bug fix for printing model output when only one transition rate is affected by covariates. Thanks to Jordi Blanch for the report. 2015-09-14 Chris Jackson * src/lik.c: More underflow correction for probabilities of hidden states in viterbi.msm. Thanks to Hannah Linder for the report. * R/msm.R: "death" argument in msm() is deprecated and renamed to "deathexact". * R/msm.R: censor.states now defaults to all transient states if not supplied, instead of complaining, even if there is no absorbing state. Thanks to Jonathan Williams for the report. * DESCRIPTION: Version 1.5.3 released to r-forge. 2015-04-10 Chris Jackson * R/msm.R(statetable.msm): Code simplified, now row names work with factor states. 2015-02-17 Chris Jackson * DESCRIPTION: Version 1.5.2 released to r-forge. 2015-02-10 Chris Jackson * R/msm.R, src/lik.c: obstrue can now contain the actual true state, instead of an indicator. This allows the information from HMM outcomes generated conditionally on this state to be included in the model. * R/msm.R(na.find.msmdata): Fix of bug in na.find.msmdata that could lead to NAs being passed through to C and causing a crash. Triggered when state or time were NA and there were covariates. 2015-02-09 Chris Jackson * R/hmm-dists.R(hmmDIST): Fix of bug when HMM parameters come from named vectors. 2015-01-29 Chris Jackson * R/outputs.R(msm.form.qoutput) Bug fix in printing fitted model objects. 2015-01-16 Chris Jackson * hmm.R: "links" component dropped from hmodel objects, as it is no longer used. * simul.R: "keep" component added to simmulti.msm result. * R/hmm.R and others: Multivariate observations in HMMs with different models for each variable. Limited testing so far. 2015-01-15 Chris Jackson * Correct version of the built vignette restored to the package (1.5 instead of 1.3.2). * Experimental feature: multivariate observations in HMMs. Start by supporting multiple outcomes from the same distribution at the same time, with the data supplied as a matrix. * DESCRIPTION: Version 1.5.1 released to r-forge. 2015-01-05 Chris Jackson * DESCRIPTION: Version 1.5 released to CRAN. 2014-12-12 Chris Jackson * R/msm.R,R/phase.R. Phase type models now allow HMM on top. Bug fixes to these models. * DESCRIPTION: Version 1.4.3 released to r-forge. 2014-12-11 Chris Jackson * Posterior probability of the hidden state at each time in the Viterbi algorithm now conditions on all the data. * R/msm.R,R/outputs.R(various): Bug fixes to misclassification models where some states were misclassified as other states with probability 1, for both ematrix and hmmCat specifications. Thanks to Li Su for the report. * DESCRIPTION: Version 1.4.2 released to r-forge. 2014-12-10 Chris Jackson * src/lik.c, R/outputs.R: Viterbi algorithm now also returns the probability of each hidden state at each time given the data up to that point. * data/msmdata.rda: statemax added to CAV data. * man: Document that generic AIC function AIC() works for msm models. * DESCRIPTION: Version 1.4.1 released to r-forge. 2014-12-08 Chris Jackson * R/phase.R,R/msm.R,Rd/2phase.Rd: New features for phase-type models. 2014-12-04 Chris Jackson * R/draic.R: Bug fixes in drlcv.msm (likelihood of big model on left-one-out subject was using the original instead of the refitted model, and used covariate centering inconsistently). Thanks to Howard Thom. 2014-12-02 Chris Jackson * R/msm.R(msm.initprobs2mat,msm.form.houtput): Bug fixes for covariates on initial state occupancy probabilities with structural zeros in. Thanks to Jeffrey Eaton and Tara Mangal. * R/msm.R(msm.form.output): Clean up code, also ensure models fitted with 1.4 can be printed with 1.4.1. 2014-11-27 Chris Jackson * R/draic.R: Bug fix in "prob > 0" in drlcv.msm. Thanks to Howard Thom. * R/msm.R: colSums efficiency improvement in msm.add.qcovs, msm.form.dq. Thanks to Jeffrey Eaton. 2014-11-19 Chris Jackson * R/outputs.R: Allow qmatrix to be passed to pmatrix.msm, and a list of qmatrices to pmatrix.piecewise.msm, instead of a fitted model. 2014-11-18 Chris Jackson * R/outputs.R: qmatrix.msm and related functions tidied up. * R/outputs.R,R/msm.R: Don't print CIs for fixed parameters in output formatting functions. * R/msm.R: Warn that polynomial contrasts aren't supported. 2014-11-11 Chris Jackson * src/pijt.c(MatrixExpEXPM): give error if optimiser has chosen overflowing parameter values. Stops infinite loops seen on Windows. 2014-11-10 Chris Jackson * R/msm.R: Documentation and error message for factor states. 2014-10-31 Chris Jackson * R/outputs.R(efpt.msm): Support tostate as character. * man/plot.survfit.msm: Reference Turnbull method. * src/lik.c(GetCensored): Fixed valgrind uninitialized value warning. 2014-09-22 Chris Jackson * R/optim.R(deriv.test): require namespace instead of loading numDeriv 2014-07-04 Chris Jackson * src/analyticp.c: memory leaks removed. 2014-07-04 Chris Jackson * DESCRIPTION: Version 1.4 released to CRAN. 2014-07-02 Chris Jackson * R/outputs.R: Default CI method for pnext.msm changed to "normal", since delta method may not respect probability <1 constraint. 2014-06-23 Chris Jackson * C interface changed from .C to .Call. * Added ppass.msm for passage probabilites. * DESCRIPTION: Version 1.3.3 released to r-forge. 2014-06 Chris Jackson * src/lik.c: Bug fix in infosimple: info was not being initialized at zero, leading to occasional random output. * DESCRIPTION: Version 1.3.2 released to r-forge. 2014-06 Chris Jackson * tests: Test suite tidied up and converted to use "testthat" package. * R/boot.R(efpt.ci.msm): Bug fix for bootstrap and efpt.msm. * src/lik.c(likhidden): Give informative warning for initial outcomes in HMMs which are impossible for given initial state probabilites and outcome models. Makes use of a global variable in a private environment called msm.globals. * draic.msm, drlcv.msm added. 2014-06 Chris Jackson * If msm is called with hessian=FALSE, then the Fisher (expected) information is used to obtain standard errors and CIs, which may be preferable if the observed Hessian is very intensive to approximate or its estimate is nonsingular / nonpositive-definite. 2014-05 Chris Jackson * Analytic derivatives available for most hidden Markov models and models with censored states (excluding unknown initial state probabilities, constraints on misclassification / categorical outcome probabilities and their covariates, and truncated or measurement error distributions). This should speed up optimisation with the BFGS or CG methods. The corresponding Fisher information matrix is also available for misclassification (categorical/identity outcome) models. * The BFGS optimisation method is now the default, rather than Nelder-Mead. 2014-05 Chris Jackson * msm.optim.fixed, msm.rep.constraints: Bug fix for constraints on misclassification probabilities and fixed parameters. 2014-05 Chris Jackson * msm.R(msm.mnlogit.transform): Bug fix: reapply sum to 1 constraint after applying constraints to baseline probabilities in HMMs. May affect results. 2014-05 Chris Jackson * hmm.R(msm.econstr2hconstr): internal constraints in misclassification models mapped to 1,2,... using match(constr, unique(constr)) 2014-05 Chris Jackson * msm.R(msm.unfixallparams): Don't unconstrain constraints, so derivatives of fully fixed models refer to constrained pars. 2014-05 Chris Jackson * Various help pages now document the objects and data structures used internally and returned by msm() in the fitted model object. 2014-04 Chris Jackson * msm.R and others: major rewrite of much of the internal code that deals with reading the data and passing it to models. This uses model frames and model formulae more efficiently. As a result the "data" component of the msm has a different structure: a list with one component "mf", the model frame, containing all original variables required for the model fit. This and related data structures can can be extracted with the new "model.frame.msm" and "model.matrix.msm" methods. * outputs.R: new print method now the default, and new functions msm.form.qoutput and msm.form.eoutput to produce the printed numbers in the same arrangement. * msm.R: Centering of "timeperiod" covariates in "pci" models is now done consistently with other covariates, i.e. with last observation omitted. * outputs.R(factorcov2numeric.msm): bug fix for misclassification covariates. * msm.R(crudeinits.msm): Times consistency check added. * msm.R(msm.check.model): Model consistency check error messages now report row numbers before missing data are omitted. * hmm.R(msm.form.hcmodel): Bug fix for when initial values for HMM covariate effects of wrong length, this should ignore and carry on. * pearson.R: Bug fix for when integral for accurate p-value doesn't converge. * lik.c: Don't recalculate P matrices for timelag / obstype / covariate combinations that occur more than once. This may speed up some hidden Markov or censoring models. 2014-04-11 Chris Jackson * msm.R(msm.form.params): Fix of bug which broke models with covariates on initial state occupancy. 2014-04-10 Chris Jackson * R/boot.R,R/outputs.R: Parallel processing using "doParallel" added for bootstrapping and bootstrap CIs. 2014-04-09 Chris Jackson * R/optim.R: Optimisation methods abstracted into their own functions. 2014-04-04 Chris Jackson * DESCRIPTION: Version 1.3.1 released to r-forge. 2014-04-03 Chris Jackson * R/msm.R(msm.add.qcovs,msm.add.dqcovs): Fix of drop=FALSE bug for data with only one transition. 2014-04-02 Chris Jackson * R/msm.R: Fix of obscure bug that broke some subject-specific likelihoods, caused by omitting obstype.obs from data object. 2014-04-01 Chris Jackson * R/outputs.R: Time-dependent covariates supported in totlos.msm. * R/outputs.R(envisits.msm, totlos.msm): New facility for expected number of visits. 2014-02-26 Chris Jackson * R/mstate.R,man/msm2Surv.Rd: New function for exporting data in counting process format for use with survival and mstate. 2014-02-25 Chris Jackson * R/msm.R: Handle convergence failure codes from optim(). 2014-02-20 Chris Jackson * R/outputs.R(mattotrans): printnew.msm fixed for 2-state models. Thanks to Martyn Plummer. 2014-01-15 Chris Jackson * DESCRIPTION: Version 1.3 released to CRAN. 2014-01-09 Chris Jackson * inst/doc/msm-manual.Rnw: Fixed error in analytic p13(t) in section 1.4. 2013-12-04 Chris Jackson * R/outputs.R: Experimental new print method available as printnew.msm. * srcR/pijt.c(MatrixExpPade): Fix for int coercion from special values, to pass CRAN UBSanitizer check. * src/analyticp.c: Some algebra rearranged to fix potential division by zeros. * src/analyticp.c, R/msm.R(msm.form.qmodel): Corrected permutation for Q matrix, fixing bug from 1.2.3 which broke models with non-standard state ordering. * R/outputs.R: New "start" argument to efpt.msm, allowing averaging over a set of starting states. * DESCRIPTION: Datasets now lazy loaded so data() not required. 2013-10-07 Chris Jackson * DESCRIPTION: Version 1.2.7 released to r-forge. 2013-10-04 Chris Jackson * R/outputs.R(observed.msm): Don't use Viterbi imputed states at change points when computing observed prevalences in "pci" models with piecewise-constant intensities. 2013-10-01 Chris Jackson * R/msm.R(msm.mninvlogit.transform): Fix for bug with misclassification models with only one misclassification probability. * src/lik.c: Match Q matrices with covariates from start of transition, not end, in likelihoods and derivatives by subject. 2013-09-13 Chris Jackson * R/msm.R: "missing" for some null default arguments in msm() changed to is.null. * DESCRIPTION: Version 1.2.6 released to r-forge. 2013-08-30 Chris Jackson * R/msm.R(msm.R): Give an informative error if trying to use gen.inits with a HMM, and document that this is not supported. 2013-08-20 Chris Jackson * R/msm.R(msm.check.times): Row numbers reported in error message about different states at the same time corrected to account for missing data. Thanks to Lucy Leigh for the report. 2013-07-30 Chris Jackson * R/outputs.R: formula for totlos.msm implemented, which is vastly more efficient than the numerical integration used previously. Debugging outputs left in 1.2.3 also removed. * R/msm.R, src/*.c: Likelihood calculations use expm from the expm package by default where matrix exponentiation is required. As a result msm now depends on the expm package. * R/utils.R: MatrixExp now uses expm from the expm package by default. * R/various: some fixes for bugs introduced by the range facility. * DESCRIPTION: Version 1.2.5 released to r-forge. 2013-07-22 Chris Jackson * R/(various): Range constraints can now be given for HMM outcome parameters, through a new argument "hranges" to msm(). This may improve HMM identifiability. Thanks to Soon-Ee Cheah for the suggestion. * R/constants.R: Scale parameters of Weibull and t HMM outcome distributions now restricted properly to be positive in estimation. * DESCRIPTION: Version 1.2.4 released to r-forge. 2013-07-04 Chris Jackson * R/utils.R: MatrixExp rewritten to use C code for series method and analytic solutions for Markov models, avoiding code duplication. 2013-07-02 Chris Jackson * R/msm.R: If available, loglikelihood derivatives, expected and (if requested) observed information are returned in paramdata component for all models. If all parameters fixed, these are over all parameters. If some are fixed, than these are just over the parameters that are optimised. * R/outputs.R: surface.msm fixed for models fitted with Fisher scoring. 2013-06-06 Chris Jackson * R/outputs.R: totlos.msm was calculating the wrong thing for fromt > 0. * DESCRIPTION: Version 1.2.3 released to r-forge. 2013-06-04 Chris Jackson * R/pearson.R: Corrected data rows mismatch in bootstrapping with imputed sampling times after deaths in Pearson statistic. * src/lik.c: Memory crash bug in Viterbi fixed. 2013-06-03 Chris Jackson * (Most R and C files): Major restructuring of the internals. Main change is to adjust all parameters for covariates in R rather than C, making for much tidier code. New R functions for applying transformations and inverse transformations. * src/pijt.c: Derivatives of the likelihood for non-hidden models now work properly with negative constraints. * R/msm.R: Initial state occupancy probabilities are estimated on the multivariate logit scale, rather than univariate logit, and confidence intervals are calculated using the normal simulation method. Probability for the baseline category "initpbase" is now a labelled parameter. * R/msm.R: When centering covariates around their means for the default likelihood calculation, the means used are now after dropping missing values and subjects with one observation, not before. Thanks to Howard Thom for the report. * Relatedly, the covariate values for subjects' last observations are not included in this mean, since they don't contribute to the likelihood, so interpretation of initial values for the qmatrix, and outputs for covariates="mean", will now be very slightly different. 2013-05-28 Chris Jackson * inst/doc/msm-manual.Rnw: Likelihood for exact times still had wrong sign for qii (see version 1.1.2). 2013-05-25 Chris Jackson * inst/doc/msm-manual.Rnw: Added advice about "function cannot be evaluated at initial parameters". 2013-05-24 Chris Jackson * R/msm.R: New interface for supplying different covariates on different transition intensities. * R/msm.R: Redundant constraint check and factor warning fixed and cleaned. 2013-05-23 Chris Jackson * R/msm.R(msm.form.covdata): checks on constraints and covinits separated into new functions. * R/msm.R(msm.form.covmodel): wrong names in error message for constraint length checking. 2013-05-21 Chris Jackson * R/msm.R(msm.form.data): Handle factor states (with levels 1:nstates) by converting to numeric. * R/msm.R, src/lik.c: Can now print subject-specific log-likelihoods at the MLE via logLik.msm(). * DESCRIPTION: Version 1.2.2 released to r-forge. 2013-05-19 Chris Jackson * R/utils.R: qtnorm, qmenorm, qmeunif and qpexp changed to use qgeneric. Their results should be the same. * R/utils.R: long-redundant identity function finally removed. 2013-05-18 Chris Jackson * R/utils.R: qgeneric function copied from flexsurv package and modified to handle argument clashes. * R/utils.R: Return NaN for all dpqr(tnorm,menorm,meunif) if lower bound greater than upper bound. 2013-05-17 Chris Jackson * R/msm.R: Don't warn if not all states observed in data for misclassification models (typo bugfix in msm.form.data). 2013-05-16 Chris Jackson * R/msm.R,R/hmm.R,src/lik.c: Allow matrix by patient to be supplied for the initial state occupancy probabilities. * DESCRIPTION: Version 1.2.1 released to r-forge. 2013-05-15 Chris Jackson * R/msm.R: move gen.inits from msm.form.qmodel to main function. 2013-05-14 Chris Jackson * DESCRIPTION: Version 1.2 released 2013-05-08 Chris Jackson * R/msm.R,R/outputs.R: Misclassification models where some off-diagonal misclassification probabilities are 1 are now handled properly. Thanks to Howard Thom for uncovering this. 2013-04-19 Chris Jackson * R/outputs.R: prevalence.msm can now produce expected values by integrating model predictions over the covariate histories observed in the data. * R/msm.R(msm.form.data): Drop subjects with only one observation remaining after dropping missing data (e.g. psor data). This gives a more appropriate measure of the numbers at risk in prevalence.msm. 2013-04-18 Chris Jackson * R/outputs.R(summary.msm): Allow arguments to be passed through summary.msm to prevalence.msm. * R/outputs.R(pmatrix.piecewise.msm): Allow this to be used for time-homogeneous models with change point vector "times" of length 0. 2013-04-15 Chris Jackson * R/outputs.R: New function efpt.msm for expected first passage times for time-homogeneous models. Thanks to Howard Thom for the research. * R/outputs.R: totlos.msm now passes options to integrate() to bootstrapping functions. 2013-04-10 Chris Jackson * R/msm.form.data: firstobs was wrong with missing data. 2013-04-08 Chris Jackson * R/simul.R, R/pearson.R: Function boot.param.msm renamed to simfitted.msm and made user-accessible. 2013-04-05 Chris Jackson * R/pearson.R: Accurate p-values from Titman (Lifetime Data Analysis, 2009). * R/pearson.R: Degrees of freedom were being calculated incorrectly (via "n.zerofrom" variable) when user-defined groups included from-states. * R/simul.R: Include an option to simmulti.msm (and getobs.msm) to not drop absorbing-absorbing transitions. 2013-03-22 Chris Jackson * R/pearson.R: Fix of bug in Pearson test introduced in version 0.9.5, which affected the expected transitions to the final state (and resulting test statistics) for panel data without exact death times. * src/lik.c, src/pijt.c: Implement the Fisher information for non-hidden models without censored states. * R/msm.R: Implement a Fisher scoring algorithm which uses this expected information. 2013-02-02 Chris Jackson * R/outputs.R(observed.msm): Add a censoring time facility to optionally remove subjects from the risk set a certain time after they have reached an absorbing state. Thanks to Andrew Titman. 2013-02-02 Chris Jackson * src/lik.c: Bug fix for Viterbi with obstrue. Thanks to Linda Sharples. * R/outputs.R(print.msm): Don't print message about baseline covariate values in misclassification model outputs if there are no covariates. 2013-01-14 Chris Jackson * R/outputs.R(observed.msm): Bug fix for interp="midpoint" method in observed prevalence calculation. Thanks to Erica Liu. 2012-12-10 Chris Jackson * tests/simple.R: Modified pmatrix.msm normal bootstrap test output to work with new seeding behaviour of rmvnorm. * DESCRIPTION: Version 1.1.4 released 2012-09-28 Chris Jackson * src/doc: Remember to copy the up-to-date manual source into src for new releases, as required by Linux distribution package builders. * DESCRIPTION: Version 1.1.3 released 2012-09-27 Chris Jackson * inst/doc/msm-manual.Rnw: Work around texi2dvi problem where non-breaking spaces appear as tildes. 2012-09-25 Chris Jackson * R/outputs.R(qematrix.msm): Bug fix for user-supplied covariate values when center=FALSE. Thanks to Vikki O'Neill for the report. 2012-09-24 Chris Jackson * man/boot.msm.Rd: Documented failure of boot.msm to handle user-defined objects that clash with built-in objects. 2012-09-21 Chris Jackson * R/msm.R: Use BFGS method for one-parameter optimisation unless method supplied explicitly, avoiding warning about unreliability of Nelder-Mead. 2012-07-31 Chris Jackson * R/pearson.R: Browser was still on for pearson.msm. Thanks to Chyi-Hung Hsu. * DESCRIPTION: Version 1.1.2 released 2012-05-28 Chris Jackson * (various files): New Student t distribution for hidden Markov model outcomes. Thanks to Darren Gillis. 2012-05-11 Chris Jackson * R/msm.R(msm.check.times): Bug fix in data consistency checks with unsorted subject IDs. Thanks to Kelly Williams-Sieg for the report. * DESCRIPTION: Version 1.1.1 released 2012-05-01 Chris Jackson * R/utils.R: Corner cases in qtnorm fixed. Thanks to Art Owen for the report. * R/boot.R: Multicore functionality removed from this release since doSMP was removed from CRAN. Will restore when a stable preferred cross-platform solution emerges. 2012-01-31 Chris Jackson * R/pearson.R: Bug fix for models where transitions are only allowed from one state. Thanks to Gavin Chan for the report. 2012-01-31 Chris Jackson * R/msm.R: If user supplies an ematrix with all misclassification probabilities zero, the non-misclassification model is fitted. Thanks to Sharareh Taghipour for the report. * R/msm.R(msm.check.model): Bug fix for error messages when model inconsistent with data. 2011-11-28 Chris Jackson * R/boot.R: boot.msm and functions which use this can now use doSMP to parallelise calculations. 2011-11-25 Chris Jackson * R/boot.R: Fix of bug which affected calculation of confidence intervals by the "normal" method when there were fixed parameters or HMMs. 2011-10-27 Chris Jackson * R/outputs.R: Bug fix: Subset function "[.msm.est" was labelling columns wrong for objects with no SE component (pmatrix.msm, pnext.msm). 2011-09-09 Chris Jackson * DESCRIPTION: Version 1.1 released 2011-07-25 Chris Jackson * R/outputs.R: New function "[.msm.est" to extract specific rows and columns of the output from, e.g., qmatrix.msm() in a more intuitive way. 2011-07-24 Chris Jackson * R/outputs.R: New function "pnext.msm" to compute a matrix of probabilities for the next state of the process. 2011-07-07 Chris Jackson * man/msm.Rd: Doc clarifies that "death" is overridden by "obstype" and "exacttimes", and "exacttimes" is overridden by "obstype". 2011-06-09 Chris Jackson * man/msm.Rd: Correct documentation for factor levels of "timeperiod". * R/outputs.R(qematrix.msm): Fix CIs for diagonal entries when first state is absorbing. * R/msm.R(msm.check.model): Refer to observation numbers, not transition numbers, in "data inconsistent with model" error message. 2011-05-26 Chris Jackson * DESCRIPTION: Version 1.0.1 released 2011-05-20 Chris Jackson * R/outputs.R(msm.fill.pci.covs): Bug fix, pmatrix.msm would break for models with non-integer time change points "pci". Thanks to Christos Argyropoulos for the report. * man/prevalence.msm.Rd: Clarify that "piecewise.times" is not needed for models fitted with "pci". Thanks to Christos Argyropoulos. * R/msm.R(msm): Warning if initcovariates is supplied but the model is not hidden Markov. Thanks to Christos Argyropoulos. 2011-05-05 Chris Jackson * R/utils.R(dtnorm): Return -Inf when log=TRUE and x outside truncation bounds. Thanks to William Leeds for the report. 2011-02-08 Chris Jackson * man/msm.Rd: Help page clarified to say that "state" is also used for the observed outcome in a HMM. Thanks to Ricardo Antunes. 2010-11-24 Chris Jackson * R/outputs.R: Line types, colours and widths can be configured in plotprog.msm, plot.survfit.msm and plot.prevalence.msm. * DESCRIPTION: Version 1.0 finally released to accompany the forthcoming paper on msm in Journal of Statistical Software. 2010-11-12 Chris Jackson * man/msm.Rd: Documentation for the return value of msm corrected to state that the "logbaseline" components of result matrices are evaluated with covariates set to zero if center=FALSE, and at their means if center=TRUE. Previously it stated that "logbaseline" was evaluated at the mean covariate values. * R/msm.R(msm), R/outputs.R(print.msm): Return the "baseline" and "sojourn" components of result matrices at covariate values of 0 if center=0. Thanks to Kenneth Gundersen for the report. 2010-11-01 Chris Jackson * R/boot.R(bootdata.trans.msm): Fix for bootstrapping when some levels of a factor do not appear in a bootstrapped dataset. Thanks to Gale Bravener for the report. 2010-10-29 Chris Jackson * R/msm.R(msm.check.times): Fixed a bug in comparing small floating point numbers to zero, and added "may be" to warning about data inconsistent with transition matrix, due to uncertainty about these comparisons. 2010-09-22 Chris Jackson * R/msm.R(msm.check.times): Added warning for multiple observations at the same time on the same person with different states, which leads to zero likelihood and "cannot be evaluated at initial values" message. 2010-05-18 Chris Jackson * DESCRIPTION: Version 0.9.7 released 2010-05-07 Chris Jackson * R/msm.R: Ematrices and ematrix.msm for models with all "fixedpars" returned correctly. 2010-05-04 Chris Jackson * R/boot.R: Bug fixes. "end" argument wasn't included in totlos.ci.msm and totlos.normci.msm, bootstrapping broke with covariates on HMM outcomes, and "fixedpars" weren't accounted for in normboot.msm. Thanks to Li Su for these reports. 2010-02-09 Chris Jackson * R/pearson.R: Fix for "NA in probability vector" error caused by floating point comparisons in empiricaldists(), which were still happening. Thanks to Wen-Wen Yang for the report. * DESCRIPTION: Version 0.9.6 released 2010-01-29 Chris Jackson * src/pijt.c(Pmat): Don't round extreme likelihood contributions to 0 and 1 for models with "exacttimes", since they are not probabilities. Fixes occasional wrong likelihood calculations. 2010-01-14 Chris Jackson * R/msm.R: The "pci" element of fitted model objects now excludes values which are outside the time range of the data. Allows pmatrix.msm to be used on such models without error. Also give a warning when any "pci" cut points equal the min/max time point in the data. Thanks to Matt Cowperthwaite. 2009-11-25 Chris Jackson * R/pearson.R: Fix for problem revealed by different handling of factors in R-2.10.0, which caused all expected values to be returned as zero. Thanks to Brian Tom for the report. * DESCRIPTION: Version 0.9.5 released. 2009-11-13 Chris Jackson * R/msm.R(msm.form.data): Bug fix for handling missing subject ID. * DESCRIPTION: Version 0.9.4 released. 2009-11-05 Chris Jackson * R/outputs.R(pmatrix.msm, pmatrix.piecewise.msm): Allow options to MatrixExp to be passed through. * R/msm.R(crudeinits.msm): Don't break with missing values. 2009-09-15 Chris Jackson * R/likderiv.msm: Bug fix: Use obstype.obs when calculating score residuals, not obstype. Also fixed misplaced for loop initialising patient derivatives to zero in src/lik.c(derivsimple_subj). Thanks to Aidan O'Keeffe for the report. 2009-08-26 Chris Jackson * R/pearson.R: Fix for "replacement has 0 rows" error - don't add covariates column to internal data when there are no covariates. * R/pearson.R: timeinterval rounded in empiricaldists to avoid "NA in probability vector" errors in R-devel arising from floating point fuzz. 2009-08-20 Chris Jackson * R/msm.R: fix of previous bug fix from 06-24 for derivatives with respect to fixed parameters. Thanks to Aidan O'Keeffe for the report. * DESCRIPTION: Version 0.9.3 released. 2009-07-27 Chris Jackson * R/msm.R(msm.form.output): Bug fix - estimates of covariate effects were being ordered wrongly in matrices outputted by msm in models with "qconstraint". Thanks to Brian Tom for the report. 2009-06-24 Chris Jackson * DESCRIPTION: Version 0.9.2 released. 2009-06-24 Chris Jackson * R/msm.R: Bug fix - don't return derivatives with respect to fixed parameters - this was causing "gradient in optim evaluated to wrong length" error for models with fixed parameters fitted using BFGS. Thanks to Isaac Dinner for the report. 2009-06-12 Chris Jackson * tests/simple.R: Removed a couple of tests which fail due to floating point fuzz on Fedora/Red Hat PPC Linux. * DESCRIPTION: Version 0.9.1 released. 2009-06-09 Chris Jackson * R/pearson.R: Covariate grouping fixed to 1 for pci models with no other covariates, as the covariate group is equivalent to the time group. * DESCRIPTION: Version 0.9 released. 2009-06-05 Chris Jackson * DESCRIPTION: Licence altered from GPLv2 to GPL v2 or later. Licence text removed from src/pijt.c. * R/msm.R(msm): Default changed to use.deriv=TRUE. * R/msm.R(msm.pci): Don't impute observations for pci models at times when there is already an observation. This fixes "times not ordered" errors when bootstrap resampling for Pearson test. 2009-04-29 Chris Jackson * R/outputs.R(factorcov2numeric.msm): Extractor functions now set unspecified covariate values in covariate lists to 0, and ignore unknown covariates. * R/outputs.R(factorcov2numeric.msm): All extractor functions can now accept covariate values as numeric contrasts as well as factor levels. * R/outputs.R(plot.survfit.msm): Call to survfit fixed for compatibility with R version 2.9.0. * R/outputs.R(pmatrix.msm): Adapted to automatically handle "pci" models with piecewise constant intensities, with new "t1" argument representing start time. New internal function "msm.fill.pci.covs" to enable time-constant covariates to be passed through this facility properly. Arguments of all calls to pmatrix.msm changed. As a result, functions which call pmatrix.msm (prevalence.msm, expected.msm, totlos.msm, plot.survfit.msm) now handle time-inhomogeneous models specified using "pci". * R/msm.R(msm.pci): Bug fix - covmeans calculated wrong in pci models with other covariates, leading to error in qmatrix.msm for covariates=0. 2009-04-29 Chris Jackson * src/lik.c: Bug fix - score residuals were being calculated wrongly for models with covariates. 2009-04-24 Chris Jackson * R/pearson.R: Fixed "second argument must be a list" bug. * R/outputs.R: Order of effects in hazard.msm and odds.msm changed to read across rows of the transition/misclassification matrix. This is for consistency with, e.g. fixedpars. 2009-04-08 Chris Jackson * man/msm.Rd: Documentation for qconstraint clarified. * R/outputs.R: Bug fix - interactions now expanded properly when calling extractor functions for models with interactions between covariates. * R/msm.R: Bug fix which affected bootstrap refitting in pearson.msm, giving "Error in `$<-.data.frame`(`*tmp*`, "pci.imp"..." * DESCRIPTION: Version 0.8.2 released. 2009-04-03 Chris Jackson * LaTeX sources for PDF manual included in src/doc to enable msm to be approved as a Debian package. 2008-07-25 Chris Jackson * R/pearson.R: Bug fix, maxtimes was producing negative censoring times. * DESCRIPTION: Version 0.8.1 released. 2008-07-23 Chris Jackson * R/msm.R: New option "pci" to msm, which automatically constructs a model with piecewise-constant transition intensities which change at the supplied times. * R/boot.R: Give an informative error in normal theory CIs when SEs not available from fitted model. 2008-07-22 Chris Jackson * src/lik.c (GetOutcomeProb): HMM now applies to censored outcomes, unless obstrue = 1. Thanks to Norm Good for the suggestion. 2008-04-15 Chris Jackson * R/msm.R: deriv.test argument to msm removed. * src/lik.c: Bug fix in liksimple/derivsimple - the P matrix was not being recalculated when the obstype changed between 1 and 2. Thanks to Peter Jepsen for uncovering this. 2008-03-31 Chris Jackson * R/outputs.R: totlos.msm now computes total length of stay for all states, not just transient states. New argument "end" added. * R/outputs.R: xlim argument added to plotprog.msm. * R/outputs.R: legend added to plot.prevalence.msm. 2008-03-28 Chris Jackson * DESCRIPTION: Version 0.8 released. 2008-03-18 Chris Jackson * R/pearson.R: New file for the Pearson-type goodness-of-fit test. Thanks to Andrew Titman for his work on this. * data/heart.txt: Data "heart" renamed to "cav". * R/simul.R: any() bugs in simmisc.msm for simulating misclassification models fixed 2008-03-11 Chris Jackson * R/outputs.R: logLik.msm degrees of freedom corrected for models with parameter constraints. * R/outputs.R: New function "plot.survfit.msm" to plot Kaplan-Meier estimate of survival probabilty compared with the fitted survival probability from a model. * R/outputs.R: Allow customisable axis titles and line widths in all plot functions. 2008-03-03 Chris Jackson * R/outputs.R: New function "plotprog.msm" to plot Kaplan-Meier estimates of time to first occurrence of each state. Added "survfit" and "Surv" imports from the "survival" package. * R/outputs.R: New likelihood ratio test function "lrtest.msm". 2008-03-03 Chris Jackson * R/outputs.R: logLik method returns the log-likelihood, not the minus log-likelihood. Thanks to Jay Rotella for the report. 2008-02-27 Chris Jackson * R/utils.R: Transformation bug fixed which caused rtnorm to hang for extreme means. Thanks to Björn Bornkamp. 2008-02-18 Chris Jackson * R/boot.R: Simulate normal CIs using unreplicated parameters, so that they work with the new release of mvtnorm. Thanks to Peter Jepsen for the report. 2007-12-12 Chris Jackson * R/msm.R,src/lik.c: Score residuals implemented. 2007-12-10 Chris Jackson * R/utils.R: Quantile functions: uniroot() convergence tolerance tightened to solve problems with obtaining quantiles for small arguments. Thanks to Barbara Bredner for the report. * DESCRIPTION: Version 0.7.6 released. 2007-11-21 Chris Jackson * R/simul.R: Bug fix, "cur.t not found" error. * R/simul.R: Allow covariates on misclassification probabilities in simulations 2007-11-20 Chris Jackson * R/msm.R: Don't give no-SEs warning when hessian=FALSE * R/simul.R: Handle only one observation per subject. * R/outputs.R: New internal function intervaltrans.msm to determine set of allowed transitions in an interval. * DESCRIPTION: Version 0.7.5 released. 2007-11-08 Chris Jackson * R/outputs.R(qratio.se.msm): Bug fix for factor covariates. Thanks to Peter Jepsen. 2007-11-05 Chris Jackson * R/boot.R (bootdata.trans.msm,bootdata.subject.msm), R/msm.R (msm.form.data,msm.form.covdata): Handle factor covariates properly when bootstrap refitting, by retaining the original covariates (not the numeric contrasts) in the data. Thanks to Peter Jepsen. * R/outputs.R: qmatrix.msm, ematrix.msm, sojourn.msm and qratio.msm can now be called with ci="none", returning just the matrix of estimates, with no CI. 2007-11-02 Chris Jackson * R/utils.R: MatrixExp now accepts a vector of t, in which case it only needs to calculate the eigensystem once. 2007-10-30 Chris Jackson * R/utils.R: Bug fix in ppexp. Thanks to Mike Murphy. * msm-manual: More explanation of censored states versus censored event times. 2007-10-25 Chris Jackson * src/hmm.c: New beta HMM outcome distribution. * src/lik.c: Ignore initprobs in HMMs if the true state is known at the initial observation. 2007-10-24 Chris Jackson * src/lik.c: Handle censoring properly in Viterbi algorithm. 2007-10-22 Chris Jackson * R/boot.R(bootdata.subject.msm): Bug fix, wrong covariate matrix was being read. Thanks to Peter Jepsen for the report. * msm-manual.pdf: Correction of algebraic typos in Viterbi algorithm. * src/lik.c: Account for obstrue in Viterbi algorithm. * R/outputs.R: Allow Viterbi algorithm to be used to impute censored states in data with censored states but no HMM. 2007-10-18 Chris Jackson * R/outputs.R(prevalence.msm,plot.prevalence.msm): Account for arguments supplied to prevalence.msm when doing the plot. Thanks to Peter Jepsen for the report. 2007-10-01 Chris Jackson * src/Makevars: CR endings removed to satisfy R CMD CHECK in R 2.6.0 * R/outputs.R(print.msm.est): test for CI using is.list(), since $ on an atomic object fails in R 2.7.0 instead of returning NULL. * DESCRIPTION: Version 0.7.4 released. Use standardised license string. 2007-08-15 Chris Jackson * DESCRIPTION: Version 0.7.3 released. 2007-08-14 Chris Jackson * R/boot.R: Handle obstype and obsmisc in bootstrap refitting, and handle refitting of msm models where obstype, obsmisc and subject vectors are calculated within the argument to msm. Thanks to Peter Jepsen for the report. * R/boot.R, R/outputs.R: Add bootstrap handlers (both nonparametric and normal-theory) for qmatrix.msm, ematrix.msm, sojourn.msm, qratio.msm, pmatrix.piecewise.msm, totlos.msm, prevalence.msm. 2007-07-27 Chris Jackson * src/analyticp.c: Bug fix: exponential of certain degenerate 5 state intensity matrices was not being calculated properly. Thanks to Ross Boylan for the report. * man/msm.Rd: Make clear that the initial values for constrained parameters are taken from the first of the multiple initial values supplied. Thanks to Ross Boylan. 2007-06-30 Chris Jackson * R/outputs.R(surface.msm): Bug fix: don't include auxiliary parameters in HMMs. Thanks to Michael Sweeting. 2007-06-29 Chris Jackson * R/utils.R(MatrixExp), src/pijt.c(MatrixExp): Bug fix. When there are complex eigenvalues, don't use the eigensystem method of calculating the matrix exponential. Thanks to Véronique Bouchard. 2007-06-05 Chris Jackson * R/outputs.R(expected.msm): Bug fix, wrong risk set was being calculated for user-specified "times". * R/outputs.R(observed.msm): Allow interpolation of observed states using the midpoint of an interval. * R/outputs.R(pmatrix.msm), R/boot.R: Confidence intervals for P matrix can now be calculated by simulating from multivariate normal distribution of MLEs. * R/outputs.R(plot.prevalence.msm),man/plot.prevalence.msm.Rd: new function for prevalence plots. * man/pmatrix.piecewise.msm.Rd: Example corrected to use four sets of covariates. Thanks to Qing Wang. * DESCRIPTION,NAMESPACE: Added rmvnorm import from "mvtnorm" package. 2007-05-31 Chris Jackson * DESCRIPTION: Version 0.7.2 released. 2007-05-29 Chris Jackson * R/outputs.R: Functions to calculate SEs and CIs for ematrix.msm adapted to deal with multinomial logistic regression. CIs for probabilities are calculated using delta method approximation to variance of logit p, instead of log p as previously. 2007-05-26 Chris Jackson * R/utils.R: Truncated normal random sampling algorithm improved to use the rejection method by Christian Robert. Thanks to Vivek Roy for the suggestion. 2007-05-25 Chris Jackson * R/msm.R: Constraints on intensity covariate effects that some effects are equal to other effects multiplied by -1 are now allowed. * R/msm.R: Structural zeroes are allowed for initial state occupancy probabilities. * inst/doc/msm-manual.pdf: Misclassification examples on heart data changed so that individuals' first observations are not misclassified. 2007-05-21 Chris Jackson * R/lik.c: Serious bug fix. Effects of covariates on outcome probabilities in misclassification models (categorical HMMs) are now estimated using multinomial logistic regressions, instead of (incorrectly) independent univariate logistic regressions for each probability. * R/msm.R, R/lik.c: Effects of covariates on initial state probabilities in HMMs can now be estimated through multinomial logistic regression. 2007-05-13 Chris Jackson * R/outputs.R, R/boot.R: New option "ci.boot" to prevalence.msm, a helper to calculate bootstrap confidence limits for the expected prevalences using "boot.msm". * R/msm.R, src/lik.c: New argument "obstrue" to msm, to allow some observations to be observed without error in misclassification models. 2007-05-11 Chris Jackson * R/msm.R: Return derivatives in $deriv component of the msm object after optimisation. Thanks to Ole Rummel. 2007-04-18 Chris Jackson * R/msm.R: Don't drop covariates on transition process which are missing at the last observation for a patient, because they are not used in the analysis. This has the consequences that output from prevalence.msm may be different from earlier versions (0.7 or earlier) if there are missing values in the data. Users are advised to drop missing values from their data (if statistically appropriate!) before using msm. * DESCRIPTION: Maintainer email address changed. * DESCRIPTION: Version 0.7.1 released. 2007-04-05 Chris Jackson * R/outputs.R(viterbi.msm): Bug fix for models with covariates. Thanks to Hongjie Wang. * R/outputs.R(prevalence.msm): Can now calculate expected prevalences for models with piecewise-constant intensities, in the same manner as pmatrix.piecewise.msm. 2007-04-04 Chris Jackson * R/outputs.R(prevalence.msm): Bug fix, initstates was being ignored. Thanks to Peter Jensen. * R/msm.R: Give a warning when the standard errors cannot be calculated. * R/msm.R(msm.form.houtput): Bug fix for initprobs display with only two states. 2007-03-02 Chris Jackson * R/outputs.R(print.msm, qematrix.msm): Bug fix: When center=FALSE, reported baseline intensity matrix should be labelled as with covariates set to zero, not at their means. Thanks to Ross Boylan. 2007-02-09 Chris Jackson * src/lik.c: Return likelihood of zero for individuals with only one observation in censoring and hidden models. Thanks to Jonathan Williams for discovering the bug. * data/heart.txt: Age at transplant date corrected. Thanks to Jonathan Williams. 2006-11-21 Chris Jackson * R/msm.R: Initial state occupancy probabilities can now be estimated. See new argument "est.initprobs" to msm. * DESCRIPTION: Version 0.7 released. 2006-11-20 Chris Jackson * R/simul.R(sim.msm): Transpose error in bug fix from 0.6.4 corrected. * R/outputs.R: Values of factor covariates are now supplied to extractor functions in a sensible way, at last. Reordering bug fixed with named covariate lists. 2006-11-19 Chris Jackson * R/boot.R: New file. Implements bootstrap resampling for fitted msm models. * R/outputs.R: Bootstrap confidence intervals available for pmatrix.msm and totlos.msm. * R/outputs.R: pmatrix.msm now defaults to one time unit, instead of forcing time unit to be explicitly given. * R/outputs.R: observed.msm function rewritten. Fixes bug in calculating observed prevalence for state at maximum observed time, reported by Jeremy Penn. It is also now much faster. * R/outputs.R: prevalence.msm is also adapted sensibly to handle data where not all individuals start at a common time. 2006-09-29 Chris Jackson * man/deltamethod.Rd: Example fixed to use correct covariance matrix. Thanks to Andreas Beyerlein. 2006-09-21 Chris Jackson * src/Makevars: PKG_LIBS fix to pass R CMD CHECK in R 2.4.0 * DESCRIPTION: Version 0.6.4 released. 2006-09-12 Chris Jackson * R/simul.R(sim.msm) Bug fix: multiply covariates by baseline intensities in the correct order. Also convert vector beta to matrix. Thanks to Stephan Lenz for the report. 2006-09-08 Chris Jackson * R/utils.R(rtnorm) Bug fix: use the correct components of parameters which are vectors. Thanks to Jean-Baptiste Denis for the report. 2006-07-16 Chris Jackson * Rd/msm.Rd, inst/doc/msm-manual.pdf: Documentation correction - the initial values of the qmatrix are with covariates at their means in the data, not with the covariates at zero. This bug has existed since version 0.5. 2006-07-16 Chris Jackson * R/msm.R: Row and column names of crudeinits output retained from qmatrix input. 2006-06-29 Chris Jackson * Definition of initprobs corrected on manual p31. 2006-06-28 Chris Jackson * References reinstated in the PDF manual. * DESCRIPTION: Version 0.6.3 released. 2006-06-23 Chris Jackson * DESCRIPTION: Version 0.6.2 released. 2006-06-21 Chris Jackson * msm.obs.to.fromto,msm.check.times: Support character subject variables. Thanks to Danstan Bagenda for the report. 2006-06-21 Chris Jackson * Analytically-calculated transition probability matrices implemented for selected 3, 4 and 5 state models. These are calculated in new file src/analyticp.c. New option "analyticp" in msm() to revert to the old matrix exponential method. Update to msm-manual.pdf describing this method. 2006-06-20 Chris Jackson * R/simul.R(getobs.msm): Bug fix - Keep only one observation in the absorbing state when absorbing state is not the highest state. 2006-05-29 Chris Jackson * man/logLik.Rd: help page fixed to explain that this returns the minus log likelihood. Thanks to Ole Rummel. * msm.R (likderiv.msm): bug fix - transformation of the derivatives when all parameters are fixed was returning all NAs. 2006-03-26 Chris Jackson * lik.c(Viterbi): Bug fix - don't ignore initprobs. Thanks to Melanie Wall for reporting this. * DESCRIPTION: Version 0.6.1 released. 2006-03-15 Chris Jackson * NAMESPACE: Import persp, plot and contour in from graphics. * msm.R (msm.check.times): Bug fix for factor subjects with empty levels. Thanks to Jacques Gautrais. 2006-01-04 Chris Jackson * msm.R (msm.form.data): use match(, unique()) to convert subject to ordinal, not factor. Also do msm.check.times after dropping missing data. Plus fix for missing obstime. 2005-11-25 Chris Jackson * DESCRIPTION: Version 0.6 released. 2005-11-17 Chris Jackson * R/outputs.R: New function surface.msm for surface plots of likelihoods. 2005-11-16 Chris Jackson * lik.c,pijt.c, etc.: Analytic derivatives of the likelihood implemented for all models, apart from hidden Markov models or models with censoring. New argument "use.deriv" to tell msm to use these where appropriate. Thanks to Andrew Titman for the debugging help. * The Dennis and Schnabel algorithm in the R function "nlm" can now also be used to maximise the likelihood, as an alternative to the algorithms in "optim". 2005-11-11 Chris Jackson * msm-manual.pdf: definition of initial state probability f corrected in hidden likelihood, equation 13. Thanks to Andrew Titman. 2005-11-08 Chris Jackson * man/deltamethod.Rd: Documentation of deltamethod clarified to explain how to use user-defined variables within the formula. 2005-10-11 Chris Jackson * Negative binomial hidden Markov model output distribution added. * DESCRIPTION: Version 0.5.2 released. 2005-10-10 Chris Jackson * lik.c(Viterbi): Bug fix, wasn't handling Markov chains with progressive and regressive states properly. Thanks to Rochelle Watkins. * msm.R(msm.form.covdata): further fix for missing data. 2005-10-1 Chris Jackson * msm.form.qmodel: Bug fix with gen.inits==TRUE and censoring. Thanks to Jacques Gautrais. 2005-07-27 Chris Jackson * sim.msm: collapse.covs fixed to handle covariate matrices with one observation time. * msm.R(msm.form.covdata): bug fix for covariates in global environment, not a data frame. This bug produced the error "Error in 1:n : NA/NaN argument". 2005-05-27 Chris Jackson * sim.msm: sample replaced by resample as in ?sample, to fix simulations with small models. * msm.R: Fix for one-parameter models. (drop=FALSE in subsetting covmat) 2005-05-25 Chris Jackson * utils.R: New functions (dpqr)pexp for the exponential distribution with piecewise-constant rate. * utils.R: Bug fix: arguments lower.tail and log.p implemented for truncated normal and measurement error distributions. * DESCRIPTION: Version 0.5.1 released. 2005-05-23 Chris Jackson * tests/*: Tests are now fully automated. Outputs are compared against known results using stopifnot(). * outputs.R(hazard.msm, odds.msm) Names "L95", "U95" changed to "L","U" for generality. 2005-05-20 Chris Jackson * msm.R: Data reorganised so that covariates are stored in a matrix throughout. These are available from the model output as cov for one per observation time, and covmat for one per time difference. This fixes a bug which prevented covariates with names such as "state", "time", "subject", among others, from being used. 2005-05-16 Chris Jackson * simul.R(sim.msm) Re-written. Fixes a bug in simulating from models with time-dependent covariates, where not every covariate change was accounted for. Uses new function rpexp to simulate from the exponential distribution with piecewise-constant rate. Thanks to Mike Sweeting for the bug report. * simul.R(sim.msm) Simulations now contain a censoring time at maxtime, instead of the future absorption time. * simul.R(getobs.msm) Re-written, replacing ugly loops with vectorised code. 2005-04-11 Chris Jackson * man/simul.Rd: clarified that qmatrix is with covariates set to zero. Thanks to Anne Presanis. 2005-04-11 Chris Jackson * outputs.R(pmatrix.piecewise.msm): Bug fix for times of length 1. Thanks to Anne Presanis. 2005-03-09 Chris Jackson * pijt.c(Pmat): Don't recalculate pii within j loop. 2005-03-08 Chris Jackson * pijt.c: New function Eigen. MatrixExp merged into one function. 2005-03-07 Chris Jackson * msm.R(msm): Argument "hessian" added to msm. Covariance matrix is set to NULL instead of a string when SEs not available. * msm.R(msm): Confidence limits of fixed parameters set to NA, not zero width. 2005-03-06 Chris Jackson * DESCRIPTION: Version 0.5 released. This is a major re-write, so instead of a detailed change log, the NEWS entry is reproduced below. Version 0.5 (2005-03-06) ----------- * Major update. Much of the internal R and C code has been re-written. * General continuous-time hidden Markov models can now be fitted with msm, as well as misclassification models. Allowed response distributions conditionally on the hidden state include categorical, normal, Poisson, exponential and others. See the new "hmodel" argument. Misclassification models can either be fitted in the old style using an ematrix, or using a general HMM with a categorical response distribution. Covariates can be fitted to many of the new hidden response processes via generalized regressions. See "hcovariates", "hcovinits" arguments. * Per-observation observation schemes, generalising the "exacttimes" and "death" concepts. An optional new variable in the data can specify whether each observation is a snapshot of the process, an exactly-observed transition time, or a death state. Observations are allowed to be at identical times, for example, a snapshot followed instantly by an exact transition time. * Various syntax changes for cleaner moder specification. - Instead of 0/1 indicators, qmatrix and ematrix should contain the initial values for the transition intensity / misclassification matrix. These matrices can be named with names for the states of the Markov chain. - The inits argument is abolished. Initial values are estimated automatically if the new argument to msm "gen.inits = TRUE" is supplied. This uses the initial values calculated by crudeinits.msm. - misc no longer needs to be specified if an ematrix is supplied. - fixedpars=TRUE fixes all parameters, or specific parameters can be fixed as before. - crudeinits.msm takes a state ~ time formula instead of two separate state, time arguments, for consistency with the msm function. - Initial values for covariate effects on transition rates / misclassification probabilities are assumed to be zero unless otherwise specified by the new "covinits" / "misccovinits" argument. * Support for 'from-to' style data has been withdrawn. Storing data in this format is inadvisable as it destroys the longitudinal nature of the data. * Speed improvements. The algorithm for calculating the likelihood for non-hidden multi-state models has changed so that the matrix exponential of the Q matrix is only calculated once for each time difference / covariate combination. Therefore, users should see speed improvements for data where the same from-state, to-state, time difference, covariates combination appears many times. * Confidence intervals are now presented instead of standard errors for uncertainty in parameter estimates. * New method of calculating matrix exponentials when the eigenvector matrix is not invertible. It now uses the more robust method of Pade approximants with scaling and squaring, instead of power series. Faster LAPACK routines are now used for matrix inversion. * covmatch argument to msm has been abolished. To take a time-dependent covariate value from the end of the relevant transition instead of the default start, users are expected to manipulate their data accordingly before calling msm, shifting the positions of the covariate back by one within each subject. * Syntax changes for simmulti.msm. Bug fixes --------- * The likelihood is now calculated correctly for individuals with censored intermediate states, as well as censored initial and final states. Thanks to Michael Sweeting for reporting this. * hazard.scale and odds.scale were interpreted wrongly in hazard.msm and odds.msm respectively. * time-dependent covariate values now taken from the start instead of end of the transition under hidden Markov models. 2005-01-28 Chris Jackson * src/lik.c (GetCensoredPObsTrue): Censored outcomes are now assumed to be not misclassified. * msm.R(msm.form.censor): Bug fix - transient states were detected incorrectly. * src/pijt.c: Bug fix. P matrix calculation for misclassification models was ignoring exacttimes. * src/lik.c: Bug fix. Ignore death when exacttimes = TRUE. * DESCRIPTION: Version 0.4.1 released. 2005-01-07 Chris Jackson * DESCRIPTION: Version 0.4 released. 2005-01-06 Chris Jackson * msm/R/msm.process.covs: Bug fix - covariates were not being centered. Thanks to Andrew Titman. 2004-12-29 Chris Jackson Support added for censored observations. * src/lik.c: Bug fix. Don't ignore exacttimes for misclassification models. Fixes in documentation. Thanks to Ross Boylan. 2004-09-18 Chris Jackson * man: Rd syntax errors fixed to pass R CMD CHECK under 2.0.0 * * msm-manual: Reference to the PDF manual for msm made more prominent. * DESCRIPTION: Version 0.3.3 released. 2004-06-23 Chris Jackson * msm.R(msm.process.covs): Bug fix, constraints were not being calculated properly when some covariates were constrained and some were not. Thanks to Mike Sweeting. 2004-06-01 Chris Jackson * msm-manual: Correction - heartmiscsex.msm is actually run using default Nelder-Mead optimization, not BFGS. 2004-05-13 Chris Jackson * R/outputs.R: plot.msm now plots survival curves in different colours as well as different line types. 2004-05-11 Chris Jackson * R/simul.R: simmulti.msm now returns a data frame, as it should do. 2004-04-23 Chris Jackson * New argument "start" in simmulti.msm to give the starting state for each individual. Thanks to Stephan Lenz for the suggestion. 2004-03-25 Chris Jackson * NEWS file moved to inst directory, so that it ends up in the root directory of binary installs. Leave ChangeLog in the source package. * DESCRIPTION: Version 0.3.2 released. 2004-03-24 Chris Jackson * R/outputs.R(print.msm): Bug fix - only say "covariates set to their means" in the output if there actually are any covariates. * msm-manual.pdf: Hidden Markov model theory moved to straight after general model theory, general cleanups. 2004-03-23 Chris Jackson * msm-manual.pdf: R code examples rewritten using Sweave. Examples run again with different death assumption, most estimates are negligibly different. Misclassification model examples corrected to include death. Example of plot.msm added. This is not distributed as a vignette, as the msm model examples take a long time to fit. 2004-03-22 Chris Jackson * R/simul.R(simmulti.msm, getobs.msm): tunit argument abolished and death times assumed to be known exactly. * src/lik.c(fillparvec): Bug fix. Bounds checking on vector of indices of fixed parameters. Thanks to Ross Boylan. 2004-03-21 Chris Jackson * R/msm.R, src/lik.c: tunit argument is now abolished (with warning given). Death states are assumed to have exact entry times, not within one day. This is cleaner and more logical, as in longitudinal studies all observations are usually accurate to one basic time unit, not just deaths. * R/msm.R, src/lik.c: More than one death state is now supported. A death state has exact entry time, with an unknown transient state at the previous instant. Thanks to Jean-Luc Bulliard for suggesting this. * R/msm.R(msm.check.times): Just give a warning if a subject only has one observation, no need to die. * R/msm.R(lik.msm): Bug fix. set diagonal to 0 when calculating number of misclassified states nms, in case user has given non zero diagonal entries in ematrix. * (various) Changes made so that R CMD CHECK passes with R 1.9.0 alpha: codoc mismatches and PACKAGE argument in .C() 2003-10-14 Chris Jackson * src/pijt.c(MatrixExpSeries): Bug fix. Don't overwrite the matrix A, as it is needed after the function exits. This had led to wrong results when exacttimes = TRUE and the intensity matrix had repeated eigenvalues. * src/lik.c(liksimple, liksimple_fromto, UpdateLik): Don't ignore death argument when exacttimes = TRUE. * R/msm.R(msm.check.times): Use table instead of tapply to count the number of observations per subject. Fixes further problems with running out of memory. * DESCRIPTION: Version 0.3.1 released. 2003-09-29 Chris Jackson * R/outputs.R: Debugging print statements removed from pmatrix.piecewise.msm * msm-manual.pdf: Version number added. * DESCRIPTION: Version 0.3 released. 2003-09-26 Chris Jackson * src/lik.c, src/pijt.c: Allocate memory using S_alloc, not Calloc. Solves the problem of running out of memory for large datasets. * R/outputs.R(observed.msm): Fixed a bug with looping over a factor patient ID, which caused prevalence.msm to fail. 2003-09-25 Chris Jackson * R/outputs.R(print.msm) Don't draw ASCII underlines under "Multi-state Markov models" banner - looks ugly in proportional font. * R/msm.R: nmiscs model attribute (number of misclassification probabilities) changed to nmisc for compatibility with C code. * src/lik.c(liksimple, liksimple_fromto): Bug fixed in the likelhood calculation for non-misclassified reversible models with death time known within one day. The error assumed the unobserved states on the day before death could only be states greater or equal than the previously observed state. This is not true for reversible models. * man/summary.msm.Rd: usage and argument lists made consistent, satisfying new R CMD CHECK. 2003-09-24 Chris Jackson * R/msm.R, R/outputs.R, src/lik.c: A new argument "qconstraint" to msm now allow equality constraints between baseline transition intensities. A similar argument "econstraint" allows equality constraints between misclassification probabilities. Thanks to Mike Sweeting and Ross Boylan for suggesting this. 2003-09-23 Chris Jackson * src/pijt.c(pijt): Bug fixed in the likelihood calculation for exact transition times with reversible models. The error assumed Prr(t) was always equal to exp(-qrr t), when this is only satisfied for a state r which is only visited once. 2003-06-30 Chris Jackson * R/outputs.R(qematrix.msm): Didn't work when the baseline rates or probabilities were fixed to zero, bug fixed (now uses x$model$qvector to test whether a transition is allowed, not x$Qmatrices$logbaseline). * R/outputs.R: New function - pmatrix.piecewise.msm, for calculating P-matrices for processes with non-homogeneous but piecewise-constant intensities. Thanks to Mike Sweeting for suggesting this. * DESCRIPTION: Version 0.2.2 released 2003-06-25 Chris Jackson * R/msm.R (msm.check.model): Bug fix - was reporting the wrong subject numbers when there were disallowed transitions in the data. Thanks to Stephan Lenz for spotting this. 2003-06-20 Chris Jackson * R/outputs.R: Covariates argument is now checked that it is a list, to avoid ugly warnings in R 1.7.0 2003-06-16 Chris Jackson * R/msm.R (msm.form.output): Died when only one parameter in the model, fixed by coercing covmat to matrix. 2003-06-03 Chris Jackson * inst/doc/msm-manual.pdf: Edits to manual, e.g. correction of covariates formulae to include baseline intensity, lots of typos corrected. * DESCRIPTION: Version 0.2.1 released 2003-04-29 Chris Jackson * R/simul.R: Bug fix in simmulti.msm: didn't work for one covariate. Thanks to Mike Sweeting for spotting this. * R/msm.R: Subject identification variable is now allowed to be factor or character. Thanks to Pablo Emilio Verde for the suggestion. * R/msm.R: msm.check.times also checks whether all the observations on a subject are adjacent in the data set. 2003-03-20 Chris Jackson * R/R: Bug fix in msm.check.times. Thanks to Pablo Emilio Verde for helping to find this. 2003-02-20 Chris Jackson * R/simul.R: Bug fix in getobs.msm: exact death times were ignored. (obstimes[i] replaced by sim$times[j+1]). 2003-01-05 Chris Jackson * DESCRIPTION: Version 0.2 released. * inst/doc/msm-manual.pdf: PDF manual completed. 2003-01-03 Chris Jackson * man: Heart transplant data added as an example data set * man: Aesthetic cleanups of all help pages * R/msm.R: New function crudeinits.msm to estimate a set of initial values for transition rates by assuming data represent the only transition times. * R/msm.R: New function statetable.msm to calculate frequencies of successive state pairs in data. * R/outputs.R: Methodology changed for prevalencemisc.msm to make it more similar to prevalence.msm, avoiding confusion. Observed counts now common to both, and separated out into a new function observed.msm. Then prevalencemisc.msm (and the internal C onestep) was removed and prevalence.msm was made general to both misclassification and non-misclassification models. 2002-12-18 Chris Jackson * src/lik.c: Bugfix. nms changed to nst in likelihood-calculating functions. Fixes failure to calculate the likelihood where some states where some states are observed without error, but are not death states (Thanks to Martyn Plummer). * R/simul.R: Bugfix in getobs.msm, which led to the entrance to not being observed for models with absorbing states. 2002-12-09 Chris Jackson * R/outputs.R: new function odds.msm to calculate odds ratios for misclassification probabilities. * R/outputs.R: new function ematrix.msm. Calls new internal functions, including qematrix.msm. 2002-12-03 Chris Jackson * R/outputs.R: new function qratio.msm for estimating ratios of intensities and (via new function qratio.se.msm) their standard errors. Documentation in man/qratio.msm.Rd. 2002-12-02 Chris Jackson * R/outputs.R: new internal function qmatrix.diagse.msm * R/msm.R Null components of msm objects removed, e.g. misclassification parameters for non-misclassification models. 2002-11-27 Chris Jackson * R: File msm.R split into msm.R, outputs.R and utils.R. * R/msm.R. New functions absorbing.msm and transient.msm which give the indices of the absorbing or transient states of the model. * R/msm.R. (plot.msm) Now accepts a "covariates" argument for covariates at which to evaluate the survival probabilities. * R/msm.R. Functions which operate on msm objects now have the msm object argument named "x", instead of "msm", for consistency. * man/qmatrix.msm.Rd, man/pmatrix.msm.Rd, man/sojourn.msm.Rd. Updated documentation. * R/msm.R (msm). The contents of msm objects has been reorganised. The first component of Qmatrices is now called "logbaseline" and gives the estimates of the log intensites as returned from the optimisation. Components "qcenter" and "ecenter" are removed, as they were named confusingly. The component 'Pmatrix' is also removed, as it is obsoleted by the function 'pmatrix.msm'. New component 'foundse' is a logical indicating whether the Hessian is positive definite, i.e. whether standard errors are available. * R/msm.R (sojourn.msm) Function rewritten to allow a given set of covariate values, using the new qmatrix.msm. Now takes a fitted msm model as its argument, and the component "mean" in the return is changed to "estimate". * R/msm.R (qmatrix.msm). New function to compute transition intensity matrix at given covariate values. * R/msm.R (pmatrix.msm). New function to compute transition probability matrix at given covariate values. * R/simul.R (simmulti.msm): Check for ordered patient IDs, and sort input data if not ordered. Also check for duplicated observation times and remove them. Default for 'death' argument changed to FALSE for consistency with msm(). Give column names to the simulated data. 2002-11-13 Chris Jackson * R/msm.R: New function msm.check.qmatrix to test for consistency of Markov chain intensity matrices. * R/msm.R, man/totlos.Rd: New function totlos.msm to estimate total length of stay in a state, with documentation. * src/lik.c, src/pijt.c: Unused and uninitialised variables fixed so the library builds cleanly with -Wall. 2002-11-08 Chris Jackson * src/lik.c: Debugging print statements removed from onestep * msm_0.1.tar.gz: First release msm/NAMESPACE0000644000176200001440000000752214556740325012306 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("[",msm.est) S3method(as.data.frame,msm.estbystate) S3method(coef,msm) S3method(contour,msm) S3method(image,msm) S3method(logLik,msm) S3method(model.frame,msm) S3method(model.matrix,msm) S3method(persp,msm) S3method(plot,msm) S3method(plot,prevalence.msm) S3method(print,hmmMVdist) S3method(print,hmmdist) S3method(print,hmodel) S3method(print,msm) S3method(print,msm.est) S3method(print,msm.estbystate) S3method(print,msm.prevalence) S3method(print,pearson.msm) S3method(print,summary.msm) S3method(summary,msm) S3method(tidy,msm) S3method(tidy,msm.est) S3method(tidy,msm.estbystate) S3method(tidy,msm.prevalence) export(MatrixExp) export(absorbing.msm) export(boot.msm) export(coef.msm) export(crudeinits.msm) export(d2phase) export(deltamethod) export(dmenorm) export(dmeunif) export(dpexp) export(draic.msm) export(drlcv.msm) export(dtnorm) export(efpt.msm) export(ematrix.msm) export(envisits.msm) export(h2phase) export(hazard.msm) export(hmmBeta) export(hmmBetaBinom) export(hmmBinom) export(hmmCat) export(hmmExp) export(hmmGamma) export(hmmIdent) export(hmmLNorm) export(hmmMETNorm) export(hmmMEUnif) export(hmmMV) export(hmmNBinom) export(hmmNorm) export(hmmPois) export(hmmT) export(hmmTNorm) export(hmmUnif) export(hmmWeibull) export(hmodel2list) export(logLik.msm) export(lrtest.msm) export(msm) export(msm.form.eoutput) export(msm.form.qoutput) export(msm2Surv) export(odds.msm) export(p2phase) export(pearson.msm) export(phasemeans.msm) export(plot.prevalence.msm) export(plot.survfit.msm) export(plotprog.msm) export(pmatrix.msm) export(pmatrix.piecewise.msm) export(pmenorm) export(pmeunif) export(pnext.msm) export(ppass.msm) export(ppexp) export(prevalence.msm) export(printnew.msm) export(printold.msm) export(ptnorm) export(q2phase) export(qgeneric) export(qmatrix.msm) export(qmenorm) export(qmeunif) export(qpexp) export(qratio.msm) export(qtnorm) export(r2phase) export(rmenorm) export(rmeunif) export(rpexp) export(rtnorm) export(scoreresid.msm) export(sim.msm) export(simfitted.msm) export(simmulti.msm) export(sojourn.msm) export(statetable.msm) export(surface.msm) export(totlos.msm) export(transient.msm) export(updatepars.msm) export(viterbi.msm) importFrom(expm,expm) importFrom(generics,tidy) importFrom(grDevices,rainbow) importFrom(graphics,contour) importFrom(graphics,filled.contour) importFrom(graphics,image) importFrom(graphics,legend) importFrom(graphics,lines) importFrom(graphics,par) importFrom(graphics,persp) importFrom(graphics,plot) importFrom(graphics,text) importFrom(mvtnorm,rmvnorm) importFrom(stats,as.formula) importFrom(stats,coef) importFrom(stats,deriv) importFrom(stats,dexp) importFrom(stats,dnorm) importFrom(stats,integrate) importFrom(stats,logLik) importFrom(stats,model.extract) importFrom(stats,model.frame) importFrom(stats,model.matrix) importFrom(stats,na.fail) importFrom(stats,na.omit) importFrom(stats,na.pass) importFrom(stats,numericDeriv) importFrom(stats,optimHess) importFrom(stats,pchisq) importFrom(stats,pexp) importFrom(stats,plogis) importFrom(stats,pnorm) importFrom(stats,qlogis) importFrom(stats,qnorm) importFrom(stats,quantile) importFrom(stats,rbeta) importFrom(stats,rbinom) importFrom(stats,reformulate) importFrom(stats,reshape) importFrom(stats,rexp) importFrom(stats,rgamma) importFrom(stats,rlnorm) importFrom(stats,rnbinom) importFrom(stats,rnorm) importFrom(stats,rpois) importFrom(stats,rt) importFrom(stats,runif) importFrom(stats,rweibull) importFrom(stats,sd) importFrom(stats,setNames) importFrom(stats,terms) importFrom(stats,uniroot) importFrom(survival,Surv) importFrom(survival,survfit) importFrom(tibble,tibble) importFrom(utils,head) importFrom(utils,tail) useDynLib(msm, .registration=TRUE) msm/NEWS.md0000644000176200001440000000615614713145746012170 0ustar liggesusersUser-visible changes only. For internal changes, see Github commits. # Version 1.8.2 (2024-11-07) * Fix a further memory error affecting CRAN checks of some dependent packages (#106). # Version 1.8.1 (2024-10-04) * Fix memory error that crashed reverse dependency checks (#106). # Version 1.8 (2024-09-06) * Subject-level weights supported for likelihood calculation with new `msm()` argument `subject.weights`. * Tidying methods added for `msm` objects and most of msm's output functions (`prevalence.msm`, `qmatrix.msm` and related functions, and `totlos.msm` and related functions). These methods convert the output to a tidy data frame (tibble), in the manner of the [broom](https://broom.tidymodels.org/) package. To use these methods, just call `tidy(x)`, where `x` is the result of calling, e.g. `msm`, `prevalence.msm`, or `qmatrix.msm`. Hence the msm package now imports the `generics` and `tibble` packages. * Subjects with one observation are no longer dropped in HMMs, since they provide information about the distribution of the outcome given the hidden state. * `ppass.msm` now supports `pci` models and other time-inhomogeneous models. Thanks to Jon Fintzi for working on this. * New function `hmodel2list` to extract HMM constructor function calls from fitted HMMs. Thanks to Will Hulme for working on this. * Objects returned by `totlos.msm`, `efpt.msm` and `envisits.msm` now have class `"msm.estbystate"`. * Objects returned by `prevalence.msm` now have class `"msm.prevalence"`. * Fix of bugs for models containing a covariate named `"baseline"` or `"Baseline"`. # Version 1.7.1 (2023-11-23) * Fix of a bug in the Viterbi algorithm for the calculation of the fitted state at the initial time for each subject. * Bug fix for `pmatrix.piecewise.msm` given just intensity matrices instead of a fitted model. * Auto-generated initial values set to a small positive number rather than zero when there are no observed data for a particular permitted transition. This fixes consistency checks (e.g. for `qconstraint`) in this situation. * Fix when covariates come into the data as one-column matrices instead of vectors. * Modernised to use roxygen, and pkgdown website created at https://chjackson.github.io/msm * Some internal functions (e.g. `deriv.msm`) that clash with base S3 generics renamed # Version 1.7 (2022-11-27) * `rpexp` is now more efficient. Thanks to Mark Clements. Note that the values simulated by `rpexp`, `sim.msm` and `simmulti.msm` for a specific seed will now be different in models where the intensities are piecewise constant. * Bug fix: in HMMs with partially known initial states specified through `obstrue` and `censor`, `initprobs` is now accounted for. * Bug fix for bootstrapping with character subject IDs. * `crudeinits.msm` handled when state is a factor. * Fix for `hranges` on multiple parameters. * `obstrue` handled in forward-backward algorithm (`viterbi.msm`). # Version 1.6.9 * ... and earlier versions: see [inst/NEWS](https://github.com/chjackson/msm/blob/master/inst/NEWS) in the source for changes. msm/inst/0000755000176200001440000000000014713146130012023 5ustar liggesusersmsm/inst/CITATION0000644000176200001440000000122214527462170013165 0ustar liggesuserscitHeader("To cite msm in publications use:") bibentry(bibtype = "Article", title = "Multi-State Models for Panel Data: The {msm} Package for {R}", author = person("Christopher H. Jackson"), journal = "Journal of Statistical Software", year = "2011", volume = "38", number = "8", pages = "1--29", doi = "10.18637/jss.v038.i08", textVersion = paste("Christopher H. Jackson (2011).", "Multi-State Models for Panel Data: The msm Package for R.", "Journal of Statistical Software, 38(8), 1-29.", "URL https://www.jstatsoft.org/v38/i08/.") ) msm/inst/doc/0000755000176200001440000000000014713146125012574 5ustar liggesusersmsm/inst/doc/msm-manual.R0000644000176200001440000002414714713146124014775 0ustar liggesusers### R code from vignette source 'msm-manual.Rnw' ################################################### ### code chunk number 1: msm-manual.Rnw:41-43 ################################################### version <- gsub("Version: +", "", packageDescription("msm", lib.loc=c("../..",.libPaths()))$Version) ################################################### ### code chunk number 2: msm-manual.Rnw:48-49 ################################################### cat(version) ################################################### ### code chunk number 3: msm-manual.Rnw:52-53 ################################################### cat(format(Sys.time(), "%d %B, %Y")) ################################################### ### code chunk number 4: msm-manual.Rnw:861-862 ################################################### options(width = 60) ################################################### ### code chunk number 5: msm-manual.Rnw:897-898 ################################################### library(msm) ################################################### ### code chunk number 6: msm-manual.Rnw:957-958 ################################################### cav[1:21,] ################################################### ### code chunk number 7: msm-manual.Rnw:968-969 ################################################### statetable.msm(state, PTNUM, data=cav) ################################################### ### code chunk number 8: msm-manual.Rnw:1020-1024 ################################################### Q <- rbind ( c(0, 0.25, 0, 0.25), c(0.166, 0, 0.166, 0.166), c(0, 0.25, 0, 0.25), c(0, 0, 0, 0) ) ################################################### ### code chunk number 9: msm-manual.Rnw:1058-1060 ################################################### Q.crude <- crudeinits.msm(state ~ years, PTNUM, data=cav, qmatrix=Q) ################################################### ### code chunk number 10: msm-manual.Rnw:1084-1086 ################################################### cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4) ################################################### ### code chunk number 11: msm-manual.Rnw:1114-1115 (eval = FALSE) ################################################### ## help(optim) ################################################### ### code chunk number 12: msm-manual.Rnw:1138-1139 ################################################### cav.msm ################################################### ### code chunk number 13: msm-manual.Rnw:1178-1180 ################################################### cavsex.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4, covariates = ~ sex) ################################################### ### code chunk number 14: msm-manual.Rnw:1188-1189 ################################################### cavsex.msm ################################################### ### code chunk number 15: msm-manual.Rnw:1205-1207 ################################################### qmatrix.msm(cavsex.msm, covariates=list(sex=0)) # Male qmatrix.msm(cavsex.msm, covariates=list(sex=1)) # Female ################################################### ### code chunk number 16: msm-manual.Rnw:1219-1222 (eval = FALSE) ################################################### ## cavsex.msm <- msm( state ~ years, subject=PTNUM, data = cav, ## qmatrix = Q, deathexact = 4, ## covariates = list("1-2" = ~ sex, "1-4" = ~sex) ) ################################################### ### code chunk number 17: msm-manual.Rnw:1233-1237 (eval = FALSE) ################################################### ## cav3.msm <- msm( state ~ years, subject=PTNUM, data = cav, ## qmatrix = Q, deathexact = 4, ## covariates = ~ sex, ## constraint = list(sex=c(1,2,3,1,2,3,2)) ) ################################################### ### code chunk number 18: msm-manual.Rnw:1273-1277 (eval = FALSE) ################################################### ## cav4.msm <- msm( state ~ years, subject=PTNUM, data = cav, ## qmatrix = Q, deathexact = 4, ## control = list(trace=2, REPORT=1), ## fixedpars = c(6, 7) ) ################################################### ### code chunk number 19: msm-manual.Rnw:1316-1317 ################################################### pmatrix.msm(cav.msm, t=10) ################################################### ### code chunk number 20: msm-manual.Rnw:1346-1347 ################################################### sojourn.msm(cav.msm) ################################################### ### code chunk number 21: msm-manual.Rnw:1359-1360 ################################################### pnext.msm(cav.msm) ################################################### ### code chunk number 22: msm-manual.Rnw:1385-1386 ################################################### totlos.msm(cav.msm) ################################################### ### code chunk number 23: msm-manual.Rnw:1408-1409 ################################################### qratio.msm(cav.msm, ind1=c(2,1), ind2=c(1,2)) ################################################### ### code chunk number 24: msm-manual.Rnw:1417-1418 ################################################### hazard.msm(cavsex.msm) ################################################### ### code chunk number 25: msm-manual.Rnw:1427-1428 (eval = FALSE) ################################################### ## qmatrix.msm(cav.msm) ################################################### ### code chunk number 26: msm-manual.Rnw:1438-1439 (eval = FALSE) ################################################### ## qmatrix.msm(cavsex.msm, covariates = 0) ################################################### ### code chunk number 27: msm-manual.Rnw:1444-1445 (eval = FALSE) ################################################### ## qmatrix.msm(cavsex.msm, covariates = list(sex = 1)) ################################################### ### code chunk number 28: msm-manual.Rnw:1471-1472 ################################################### plot(cav.msm, legend.pos=c(8, 1)) ################################################### ### code chunk number 29: msm-manual.Rnw:1714-1716 ################################################### options(digits=3) prevalence.msm(cav.msm, times=seq(0,20,2)) ################################################### ### code chunk number 30: msm-manual.Rnw:1718-1719 ################################################### plot.prevalence.msm(cav.msm, mintime=0, maxtime=20) ################################################### ### code chunk number 31: msm-manual.Rnw:1854-1857 ################################################### options(digits=2) pearson.msm(cav.msm, timegroups=2, transitions=c(1,2,3,4,5,6,7,8,9,9,9,10)) ################################################### ### code chunk number 32: msm-manual.Rnw:1982-1994 ################################################### Qm <- rbind(c(0, 0.148, 0, 0.0171), c(0, 0, 0.202, 0.081), c(0, 0, 0, 0.126), c(0, 0, 0, 0)) ematrix <- rbind(c(0, 0.1, 0, 0), c(0.1, 0, 0.1, 0), c(0, 0.1, 0, 0), c(0, 0, 0, 0)) cavmisc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = Qm, ematrix = ematrix, deathexact = 4, obstrue = firstobs) cavmisc.msm ################################################### ### code chunk number 33: msm-manual.Rnw:2022-2026 ################################################### cavmiscsex.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = Qm, ematrix = ematrix, deathexact = 4, misccovariates = ~sex, obstrue=firstobs) ################################################### ### code chunk number 34: msm-manual.Rnw:2028-2029 ################################################### cavmiscsex.msm ################################################### ### code chunk number 35: msm-manual.Rnw:2049-2051 ################################################### ematrix.msm(cavmiscsex.msm, covariates=list(sex=0)) ematrix.msm(cavmiscsex.msm, covariates=list(sex=1)) ################################################### ### code chunk number 36: msm-manual.Rnw:2098-2100 ################################################### pearson.msm(cavmisc.msm, timegroups=2, transitions=c(1,2,3,4,5,6,7,8,9,9,9,10)) ################################################### ### code chunk number 37: msm-manual.Rnw:2147-2149 ################################################### vit <- viterbi.msm(cavmisc.msm) vit[vit$subject==100103,] ################################################### ### code chunk number 38: msm-manual.Rnw:2349-2350 ################################################### three.q <- rbind(c(0, exp(-6), exp(-9)), c(0, 0, exp(-6)), c(0, 0, 0)) ################################################### ### code chunk number 39: msm-manual.Rnw:2368-2380 ################################################### hmodel1 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(999)) fev1.msm <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel1, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(acute = c(1,1))) fev1.msm sojourn.msm(fev1.msm) ################################################### ### code chunk number 40: msm-manual.Rnw:2660-2661 (eval = FALSE) ################################################### ## help(msm) ################################################### ### code chunk number 41: msm-manual.Rnw:2669-2670 (eval = FALSE) ################################################### ## help.start() msm/inst/doc/msm-manual.Rnw0000644000176200001440000036734114471426252015354 0ustar liggesusers%%\VignetteIndexEntry{User guide to msm with worked examples} %\VignettePackage{msm} \documentclass{article} %% Need to modify Sweave.sty to pass pdftex option to graphicx. %\usepackage{Sweave-local} \usepackage{graphics} \RequirePackage[T1]{fontenc} %%Check if we are compiling under latex or pdflatex \ifx\pdftexversion\undefined \RequirePackage[dvips]{graphicx} \else \RequirePackage[pdftex]{graphicx} \RequirePackage{epstopdf} \fi \RequirePackage{ae,fancyvrb} \IfFileExists{upquote.sty}{\RequirePackage{upquote}}{} \setkeys{Gin}{width=0.8\textwidth} \DefineVerbatimEnvironment{Sinput}{Verbatim}{fontshape=sl} \DefineVerbatimEnvironment{Soutput}{Verbatim}{} \DefineVerbatimEnvironment{Scode}{Verbatim}{fontshape=sl} \newenvironment{Schunk}{}{} \usepackage{times} \usepackage{url} \addtolength{\textwidth}{2cm} \newcommand{\Exp}{\mathop{\mathrm{Exp}}} \newcommand{\etal}{{\textit{et al.}}} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} %% version <- 1.3 <>= version <- gsub("Version: +", "", packageDescription("msm", lib.loc=c("../..",.libPaths()))$Version) @ \title{Multi-state modelling with R: the {\tt msm} package \vskip 0.2in \large{Version % <>= cat(version) @ \vskip 0.1in <>= cat(format(Sys.time(), "%d %B, %Y")) @ }} \author{Christopher Jackson\\MRC Biostatistics Unit\\Cambridge, U.K.\\ \texttt{chris.jackson@mrc-bsu.cam.ac.uk}} \date{} %% label with date when Rnw is compiled, not when tex is compiled. should be release date of package \bibliographystyle{unsrt} \begin{document} \maketitle \begin{abstract} The multi-state Markov model is a useful way of describing a process in which an individual moves through a series of states in continuous time. The \Rpackage{msm} package for R allows a general multi-state model to be fitted to longitudinal data. Data often consist of observations of the process at arbitrary times, so that the exact times when the state changes are unobserved. For example, the progression of chronic diseases is often described by stages of severity, and the state of the patient may only be known at doctor or hospital visits. Features of \Rpackage{msm} include the ability to model transition rates and hidden Markov output models in terms of covariates, and the ability to model data with a variety of observation schemes, including censored states. Hidden Markov models, in which the true path through states is only observed through some error-prone marker, can also be fitted. The observation is generated, conditionally on the underlying states, via some distribution. An example is a screening misclassification model in which states are observed with error. More generally, hidden Markov models can have a continuous response, with some arbitrary distribution, conditionally on the underlying state. This manual introduces the theory behind multi-state Markov and hidden Markov models, and gives a tutorial in the typical use of the \Rpackage{msm} package, illustrated by some typical applications to modelling chronic diseases. Much of the material in this manual is published, in a more concise form, in Journal of Statistical Software (2011) 38(8):1-29, \url{http://www.jstatsoft.org/v38/i08/} \end{abstract} \section{Multi-state models} \label{sec:multistate} \subsection{Introduction} \label{sec:intro} Figure \ref{fig:multi} illustrates a multi-state model in continuous time. Its four states are labelled {\bf 1, 2, 3, 4}. At a time $t$ the individual is in state $S(t)$. The arrows show which transitions are possible between states. The next state to which the individual moves, and the time of the change, are governed by a set of {\em transition intensities} $q_{rs}(t, z(t))$ for each pair of states $r$ and $s$. The intensities may also depend on the time of the process $t$, or more generally a set of individual-specific or time-varying explanatory variables $z(t)$. The intensity represents the instantaneous risk of moving from state $r$ to state $s$: \begin{equation} \label{eq:multi:intensity} q_{rs}(t, z(t)) = \lim_{\delta t \rightarrow 0} P (S(t+\delta t) = s | S(t) = r) / \delta t \end{equation} The intensities form a matrix $Q$ whose rows sum to zero, so that the diagonal entries are defined by $q_{rr} = - \sum_{s \neq r} q_{rs}$. To fit a multi-state model to data, we estimate this transition intensity matrix. We concentrate on {\em Markov} models here. The Markov assumption is that future evolution only depends on the current state. That is, $q_{rs}(t, z(t), \mathcal{F}_t)$ is independent of $\mathcal{F}_t$, the observation history $\mathcal{F}_t$ of the process up to the time preceding $t$. See, for example, Cox and Miller\cite{cox:miller} for a thorough introduction to the theory of continuous-time Markov chains. \begin{figure}[p] \begin{center} \scalebox{0.4}{\includegraphics{figures/multistate}} \[ Q = \left( \begin{array}{llll} q_{11} & q_{12} & q_{13} & q_{14}\\ q_{21} & q_{22} & q_{23} & q_{24}\\ q_{31} & q_{32} & q_{33} & q_{34}\\ q_{41} & q_{42} & q_{43} & q_{44}\\ \end{array} \right ) \] \caption{\label{fig:multi}General multi-state model.} \end{center} \end{figure} In a time-homogeneous continuous-time Markov model, a single period of occupancy (or \emph{sojourn time}) in state $r$ has an exponential distribution, with rate given by $-q_{rr}$, (or mean $-1 / q_{rr}$). The remaining elements of the $r$th row of $Q$ are \emph{proportional to} the probabilities governing the next state after $r$ to which the individual makes a transition. The probability that the individual's next move from state $r$ is to state $s$ is $-q_{rs} / q_{rr}$. \subsection{Disease progression models} The development of the \Rpackage{msm} package was motivated by applications to disease modelling. Many chronic diseases have a natural interpretation in terms of staged progression. Multi-state Markov models in continuous time are often used to model the course of diseases. A commonly-used model is illustrated in Figure \ref{fig:disease}. This represents a series of successively more severe disease stages, and an `absorbing' state, often death. The patient may advance into or recover from adjacent disease stages, or die at any disease stage. Observations of the state $S_i(t)$ are made on a number of individuals $i$ at arbitrary times $t$, which may vary between individuals. The stages of disease may be modelled as a homogeneous continuous-time Markov process, with a transition matrix $Q$, pictured below Figure \ref{fig:disease}. A commonly-used model is the \emph{illness-death} model, with three states representing health, illness and death (Figure \ref{fig:multi:illdeath}). Transitions are permitted from health to illness, illness to death and health to death. Recovery from illness to health is sometimes also considered. A wide range of medical situations have been modelled using multi-state methods, for example, screening for abdominal aortic aneurysms (Jackson \etal\cite{jackson:sharples:2003}), problems following lung transplantation (Jackson and Sharples\cite{jackson:sharples:2002}), problems following heart transplantation (Sharples\cite{sharp:gibbs}, Klotz and Sharples\cite{klotz:est}), hepatic cancer (Kay\cite{kay:mark}), HIV infection and AIDS (Longini \etal\cite{long1}, Satten and Longini\cite{sattlong}, Guihenneuc-Jouyaux \etal\cite{rich}, Gentleman \etal\cite{gentlaw}), diabetic complications (Marshall and Jones\cite{retino2}, Andersen\cite{andersen88}), breast cancer screening (Duffy and Chen\cite{duffy95}, Chen \emph{et al.}\cite{duffy96}), cervical cancer screening (Kirby and Spiegelhalter\cite{kirby:spiegelhalter}) and liver cirrhosis (Andersen \etal\cite{ander:proth}). Many of these references also describe the mathematical theory, which will be reviewed in the following sections. \begin{figure}[p] \centering \vskip 1cm \scalebox{1.0}{\includegraphics{figures/general}} \[ Q = \left( \begin{array}{llllll} q_{11} & q_{12} & 0 & 0 & \ldots & q_{1n}\\ q_{21} & q_{22} & q_{23} & 0 & \ldots & q_{2n}\\ 0 & q_{32} & q_{33} & q_{34} & \ddots & q_{3n}\\ 0 & 0 & q_{43} & q_{44} & \ddots & q_{4n}\\ \vdots & \vdots & \ddots & \ddots & \ddots & \vdots\\ 0 & 0 & 0 & 0 & \ldots & 0\\ \end{array} \right ) \] \caption{\label{fig:disease}General model for disease progression.} \end{figure} \begin{figure}[p] \begin{center} \scalebox{0.4}{\includegraphics{figures/illdeath}} \caption{Illness-death model.} \label{fig:multi:illdeath} \end{center} \end{figure} \subsection{Arbitrary observation times} \label{sec:arbitr-observ-times} Longitudinal data from monitoring disease progression are often incomplete in some way. Usually patients are seen at intermittent follow-up visits, at which monitoring information is collected, but information from the periods between visits is not available. Often the exact time of disease onset is unknown. Thus, the changes of state in a multi-state model usually occur at unknown times. Also a subject may only be followed up for a portion of their disease history. A fixed observation schedule may be specified in advance, but in practice times of visits may vary due to patient and hospital pressures. The states of disease progression models often include death. Death times are commonly recorded to within a day. Also observations may be censored. For example, at the end of a study, an individual may be known only to be alive, and in an unknown state. A typical sampling situation is illustrated in Figure \ref{fig:multi:sampling}. The individual is observed at four occasions through 10 months. The final occasion is the death date which is recorded to within a day. The only other information available is the occupation of states 2, 2, and 1 at respective times 1.5, 3.5 and 5. The times of movement between states and the state occupancy in between the observation times are unknown. Although the patient was in state 3 between 7 and 9 months this was not observed at all. \paragraph{Informative sampling times} To fit a model to longitudinal data with arbitrary sampling times we must consider the reasons why observations were made at the given times. This is analogous to the problem of missing data, where the fact that a particular observation is missing may implicitly give information about the value of that observation. Possible observation schemes include: \begin{itemize} \item {\em fixed}. Each patient is observed at fixed intervals specified in advance. \item {\em random}. The sampling times vary randomly, independently of the current state of the disease. \item {\em doctor's care}. More severely ill patients are monitored more closely. The next sampling time is chosen on the basis of the current disease state. \item patient {\em self-selection}. A patient may decide to visit the doctor on occasions when they are in a poor condition. \end{itemize} Gr\"uger \etal \cite{gruger:valid} discussed conditions under which sampling times are \emph{informative}. If a multi-state model is fitted, ignoring the information available in the sampling times, then inference may be biased. Mathematically, because the sampling times are often themselves random, they should be modelled along with the observation process $X_t$. However the ideal situation is where the joint likelihood for the times and the process is proportional to the likelihood obtained if the sampling times were fixed in advance. Then the parameters of the process can be estimated independently of the parameters of the sampling scheme. In particular, they showed that fixed, random and doctor's care observation policies are not informative, whereas patient self-selection is informative. Note that \Rpackage{msm} does not deal with informative sampling times. See, e.g. \cite{sweeting:inform:msm} for some methods in this case, which require specialised programming. \begin{figure}[p] \begin{center} \scalebox{0.6}{\rotatebox{270}{\includegraphics{figures/sampling}}} \caption{Evolution of a multi-state model. The process is observed on four occasions.} \label{fig:multi:sampling} \end{center} \end{figure} \subsection{Likelihood for the multi-state model} \label{sec:multi:likelihood} Kalbfleisch and Lawless\cite{kalbfleisch:lawless} and later Kay \cite{kay:mark} described a general method for evaluating the likelihood for a general multi-state model in continuous time, applicable to any form of transition matrix. The only available information is the observed state at a set of times, as in Figure \ref{fig:multi:sampling}. The sampling times are assumed to be non-informative. \paragraph{Transition probability matrix} The likelihood is calculated from the \emph{transition probability matrix} $P(t)$. For a time-homogeneous process, the $(r,s)$ entry of $P(t)$, $p_{rs}(t)$, is the probability of being in state $s$ at a time $t+u$ in the future, given the state at time $u$ is $r$. It does not say anything about the time of transition from $r$ to $s$, indeed the process may have entered other states between times $u$ and $t+u$. $P(t)$ can be calculated by taking the matrix exponential of the scaled transition intensity matrix (see, for example, Cox and Miller \cite{cox:miller}). \begin{equation} \label{eq:exptq} P(t) = \Exp(tQ) \end{equation} The matrix exponential $\Exp$ is different from a scalar exponential. The exponential of a matrix is defined by the same "power series" $\Exp(X) = 1 + X^2/2! + X^3/3! + ...$ as the scalar exponential, except that each term $X^k$ in the series is defined by matrix products, not element-wise scalar multiplication. It is notoriously difficult to calculate reliably, as discussed by Moler and van Loan \cite{matrixexp}. For simpler models, it is feasible to calculate an analytic expression for each element of $P(t)$ in terms of $Q$. This is generally faster and avoids the potential numerical instability of calculating the matrix exponential. Symbolic algebra sofware, such as Mathematica, can be helpful for obtaining these expressions. For example, the three-state illness-death model with no recovery has a transition intensity matrix of \[ Q = \left( \begin{array}{llllll} -(q_{12} + q_{13}) & q_{12} & q_{13}\\ 0 & - q_{23} & q_{23}\\ 0 & 0 & 0\\ \end{array} \right ) \] The corresponding time $t$ transition probabilities are \begin{eqnarray*} p_{11}(t) & = & e^{-(q_{12} + q_{13})t}\\ p_{12}(t) & = & \left\{ \begin{array}{ll} \frac{ q_{12} }{q_{12} + q_{13} - q_{23} } (e^{-q_{23} t} - e^{-(q_{12} + q_{13})t}) & (q_{12} + q_{13} \neq q_{23})\\ q_{12}te^{(-(q_{12} + q_{13})t} & (q_{12} + q_{13} = q_{23}) \end{array} \right. \\ p_{13}(t) & = & \left\{ \begin{array}{ll} 1 - e^{-(q_{12} + q_{13})t} - \frac{ q_{12} }{q_{12} + q_{13} - q_{23} } (e^{-q_{23} t} - e^{-(q_{12} + q_{13})t}) & (q_{12} + q_{13} \neq q_{23})\\ (-1 + e^{(q_{12} + q_{13})t} - q_{12}t)e^{-(q_{12} + q_{13})t} & (q_{12} + q_{13} = q_{23}) \end{array} \right. \\ p_{21}(t) & = & 0\\ p_{22}(t) & = & e^{-q_{23}t}\\ p_{23}(t) & = & 1 - e^{-q_{23}t}\\ p_{31}(t) & = & 0\\ p_{32}(t) & = & 0\\ p_{33}(t) & = & 1\\ \end{eqnarray*} The \Rpackage{msm} package calculates $P(t)$ analytically for selected 2, 3, 4 and 5-state models, illustrated in Figures \ref{fig:anp2}--\ref{fig:anp5}. For other models, which can have any transition structure on any number of states in principle, $P(t)$ is determined from the matrix exponential. This is calculated using eigensystem decomposition (if eigenvalues are distinct) or a method based on Pad\'e approximants with scaling and squaring \cite{matrixexp} (if there are repeated eigenvalues). Notice that the states are not labelled in these figures. Each graph can correspond to several different $Q$ matrices, depending on how the states are labelled. For example, Figure~\ref{fig:anp2} a) illustrates the model defined by either \( Q = \left( \begin{array}{ll} - q_{12} & q_{12} \\ 0 & 0 \end{array} \right) \) or \( Q = \left( \begin{array}{ll} 0 & 0\\ q_{21} & - q_{21} \end{array} \right) \). \begin{figure} \begin{center} a) \includegraphics[width=3cm]{figures/p2q1} \hskip 3cm b) \includegraphics[width=3cm]{figures/p2q12} \end{center} \caption{\label{fig:anp2}Two-state models fitted using analytic $P(t)$ matrices in \Rpackage{msm}. Implemented for all permutations of state labels 1, 2.} \end{figure} \begin{figure} \begin{center} a) \includegraphics[width=3cm]{figures/p3q12} \hskip 3cm b) \includegraphics[width=5cm]{figures/p3q14} \vskip 1cm c) \includegraphics[width=3cm]{figures/p3q16}\hskip 3cm d) \includegraphics[width=3cm]{figures/p3q124}\vskip 1cm e) \includegraphics[width=3cm]{figures/p3q135}\hskip 3cm f) \includegraphics[width=3cm]{figures/p3q1246} \end{center} \caption{\label{fig:anp3}Three-state models fitted using analytic $P(t)$ matrices in \Rpackage{msm}. Implemented for all permutations of state labels 1, 2, 3.} \end{figure} \begin{figure} \begin{center} a) \includegraphics[width=7cm]{figures/p4q159} \vskip 1cm b) \includegraphics[width=7cm]{figures/p4q13569} \end{center} \caption{\label{fig:anp4}Four-state models fitted using analytic $P(t)$ matrices in \Rpackage{msm}. Implemented for all permutations of state labels 1, 2, 3, 4.} \end{figure} \begin{figure} \begin{center} a) \includegraphics[width=9cm]{figures/p5q1_6_11_16}\vskip 1cm b) \includegraphics[width=9cm]{figures/p5q1_4_6_8_11_12_16}\vskip 1cm c) \includegraphics[width=5cm]{figures/p5q1_6_7_11_12} \end{center} \caption{\label{fig:anp5}Five-state models fitted using analytic $P(t)$ matrices in \Rpackage{msm}. Implemented for all permutations of state labels 1, 2, 3, 4, 5.} \end{figure} \paragraph{Likelihood for intermittently-observed processes} Suppose $i$ indexes $M$ individuals. The data for individual $i$ consist of a series of times $(t_{i1}, \ldots, t_{in_i})$ and corresponding states $(S(t_{i1}), \ldots, S(t_{in_i}))$. Consider a general multi state model, with a pair of successive observed disease states $S(t_j), S(t_{j+1})$ at times $t_j, t_{j+1}$. The contribution to the likelihood from this pair of states is \begin{equation} \label{eq:multi:lik:contrib} L_{i, j} = p_{S(t_j)S(t_{j+1})}(t_{j+1} - t_j) \end{equation} This is the entry of the transition matrix $P(t)$ at the $S(t_j)$th row and $S(t_{j+1})$th column, evaluated at $t = t_{j+1} - t_j$. The full likelihood $L(Q)$ is the product of all such terms $L_{i,j}$ over all individuals and all transitions. It depends on the unknown transition matrix $Q$, which was used to determine $P(t)$. \paragraph{Exactly-observed death times} In observational studies of chronic diseases, it is common that the time of death is known, but the state on the previous instant before death is unknown. If $S(t_{j+1}) = D $ is such a death state, then the contribution to the likelihood is summed over the unknown state $m$ on the instant before death: \begin{equation} \label{eq:multi:lik:death} L_{i, j} = \sum_{m \neq D} p_{S(t_j),m}(t_{j+1} - t_j) q_{m, D} \end{equation} The sum is taken over all possible states $m$ which can be visited between $S(t_j)$ and $D$. \paragraph{Exactly observed transition times} If the times $(t_{i1}, \ldots, t_{in_i})$ had been the {\em exact} transition times between the states, with no transitions between the observation times, then the contributions would be of the form \begin{equation} \label{eq:multi:lik:exact} L_{i, j} = \exp(q_{S(t_j)S(t_{j})}(t_{j+1} - t_j)) q_{S(t_j)S(t_{j+1})} \end{equation} since the state is assumed to be $S(t_j)$ throughout the interval between $t_j$ and $t_{j+1}$ with a known transition to state $S(t_{j+1})$ at $t_{j+1}$. \Rpackage{msm} is restricted to Markov models, but much richer models are possible for this type of data. For example, Putter \etal \cite{putter:mstate} discussed the \Rpackage{mstate} software for semi-parametric multi-state models with non-parametric baseline hazards and Cox regression. The Markov assumption is restrictive but necessary in general to compute a likelihood for intermittently-observed processes. \paragraph{Censored states} A censored quantity is one whose exact value is unknown, but known to be in a certain interval. For example, in survival analysis, a death time is \emph{right-censored} if the study ends and the patient is still alive, since the death time is known to be greater than the end time. In multi-state models for intermittently-observed processes, the times of changes of state are usually \emph{interval censored}, known to be within bounded intervals. This leads to a likelihood based on equation \ref{eq:multi:lik:contrib}. In some circumstances, \emph{states} may be censored as well as \emph{event times}. For example, at the end of some chronic disease studies, patients are known to be alive but in an \emph{unknown state}. For such a censored observation $S(t_{j+1})$ ($j+1=n$) known only to be a state in the set $C$, the equivalent contribution to the likelihood is \begin{equation} \label{eq:multi:lik:deathcens} L_{i, j} = \sum_{m \in C} p_{S(t_j),m}(t_{j+1} - t_j) \end{equation} Note that this special likelihood is not needed if the state is known at the end of the study. In this case, likelihood \ref{eq:multi:lik:contrib} applies. Although the \emph{survival time} is censored, the \emph{state} at the end of the study is not censored. More generally, suppose every observation from a particular individual is censored. Observations $1, 2, \ldots n_i$ are known only to be in the sets $C_1, C_2, \ldots, C_{n_i}$ respectively. The likelihood for this individual is a sum of the likelihoods of all possible paths through the unobserved states. \begin{equation} \label{eq:multi:lik:cens} L_i = \sum_{s_{n_i} \in C_{n_i}} \ldots \sum_{s_2 \in C_2} \sum_{s_1 \in C_1} p_{s_1 s_2}(t_2 - t_1) p_{s_2 s_3} (t_3 - t_2) \ldots p_{s_{n_i-1} s_{n_i}} (t_{n_i} - t_{n_i-1}) \end{equation} Suppose the states comprising the set $C_j$ are $c^{(j)}_1, \ldots, c^{(j)}_{m_j}$. This likelihood can also be written as a matrix product, say, \begin{equation} \label{eq:multi:lik:cens:matrix} L_i = \mathbf{1}^T P^{1,2} P^{2,3} \ldots P^{n_i-1, n_i} \mathbf{1} \end{equation} where $P^{j-1, j}$ is a $m_{j-1} \times m_j$ matrix with $(r,s)$ entry $p_{c^{(j-1)}_r c^{(j)}_s}(t_j - t_{j-1})$, and $\mathbf{1}$ is the vector of ones. The \Rpackage{msm} package allows multi-state models to be fitted to data from processes with arbitrary observation times (panel data), exactly-observed transition times, exact death times and censored states, or a mixture of these schemes. \subsection{Covariates} \label{sec:multi:covariates} The relation of constant or time-varying characteristics of individuals to their transition rates is often of interest in a multi-state model. Explanatory variables for a particular transition intensity can be investigated by modelling the intensity as a function of these variables. Marshall and Jones \cite{retino2} described a form of a {\em proportional hazards} model, where the transition intensity matrix elements $q_{rs}$ which are of interest can be replaced by \[ q_{rs}(z(t)) = q_{rs}^{(0)} \exp(\beta_{rs}^T z(t)) \] The new $Q$ is then used to determine the likelihood. If the covariates $z(t)$ are time dependent, the contributions to the likelihood of the form $p_{rs} (t - u)$ are replaced by \[ p_{rs}(t - u, z(u)) \] although this requires that the value of the covariate is known at every observation time $u$. Sometimes covariates are observed at different times to the main response, for example recurrent disease events or other biological markers. In some of these cases it could be assumed that the covariate is a step function which remains constant between its observation times. If the main response (the state of the Markov process) is not observed at the times when the covariate changes, it could be considered as a "censored" state (as in Section \ref{sec:multi:likelihood}). The \Rpackage{msm} package allows individual-specific or time dependent covariates to be fitted to transition intensities. In order to calculate transition probabilities $P(t)$ on which the likelihood depends, time-dependent covariates are assumed to be piecewise-constant. Models whose intensities change with time are called \emph{time-inhomogeneous}. An important special case handled by \Rpackage{msm} is the model in which intensities change at a series of times common to each individual. Marshall and Jones \cite{retino2} described likelihood ratio and Wald tests for covariate selection and testing hypotheses, for example whether the effect of a covariate is the same for all forward transitions in a disease progression model, or whether the effect on backward transitions is equal to minus the effect on forward transitions. \subsection{Hidden Markov models} \label{sec:hmm} In a {\em hidden Markov model} (HMM) the states of the Markov chain are not observed. The observed data are governed by some probability distribution (the \emph{emission} distribution) conditionally on the unobserved state. The evolution of the underlying Markov chain is governed by a transition intensity matrix $Q$ as before. (Figure \ref{fig:multi:hidden}). Hidden Markov models are mixture models, where observations are generated from a certain number of unknown distributions. However the distribution changes through time according to states of a hidden Markov chain. This class of model is commonly used in areas such as speech and signal processing \cite{juang:rabiner} and the analysis of biological sequence data \cite{biolog:seq}. In engineering and biological sequencing applications, the Markov process usually evolves over an equally-spaced, discrete `time' space. Therefore most of the theory of HMM estimation was developed for discrete-time models. HMMs have less frequently been used in medicine, where continuous time processes are often more suitable. A disease process evolves in continuous time, and patients are often monitored at irregular and differing intervals. These models are suitable for estimating population quantities for chronic diseases which have a natural staged interpretation, but which can only be diagnosed by an error-prone marker. The \Rpackage{msm} package can fit continuous-time hidden Markov models with a variety of emission distributions. \begin{figure}[htbp] \begin{center} \scalebox{0.6}{\rotatebox{270}{\includegraphics{figures/hidden}}} \caption{A hidden Markov model in continuous time. Observed states are generated conditionally on an underlying Markov process. } \label{fig:multi:hidden} \end{center} \end{figure} \subsubsection{Misclassification models} An example of a hidden Markov model is a multi-state model with misclassification. Here the observed data are states, assumed to be misclassifications of the true, underlying states. For example, consider a disease progression model with at least a disease-free and a disease state. When screening for the presence of the disease, the screening process can sometimes be subject to error. Then the Markov disease process $S_i(t)$ for individual $i$ is not observed directly, but through realisations $O_i(t)$. The quality of a diagnostic test is often measured by the probabilities that the true and observed states are equal, $Pr(O_i(t) = r | S_i(t) = r)$. Where $r$ represents a `positive' disease state, this is the {\em sensitivity}, or the probability that a true positive is detected by the test. Where $r$ represents a `negative' or disease-free state, this represents the {\em specificity}, or the probability that, given the condition of interest is absent, the test produces a negative result. As an extension to the simple multi-state model described in section \ref{sec:multistate}, the \Rpackage{msm} package can fit a general multi-state model with misclassification. For patient $i$, observation time $t_{ij}$, observed states $O_{ij}$ are generated conditionally on true states $S_{ij}$ according to a {\em misclassification matrix} $E$. This is a $n \times n$ matrix, whose $(r,s)$ entry is \begin{equation} \label{eq:misc} e_{rs} = Pr(O(t_{ij}) = s | S(t_{ij}) = r), \end{equation} which we first assume to be independent of time $t$. Analogously to the entries of $Q$, some of the $e_{rs}$ may be fixed to reflect knowledge of the diagnosis process. For example, the probability of misclassification may be negligibly small for non-adjacent states of disease. Thus the progression through underlying states is governed by the transition intensity matrix $Q$, while the observation process of the underlying states is governed by the misclassification matrix $E$. To investigate explanatory variables $w(t)$ for the probability $e_{rs}$ of misclassification as state $s$ given underlying state $r$, a multinomial logistic regression model can be used: \begin{equation} \label{eq:misccovs} \log \frac{e_{rs}(t)}{e_{rs_0}(t)} = \gamma_{rs}^T w(t). \end{equation} where $s_0$ is some baseline state, usually chosen as the underlying state, or the state with the highest probability (for numerical stability). \subsubsection{General hidden Markov model} \label{sec:hmm:general} Consider now a general hidden Markov model in continuous time. The true state of the model $S_{ij}$ evolves as an unobserved Markov process. Observed data $y_{ij}$ are generated conditionally true states $S_{ij} = 1, 2, \ldots, n$ according to a set of distributions $f_1(y | \theta_1, \gamma_1)$, $f_2(y | \theta_2, \gamma_2)$, $\ldots$, $f_n(y | \theta_n, \gamma_n)$, respectively. $\theta_r$ is a vector of parameters for the state $r$ distribution. One or more of these parameters may depend on explanatory variables through a link-transformed linear model with coefficients $\gamma_r$. \subsubsection{Likelihood for general hidden Markov models} A type of EM algorithm known as the {\em Baum-Welch} or {\em forward-backward} algorithm \cite{baum:petrie66, baum:petrie70}, is commonly used for hidden Markov model estimation in discrete-time applications. See, for example, Durbin \etal \cite{biolog:seq}, Albert \cite{albert99}. A generalisation of this algorithm to continuous time was described by Bureau \etal \cite{bureau:hughes:shiboski:00}. The \Rpackage{msm} package uses a direct method of calculating likelihoods for continuous-time models based on matrix products. This type of method has been described by Macdonald and Zucchini \cite[pp. 77--79]{macdonald:zucchini}, Lindsey \cite[p.73]{lindsey:rm} and Guttorp \cite{guttorp}. Satten and Longini \cite{sattlong} used this method to calculate likelihoods for a hidden Markov model in continuous time with observations of a continuous marker generated conditionally on underlying discrete states. Patient $i$'s contribution to the likelihood is \begin{eqnarray} \label{eq:multi:hiddencontrib} L_i & = & Pr(y_{i1}, \ldots, y_{in_i})\\ & = & \sum Pr(y_{i1}, \ldots, y_{in_i} | S_{i1}, \ldots, S_{in_i}) Pr(S_{i1}, \ldots, S_{in_i}) \nonumber \end{eqnarray} where the sum is taken over all possible paths of underlying states $S_{i1}, \ldots, S_{in_i}$. Assume that the observed states are conditionally independent given the values of the underlying states. Also assume the Markov property, $Pr(S_{ij}|S_{i,j-1}, \ldots, S_{i1}) = Pr(S_{ij}|S_{i,j-1})$. Then the contribution $L_i$ can be written as a product of matrices, as follows. To derive this matrix product, decompose the overall sum in equation \ref{eq:multi:hiddencontrib} into sums over each underlying state. The sum is accumulated over the unknown first state, the unknown second state, and so on until the unknown final state: \begin{eqnarray} \label{eq:multi:hiddenlik} L_i & = & \sum_{S_{i1}} Pr(y_{i1}|S_{i1})Pr(S_{i1}) \sum_{S_{i2}} Pr(y_{i2}|S_{i2})Pr(S_{i2}|S_{i1}) \sum_{S_{i3}} Pr(y_{i3}|S_{i3}) Pr(S_{i3}|S_{i2}) \nonumber \\ & & \ldots \sum_{S_{in_i}} Pr(y_{in_i}|S_{in_i}) Pr(S_{in_i}|S_{in_{i-1}}) \end{eqnarray} where $Pr(y_{ij}|S_{ij})$ is the emission probability density. For misclassification models, this is the misclassification probability $e_{S_{ij} O_{ij}}$. For general hidden Markov models, this is the probability density $f_{S_{ij}}(y_{ij}|\theta_{S_{ij}},\gamma_{S_{ij}})$. $Pr(S_{i,j+1}|S_{ij})$ is the $(S_{ij}, S_{i,j+1})$ entry of the Markov chain transition matrix $P(t)$ evaluated at $t = t_{i,j+1} - t_{ij}$. Let $f$ be the vector with $r$ element the product of the initial state occupation probability $Pr(S_{i1}=r)$ and $Pr(y_{i1}| r)$, and let $\mathbf 1$ be a column vector consisting of ones. For $j = 2, \ldots, n_i$ let $T_{ij}$ be the $R \times R$ matrix (where $R$ is the number of states) with $(r,s)$ entry \[ Pr(y_{ij}| s) p_{rs} (t_{ij} - t_{i,j-1}) \] Then subject $i$'s likelihood contribution is \begin{equation} L_i = f T_{i2} T_{i3}, \ldots T_{in_i} \mathbf 1 \label{eq:multi:hidden:matprod} \end{equation} If $S(t_{j}) = D$ is an absorbing state such as death, measured without error, whose entry time is known exactly, then the contribution to the likelihood is summed over the unknown state at the previous instant before death. The $(r,s)$ entry of $T_{ij}$ is then \[ p_{rs}(t_{j} - t_{j-1}) q_{s, D} \] Section \ref{sec:fitting:hmm:misc} describes how to fit multi-state models with misclassification using the \Rpackage{msm} package, and Section \ref{sec:fitting:hmm:general} describes how to apply general hidden Markov models. \subsubsection{Example of a general hidden Markov model} \label{sec:hmm:example:fev} Jackson and Sharples \cite{jackson:sharples:2002} described a model for FEV$_1$ (forced expiratory volume in 1 second) in recipients of lung transplants. These patients were at risk of BOS (bronchiolitis obliterans syndrome), a progressive, chronic deterioration in lung function. In this example, BOS was modelled as a discrete, staged process, a model of the form illustrated in Figure \ref{fig:disease}, with 4 states. State 1 represents absence of BOS. State 1 BOS is roughly defined as a sustained drop below 80\% below baseline FEV$_1$, while state 2 BOS is a sustained drop below 65\% baseline. FEV$_1$ is measured as a percentage of a baseline value for each individual, determined in the first six months after transplant, and assumed to be 100\% baseline at six months. As FEV$_1$ is subject to high short-term variability due to acute events and natural fluctuations, the exact BOS state at each observation time is difficult to determine. Therefore, a hidden Markov model for FEV$_1$, conditionally on underlying BOS states, was used to model the natural history of the disease. Discrete states are appropriate as onset is often sudden. \paragraph{Model 1} Jackson \cite{my:phd} considered models for these data where FEV$_1$ were Normally distributed, with an unknown mean and variance conditionally each state (\ref{eq:fev:normal}). This model seeks the most likely location for the within-state FEV$_1$ means. \begin{equation} \label{eq:fev:normal} y_{ij} | \{ S_{ij} = k\} \sim N(\mu_k + \beta x_{ij}, \sigma^2_k) \end{equation} \paragraph{Model 2} Jackson and Sharples \cite{jackson:sharples:2002} used a more complex two-level model for FEV$_1$ measurements. Level 1 (\ref{eq:fev:level1}) represents the short-term fluctuation error of the marker around its underlying continuous value $y^{hid}_{ij}$. Level 2 (\ref{eq:fev:level2}) represents the distribution of $y^{hid}_{ij}$ conditionally on each underlying state, as follows. \begin{equation} \label{eq:fev:level1} y_{ij} | y^{hid}_{ij} \qquad \sim N ( y^{hid}_{ij} + \beta x_{ij} , \sigma^2_\epsilon) \end{equation} \begin{equation} \label{eq:fev:level2} y^{hid}_{ij} | S_{ij} \quad \sim \quad \left\{ \begin{array}{cll} \mbox{State}& \mbox{Three state model} & \mbox{Four state model} \\ S_{ij} = 0 & N(\mu_0, \sigma^2_0)I_{[80, \infty)} & N(\mu_0, \sigma^2_0)I_{[80, \infty)} \\ S_{ij} = 1 & N(\mu_1, \sigma^2_1)I_{(0, 80)} & Uniform(65, 80) \\ S_{ij} = 2 & \mbox{(death)} & N(\mu_2, \sigma^2_2)I_{(0, 65)} \\ S_{ij} = 3 & & \mbox{(death)} \end{array} \right . \end{equation} Integrating over $y^{hid}_{ij}$ gives an explicit distribution for $y_{ij}$ conditionally on each underlying state (given in Section \ref{sec:fitting:hmm:general}, Table \ref{tab:hmm:dists}). Similar distributions were originally applied by Satten and Longini \cite{sattlong} to modelling the progression through discrete, unobserved HIV disease states using continuous CD4 cell counts. The \Rpackage{msm} package includes density, quantile, cumulative density and random number generation functions for these distributions. In both models 1 and 2, the term $\beta x_{ij}$ models the short-term fluctuation of the marker in terms of acute events. $x_{ij}$ is an indicator for the occurrence of an acute rejection or infection episode within 14 days of the observation of FEV$_1$. Section \ref{sec:fitting:hmm:general} describes how these and more general hidden Markov models can be fitted with the \Rpackage{msm} package. \clearpage \section{Fitting multi-state models with {\tt msm}} <>= options(width = 60) @ \Rpackage{msm} is a package of functions for multi-state modelling using the R statistical software. The \Rfunction{msm} function itself implements maximum-likelihood estimation for general multi-state Markov or hidden Markov models in continuous time. We illustrate its use with a set of data from monitoring heart transplant patients. Throughout this section ``\textsl{\texttt{>}}'' indicates the R command prompt, \textsl{\texttt{slanted typewriter}} text indicates R commands, and \texttt{typewriter} text R output. \subsection{Installing \tt{msm}} \label{sec:installing} The easiest way to install the \Rpackage{msm} package on a computer connected to the Internet is to run the R command: \begin{Scode} install.packages("msm") \end{Scode} This downloads \Rpackage{msm} from the CRAN archive of contributed R packages (\texttt{cran.r-project.org} or one of its mirrors) and installs it to the default R system library. To install to a different location, for example if you are a normal user with no administrative privileges, create a directory in which R packages are to be stored, say, \texttt{/your/library/dir}, and run \begin{Scode} install.packages("msm", lib='/your/library/dir') \end{Scode} After \Rpackage{msm} has been installed, its functions can be made visible in an R session by <<>>= library(msm) @ or, if it has been installed into a non-default library, \begin{Scode} library(msm, lib.loc='/your/library/dir') \end{Scode} \subsection{Getting the data in} \label{sec:datain} The data are specified as a series of observations, grouped by patient. At minimum there should be a data frame with variables indicating \begin{itemize} \item the time of the observation, \item the observed state of the process. \end{itemize} If the data do not also contain \begin{itemize} \item the subject identification number, \end{itemize} then all the observations are assumed to be from the same subject. The subject ID does not need to be numeric, but data must be grouped by subject, and observations must be ordered by time within subjects. If the model includes variables with missing values, then the corresponding observations are omitted by \Rfunction{msm} with a warning. If you have missing data, as in any statistical model, it is recommended to ensure these do not result in biases. An example data set, taken from monitoring a set of heart transplant recipients, is provided with \Rpackage{msm}. (Note: since \Rpackage{msm} version 1.3, the command \Rfunction{data(cav)} is no longer needed to load the data --- it is now ``lazy-loaded'' when required). Sharples \etal \cite{my:cav} studied the progression of coronary allograft vasculopathy (CAV), a post-transplant deterioration of the arterial walls, using these data. Risk factors and the accuracy of the screening test were investigated using multi-state Markov and hidden Markov models. The first three patient histories are shown below. There are 622 patients in all. \Robject{PTNUM} is the subject identifier. Approximately each year after transplant, each patient has an angiogram, at which CAV can be diagnosed. The result of the test is in the variable \Robject{state}, with possible values 1, 2, 3 representing CAV-free, mild CAV and moderate or severe CAV respectively. A value of 4 is recorded at the date of death. \Robject{years} gives the time of the test in years since the heart transplant. Other variables include \Robject{age} (age at screen), \Robject{dage} (donor age), \Robject{sex} (0=male, 1=female), \Robject{pdiag} (primary diagnosis, or reason for transplant - IHD represents ischaemic heart disease, IDC represents idiopathic dilated cardiomyopathy), \Robject{cumrej} (cumulative number of rejection episodes), and \Robject{firstobs}, an indicator which is 1 when the observation corresponds to the patient's transplant (the first observation), and 0 when the observation corresponds to a later angiogram. <<>>= cav[1:21,] @ A useful way to summarise multi-state data is as a frequency table of pairs of consecutive states. This counts over all individuals, for each state $r$ and $s$, the number of times an individual had an observation of state $r$ followed by an observation of state $s$. The function \Rfunction{statetable.msm} can be used to produce such a table, as follows, <<>>= statetable.msm(state, PTNUM, data=cav) @ Thus there were 148 CAV-free deaths, 48 deaths from state 2, and 55 deaths from state 3. On only four occasions was there an observation of severe CAV followed by an observation of no CAV. \subsection{Specifying a model} \label{sec:specifying:model} We now specify the multi-state model to be fitted to the data. A model is governed by a transition intensity matrix $Q$. For the heart transplant example, there are four possible states through which the patient can move, corresponding to CAV-free, mild/moderate CAV, severe CAV and death. We assume that the patient can advance or recover from consecutive states while alive, and die from any state. Thus the model is illustrated by Figure \ref{fig:disease} with four states, and we have \[ Q = \left( \begin{array}{llll} -(q_{12} + q_{14}) & q_{12} & 0 & q_{14}\\ q_{21} & -(q_{21}+q_{23}+q_{24}) & q_{23} & q_{24}\\ 0 & q_{32} & -(q_{32}+q_{34}) & q_{34}\\ 0 & 0 & 0 & 0 \\ \end{array} \right ) \] It is important to remember that this defines which \emph{instantaneous} transitions can occur in the Markov process, and that the data are \emph{snapshots} of the process (see section \ref{sec:arbitr-observ-times}). Although there were 44 occasions on which a patient was observed in state 1 followed by state 3, we can still have $q_{13}=0$. The underlying model specifies that the patient must have passed through state 2 in between, rather than jumping straight from 1 to 3. If your data represent the exact and complete transition times of the process, then you must specify \Rfunarg{exacttimes=TRUE} or \Rfunarg{obstype=2} in the call to \Rfunction{msm}. To tell \Rfunction{msm} what the allowed transitions of our model are, we define a matrix of the same size as $Q$, containing zeroes in the positions where the entries of $Q$ are zero. All other positions contain an initial value for the corresponding transition intensity. The diagonal entries supplied in this matrix do not matter, as the diagonal entries of $Q$ are defined as minus the sum of all the other entries in the row. This matrix will eventually be used as the \Rfunarg{qmatrix} argument to the \Rfunction{msm} function. For example, <<>>= Q <- rbind ( c(0, 0.25, 0, 0.25), c(0.166, 0, 0.166, 0.166), c(0, 0.25, 0, 0.25), c(0, 0, 0, 0) ) @ Fitting the model is a process of finding values of the seven unknown transition intensities: $q_{12}$, $q_{14}$, $q_{21}$, $q_{23}$, $q_{24}$, $q_{32}$, $q_{34}$, which maximise the likelihood. \subsection{Specifying initial values} \label{sec:inits} The likelihood is maximised by numerical methods, which need a set of initial values to start the search for the maximum. For reassurance that the true maximum likelihood estimates have been found, models should be run repeatedly starting from different initial values. However a sensible choice of initial values can be important for unstable models with flat or multi-modal likelihoods. For example, the transition rates for a model with misclassification could be initialised at the corresponding estimates for an approximating model without misclassification. Initial values for a model without misclassification could be set by supposing that transitions between states take place only at the observation times. If we observe $n_{rs}$ transitions from state $r$ to state $s$, and a total of $n_r$ transitions from state $r$, then $q_{rs} / q_{rr}$ can be estimated by $n_{rs} / n_r$. Then, given a total of $T_r$ years spent in state $r$, the mean sojourn time $1 / q_{rr}$ can be estimated as $T_r / n_r$. Thus, $n_{rs} / T_r$ is a crude estimate of $q_{rs}$. Such default initial values can be used by supplying \Rfunarg{gen.inits=TRUE} in the call to \Rfunction{msm} below, along with a \Rfunarg{qmatrix} whose non-zero entries represent the allowed transitions of the model. Alternatively the function \Rfunction{crudeinits.msm} could be used to get this matrix of initial values explicitly as follows. These methods are only available for non-hidden Markov models. <<>>= Q.crude <- crudeinits.msm(state ~ years, PTNUM, data=cav, qmatrix=Q) @ However, if there are are many changes of state in between the observation times, then this crude approach may fail to give sensible initial values. For the heart transplant example we could also guess that the mean period in each state before moving to the next is about 2 years, and there is an equal probability of progression, recovery or death. This gives $q_{rr} = - 0.5$ for $r = 1, 2, 3$, and $q_{12} = q_{14} = 0.25$, $q_{21} = q_{23} = q_{24} = 0.166$, $q_{32} = q_{34} = 0.25$, and the initial value matrix \Robject{Q} shown above, which we now use to fit the model. \subsection{Running \Rfunction{msm}} \label{sec:running} To fit the model, call the \Rfunction{msm} function with the appropriate arguments. For our running example, we have defined a data set \Robject{cav}, a matrix \Robject{Q} indicating the allowed transitions, and initial values. We are ready to run \Rfunction{msm}. \paragraph{Model 1: simple bidirectional model} <<>>= cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4) @ In this example the day of death is assumed to be recorded exactly, as is usual in studies of chronic diseases. At the previous instant before death the state of the patient is unknown. Thus we specify \Rfunarg{deathexact = 4}, to indicate to \Rfunction{msm} that the entry times into state 4 are observed in this manner. If the model had five states, and states 4 and 5 were two competing causes of death with times recorded exactly in this way, then we would specify \Rfunarg{deathexact = c(4,5)}. By default, the data are assumed to represent snapshots of the process at arbitrary times. However, observations can also represent exact times of transition, ``exact death times'', or a mixture of these. See the \Rfunarg{obstype} argument to \Rfunction{msm}. While the \Rfunction{msm} function runs, it searches for the maximum of the likelihood of the unknown parameters. Internally, it uses the R function \Rfunction{optim} to minimise the minus log-likelihood. When the data set, the model, or both, are large, then this may take a long time. It can then be useful to see the progress of the optimisation algorithm. To do this, we can specify a \Rfunarg{control} argument to \Rfunction{msm}, which is passed internally to the \Rfunction{optim} function. For example \texttt{control = list(trace=1, REPORT=1)}. See the help page for \Rfunction{optim}, <>= help(optim) @ for more options to control the optimisation. \footnote{Note that since version 1.3.2, \Rfunarg{method=''BFGS''}, is the default optimisation algorithm in \Rfunction{msm}, since it can use analytic derivatives, which are available for most models.} When completed, the \Rfunction{msm} function returns a value. This value is a list of the important results of the model fitting, including the parameter estimates and their covariances. To keep these results for post-processing, we store them in an R object, here called \Robject{cav.msm}. When running several similar \Rfunction{msm} models, it is recommended to store the respective results in informatively-named objects. \subsection{Showing results} To show the maximum likelihood estimates and 95\% confidence intervals, type the name of the fitted model object at the R command prompt. \footnote{This is equivalent to typing \texttt{print.msm(cav.msm)}. The function \Rfunction{print.msm} formats the important information in the model object for printing on the screen.} The confidence level can be changed using the \Rfunarg{cl} argument to \Rfunction{msm}. <<>>= cav.msm @ From the estimated intensities, we see patients are three times as likely to develop symptoms than die without symptoms (transitions from state 1). After disease onset (state 2), progression to severe symptoms (state 3) is 50\% more likely than recovery. Once in the severe state, death is more likely than recovery, and a mean of 1 / -0.44 = 2.3 years is spent in state 3 before death or recovery. Section \ref{sec:extractor} describes various functions that can be used to obtain summary information from the fitted model. \subsection{Covariates on the transition rates} \label{sec:msm:covariates} We now model the effect of explanatory variables on the rates of transition, using a proportional intensities model. Now we have an intensity matrix $Q(z)$ which depends on a covariate vector $z$. For each entry of $Q(z)$, the transition intensity for patient $i$ at observation time $j$ is $q_{rs}(z_{ij}) = q_{rs}^{(0)} \exp(\beta_{rs}^T z_{ij})$. The covariates $z$ are specified through the \Rfunarg{covariates} argument to \Rfunction{msm}. If $z_{ij}$ is time-dependent, we assume it is constant in between the observation times of the Markov process. \Rfunction{msm} calculates the probability for a state transition from times $t_{i,j-1}$ to $t_{ij}$ using the covariate value at time $t_{i,j-1}$. We consider a model with just one covariate, female sex. Out of the 622 transplant recipients, 535 are male and 87 are female. By default, all linear covariate effects $\beta_{rs}$ are initialised to zero. To specify different initial values, use a \Rfunarg{covinits} argument, as described in \Rfunction{help(msm)}. Initial values given in the \Rfunarg{qmatrix} represent the intensities with covariate values set to their means in the data. In the following model, all transition intensities are modelled in terms of sex. \paragraph{Model 2: sex as a covariate} <<>>= cavsex.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4, covariates = ~ sex) @ Printing the \Robject{msm} object now displays the estimated covariate effects and their confidence intervals (note since version 1.3.2 these are \emph{hazard ratios} $\exp(\beta_{rs})$, not \emph{log hazard ratios} $\beta_{rs}$ as in previous versions). <<>>= cavsex.msm @ The sizes of the confidence intervals for some of the hazard ratios suggests there is no information in the data about the corresponding covariate effects, leading to a likelihood that is a flat function of these parameters, and this model should be simplified. The first column shown in the output is the estimated transition intensity matrix $q_{rs}(z) = q_{rs}^{(0)} \exp(\beta_{rs}^T z)$ with the covariate $z$ set to its mean value in the data. This represents an average intensity matrix for the population of 535 male and 87 female patients. To extract separate intensity matrices for male and female patients ($z = 0$ and $1$ respectively), use the function \Rfunction{qmatrix.msm}, as shown below. This and similar summary functions will be described in more detail in section \ref{sec:extractor}. <<>>= qmatrix.msm(cavsex.msm, covariates=list(sex=0)) # Male qmatrix.msm(cavsex.msm, covariates=list(sex=1)) # Female @ Since \Rpackage{msm} version 1.2.3, different transition rates may be easily modelled on different covariates by specifying a named list of formulae as the \Rfunarg{covariates} argument. Each element of the list has a name identifying the transition. In the model below, the transition rate from state 1 to state 2 and the rate from state 1 to state 4 are each modelled on sex as a covariate, but no other intensities have covariates on them. \paragraph{Model 2a: transition-specific covariates} <>= cavsex.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4, covariates = list("1-2" = ~ sex, "1-4" = ~sex) ) @ We may also want to constrain the effect of a covariate to be equal for certain transition rates, to reduce the number of parameters in the model, or to investigate hypotheses on the covariate effects. A \Rfunarg{constraint} argument can be used to indicate which of the transition rates have common covariate effects. \paragraph{Model 3: constrained covariate effects} <>= cav3.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4, covariates = ~ sex, constraint = list(sex=c(1,2,3,1,2,3,2)) ) @ This constrains the effect of sex to be equal for the progression rates $q_{12}, q_{23}$, equal for the death rates $q_{14}, q_{24}, q_{34}$, and equal for the recovery rates $q_{21}, q_{32}$. The intensity parameters are assumed to be ordered by reading across the rows of the transition matrix, starting at the first row: ($q_{12}, q_{14}, q_{21}, q_{23}, q_{24}, q_{32}, q_{34}$), giving constraint indicators \Rfunarg{(1,2,3,1,2,3,2)}. Any vector of increasing numbers can be used for the indicators. Negative entries can be used to indicate that some effects are equal to minus others: \Rfunarg{(1,2,3,-1,2,3,2)} sets the fourth effect to be minus the first. In a similar manner, we can constrain some of the baseline transition intensities to be equal to one another, using the \Rfunarg{qconstraint} argument. For example, to constrain the rates $q_{12}$ and $q_{23}$ to be equal, and $q_{24}$ and $q_{34}$ to be equal, specify \Rfunarg{qconstraint = c(1,2,3,1,4,5,4)}. \subsection{Fixing parameters at their initial values} For exploratory purposes we may want to fit a model assuming that some parameters are fixed, and estimate the remaining parameters. This may be necessary in cases where there is not enough information in the data to be able to estimate a proposed model, and we have strong prior information about a certain transition rate. To do this, use the \Rfunarg{fixedpars} argument to \Rfunction{msm}. For model 1, the following statement fixes the parameters numbered 6, 7, that is, $q_{32}$, $q_{34}$, to their initial values (0.25 and 0.25, respectively). \paragraph{Model 4: fixed parameters} <>= cav4.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = Q, deathexact = 4, control = list(trace=2, REPORT=1), fixedpars = c(6, 7) ) @ A \Rfunarg{fixedpars} statement can also be used for fixing covariate effect parameters to zero, that is to assume no effect of a covariate on a certain transition rate. \subsection{Extractor functions} \label{sec:extractor} We may want to extract some of the information from the \Rfunction{msm} model fit for post-processing, for example for plotting graphs or generating summary tables. A set of functions is provided for extracting interesting features of the fitted model. \begin{description} \item[Intensity matrices] The function \Rfunction{qmatrix.msm} extracts the estimated transition intensity matrix and its confidence intervals for a given set of covariate values, as shown in section \ref{sec:msm:covariates}. Confidence intervals are calculated from the covariance matrix of the estimates by assuming the distribution is symmetric on the log scale. Standard errors for the intensities are also available from the object returned by \Rfunction{qmatrix.msm}. These are calculated by the delta method. The \Rpackage{msm} package provides a general-purpose function \Rfunction{deltamethod} for estimating the variance of a function of a random variable $X$ given the expectation and variance of $X$. See \texttt{help(deltamethod)} for further details. Bootstrap confidence intervals are also available for \Rfunction{qmatrix.msm} and for most output functions; these are often more accurate, at the cost of computational time. For more about bootstrapping in \Rpackage{msm}, see Section \ref{sec:boot}. \item[Transition probability matrices] The function \Rfunction{pmatrix.msm} extracts the estimated transition probability matrix $P(t)$ within a given time. For example, for model 1, the 10 year transition probabilities are given by: <<>>= pmatrix.msm(cav.msm, t=10) @ Thus, a typical person in state 1, disease-free, has a probability of 0.5 of being dead ten years from now, a probability of 0.3 being still disease-free, and probabilities of 0.1 of being alive with mild/moderate or severe disease, respectively. This assumes $Q$ is constant within the desired time interval. For non-homogeneous processes, where $Q$ varies with time-dependent covariates but can be approximated as piecewise constant, there is an equivalent function \Rfunction{pmatrix.piecewise.msm}. Consult its help page for further details. If \Rfunarg{ci=''norm''} is specified, then a confidence interval is calculated based on drawing a random sample (default size 1000) from the assumed multivariate normal distribution of the maximum likelihood estimates and covariance matrix, and transforming. If \Rfunarg{ci=''boot''} is specified, then a bootstrap confidence interval for the transition probability matrix is calculated (see Section \ref{sec:boot}) . However, both of these are computationally intensive, particularly the bootstrap method, so no confidence interval is calculated by default. \item[Mean sojourn times] The function \Rfunction{sojourn.msm} extracts the estimated mean sojourn times in each transient state $r$, for a given set of covariate values. This is calculated as $-1 / \hat q_{rr}$, where $\hat q_{rr}$ is the $r$th diagonal entry of the estimated transition intensity matrix. <<>>= sojourn.msm(cav.msm) @ \item[Probability that each state is next] The function \Rfunction{pnext.msm} extracts the matrix of probabilities $-q_{rs} / q_{rr}$ that the next state after state $r$ is state $s$, for each $r$ and $s$. Together with the mean sojourn times, this gives a more intuitive parameterisation of a continuous-time Markov model than the raw transition intensities $q_{rs}$. Note these are different from the transition probabilities in a given time $t$ returned by \Rfunction{pmatrix.msm}. <<>>= pnext.msm(cav.msm) @ \item[Total length of stay] Mean sojourn times describe the average period in a single stay in a state. For processes with successive periods of recovery and relapse, we may want to forecast the total time spent healthy or diseased, before death. The function \Rfunction{totlos.msm} estimates the forecasted total length of time spent in each transient state $s$ between two future time points $t_1$ and $t_2$, for a given set of covariate values. This defaults to the expected amount of time spent in each state between the start of the process (time 0, the present time) and death or a specified future time. This is obtained as \[ L_s = \int_{t_1}^{t_2} P(t)_{r,s} dt \] where $r$ is the state at the start of the process, which defaults to 1. This is calculated using numerical integration. For model 1, each patient is forecasted to spend 8.8 years disease free, 2.2 years with mild or moderate disease and 1.8 years with severe disease. Bootstrap and asymptotic confidence intervals are available, as for \Rfunction{pmatrix.msm}, but are not calculated by default. <<>>= totlos.msm(cav.msm) @ \item[Expected first passage times] The function \Rfunction{efpt.msm} estimates the expected time until the process first enters a given state or set of states, also called the ``hitting time''. See its help page for further details. \item[Expected number of visits] The function \Rfunction{envisits.msm} estimates the expected number of visits to a state, computed in a similar way to the total length of stay. See its help page for further details. \item[Ratio of transition intensities] The function \Rfunction{qratio.msm} estimates a ratio of two entries of the transition intensity matrix at a given set of covariate values, together with a confidence interval estimated assuming normality on the log scale and using the delta method. For example, we may want to estimate the ratio of the progression rate $q_{12}$ into the first state of disease to the corresponding recovery rate $q_{21}$. For example in model 1, recovery is 1.8 times as likely as progression. <<>>= qratio.msm(cav.msm, ind1=c(2,1), ind2=c(1,2)) @ \item[Hazard ratios for transition] The function \Rfunction{hazard.msm} gives the estimated hazard ratios corresponding to each covariate effect on the transition intensities. 95\% confidence limits are computed by assuming normality of the log-effect. <<>>= hazard.msm(cavsex.msm) @ \end{description} \paragraph{Setting covariate values} All of these extractor functions take an argument called \Rfunarg{covariates}. If this argument is omitted, for example, <>= qmatrix.msm(cav.msm) @ then the intensity matrix is evaluated as $Q(\bar x)$ with all covariates set to their mean values $\bar x$ in the data. For factor / categorical variables, the mean of the 0/1 dummy variable for each factor level is used, representing an average over all values in the data, rather than a specific factor level. Alternatively, set \Rfunarg{covariates} to 0 to return the result $Q(0)$ with covariates set to zero. This will usually be preferable for categorical covariates, where we wish to see the result for the baseline category. <>= qmatrix.msm(cavsex.msm, covariates = 0) @ Alternatively, the desired covariate values can be specified explicitly as a list, <>= qmatrix.msm(cavsex.msm, covariates = list(sex = 1)) @ Values of categorical covariates must be quoted. For example, consider a covariate \texttt{smoke}, representing tobacco smoking status, with three levels, \texttt{NON, CURRENT, EX}, representing a non-smoker, current smoker or ex-smoker. \begin{Scode} qmatrix.msm(example.msm, covariates = list(age = 60, smoke=''CURRENT'')) \end{Scode} \subsection{Survival plots} In studies of chronic disease, an important use of multi-state models is in predicting the probability of survival for patients in increasingly severe states of disease, for some time $t$ in the future. This can be obtained directly from the transition probability matrix $P(t)$. The \Rfunction{plot} method for \Robject{msm} objects produces a plot of the expected probability of survival against time, from each transient state. Survival is defined as not entering the final absorbing state. <>= plot(cav.msm, legend.pos=c(8, 1)) @ This shows that the 10-year survival probability with severe CAV is approximately 0.1, as opposed to 0.3 with mild CAV and 0.5 without CAV. With severe CAV the survival probability diminishes very quickly to around 0.3 in the first five years after transplant. The \Rfunarg{legend.pos} argument adjusts the position of the legend in case of clashes with the plot lines. A \Rfunarg{times} argument can be supplied to indicate the time interval to forecast survival for. A more sophisticated analysis of these data might explore competing causes of death from causes related or unrelated to the disease under study. \subsection{Bootstrapping} \label{sec:boot} Most of \Rpackage{msm}'s output functions present confidence intervals based on asymptotic standard errors calculated from the Hessian, or transformations of these using the delta method. The asymptotic standard errors are expected to be underestimates of the true standard errors (Cramer-Rao lower bound). For some output functions, such as \Rfunction{pmatrix.msm}, and functions based on \Rfunction{pmatrix.msm} such as \Rfunction{totlos.msm} and \Rfunction{prevalence.msm}, the delta method cannot be used at all to obtain standard errors. In these cases, confidence intervals can be calculated by drawing a random sample from the assumed multivariate normal distribution of the maximum likelihood estimates and covariance matrix, and transforming. However, this is still based on potentially inaccurate asymptotic theory. The \Rpackage{msm} package provides the function \Rfunction{boot.msm} to enable bootstrap refitting of \Rfunction{msm} models, an alternative way to estimate uncertainty. For non-hidden Markov models, a bootstrap dataset is drawn by resampling pairs of consecutive states from the full data, i.e. \emph{transitions}. These are assumed to be independent when calculating the likelihood (Section \ref{sec:multi:likelihood}). For hidden Markov models and models with censoring, a bootstrap dataset is drawn by resampling complete series from independent subjects. The bootstrap datasets have the same number of transitions, or subjects, respectively, as the original data. For most output extractor functions provided with \Rpackage{msm}, the option \Rfunarg{ci=''boot''} is available, as a wrapper around \Rfunction{boot.msm}, to enable bootstrap confidence intervals to be calculated. But any user-defined output statistic can be bootstrapped, as follows. The function \Rfunction{boot.msm} is called with the fitted \Rfunction{msm} model as first argument, and an R function specifying the statistic to be bootstrapped as the second argument \texttt{stat}. The return value from \Rfunction{boot.msm} is a list of \texttt{B} replicates (by default, \texttt{B=1000}) of the desired statistic. For example, to bootstrap the transition intensity matrix of the heart transplantation model \Robject{cav.msm}: \begin{Scode} q.list <- boot.msm(cav.msm, stat=function(x){qmatrix.msm(x)$estimates}) \end{Scode} Note that for \Rfunction{boot.msm} to be able to refit the original model that produced \Robject{cav.msm}, all objects used in the original model fit (for example, in this case, \Robject{Q}) must be in the working environment. Otherwise, \Rfunction{boot.msm} will give an ``object not found'' error. The user can then summarise these replicates by calculating empirical standard deviations or quantile-based intervals. In this example, \Robject{q.list} is a list of 1000 4$\times$4 matrices. The following code calculates the bootstrap standard error as the empirical standard deviation of the 1000 replicates, and a similar 95\% bootstrap confidence interval. \begin{Scode} q.array <- array(unlist(q.list), dim=c(4,4,1000)) apply(q.array, c(1,2), sd) apply(q.array, c(1,2), function(x)quantile(x, c(0.025, 0.975))) \end{Scode} Note that when bootstrapping, the refits of the model to the resampled datasets may occasionally fail to converge (as discussed in Section \ref{sec:failure}) even if the original model fit did converge. In these cases, a warning is given, but \Rfunction{boot.msm} simply discards the failed dataset and moves on to the next bootstrap iteration. Unless convergence failure occurs for a large proportion of iterations, this should not affect the accuracy of the final bootstrap confidence intervals. \subsection{Convergence failure} \label{sec:failure} Inevitably if over-complex models are applied with insufficient data then the parameters of the model will not be identifiable. This will result in the optimisation algorithm failing to find the maximum of the log-likelihood, or even failing to evaluate the likelihood. For example, it will commonly be inadvisable to include several covariates in a model simultaneously. In some circumstances, the optimisation may report convergence, but fail to calculate any standard errors. In these cases, the Hessian of the log-likelihood at the reported solution is not positive definite. Thus the reported solution may be a saddle point rather than the maximum likelihood, or it may be close to the maximum. \begin{description} \item[Model simplification] Firstly, make sure there are not too many parameters in the model. There may not be enough information in the data on a certain transition rate. It is recommended to count all the pairs of transitions between states in successive observation times, making a frequency table of previous state against current state (function \Rfunction{statetable.msm}), and do this for any subgroups defining covariates. Although the data are a series of snapshots of a continuous-time process, and the actual transitions take place in between the observation times, this type of table may still be helpful. If there are not many observed `transitions' from state 2 to state 4, for example, then the data may be insufficient to estimate $q_{24}$. For a staged disease model (Figure \ref{fig:disease}), the number of disease states should be low enough that all transition rates can be estimated. Consecutive states of disease severity should be merged if necessary. If it is realistic, consider applying constraints on the intensities or the covariate effects so that the parameters are equal for certain transitions, or zero for certain transitions. Be careful to use a observation scheme and transition matrix appropriate to your data (see Section \ref{sec:arbitr-observ-times}). By default, \Rfunction{msm} assumes that the data represent snapshots of the process, and the true state is unknown between observation times. In such circumstances, it is rarely feasible to estimate an intensity matrix with \emph{instantaneous} transitions allowed between every pair of states. This would be easier if the complete course of the process is known \Rfunarg{(exacttimes = TRUE)} in the call to \Rfunction{msm}. Understand the difference between \emph{instantaneous} and \emph{interval} transitions - although individuals may be in state 1 at time $t_r$, and state 3 at time $t_{r+1}$, that doesn't mean that instantaneous transitions from 1 to 3 should be permitted. \item[Initial values] Make sure that a sensible set of initial values have been chosen. The optimisation may only converge within a limited range of `informative' initial values. It is also sensible to run the model for several different initial values to ensure that the estimation has converged to a global rather than a local optimum. \item[Scaling] It is often necessary to apply a scaling factor to normalise the likelihood (\Rfunarg{fnscale}), or certain individual parameters \Rfunarg{(parscale)}. This may prevent overflow or underflow problems within the optimisation. For example, if the value of the -2 $\times$ log-likelihood is around 5000, then the following option leads to an minimisation of the -2 $\times$ log-likelihood on an approximate unit scale: \Rfunarg{control = list(fnscale = 5000)}. % Though since version 1.4.1, \Rfunarg{fnscale} is applied automatically using the likelihood at the initial values, unless the user has already supplied it. % If not provided by the user, \code{control=list(fnscale = a)} is % applied automatically to normalise the optimisation, where \code{a} % is the minus twice log likelihood at the initial values. It is also advisable to analyse all variables, including covariates and the time unit, on a roughly normalised scale. For example, working in terms of a time unit of months or years instead of days, when the data range over thousands of days. \item[Convergence criteria] ``False convergence'', in which \Rfunction{optim()} reports convergence of the optimisation but the Hessian is not positive definite, can sometimes be solved by tightening the criteria (\Rfunarg{reltol}, defaults to \texttt{1e-08}) for reporting convergence. For example, \Rfunarg{control = list(reltol = 1e-16)}. Alternatively consider using smaller step sizes for the numerical approximation to the gradient, used in calculating the Hessian. This is given by the control parameter \Rfunarg{ndeps}. For example, for a model with 5 parameters, \Rfunarg{control = list(ndeps = rep(1e-6, 5))} \item[Choice of algorithm] By default, since version 1.3.2, \Rfunction{msm} uses the BFGS method of \Rfunction{optim}, which makes use of analytic derivatives. Analytic derivatives are available for all models in msm, apart from hidden Markov models with unknown initial state probabilities, misclassification models with equality constraints on misclassification probabilities, and truncated or measurement-error outcome distributions. This speeds up optimisation. Though alternative algorithms are available such as \Rfunarg{method = ``CG''}. Or use the \Rfunction{nlm} R function via \Rfunarg{msm(..., opt.method = "nlm" , ...)} Note also the Fisher scoring method available for non-hidden Markov models for panel data, via \Rfunarg{msm(..., opt.method = "fisher", ...)}, is expected to be faster than the generic methods, but less robust to bad initial values. Or since version 1.3.2, msm can also use \Rfunarg{method=``bobyqa''} from the \Rpackage{minqa} package, a fast derivative-free method. \item[\Rfunction{optim} "function cannot be evaluated at initial parameters"] To diagnose this problem, run \Rfunction{msm} again with \Rfunarg{fixedpars=TRUE} set, to calculate the -2 log-likelihood at the initial values. This will probably be \Robject{Inf}. To show the contributions of individual subjects to the overall log likelihood, call \Rfunction{logLik.msm(x, by.subject=TRUE)}, where \Robject{x} is the fitted model object. If only a few subjects give an infinite log-likelihood, then you can check whether their state histories are particularly unusual and conflict with the model. For example, they might appear to make unusually large jumps between states in short periods of time. For models with misclassification, note that the default true initial state distribution \Rfunarg{initprobs} puts all individuals in true state 1 at their first observation. If someone starts in a much higher state, this may result in an infinite log-likelihood, and changing \Rfunarg{initprobs} would be sensible. \end{description} \subsection{Model assessment} \label{sec:model-assessment} \paragraph{Observed and expected prevalence} To compare the relative fit of two nested models, it is easy to compare their likelihoods. However it is not always easy to determine how well a fitted multi-state model describes an irregularly-observed process. Ideally we would like to compare observed data with fitted or expected data under the model. If there were times at which all individuals were observed then the fit of the expected numbers in each state or {\em prevalences} can be assessed directly at those times. Otherwise, some approximations are necessary. We could assume that an individual's state at an arbitrary time $t$ was the same as the state at their previous observation time. This might be fairly accurate if observation times are close together. This approach is taken by the function \Rfunction{prevalence.msm}, which constructs a table of observed and expected numbers and percentages of individuals in each state at a set of times. A set of expected counts can be produced if the process begins at a common time for all individuals. Suppose at this time, each individual is in state 0. Then given $n(t)$ individuals are under observation at time $t$, the expected number of individuals in state $r$ at time $t$ is $n(t) P(t)_{0,r}$. If the covariates on which $P(t)$ depends vary between individuals, then this can be averaged over the covariates observed in the data. For example, we calculate the observed and expected numbers and percentages at two-yearly intervals up to 20 years after transplant, for the heart transplant model \Rfunction{cav.msm}. The number of individuals still alive and under observation decreases from 622 to 251 at year 20. The observed and expected percentages are plotted against time. <<>>= options(digits=3) prevalence.msm(cav.msm, times=seq(0,20,2)) @ <>= plot.prevalence.msm(cav.msm, mintime=0, maxtime=20) @ Comparing the observed and expected percentages in each state, we see that the predicted number of individuals who die (State 4) is under-estimated by the model from about year 8 onwards. Similarly the number of individuals sill alive and free of CAV (State 1) is over-estimated by the model from about year 8 onwards. Such discrepancies could have many causes. One possibility is that the transition rates vary with the time since the beginning of the process, the age of the patient, or some other omitted covariate, so that the Markov model is {\em non-homogeneous}. This could be accounted for by modelling the intensity as a function of age, for example, such as a piecewise-constant function. The \Rfunarg{pci} argument to \Rfunction{msm} can be used to automatically construct models with transition intensities which are piecewise-constant in time. In this example, the hazard of death may increase with age, so that the model underestimates the number of deaths when forecasting far into the future. Another cause of poor model fit may sometimes be the failure of the Markov assumption. That is, the transition intensities may depend on the time spent in the current state (a semi-Markov process) or other characteristics of the process history. Accounting for the process history is difficult as the process is only observed through a series of snapshots. Semi-Markov models may in principle be fitted to this type of data using phase-type distributions. Since version 1.4.1 the \Rfunarg{phase.states} option to \Rfunction{msm} can be used to define some phase-type models. See \Rfunction{help(msm)} for further details. However, if it is known that individuals who died would not have been followed up after a certain time, had they survived to that time, then they should not be included in the observed prevalence of the death state after that time. This can be accounted for by passing a vector of maximum potential follow-up times, one for each individual in the same order as the original data, in the \Rfunarg{censtime} argument to \Rfunction{prevalence.msm}. Ignoring the potential follow-up times is likely to have resulted in overestimates of the number of deaths at later times for the ``observed'' prevalences in the CAV example, though these times are not available in the data supplied with \Rpackage{msm}. \paragraph{Pearson-type goodness-of-fit test} \label{sec:pearson} Suppose that the true transition times are unknown, and data consist of observations of the process at arbitrary times which differ between individuals (panel data). Assessing goodness of fit by prevalence counts then involves estimating the observed prevalence at a series of points by some form of interpolation. This is only advisable if observation times are close together. An alternative method of assessing goodness-of-fit is to construct tables of observed and expected numbers of transitions, as described by Aguirre-Hernandez and Farewell \cite{ahf}. This leads to a formal test of goodness-of-fit, analogous to the classical Pearson $\chi^2$ test for contingency tables. The tables are constructed as follows. Each pair of successive observations in the data (\emph{transition}) is classified by \begin{itemize} \item the starting state $r$ and finishing state $s$, \item time between the start of the process and the first of the pair of observations (indexed by $h$), \item time interval between the observations (indexed by $l_h$, within categories $h$), \item (if there are fitted covariates) the impact of covariates, as summarised by $q_{rr}$ (indexed by $c$), \item any other grouping of interest for diagnosing lack of fit (indexed by $g$). \end{itemize} Groupings of continuous quantities are normally defined by quantiles, so that there are a similar number of observed transitions in each (one-dimensional) category. The observed and expected numbers of transitions in each group are then defined by \[ o_{hl_h rscg} = \sum I(S(t_{i,j+1}) = s, S(t_{ij}) = r) \] \[ e_{hl_h rscg} = \sum P(S(t_{i,j+1}) = s | S(t_{ij}) = r) \] where $I(A)$ is the indicator function for an event $A$ and the summation is over the set of transitions in the category defined by $h,l_h,c,g$, over all individuals $i$. The Pearson-type test statistic is then \[ T = \sum_{hl_h rscg} \frac{(o_{hl_h rscg} - e_{hl_h rscg})^2}{e_{hl_h rscg}} \] The classical Pearson test statistic is distributed as $\chi^2_{n-p}$, where $n$ is the number of independent cells in the table and $p$ is the number of estimated parameters $p$. But the null distribution of $T$ is not exactly $\chi^2$, since the time intervals are non-identical, therefore the observed transitions are realizations from a set of independent but non-identical multinomial distributions. Titman \cite{titman:asympnull} showed that the null distribution of $T$ is asymptotically approximated by a weighted sum of $\chi^2_1$ random variables. Aguirre-Hernandez and Farewell \cite{ahf} also showed that $\chi^2_{n-p}$ is a good approximation if there are no fitted covariates. For models with covariates, the null mean of $T$ is higher than $n - p$, but lower than $n$. Therefore, upper and lower bounds for the true $p$-value of the statistic can be obtained from the $\chi^2_{n-p}$ and $\chi^2_n$ distributions. Aguirre-Hernandez and Farewell \cite{ahf} also described a bootstrap procedure for obtaining an accurate $p$-value. Titman and Sharples \cite{titman:sharples} described modifications to the test to correct for the biases introduced where in addition to the panel-data observation scheme: \begin{itemize} \item Times of death are known exactly. In this case, transitions ending in death are classified according to the next scheduled observation time after the death, which is estimated by multiple imputation from a Kaplan-Meier estimate of the distribution of time intervals between observations. \item An individual's final observation is censored, so that they are only known to be alive at that point. \item States are misclassified. \end{itemize} The \Rpackage{msm} package provides the function \Rfunction{pearson.msm} to perform the Pearson-type test. By default, three groups are used for each of $h$, $l_h$ and $c$. Often the number of groups will need to be reduced in cases where the resulting contingency tables are sparse (thus there are several low expected counts and the variance of $T$ is inflated). The test is now performed on the model \Robject{cav.msm} for the heart transplant dataset (a version of which was also analysed by Titman and Sharples \cite{titman:sharples}). The default three interval groups are used, and two groups of the time since the start of the process. The \Rfunarg{transitions} argument groups the transitions from state 3 to each of states 1, 2 and 3 (the 9th, 10th and 11th transitions) together in the table, since these transitions are infrequent. <<>>= options(digits=2) pearson.msm(cav.msm, timegroups=2, transitions=c(1,2,3,4,5,6,7,8,9,9,9,10)) @ The first two tables in the output show the contingency tables of observed and expected numbers of transitions. Note that the observed number of transitions in certain categories is not a whole number, since these are averaged over multiple imputations of the next scheduled observation time following deaths. The column \texttt{Time} is the group defined by time since the start of the process, and the column \texttt{Interval} is the group defined by intervals between observations. The columns indicate the allowed transitions, or pairs of states which can be observed in successive observations. The third table presents the ``deviance'', the value of $\frac{(o_{hl_h rscg} - e_{hl_h rscg})^2}{e_{hl_h rscg}}$ for each cell, multipled by the sign of $o_{hl_h rscg} - e_{hl_h rscg}$ to indicate whether there were more or fewer transitions than expected in each cell. These can indicate areas of bad fit. For example, systematic changes in deviance by time or time interval between observations can indicate that a model with time-varying transition intensities is more suitable. Changes in deviance by covariate impact may indicate heterogeneity between individuals which is unexplained by the fitted covariates. Changes in deviance with the length of the interval between observations may also indicate failure of the Markov assumption, and that a semi-Markov model (in which intensities depend on the time spent in the current state) may fit better. In this example, the test statistic is 100. \Robject{p.upper} is an upper bound for the $p$-value of the statistic based on an asymptotic $\chi^2_{42}$ distribution, therefore the model does not fit well. It is not clear from the table of deviances which aspects of the fit are most influental to the test statistic. However, the two-way Markov model itself is not biologically plausible, as discussed in Section \ref{sec:fitting:hmm:misc}. For non-hidden Markov models for panel data, \Rfunction{pearson.msm} also presents the accurate analytic p-value of Titman \cite{titman:asympnull}. For all models, \Rfunction{pearson.msm} provides an option for parametric bootstrapping to obtain an accurate p-value. \subsection{Fitting misclassification models with \Rpackage{msm}} \label{sec:fitting:hmm:misc} In fact, in the heart transplant example from section \ref{sec:datain}, it is not medically realistic for patients to recover from a diseased state to a healthy state. Progression of coronary artery vasculopathy is thought to be an irreversible process. The angiography scan for CAV is actually subject to error, which leads to some false measurements of CAV states and apparent recoveries. Thus we account for misclassification by fitting a \emph{hidden Markov model} using \Rpackage{msm}. Firstly we replace the two-way multi-state model by a one-way model with transition intensity matrix \[ Q = \left( \begin{array}{llll} -(q_{12} + q_{14}) & q_{12} & 0 & q_{14}\\ 0 & -(q_{23}+q_{24}) & q_{23} & q_{24}\\ 0 & 0 & -q_{34} & q_{34}\\ 0 & 0 & 0 & 0 \\ \end{array} \right ) \] We also assume that true state 1 (CAV-free) can be classified as state 1 or 2, state 2 (mild/moderate CAV) can be classified as state 1, 2 or 3, while state 3 (severe CAV) can be classified as state 2 or 3. Recall that state 4 represents death. Thus our matrix of misclassification probabilities is \[ E = \left( \begin{array}{llll} 1 - e_{12} & e_{12} & 0 & 0 \\ e_{21} & 1 - e_{21} - e_{23} & e_{23} & 0 \\ 0 & e_{32} & 1 - e_{32} & 0 \\ 0 & 0 & 0 & 0\\ \end{array} \right) \] with underlying states as rows, and observed states as columns. To model observed states with misclassification, we define a matrix \Rfunarg{ematrix} indicating the states that can be misclassified. Rows of this matrix correspond to true states, columns to observed states. It should contains zeroes in the positions where misclassification is not permitted. Non-zero entries are initial values for the corresponding misclassification probabilities. We then call \Rfunction{msm} as before, but with this matrix as the \Rfunarg{ematrix} argument. Initial values of 0.1 are assumed for each of the four misclassification probabilities $e_{12}, e_{21}, e_{23}, e_{32}$. Zeroes are given where the elements of $E$ are zero. The diagonal elements supplied in \Rfunarg{ematrix} are ignored, as rows must sum to one. The matrix \Rfunarg{qmatrix}, specifying permitted transition intensities and their initial values, also changes to correspond to the new $Q$ representing the progression-only model for the underlying states. The true state for every patient at the date of transplant is known to be ``CAV-free'', not misclassified. To indicate this we use the argument \Rfunarg{obstrue} to \Rfunction{msm}. This is set to be a variable in the dataset, \Rfunarg{firstobs}, indicating where the observed state equals the true state. This takes the value of 1 at the patient's first observation, at the transplant date, and 0 elsewhere. We use an alternative quasi-Newton optimisation algorithm \Rfunarg{(method="BFGS")} which can often be faster or more robust than the default Nelder-Mead simplex-based algorithm. An optional argument \Rfunarg{initprobs} could also have been given here, representing the vector of the probabilities of occupying each true state at the initial observation (equation \ref{eq:multi:hidden:matprod}). This can also be a matrix with number of rows equal to the number of subjects, if these probabilities are subject-dependent and known. If not given, all individuals are assumed to be in true state 1 at their initial observation. If \Rfunarg{est.initprobs=TRUE} is specified, then these probabilites are estimated as part of the model fit, using a vector \Rfunarg{initprobs} as initial values. Covariate effects on these probabilities can also be estimated using a multinomial logistic regression model, if an \Rfunarg{initcovariates} argument is specified. See \Rfunction{help(msm)} for further details. \paragraph{Model 5: multi-state model with misclassification} <<>>= Qm <- rbind(c(0, 0.148, 0, 0.0171), c(0, 0, 0.202, 0.081), c(0, 0, 0, 0.126), c(0, 0, 0, 0)) ematrix <- rbind(c(0, 0.1, 0, 0), c(0.1, 0, 0.1, 0), c(0, 0.1, 0, 0), c(0, 0, 0, 0)) cavmisc.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = Qm, ematrix = ematrix, deathexact = 4, obstrue = firstobs) cavmisc.msm @ Thus there is an estimated probability of about 0.03 that mild/moderate CAV will be diagnosed erroneously, but a rather higher probability of 0.17 that underlying mild/moderate CAV will be diagnosed as CAV-free. Between the two CAV states, the mild state will be misdiagnosed as severe with a probability of 0.06, and the severe state will be misdiagnosed as mild with a probability of 0.12. The model also estimates the progression rates through underlying states. An average of 8 years is spent disease-free, an average of about 3 years is spent with mild/moderate disease, and periods of severe disease also last about 3 years on average before death. \subsection{Effects of covariates on misclassification rates} We can investigate how the probabilities of misclassification depend on covariates in a similar way to the transition intensities, using a \Rfunarg{misccovariates} argument to \Rfunction{msm}. For example, we now include female sex as a covariate for the misclassification probabilities. The linear effects on the log odds of each misclassified state relative to the true state are initialised to zero by default (but this can be changed with the \Rfunarg{misccovinits} argument). \paragraph{Model 6: misclassification model with misclassification probabilities modelled on sex} <<>>= cavmiscsex.msm <- msm(state ~ years, subject = PTNUM, data = cav, qmatrix = Qm, ematrix = ematrix, deathexact = 4, misccovariates = ~sex, obstrue=firstobs) @ <<>>= cavmiscsex.msm @ The large confidence interval for the odds ratio for 1/2 misclassification suggests there is no information in the data about the difference between genders in the false positive rates for angiography. On the other hand, women have slightly more false negatives. \subsection{Extractor functions} As well as the functions described in section \ref{sec:extractor} for extracting useful information from fitted models, there are a number of extractor functions specific to models with misclassification. \begin{description} \item[Misclassification matrix] The function \Rfunction{ematrix.msm} gives the estimated misclassification probability matrix at the given covariate values. For illustration, the fitted misclassification probabilities for men and women in model 6 are given by <<>>= ematrix.msm(cavmiscsex.msm, covariates=list(sex=0)) ematrix.msm(cavmiscsex.msm, covariates=list(sex=1)) @ The confidence intervals for the estimates for women are wider, since there are only 87 women in this set of 622 patients. \item[Odds ratios for misclassification] The function \Rfunction{odds.msm} would give the estimated odds ratios corresponding to each covariate effect on the misclassification probabilities. \begin{Scode} odds.msm(cavmiscsex.msm) \end{Scode} \item[Observed and expected prevalences] The function \Rfunction{prevalence.msm} is intended to assess the goodness of fit of the hidden Markov model for the \emph{observed} states to the data. Tables of observed prevalences of observed states are calculated as described in section \ref{sec:model-assessment}, by assuming that observed states are retained between observation times. The expected numbers of individuals in each observed state are calculated similarly. Suppose the process begins at a common time for all individuals, and at this time, the probability of occupying \emph{true} state $r$ is $f_r$. Then given $n(t)$ individuals under observation at time $t$, the expected number of individuals in true state $r$ at time $t$ is the $r$th element of the vector $n(t) f P(t)$. Thus the expected number of individuals in \emph{observed} state $r$ is the $r$th element of the vector $n(t) f P(t) E$, where $E$ is the misclassification probability matrix. The expected prevalences (not shown) for this example are similar to those forecasted by the model without misclassification, with underestimates of the rates of death from 8 years onwards. To improve this model's long-term prediction ability, it is probably necessary to account for the natural increase in the hazard of death from any cause as people become older. \item[Goodness-of-fit test] The Pearson-type goodness-of-fit test is performed, as in Section \ref{sec:pearson}. The table of deviances indicates that there are more 1-3 and 1-4 transitions than expected in short intervals, and fewer in long intervals. This may indicate some time-dependence in the transition rates. Indeed, Titman \cite{titman:phd} found that a model with piecewise-constant transition intensities gave a greatly improved fit to these data. <<>>= pearson.msm(cavmisc.msm, timegroups=2, transitions=c(1,2,3,4,5,6,7,8,9,9,9,10)) @ \end{description} \subsection{Recreating the path through underlying states} In speech recognition and signal processing, {\em decoding} is the procedure of determining the underlying states that are most likely to have given rise to the observations. The most common method of reconstructing the most likely state path is the {\em Viterbi} algorithm. Originally proposed by Viterbi \cite{viterbi}, it is also described by Durbin \etal \cite{biolog:seq} and Macdonald and Zucchini \cite{macdonald:zucchini} for discrete-time hidden Markov chains. For continuous-time models it proceeds as follows. Suppose that a hidden Markov model has been fitted and a Markov transition matrix $P(t)$ and misclassification matrix $E$ are known. Let $v_k(t_i)$ be the probability of the most probable path ending in state $k$ at time $t_i$. \begin{enumerate} \item Estimate $v_k(t_1)$ using known or estimated initial-state occupation probabilities (\texttt{initprobs}), each multiplied by the probability of the observed outcome at the initial time, given that the true initial state is $k$. \item For $i = 1 \ldots N$, calculate $v_l(t_i) = e_{l,O_{t_i}} \max_k v_k(t_{i-1}) P_{kl}(t_{i} - t_{i-1})$. Let $K_i(l)$ be the maximising value of $k$. \item At the final time point $t_N$, the most likely underlying state $S^*_N$ is the value of $k$ which maximises $v_k(t_N)$. \item Retrace back through the time points, setting $S^*_{i-1} = K_i(S^*_i)$. \end{enumerate} The computations should be done in log space to prevent underflow. The \Rpackage{msm} package provides the function \Rfunction{viterbi.msm} to implement this method. For example, the following is an extract from a result of calling \Rfunction{viterbi.msm} to determine the most likely underlying states for all patients. The results for patient 100103 are shown, who appeared to `recover' to a less severe state of disease while in state 3. We assume this is not biologically possible for the true states, so we expect that either the observation of state 3 at time 4.98 was an erroneous observation of state 2, or their apparent state 2 at time 5.94 was actually state 3. According to the expected path constructed using the Viterbi algorithm, it is the observation at time 5.94 which is most probably misclassified. <<>>= vit <- viterbi.msm(cavmisc.msm) vit[vit$subject==100103,] @ \subsection{Fitting general hidden Markov models with \Rpackage{msm}} \label{sec:fitting:hmm:general} The \Rpackage{msm} package provides a framework for fitting continuous-time hidden Markov models with general, continuous outcomes. As before, we use the \Rfunction{msm} function itself. \paragraph{Specifying the hidden Markov model} A hidden Markov model consists of two related components: \begin{itemize} \item the model for the evolution of the underlying Markov chain, \item the set of models for the observed data conditionally on each underlying state. \end{itemize} The model for the transitions between underlying states is specified as before, by supplying a \Rfunarg{qmatrix}. The model for the outcomes is specified using the argument \Rfunarg{hmodel} to \Rfunction{msm}. This is a list, with one element for each underlying state, in order. Each element of the list should be an object returned by a hidden Markov model \emph{constructor function}. The HMM constructor functions provided with \Rpackage{msm} are listed in Table \ref{tab:hmm:dists}. There is a separate constructor function for each class of outcome distribution, such as uniform, normal or gamma. Consider a three-state hidden Markov model, with a transition intensity matrix of \[ Q = \left( \begin{array}{llll} -q_{12} & q_{12} & 0 \\ 0 & -q_{23} & q_{23}\\ 0 & 0 & 0 \\ \end{array} \right ) \] Suppose the outcome distribution for state 1 is Normal$(\mu_1, \sigma^2_1)$, the distribution for state 2 is Normal$(\mu_2, \sigma^2_2)$, and state 3 is exactly observed. Observations of state 3 are given a label of -9 in the data. Here our \Rfunarg{hmodel} argument should be a list of objects returned by \Rfunction{hmmNorm} and \Rfunction{hmmIdent} constructor functions. We must specify initial values for the parameters as the arguments to the constructor functions. For example, we take initial values of $\mu_1 = 90, \sigma_1 = 8, \mu_2 = 70, \sigma_2 = 8$. Initial values for $q_{12}$ and $q_{23}$ are 0.25 and 0.2. Finally suppose the observed data are in a variable called \Robject{y}, the measurement times are in \Robject{time}, and subject identifiers are in \Robject{ptnum}. The call to \Rfunction{msm} to estimate the parameters of this hidden Markov model would then be \begin{Scode} msm( y ~ time, subject=ptnum, data = example.df, qmatrix = rbind( c(0, 0.25, 0), c(0, 0, 0.2), c(0, 0, 0)), hmodel = list (hmmNorm(mean=90, sd=8), hmmNorm(mean=70, sd=8), hmmIdent(-9)) ) \end{Scode} \begin{table}[htbp] \scriptsize \centering \begin{tabular}{lp{0.8in}p{0.6in}p{0.6in}p{0.7in}l} \hline Function & Distribution & Parameters & & Location (link) & Density for an observation $x$ \\ \hline \Rfunction{hmmCat} & Categorical & \Rfunarg{prob, basecat} & $p,c_0$ & $p$ (logit) & $p_x$, $x = 1, \ldots, n$ \\ \Rfunction{hmmIdent} & Identity & \Rfunarg{x} & $x_0$ & & $I_{x = x_0}$ \\ \Rfunction{hmmUnif} & Uniform & \Rfunarg{lower, upper} & $l,u$ & & $1 / (u - l)$, $u \leq x \leq l$ \\ \Rfunction{hmmNorm} & Normal & \Rfunarg{mean, sd} & $\mu,\sigma$ & $\mu$ (identity) & $\phi(x, \mu, \sigma) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp(-(x - \mu)^2/(2 \sigma^2) )$ \\ \Rfunction{hmmLNorm} & Log-normal & \Rfunarg{meanlog, sdlog} & $\mu,\sigma$ & $\mu$ (identity) & $\frac{1}{x \sqrt{2 \pi \sigma^2}} \exp(-(\log x - \mu)^2 / (2 \sigma^2))$ \\ \Rfunction{hmmExp} & Exponential & \Rfunarg{rate} & $\lambda$ & $\lambda$ (log) & $\lambda e^{- \lambda x}$, $x > 0$ \\ \Rfunction{hmmGamma} & Gamma & \Rfunarg{shape, rate} & $n,\lambda$ & $\lambda$ (log) & $\frac{\lambda^n}{\Gamma(n)}x^{n-1} \exp(-\lambda x)$, $x > 0, n > 0, \lambda > 0$ \\ \Rfunction{hmmWeibull} & Weibull & \Rfunarg{shape, scale} & $a, b$ & $b$ (log) & $\frac{a}{b} (\frac{x}{b})^{a-1} \exp{(-(\frac{x}{b})^a)}$, $x > 0$ \\ \Rfunction{hmmPois} & Poisson & \Rfunarg{rate} & $\lambda$ & $\lambda$ (log) & $\lambda^x \exp(-\lambda)/x!$, $x = 0, 1, 2, \ldots$ \\ \Rfunction{hmmBinom} & Binomial & \Rfunarg{size, prob} & $n,p$ & $p$ (logit) & ${n \choose x} p^x (1-p)^{n-x}$ \\ \Rfunction{hmmNBinom} & Negative binomial & \Rfunarg{disp, prob} & $n,p$ & $p$ (logit) & $\Gamma(x+n)/(\Gamma(n)x!) p^n (1-p)^x$ \\ \Rfunction{hmmBetaBinom} & Beta-binomial & \Rfunarg{size, meanp, sdp} & $n,\mu,\sigma$ & $\mu$ (logit) & ${n \choose x} Beta(x+a,n-x+b)/Beta(a,b)$ \\ & & & & & where $a=\mu/\sigma, b=(1-\mu)/\sigma$ \\ \Rfunction{hmmBeta} & Beta & \Rfunarg{shape1,shape2} & $a,b$ & & $ \Gamma(a+b) / (\Gamma(a)\Gamma(b))x^{a-1}(1-x)^{b-1}$ \\ \Rfunction{hmmT} & Student $t$ & \Rfunarg{mean, scale, df} & $\mu,\sigma,k$ & $\mu$ (identity) & $\frac{\Gamma\left((k+1)/2\right)}{\Gamma(k/2)}{\sqrt{\frac{1}{k\pi\sigma^2}}}\left\{1 + \frac{1}{k\sigma^2}(x - \mu)^{2} \right\}^{-(k + 1)/2}$ \\ \Rfunction{hmmTNorm} & Truncated normal & \Rfunarg{mean, sd, lower, upper} & $\mu,\sigma,l,u$ & $\mu$ (identity) & \parbox[t]{2in}{$\phi(x, \mu, \sigma) / \\ (\Phi(u, \mu, \sigma) - \Phi(l, \mu, \sigma))$, \\ where $\Phi(x,\mu,\sigma) = \int_{-\infty}^x \phi(u,\mu,\sigma) du$} \\ \Rfunction{hmmMETNorm} & Normal with truncation and measurement error & \Rfunarg{mean, sd, lower, upper, sderr, meanerr} & \parbox[t]{1in} {$\mu_0,\sigma_0,l,u$, \\ $\sigma_\epsilon,\mu_\epsilon$} & $\mu_\epsilon$ (identity) & \parbox[t]{2in}{$( \Phi(u, \mu_2, \sigma_3) - \Phi(l, \mu_2, \sigma_3)) / $ \\ $(\Phi(u, \mu_0, \sigma_0) - \Phi(l, \mu_0, \sigma_0)) $ \\ $\times \phi(x, \mu_0 + \mu_\epsilon, \sigma_2)$, \\ $\sigma_2^2 = \sigma_0^2 + \sigma_\epsilon^2$, \\ $\sigma_3 = \sigma_0 \sigma_\epsilon / \sigma_2$, \\ $\mu_2 = (x - \mu_\epsilon) \sigma_0^2 + \mu_0 \sigma_\epsilon^2$} \\ \Rfunction{hmmMEUnif} & Uniform with measurement error & \Rfunarg{lower, upper, sderr, meanerr} & $l,u,\mu_\epsilon,\sigma_\epsilon$ & $\mu_\epsilon$ (identity) & \parbox[t]{2in}{$(\Phi(x, \mu_\epsilon+l, \sigma_\epsilon) - \Phi(x, \mu_\epsilon+u, \sigma_\epsilon)) / \\ (u - l)$} \\ \hline \end{tabular} \caption{Hidden Markov model distributions in \Rpackage{msm}.} \label{tab:hmm:dists} \end{table} \paragraph{Covariates on hidden Markov model parameters} Most of the outcome distributions can be parameterised by covariates, using a link-transformed linear model. For example, an observation $y_{ij}$ may have distribution $f_1$ conditionally on underlying state 1. The link-transformed parameter $\theta_1$ is a linear function of the covariate vector $x_{ij}$ at the same observation time. \begin{eqnarray*} \label{eq:hmm:covs} y_{ij} | S_{ij} & \sim & f_1 (y | \theta_1, \gamma_1)\\ g(\theta_1) & = & \alpha + \beta^T x_{ij} \end{eqnarray*} Specifically, parameters named as the ``Location'' parameter in Table \ref{tab:hmm:dists} can be modelled in terms of covariates, with the given link function. The \Rfunarg{hcovariates} argument to \Rfunction{msm} specifies the model for covariates on the hidden Markov outcome distributions. This is a list of the same length as the number of underlying states, and the same length as the \Rfunarg{hmodel} list. Each element of the list is a formula, in standard R linear model notation, defining the covariates on the distribution for the corresponding state. If there are no covariates for a certain hidden state, then insert a \texttt{NULL} in the corresponding place in the list. For example, in the three-state normal-outcome example above, suppose that the normal means on states 1 and 2 are parameterised by a single covariate $x$. \[ \mu_1 = \alpha_1 + \beta_1 x_{ij}, \qquad \mu_2 = \alpha_2 + \beta_2 x_{ij}. \] The equivalent call to \Rfunction{msm} would be \begin{Scode} msm( state ~ time, subject=ptnum, data = example.df, qmatrix = rbind( c(0, 0.25, 0), c(0, 0, 0.2), c(0, 0, 0)), hmodel = list (hmmNorm(mean=90, sd=8), hmmNorm(mean=70, sd=8), hmmIdent(-9)), hcovariates = list ( ~ x, ~ x, NULL) ). \end{Scode} \paragraph{Constraints on hidden Markov model parameters} Sometimes it is realistic that parameters are shared between some of the state-specific outcome distributions. For example, the Normally-distributed outcome in the previous example could have a common variance $\sigma^2_1 = \sigma^2_2 = \sigma^2$ between states 1 and 2, but differing means. It would also be realistic for any covariates on the mean to have a common effect $\beta_1 = \beta_2 = \beta$ on the state 1 and 2 outcome distributions. The argument \Rfunarg{hconstraint} to \Rfunction{msm} specifies which hidden Markov model parameters are constrained to be equal. This is a named list. Each element is a vector of constraints on the named hidden Markov model parameter. The vector has length equal to the number of times that class of parameter appears in the whole model. As for the other constraint arguments such as \Rfunarg{qconstraint}, identical values of this vector indicate parameters constrained to be equal. For example, consider the three-state hidden Markov model described above, with normally-distributed outcomes for states 1 and 2. To constrain the outcome variance to be equal for states 1 and 2, and to also constrain the effect of \Robject{x} on the outcome mean to be equal for states 1 and 2, specify \begin{Scode} hconstraint = list(sd = c(1,1), x=c(1,1)) \end{Scode} Parameters of the outcome distributions may also be constrained within specific ranges. If chosen carefully, this may improve identifiability of hidden Markov states. For example to constrain the mean for state 1 to be between 80 and 110, and the mean for state 2 to be between 50 and 80, specify \begin{Scode} hranges = list(mean=list(lower=c(80,50), upper=c(110,80))) \end{Scode} Maximum likelihood estimation is then performed on the appropriate log or logit-transformed scale so that these constraints are satisfied. See the \Rfunction{msm} help page for further details. Note that initial values should be strictly within the ranges, and not on the range boundary. \paragraph{FEV$_1$ after lung transplants} Now we give an example of fitting a hidden Markov model to a real dataset. The data on FEV$_1$ measurements from lung transplant recipients, described in \ref{sec:hmm:example:fev}, are provided with the \Rpackage{msm} package in a dataset called \Robject{fev}. We fit models Models 1 and 2, each with three states and common $Q$ matrix. <<>>= three.q <- rbind(c(0, exp(-6), exp(-9)), c(0, 0, exp(-6)), c(0, 0, 0)) @ The simpler Model 1 is specified as follows. Under this model the FEV$_1$ outcome is Normal with unknown mean and variance, and the mean and variance are different between BOS state 1 and state 2. \Rfunarg{hcovariates} specifies that the mean of the Normal outcome depends linearly on acute events. Specifically, this covariate is an indicator for the occurrence of an acute event within 14 days of the observation, denoted \texttt{acute} in the data. As an initial guess, we suppose the mean FEV$_1$ is 100\% baseline in state 1, and 54\% baseline in state 2, with corresponding standard deviations 16 and 18, and FEV$_1$ observations coinciding with acute events are on average 8\% baseline lower. \Rfunarg{hconstraint} specifies that the acute event effect is equal between state 1 and state 2. Days of death are coded as 999 in the \texttt{fev} outcome variable. <<>>= hmodel1 <- list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(999)) fev1.msm <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel1, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(acute = c(1,1))) fev1.msm sojourn.msm(fev1.msm) @ Printing the \Rclass{msm} object \Rfunarg{fev1.msm} shows estimates and confidence intervals for the transition intensities and the hidden Markov model parameters. The estimated within-state means of FEV$_1$ are around 98\% and 52\% baseline respectively. From the estimated transition intensities, individuals spend around 1421 days (3.9 years) before getting BOS, after which they live for an average of 1248 days (3.4 years). FEV$_1$ is lower by an average of 8\% baseline within 14 days of acute events. Model 2, where the outcome distribution is a more complex two-level model, is specified as follows. We use the distribution defined by equations \ref{eq:fev:level1}--\ref{eq:fev:level2}. The \Rfunction{hmmMETNorm} constructor defines the truncated normal outcome with an additional normal measurement error. The explicit probability density for this distribution is given in Table \ref{tab:hmm:dists}. Our initial values are 90 and 54 for the means of the within-state distribution of \emph{underlying} FEV$_1$, and 16 and 18 for the standard errors. This time, underlying FEV$_1$ is truncated normal. The truncation limits \Rfunarg{lower} and \Rfunarg{upper} are not estimated. We take an initial measurement error standard deviation of \Rfunarg{sderr=8}. The extra shift \Rfunarg{meanerr} in the measurement error model is fixed to zero and not estimated. The \Rfunarg{hconstraint} specifies that the measurement error variance $\sigma^2_\epsilon$ is equal between responses in states 1 and 2, as is the effect of short-term acute events on the FEV$_1$ response. The convergence of maximum likelihood estimation in this example is particularly sensitive to the optimisation method and options, initial values, the unit of the time variable and whether covariates are centered, probably because the likelihood surface is irregular near to the true maximum. \begin{Scode} hmodel2 <- list(hmmMETNorm(mean=90, sd=16, sderr=8, lower=80, upper=Inf, meanerr=0), hmmMETNorm(mean=54, sd=18, sderr=8, lower=0, upper=80, meanerr=0), hmmIdent(999)) fev2.msm <- msm(fev ~ days, subject=ptnum, data=fev, qmatrix=three.q, deathexact=3, hmodel=hmodel2, hcovariates=list(~acute, ~acute, NULL), hcovinits = list(-8, -8, NULL), hconstraint = list(sderr = c(1,1), acute = c(1,1)), control=list(maxit=10000), center=TRUE) \end{Scode} Under this model the standard deviation of FEV$_1$ measurements caused by measurement error (more realistically, natural short-term fluctuation) is around 9\% baseline. The estimated effect of acute events on FEV$_1$ and sojourn times in the BOS-free state and in BOS before death are similar to Model 1. The following code will create a plot that illustrates a trajectory of declining FEV$_1$ from the first lung transplant recipient in this dataset. The Viterbi algorithm is used to locate the most likely point at which this individual moved from BOS state 1 to BOS state 2, according to the fitted Model 2. This is illustrated by a vertical dotted line. This is the point at which the individual's lung function started to remain consistently below 80\% baseline FEV$_1$. \begin{Scode} keep <- fev$ptnum==1 & fev$fev<999 plot(fev$days[keep], fev$fev[keep], type="l", ylab=expression(paste("% baseline ", FEV[1])), xlab="Days after transplant") vit <- viterbi.msm(fev2.msm)[keep,] (max1 <- max(vit$time[vit$fitted==1])) (min2 <- min(vit$time[vit$fitted==2])) abline(v = mean(max1,min2), lty=2) text(max1 - 500, 50, "STATE 1") text(min2 + 500, 50, "STATE 2") \end{Scode} \includegraphics{figures/fev_viterbi} \paragraph{An alternative way of specifying a misclassification model} This general framework for specifying hidden Markov models can also be used to specify multi-state models with misclassification. A misclassification model is a hidden Markov model with a categorical outcome distribution. So instead of an \Rfunarg{ematrix} argument to \Rfunction{msm}, we can use a \Rfunarg{hmodel} argument with \Rfunction{hmmCat} constructor functions. \Rfunction{hmmCat} takes at least one argument \Rfunarg{prob}, a vector of probabilities of observing outcomes of $1, 2, \ldots, n$ respectively, where $n$ is the length of \Rfunarg{prob}. All outcome probabilities with an initial value of zero are assumed to be fixed at zero. \Rfunarg{prob} is scaled if necessary to sum to one. The model in section \ref{sec:fitting:hmm:misc} specifies that an individual occupying underlying state 1 can be observed as states 2 (and 1), underlying state 2 can be observed as states 1, 2 or 3, and state 3 can be observed as states 2 or 3, and underlying state 4 (death) cannot be misclassified. Initial values of 0.1 are given for the 1-2, 2-1, 2-3 and 3-2 misclassification probabilities. This is equivalent to the model below, specified using a \Rfunarg{hmodel} argument to \Rfunction{msm}. The maximum likelihood estimates should be the same as before (Model 5) if the \Rfunarg{obstrue=firstobs} is removed from the \Rfunction{msm()} call. \Rfunarg{obstrue} has a slightly different meaning for models specified with \Rfunarg{hmodel}. If supplied, the variable indicated by \Rfunarg{obstrue} should contain the true state if this is known, and \Robject{NA} otherwise, whereas the \Rfunarg{state} variable contains an observation generated from the HMM outcome model given the (unobserved) true state. For models specified with \Rfunarg{ematrix}, the \Rfunarg{state} variable contains the (observed) true state itself. Thus the \Rfunarg{hmodel} specification is not strictly suitable for the CAV data, since the true state is both \emph{known} and \emph{observed} at the time of transplant. \begin{Scode} Qm <- rbind(c(0, 0.148, 0, 0.0171), c(0, 0, 0.202, 0.081), c(0, 0, 0, 0.126), c(0, 0, 0, 0)) cavmisc.msm <- msm(state ~ years, subject = PTNUM, data = cav, hmodel = list (hmmCat(c(0.9, 0.1, 0, 0)), hmmCat(c(0.1, 0.8, 0.1, 0)), hmmCat(c(0, 0.1, 0.9, 0)), hmmIdent(4)), qmatrix = Qm, deathexact = 4) cavmisc.msm \end{Scode} \subsubsection{Hidden Markov models with multivariate outcomes} Since version 1.5.2, \Rpackage{msm} can fit models where at each time point, there are multiple outcomes generated conditionally on a single hidden Markov state. The outcomes must be independent conditionally on the hidden state, but they may be generated from the same or different univariate distributions. See \Rfunction{help(hmmMV)} for detailed documentation and a worked example. \subsubsection{Defining a new hidden Markov model distribution} Suppose the hidden Markov model outcome distributions supplied with \Rpackage{msm} (Table \ref{tab:hmm:dists}) are insufficient. We want to define our own univariate distribution, called \Rfunction{hmmNewDist}, taking two parameters \Robject{location} and \Robject{scale}. Download the source package, for example \texttt{msm-0.7.2.tar.gz} for version 0.7.2, from CRAN and edit the files in there, as follows. \begin{enumerate} \item Add an element to \Robject{.msm.HMODELPARS} in the file \texttt{R/constants.R}, naming the parameters of the distribution. For example \begin{Scode} newdist = c('location', 'scale') \end{Scode} \item Add a corresponding element to the C variable \texttt{HMODELS} in the file \texttt{src/lik.c}. This MUST be in the same position as in the \Robject{.msm.HMODELPARS} list. For example, \begin{Scode} hmmfn HMODELS[] = { ..., hmmNewDist };. \end{Scode} \item The new distribution is allowed to have one parameter which can be modelled in terms of covariates. Add the name of this parameter to the named vector \Robject{.msm.LOCPARS} in \texttt{R/constants.R}. For example \texttt{newdist = 'location'}. Specify \texttt{newdist = NA} if there is no such parameter. \item Supposed we have specified a parameter with a non-standard name, that is, one which doesn't already appear in \Robject{.msm.HMODELPARS}. Standard names include, for example, \texttt{'mean'}, \texttt{'sd'}, \texttt{'shape'} or \texttt{'scale'}. Then we should add the allowed range of the parameter to \Robject{.msm.PARRANGES}. In this example, we add \texttt{meanpars = c(-Inf, Inf)} to \Robject{.msm.PARRANGES}. This ensures that the optimisation to estimate the parameter takes place on a suitable scale, for example, a log scale for a parameter constrained to be positive. If the parameter should be fixed during maximum likelihood estimation (for example, the denominator of a binomial distribution) then add its name to \Robject{.msm.AUXPARS}. \item Add an R constructor function for the distribution to \texttt{R/hmm-dists.R}. For a simple univariate distribution, this is of the form \begin{Scode} hmmNewDist <- function(location, scale) { hmmDIST(label = "newdist", link = "identity", r = function(n) rnewdist(n, location, scale), match.call()) } \end{Scode} \begin{itemize} \item The \texttt{'label'} must be the same as the name you supplied for the new element of \Robject{.msm.HMODELPARS} \item \texttt{link} is the link function for modelling the location parameter of the distribution as a linear function of covariates. This should be the quoted name of an R function. A log link is \texttt{'log'} and a logit link is \texttt{'qlogis'}. If using a new link function other than \texttt{'identity'}, \texttt{'log'}, or \texttt{'qlogis'}, you should add its name to the vector \Robject{.msm.LINKFNS} in \texttt{R/constants.R}, and add the name of the corresponding inverse link to \Robject{.msm.INVLINK}. You should also add the names of these functions to the C array \texttt{LINKFNS} in \texttt{src/lik.c}, and write the functions if they do not already exist. \item \texttt{r} is an R function, of the above format, returning a vector of \texttt{n} random values from the distribution. You should write this if it doesn't already exist. \end{itemize} \item Add the name of the new constructor function to the NAMESPACE in the top-level directory of the source package. \item Write a C function to compute the probability density of the distribution, and put this in \texttt{src/hmm.c}, with a declaration in \texttt{src/hmm.h}. This must be of the form \begin{Scode} double hmmNewDist(double x, double *pars) \end{Scode} where \texttt{*pars} is a vector of the parameters of the distribution, and the density is evaluated at \texttt{x}. \item (Optionally) Write a C function to compute the derivatives of the probability density with respect to the parameters, and put this in \texttt{src/hmmderiv.c}, with a declaration in \texttt{src/hmm.h}. Then add the model to \texttt{DHMODELS} in \texttt{lik.c} (in the same position as in \texttt{HMODELS}) and \texttt{.msm.HMODELS.DERIV} in \texttt{R/constants.R}. This will generally double the speed of maximum likelihood estimation, but analytic derivatives will not be available for all distributions. \item Update the documentation (\texttt{man/hmm-dists.Rd}) and the distribution table in\\ \texttt{inst/doc/msm-manual.Rnw}) if you like. \item Recompile the package (see the ``Writing R Extensions'' manual) \end{enumerate} Your new distribution will be available to use in the \Rfunarg{hmodel} argument to \Rfunction{msm}, as, for example \begin{Scode} hmodel = list(..., hmmNewDist(location = 0, scale = 1), ...) \end{Scode} If your distribution may be of interest to others, ask me (\texttt{chris.jackson@mrc-bsu.cam.ac.uk}) to include it in a future release. \clearpage \section{\Rpackage{msm} reference guide} The R help page for \Rfunction{msm} gives details of all the allowed arguments and options to the \Rfunction{msm} function. To view this online in R, type: <>= help(msm) @ Similarly all the other functions in the package have help pages, which should always be consulted in case of doubt about how to call them. The web-browser based help interface may often be convenient - type <>= help.start() @ and navigate to \textsf{Packages} $\ldots$ \textsf{msm}, which brings up a list of all the functions in the package with links to their documentation, and a link to this manual in PDF format. \appendix \section{Changes in the msm package} For a detailed list of the changes in recent versions of \Rpackage{msm}, see the \texttt{NEWS} file in the top-level directory of the installed package. Development versions of \Rpackage{msm} are to be found on GitHub \url{https://github.com/chjackson/msm}. These are often more recent than the version released on CRAN, so if you think you have found a bug, then please check first to see whether it has been fixed on the GitHub version. \section{Get in touch} If you use \Rpackage{msm} in your work, whatever your field of application, please let me know, for my own interest! Suggestions for improvement are welcome. \clearpage \bibliography{msm} \end{document} msm/inst/doc/msm-manual.pdf0000644000176200001440000154164514713146124015355 0ustar liggesusers%PDF-1.5 %ÐÔÅØ 3 0 obj << /Length 2280 /Filter /FlateDecode >> stream xÚ­É–Û¸ñî¯Ð‘zo„&¸Ó¹ÄãÄ/ã¼ÎÁîÉ%“E¡EŒ)R!A÷t¾>µ¤–Îä  …Bí…ŸÞ=|Ê’ÎU¤Ódóô ÓPåºØd:Uqmž›Sëìnt•3Û]”†Á©?˜¶µÝ‘_¬kxöå=®1Û>}êéšz'ªÐé&dº§ñ$X<Ä©ŠàhA:Wõ·êhD­Ê4q§ãB¥Y¶ÙE…Š“œ7ü}«µÌ0Ú¾cn´*T„`GªR¸Þ.ÒJ'osFû[¿Õið?æ´7Ã6 ƒx) £D¨Dó…ÏÇf°£ëÏ l!ìÏÀò‡Ó†\%E‰¬ªÒøøå##þh{”*ì¶õÈ Ÿ;ëh£NT™iÙ(WûXöƒ=°õ³ú«Zä¼ h1Ô—‡ÖÈ¥ú•Yûãi¨wûqRuuRU­¦oB¦ØplFz(•†Ñfg*úDåÃ~tCU»Y úN'©Ò0ßéL%±ûÔ Íipº0"+ÎñÆÇ®LQ0ŽÅc){ýu!š!b©¸uzãô ëÆ°ËâK|.QjÓý@1Q)+γ·Aþ/^|Ey+¾RbT–’SÊ9§ÀºÛꀄóa2Œvì×}Æ@°O 8§œWzãFÈ:0dÙ ˆc2oæ*3 `ðüv :*Ý2p ¾Ïª¼@Yò†º(M9xÄoÅŠÓ9fµ[dÌ?læü»<ý²+¢A¾y•ý²Åy‚Sw0Cûº»0—»ª1ôÂBªº¿­ŠRPˆáÌA´ÂKOxžB1eÁ‡Ž—WÁ“wÃ0V¼¡Î˜n>ídǺ­ „¢jO\óÕ!«?\Ô¯½uÝM5¹H~­V€ˆñÃŒÕRD‘—:xìý.IË­¬Q‘¬\=¿ãêùʽ½šaÒT(!>Ÿ!•`¬êü‡@x†¤z?Õ,þ* @Ï]’(9÷•>Ä9oì! ¼‹=„Þf&©¾é²O ©2xVuU Æ37ô‡©6²ÆÄyÒ0ß›ÆR ƒèYÖ$w¢gâÃl² ³o .q"Ih×[žz´Kæ¤PB`p$/K÷ñ±¡]`òz¶5¯X"3…IA»M_X¦GPžÿ^úÒayUCb2G“oÛ ».éà<, ð<1ƒk¾ªó¹µõ\žá²ä:è¨o»Í Ks9—+bOT®¼iyašK®ð²‚É QBln@Ò$ Ž[ùb;¸*°ó´oíØp,ƒ¤m€l¬„0;(ǹڎrÔÚ'²÷r>és? \î®üJàîMãp"I¸þW(̸ùÄK~ ¡E µ†Q3$.†ý^ƒ´˜Ä•v±ý- qîüþááååEýЦ?Â)ªŽßãâÁ†ÅÃÜjTW&½w’©ª (Ý ÝH˜ð C¨ßᅩ ¡¥W… %*ò·Æ„ÆOà¼[óèÀz½•–p(“½ºP™d‰Oö8 "|-JœMU´éUvÉ_±$Þ,®b!š ÷fqœ?9!÷ åÕ9£]x.Új¦ló½Öã$RI>ë@‹uEb1±ü'wnc›í7GqðÁy“$3Šó\eàã;´7¤“ăX¯ÈE¡Š–jÖÝ90S:Ÿßcfºê˜ÙÐÇK×b ßžYæªHçðò•1¢ââ̬ˆ=Zô*±*òäŠñ "±JËbEDß“æšI3õUjr˜ûc¼ßØð/¯úœÆ1Wå‚9ÛÀ¹‡bßÊßÞ¸C9#-/ÊPð§HbáJeÄH åEÇ¥‹ãì›'XÀvA hÕ&—Š©tY=``@éδïLš ͨ9[/qãJ;Si\z\‘:êCN ¸¹âßÑÿ«¶êÒ™×Ö: ±U¯ÅäsC3Þ1‡"›Ñ^•ÿŒL©Ìñ9êy“¨„$¬’R6„:ïØNAF¿BýŸŒð¼²<ø÷‚ÚÃ2ÿ¿›ôf $]ˆÞ}P‚¦ò_çÊ Ì¿ -uëµ`q:¿ÚwNƒhÎRé\ÁÞ9ˆŒwh€öò•&:^׊'žOþùO:ÌÙPe†‚òø¥ZåEveY\=¥båQ)"@H#€Õ{ÑuèJT©£ÿ./T„Žfôò€t¥V(ÓU1O CÉEpÂ%W>¼ϦævDЄ.^e'ý²ÔÌe*ýι­ºÊa½‹2)Ká«.æŸÐ']\y÷ç§wÿ Æf endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 11 0 R >> endobj 1 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F68 6 0 R /F70 7 0 R /F31 8 0 R /F28 9 0 R /F30 10 0 R >> /ProcSet [ /PDF /Text ] >> endobj 17 0 obj << /Length 3676 /Filter /FlateDecode >> stream xÚ½Z[sݶ~ϯPŸBMs$²?¸IÝÆi&m­¶ŠgÊsé0æ!Oy±¬üúîb¼ ’lO¦3—Åb±—oúãÕ_¿RÉEæJª‹«› Ç¡VÙ…Ju(ãô⪼¸Þ_Ê4(ºªØ×¦¿|{õúëW±X,гPFú"¢Ù¿Ò ™-f¤a¤…›ðs”F>*a¦7gð‰Ã4ÏDÍYñ¿"^îbWGs¹“iTÍ`š¾îé³3çÎô¦zúæyýP4ðÏ´#uUÿŽZí ýžÚK‘ï«æ–¾oºöD-X<Ï¥9©Øq×yØ×Ë Cû4½8 ó|šÝ{È%¡š®å ;©u¥ð+Â\hšø_ž]¨0×qF„’D_ìD˜ä©ãdë6]]S -/SŸ¸ït:ë7—;¡´WyDF¹þ͵ÇjH ^\îR©‚º:yŽ¢‰by±Sa%nµPp|åö‰ãÅ|fÙt)¿cFôb‚ódšà;J*ø^ì÷7Ïqt¨³É$à7*T3«Ÿ+×4Ì„t~ï¡`[ó.Vt™—T&Q¼2p¾ž‡D…Ešmt?~L÷ñY#ø9ý[H'}Nëôç©óKB­åCøø}½ØŠ{íë£(LW'Žè¬É@Ã2p )ø$v äIçI+ÓSÇMÛ¡÷ÓyPPÇ©ºêƒï˜"Såvý»—¯P%“ÐîŽmÏ»v-¢;Þ²yGë'¡ãWÓµ_A3Kƒž»†c1¸)«â¶mŠšÖ‚÷ï¦C›c~Ž"Ù˜’>÷÷>ß)ÀÿbØÛ pžiú´óÌÈy&Kçé»b åä=yî nƒ„R±P«ˆuS®í.‰rð èÌÒ¬x³”0…‰kkZz5Dn?åqjѤržMT(„Ú(öJ– à‹Ì³üÓÅè |s J°Z桊ÔúÊ®.3ˆêjs¥¨YÐÏi¬‡jG!˜:ÚÒÔÔxUY *žÁÏ2ýP¦5ñê¹ÕÖnÚ†¾W$g«AÜëàßÈS8´Íuu" ì±u´ÒÉ‚K²>ßE÷îRàá¿÷>ÌCðŸ=_’M‚£é 0ˆLûäþ``ÃŒñL§Â9UOýd~Øs3cg¨× ¦õ8/j›úž&”ælš²wÝŽ3p»DÁnŠx§+Ö_¼,`;ÑضD xúÊkóPÄ“n~†Ú=}’Oªÿèó‘o¼ñ4‘‘WAAø²Ô#¼€Ï\‹È䮜2«Ox‡ ©^¿í0þS-Øè“8ݤNÁÄcÉi‚Ý|ß›Žr#Öâ( ÀÒ‡¶»÷:mÀë‘|ޱgù`¦½˜„ ò31vîÚƒé{bh<óhË##ÀéÚGPt„À ^‹[L‰éÍCe¬Aå[ܳÞ¬rh‹BoŒA/™'ˆhƒNäCq:×nèÛö MI«º6ݵx‹Ÿj^[0ÇǶkÇÛ#}?íÚr<°‡Åñ–ÖÍG<¾ ‹]&B )ÔJ.Á—;TÍ)àŽ¥[ïg' È)Âøð÷ȉ–aÔ ¶;¶§öÖ¸î&=»ÁDëŸQX±ÔÕÃ-Õ¼älºª-©ßž‡ñ\4¤rOÓЕ´'„Ä)äêbºÛ¾ý¥»†UGÁ¼4ߨrëqˆfÕùÆ)„´“4~<©ÍÃ,ÏŸÊ‘!‰Î'Ou,z¢[0]Ò¨sÛ€¨åá` FÙU{ 96à %ø»«†#M ¸Š­ÛŠ¢Æ)&¹÷Y³Ä‡zˆÁÖ†ê$ûÈè’z°áæà±L—‰5#›îÒòz2EãsÞà4D쌛”2™$ï‹ ÛÙtâ¾ãæ”ùç•\…E´A*Î|ðަ9Åq宼6'Œ“mYplMÞ“€D*Œç›ë¼u“E¢…:‚Ô8ûÀ9žM,KžÉlâ|"ŒéÆC¢&•9w—I´ç¶CµµI lN®|bÈÓLâbÁ¾ØWµËÕ`ù-»Tñn#/‘AC64P÷d¨ b¡/×k´UÜ Æ‡é¥Xªœ_¢xU슥†t¯: QJNÙ°Â>YeUŽÖ¤¡ïTXψg¹õÎðak"¶ÂÈ,‡{GÝ"C\äßçËË4 ˜ü,»÷B€,Èi“M^ñ|A0‘¡Ï•åÙ2å3eÁâ»ÌŸ* Z˜1S}è.V ø ×–?çÚôãÀyEìp~λ$ï]– LÊ.è’$'LÀ¦¢2uÍØ÷… 9;ø®êMÑsìcYÐÞÚÀWœÄE.ezÈDdhÎsõ$N0¿™cLÝžOg“„\’ÎŽkí@ê¹<|êOž-ÁìÔÏÅá]qkˆúŒ—°Å©8ÒYüŠ¥œ³¿§áâ|®«ƒÅµ¼ýkËü;©!8| ƒàHÐèrL‚Ö6„”a’nê$‡c×6Õ«¨ÂÑÔ„Žqš­ËŽôÓCZû‡Y˜8w€Q‡½• l¿0rbbV¢ÐÆrkÏmp·Ý†8õË$—m€ž#ZÀ¥ÉRev_ü1~k¦•«,A£oɳÇÞÖ—p^K=®´ \¹ÊÒ;«€0ÏÆ5•MòÂ:Šƒ—næé„9ôÎv=Ü[_¢ÕõØÛªBÉ ý¾ªnGª†¥Ä}2ô¥nÙêå¾ šé×ÒH•ñ·˜‹,Pfù8rji˜³°×7阀·×ÛÚžàÄ@[Èç9ÚŠ}ßv{ÐÆ/~ò+÷xCâ‡fiŠáh_ˆÄüBtm²ÖhÍºà‡¢¢$+ióC;a›ŒØ·¤Ã2ª®Ÿ„€çò—â0.—^Åmy­–¸V0ßÊATÌT³/$¥ˆš½¯<øiŸö4ƒ.ÆåC@ôÑç*‡qœoJäÛÂ^´vÈ•7å…þäªÈg>ª „e{*J>­õÙšR'øiÆÓÞtKÉla€/\‰b¬šx­¼|ˆ ®Z•Hb­°(+˜`‡×™ÅÖiøöT€§bñÑ9·M§…ƒS2KXa~Î寽îŒ5 øØ÷(góÈÐÁÏ£ºÒ§¬š5>¦mö®Ãë`à«èù—$¢R VVYçÆŸ’‰sáƒÒ;kÀŒœVÅ×èñ7 ™å¶lþ”× ¬j)lܾ:`•³¤¯=Äö)cˆf mÉåh™AhŒ6åtç©~àÎS5—ž5ƒAýRzYj/߀XvÖåyÎ’ÆpÚtU¶'Ê&âF1ÔìA Ðg0 S0àLBGSÔÑIðæŒrȽäÖ¬CϹdj¢‹˜$ß1'‡)ƒ«Ë8 ¦«ìiBáfž!øW4ød -â Û\‚>féȱÊyd®¦Y ¾&^gjSimˆæÿX‡‡ûíŸ 8!­þ´Nà±¾=ò¤ØußN6ÒW%„ÏÒSˆR“fÅ ²* µ@ˆ·Ü$ pΔ€ûjú „ï-4KAÉm•D¥ 3ǯ±·Ú`Öà ·Žmi…îjØíj;VO%Ê„1€€þêH¹+VmˆäkžlOUã ?&ÎW!2cwß[d3QÃ^<î½/)2NÜ L£}˜;‚æä ®å[TVfóÎÚœzÇgÍNab½©•’{âÓCl{zü£†»‰X:"RNys,:UO¬¨xÉ ÌÙ²’X…ëµ¼ø6$Ò`#@=yk)'Áu;üê³æHÏ¥G ¾AÀ…÷“~E|ÕÑtÜé‡âþZ-gÿåûÑhÕܘƒc+›7yùýwo¨ ×ÿµmn«¦òÕ8!)[ü †½\Xþèåfù|¹ú-só¦,–´+~ŽÊÃ,ÞÄ3fä:³Kcüy¬Ž¦u<ì^·ã}1~ðùðX…z~ǰL õ8“é\š»Î§À-Õ>WI(?¼ˆ¦k=ʪ ao@ØZeŽ‚|9DëþXÔ5kw"C)7u${‹Y¿nÁ^ AgPÁËÜÄ—k1€}˜c %“êˆ|åiÂwã *úÍ=uM;}{Dª±Û?}ÚgvçkIeK ˜'I%K–‘GðŸlâqš‡±Þ<ļ'ç+ÁºCa{q(ü´æQu˜¬Kå‚ô¿9WÖ‹Þš„=à« Ù OóêE:Æ;ª®;¶½3¼ƒ¼W&”g¥=vƒÇdé…LȨCrzëZA ýàP>ÈàÍÖ±E~gn Ô|z¢8ˆ­Ò€¬ª=ÏãGcû°~;8¶5|®ùú]åQ ì©yÖž×w”¢VöçΰÙ‚Ñ¢ÆÚ©zbOŽ«÷V£¢m*æ2ÔËEŠ€I'&vôšÐ.r‡'êPÖ cÉa2Òöè• öø¬†¶#CÂ9Sч^] …F-üÂgØØ¬ë Ì`Üë-õ#†¡U¤ì% ¶Ë¢àŸ=äõ½Otœ›÷Tƒ¥ eµûIÊŽ©Œ;0´u5™-®egŸCaÒû ÀŠɼr*>oŽo‰âŸ8¹`4+fä´áRMÉ´ø•É[uYÒJ:¨\ñºèý®§Þ97ƒâ˜ÈLeд5˜abWÕøwº!Ÿ\½Iº-ÜYq८J%¹¾´Ìç°³éɼc®oO56ïn3ŠF*Ö¸¿©Õ >’6·ŠCüg5‹ÂSÁÅ¡ÕŸÝØjå>ÐYGˆÔá0v¼tàñ™!ê°fÁ¼½$Älw²89ס‹À£iþ37‰#_üéê‹ÿ:k› endstream endobj 16 0 obj << /Type /Page /Contents 17 0 R /Resources 15 0 R /MediaBox [0 0 612 792] /Parent 11 0 R >> endobj 15 0 obj << /Font << /F64 4 0 R /F31 8 0 R /F28 9 0 R /F30 10 0 R /F33 18 0 R /F27 19 0 R /F34 20 0 R /F21 21 0 R /F70 7 0 R /F68 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 24 0 obj << /Length 786 /Filter /FlateDecode >> stream xÚÝVMoÛ0 ½çWèØÌŠ¢> ØÚ­Ãv+Û°C±¤E€¦Y“öÿ¶¤ÂN”Åi|°AS)½G’ÊÒ CÒ ø½šÝ<%¯Õz¾¸‡òuö"2è¼ôÌùA…,gAyJ’öòy@¹TV®ÝʘM´ [Ú‚â}+©Á‘­ [ ”.é–.è–isï°¶=ö¨†Z ÖÑ»kè°Y{„$§Üƒ cGvBóvRåÖò1FëâËv/)e1™vB!f“àeÏOŸÃŒþPb<ä9DK÷ÚS5iOÕ¤½,®‡czWd÷R*ðßÖœÅȆ ²ì5ÄÔvl¦ÿ‹ˆŸÁ‚±‚!m"ˆŽ¾¹Š&´ì Á‡]»‹ö¾ÿ>yxb7 !¸“r¬ÙÐ#œp´±ÃÔtÍ^èʽãzaOÊqd/v‰Ô‹2ë dÍáåÞ³¥[ç —SG]Î#NîÁê¢ËÝèIìpLÇÀq%œØÇv_úuÙ»3#óGwêvîLû¦Þ¡€ÝÑ?@ãûù\ÎHèVí\&¯HxË(ºº0èú‘6÷k{#Vyèv¼Už]ž*±4u«âÔÝÙñóv½‰óåvq³M«þlÖw›Åv»\?Äã HËÊ©ÛK®zLÛNéå׸ endstream endobj 23 0 obj << /Type /Page /Contents 24 0 R /Resources 22 0 R /MediaBox [0 0 612 792] /Parent 11 0 R >> endobj 12 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/multistate.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 25 0 R /BBox [0 0 263 254] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 26 0 R >>/Font << /R8 27 0 R>> >> /Length 1020 /Filter /FlateDecode >> stream xœWK'¾÷¯à¸Éh à)²äÛzGÊ!Êi¢8‰šHNþû® Ý3+íD{Øúê«70_³Þ8úÓÿ×¶üøÌ—ÿ–h“ù¶xó×ÂëæóÇœun­&¤¦ᶬÉï/yb-ê„s4×¥C_À¡ê€Lb:•/©Ô ƒë’sDnKf~ЭtMxF3hU!;±MP|ìT@7Ãàºü¹¼.¾fG”ú.n(†n í ºÐ¬ 8\9R–È9ôv×4B‡CJÑkH¥Ø‚bÈ~W`™#a)s"ªÍ®( ¢::¯…òpŸ!{×Ó¡` ÅRY2ÜÕ9ýÌ«ebóZ#õŠ»ÛµŒ´2*‹ªÍ2ëT’ÞphH8ô#LíØó´ãC7zQs¾³ì}87áÜ£ýTµÃCïåCëuvŽ©ó¦Ú•mÆt…Äå+µÚ(hÃå¯ U3:\¢A¥ô­“ÀKùÂBë2$*(äJ VT¢gÄìûjÇ/?˜ÆàtRÞ¼tÚ[|lëý¾ƒ/bÒ%Ú; §tW1ãk‡°‚Â5V“AH{ÓŽ6 â ÔÞ¦dƒï#x-®/¸5$·£mGDî+å;¬AÖѺ~Qý±GÃé[yÈÚÐ ½*gÍvýƃ‡"«=,숉S@>Ã1šz'ÚÔã`…9ˆ:Gp¦;{À÷èéàò™³QäMeÑr,k ˆjÄ:}m¯nÌC»åd×§ýíÌu°óЏTxœ¥Š6 zhà«Ë&–ÈG>Š)ÈùíÉN…\H.ŒÒ¸™uÚÑdhd3OúPhw©ÄÈÿóšæ)Ouž9Fû@Ìk5'`pèå˜5Ú[lé±6Ê®°Öuµ”®TV›]¢ÊI¡s¬úÁQEñƒ—‰; *ÇêæÎâC6UbÍ.ØÂ$°Ú¨ñœôÚæ³íæÃakbc'OÝè"¿1ìZ ?!JÀÕ²îSî^±€fçõÔÍÅýÒ{ ¯Tö¹FÇùB@}ï#ür£ÞnùOöè·$©Ì1*·ÐâJ_pò–¡hÀÒ9Ryù>Ž÷€Kº§t_èã¹ —þº7áI­Ý£¾1ÿÈ™¤s¤”ÊM—qæÕKS`ÉÓ,e+sK™ ·ŸãÁ,0•×5,lD¹: ôO[?f¥vKz2úþ€"$½åø¬ŽXònö“4&}ÿ÷ƒv×?Û}£Ä³«Óû¤ØîPŸ¿ê§¿`x^dýwmæ§ þЇ·Ù\þXä×>ÉÀ‚TÌ¥-¿>­Ï ÈS|þíò‰Î4rË\~_žÂóåïå}ì ÿ|Ao_–ïâJ±¦ endstream endobj 25 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174558) /ModDate (D:20060622174558) /Title (multistate.fig) /Creator (fig2dev Version 3.2 Patchlevel 4) /Author (chris@bumblebee \(Chris Jackson,,,\)) >> endobj 26 0 obj << /Type /ExtGState /OPM 1 >> endobj 27 0 obj << /BaseFont /Helvetica-Bold /Type /Font /Subtype /Type1 >> endobj 13 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/general.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 28 0 R /BBox [0 0 650 218] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 29 0 R >>/Font << /R8 30 0 R>> >> /Length 1231 /Filter /FlateDecode >> stream xœ­XKoÜ6¾óWèX…ïÇÑF #=´ˆw‚œ6ˆ“` í¡¿ó"EÉPy<ŸÈùfæ£È¡öç G3hü“ÿçI½{LÃÓ?ÊaøW™á›¢ñáñA%=jíÊ`MLô„åÂh˜hÈpyL¥ÃÚgU¡ Fƒkƒ>ÉP™Œ÷À$QœUŒ°gxQ± }’©6ÉÑ4ˆA ¦@JáÒAΰ2Qú5 ³úªŽ*d§kå³}Q!L—aH15FT0ÙR-Ûœcõ¦ü‰¶Öéí\¤yÌŒ¢ÏÍ™m®Žl)Ml©‹¹,$íjò®´šfûv˜kòÎÎl¨&²¥&¶9­êMù­ÔäKn5mZMAûY²¹&²¥&±EYvæô´«É– aéãXJ„²ðÐPnõ‰Í -}.¢£‘³’1D]â«©(#<Ä‚/=†©à {Áûqk$Ì·>pQÏLjð$(9\J~BSs§ pñ?®aÖP8îYx‚î ºÀL›€6šO£)eÊ`Ö¡Ödóùx¨2”LOrlÆ G‚låÁWõ×Ûá‡úõ Ÿ âgH½îFm1n.ëBÕHñiM4=ô<“Uè/oË.ù²+H—ô¬í²äRS˜qJn¯^vŽž8;:™ë Kê”ç"BÄÔÌÞv¯2*¸b˜^ ò,‘uXðWíÑÐEç9@ÕÐÅàPC]5t ÎÙ^áZF.y[?sÓø×ú­¦—b,sX‡í®'Ù©[òºW©,ÝíeŠÆ¯¶™…3ÝfpÉbz6À–lÑØ¥lË»b˜žGXg°I²]K‚²Q«6ÛÅíDZu™Ú<P #[ZÛÜ…ª÷<.-Œü¤…a®|sOg›[ÙÒÂÄæ,ÄyïZØÿ}Œ7b¶IlèJX‰#¡*Q.©C¯¶ò)Y>ªqrÁÂË|\îÞgÚà[FfvXä׺î;C“mf„ã©ã‡­‹]Ç2XklÕ€ÛNƒÞaÚ [†m¼ÖuÞ–¦ÛÌè­îø=ôÁ9v[h@»]4ð6/4è¦ ²eئÁk]÷h’k°ÍŒ!úŽ?$ÓÅ®c ‚.MƒìBƒÞaÚ [†m¼ÖuØ‘i''‡½¡ÁX)Cƒ:T˜àh%˜LêGÑ÷ÅË 8yš öEiþÓ&û*ò\ã¾ë¸€kw Â6SZ[èÆÓ 59~݇ ‡’Y™…ó´I½Ê£)sû¾«…oʰ͔Љûا»ømtK>FX>^feÎÓ&õ*¦Ì5›2l3e€g]èù}ü6º¥ .¬ :³2 çi“z•GSæwT†ôùû $2lË¿ó4ÜÔ»G¸øà%öôEñ/GðqåÍøì³ÃiRßO·÷ý9¤Êè\{dn>~WwYØÄ@óæ¿½?ÞßïoEg;Cœ 䄦µY¹x‡¤ý> endobj 29 0 obj << /Type /ExtGState /OPM 1 >> endobj 30 0 obj << /BaseFont /Helvetica-Bold /Type /Font /Encoding 31 0 R /Subtype /Type1 >> endobj 31 0 obj << /Type /Encoding /Differences [ 45/minus] >> endobj 22 0 obj << /Font << /F31 8 0 R /F28 9 0 R /F21 21 0 R /F27 19 0 R /F64 4 0 R /F30 10 0 R >> /XObject << /Im1 12 0 R /Im2 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 35 0 obj << /Length 3040 /Filter /FlateDecode >> stream xÚ½YKܸ¾ûWÌ-jÄ­H¢$JÉiƒ¬“Ín‚2‡¶j‰ÝÍ]µØÑÃãù÷[Å*RÑØäÒâ³X¬çÇê??¾ùû<}(Ã2Oò‡ÇóC,D(óâ!Ïd˜ˆìá±yx ÓéU‡c"óàV=c# L×>ÓÐIÑÈÙ´­9$Y𤚙îô=›ž–TÔ¿›~Ô¦cBg¯J÷Ôlô ªÉ^õ0šþùgAx8ŠBßѪQ”|>ÄY@Ç¥Ó úOÈAåÈçÁP_U3µêðññïÑÃ1ŽÃ2ã›ÙË™Ø+Ã]Õé"IœÐ}«†èvµz{8¦l9$Q0´Ï-»÷U=êZQoÔ75м$}Òƒjóéq@¤{楙ÜvCÓw¸êFf¤cήf¸ë±j÷îuïÕ0LðƒË‹àñвÌË`«YÂ6É=Zï½¹àf ÜL£ÚVšó¨xXwu;5¼©QÕxå£þ‚mæëc³ê‘¨Ííf-g‡ë^Õ¦o¬2óÔÞ¿Oz¼j{*™ 5•·†, ¾k^ºÑÿ@£d±°ÞÚ) ÔªL¯ÞÿMÈ(Ì©CœŸ«ÛÄÞ¢ª¸S52K$F0¸Ž™´2„/36ŒScYs»½{ê®ÑÈä'ÝL ¿c’EÌ$4,“ðýµ#Wê¨ËÞ-+—Ū%bÖÞò˜åºsôº ]k¡å2NÃ2M™ÕœXEO‹Š`|¾ëÚ² ¡ºÝ[Ý]°'0çÉyLê¿m; cÄèhý;}™¬1ÀX HÊœÍÓ.ÚHÆS”N¹ÎÝ#V |Ïfê©e꺬æñBÇÕXøãµ7ÓÅZ¨ â¿ÔL7^­³d¥siãKgÙ€%Ž4MY¦òÜY„$ ±.MƒOW]ó m+ÏÙÆåÂÆs2%¹²ñO¯ùŽNPº&„Û›ÓIrÂHEn¡ÛêÔ*^7Ð—î ¸â±LŸ·rŒ(qÚ YYø/LÄô±j/„ˆ¦ãÂ:‰pG˜1f¼ÛQ˽{’ ²ØS¶LÂÐÍà)tÔÍL=©ñIÙ°,qN³Ü,5I]Äži½îvú½/sO–ÌLÆ6îÜgá¨ê8‚p6^ÙBÑÛ¯ìæ> `çé «aíãžû(.DxN£@nBCÉÇš¾;L;t†Ý¸ R]j­ºN 8—Mò0K8šüÐñªdxÂ'ü±f/ÃJáÔKW%‘aš@™ÌáP[´Ýu¤fE›»°ÉQ†ZÓ] b5šFÀ]y9z!ïïO‚fdܼÇíPh˜«5¸€H_CDÒ ù§tþV€ƒTe)è<]di…ÜËc¸Bõ¼ñVÙÌ ++>ÁÓ¼,Ü­ãó_0®4à>š©Ñ(€ ÌÅL8Ü4à+DqZŸ.áJÄqÍ1æl Ë‚I;ì‚EE÷ €a=µDz—^‹\àZK ÃêªÖ£Í—0±”È~6^†K´å“™Æ÷ íÄ]Š8žÿÙ5£ìË?àîË5ìµO9HDUý‘òq¦¢fÁúföC’dä2ZxE¦¹÷ ‹ÁAwœ§‹¨të˜Çï«úºb\$xÝç×ðÛr?ºûµ¼{…§W€dÆÓ熉”|ÝüÛ¯Û# ÕÌmçÆ" @ë?:­.ü•©½f@޽ÞRo=°³×hÔP ˆËá²Ù&˜z=õ½ç"8¿XÈœå ÊPÄɯöÆÔðLúÝ!…Ã(:ÕàEB’Õoä’%a)––€/š˜ÞÅb5ûL¯ì a0ÅC6”ÁKåÂm§GÖ®K ‰Ö ªux&«¦:…‡|_Ë$fwí·¬«BÊ£ähO€Ù†oÑÏüZƒâ#Éø¥6ŽY4{ÌKÕˆ"ŒÓÌ n>ÂÂ!Óíë#“ÉÒNElÁw&—néžßÎZÛ,mzHz\òЕçÈ,¨Mâ‘ ˜liBœîæ]ðHV,44OW,’$LÒrýP¸:_xâ)’_äZ‚í?™^ #îH.ã9H)›)ÀÈ<¾XŠ-‰B‘øµïcù‘Vƒ6ÅÖÓ0Xc„ÏÕ@ý©£| ¡ôreåJÞ6¬&"å¬6ŸI>í¹\š ˥ˉ$øáLGUtÌmjG}¤XAÁ@¤`Gr,Öˆ’Þ!øµØ‘»j°i´æÃÄ!\t5Ó ú4N»‰÷¤Ááðž{àù¤/xfúH+r{ëjBÇ)£ml,¸I½¢pÂÚ,6¸Va§28…3^G1ϘÍÞÒøÝ6ÔÞçÜ* µ%"ÔbJj‚ð`ãEÒÇA€Qµߊx•¢ ÀËÞ¤ÿÍK¢‡<,¥((ê'>jôtoÚ½ÌfQñ°X‚–" þƺE€ßp a¥j©¹xÜ ^öšìæ]»~1š!x|…`ÍëÑê_-ØoõÕ”\–QYD¬É,ãB×rÒI :)ñBƒ\M´Lãz³Ù·w´9•î÷ôy³ÅÛ׎ö=þ—’Ë *rŠ™ˆ¯—@0¸…Ýê%€!¾¯n ÐÓ%d/¸«c§®x¿-Á25O\j)ä pB÷n2?.çïåÊ5R"̺S5ÊÜ;Ö¥ù̓"tJW9zàlsÅ8Í¢NWÕ]ÞI>KmzÆÂ2{Pi4RSÞJåàF¦ >/æµ9?rSIƒâñõ"’}¿.‹n"ŠÉ+웹\biL+ëô??bÊxÈ3=›âàŸÆ"Æ2&¡ì¤Ÿ,ÿnÃN ›‚ zŒ¨˜?º.¦JëìØâç/òö’'‡Ñá+òµg/ë¹mb]ï_Ê$í.v,ƒ$]|¤‚ý)[sS4„eW5^MÃ5?*æ®0¡íަËÛ0ß«ÿLšªŠ9½9ªVSî$Õ´«Û xœ‹¤ÎÄU) êÆÝbæáGï~Ú´}®`lüc™¸¹¬‚9ú¥>Ћ0—%õcÕžÀÐ…ÒaÁ–]¦ÁOJþ©¿—7³-ÕÓØÂØûœW5j¨{}R¼¶¢Ñ‹êTOÚNƒ›•3M&J¬~[…Ó[ôOHHð=ñT/‘ã* °)°˜ò„IB£¢Ï|6tÖÒÂ.Ôä\eË-`ƒó'*LäTJ{ËÿÜñ…Ï…Ì<á**ô\`!nÔ¢=,ƒø1hö@<´{ýù UƲpe÷r¿ˆZ›êAÉu•ÒUdÄú #îâ%—°-ušQÜ·<—…ÇY•ãÊ2Ðà$5}1½¤bz ‰Ñóþ-9 _â½û#a¦›{§oÿeèLwÜ U¯ýœ,2 –¢‡îí(™ê¤[=>Ó éc¯l!²P ³é‚2}‘×qÌŠ¾#1ñPN„þ¹·™C¦®²µ‰¥q…2ó¸käªÂ†é4ûÓ+ ‡‰À×ýL+“¥¼d(µ›,Ú!&ÂBúÇä¸CÐ^)Dâ]D¸ ‚ÆRdøßWj£™ˆ¬Šˆþ¶;^ÍÍ ÛZÄ !hމ˜å¸b$Îã°ÈËo¸O:p’"ø„ÜàÀIŠ8ÿÊå§^ŠxퟩQÁÀg{<¤ôØóø?è$ýšNŠoЉ'òvç°üØÍßwYÙb˜ZêÄ ÑbWEÃcu±ôÿfml2š ‰`6hËÉÞpÆþM'åÖtÃ4ÙÖlX¹—òö`„±—ÛÞÿ2Ìf+­\‘á×¶D‹0Jä—ä’‡qìµùû½×<Œr/•i‡/ÀÑ¢ àðÁó4B¼g¼¹-õ/úû˽r«8…X]Ä_ãIxžö^­e˜¥ Þ)~„r¶c‹oEðƒC ÆUY<(ÑÄ.¥ã¿£±Õyk2ƒÎ°Hºd“âÌ›ïßüž§D« endstream endobj 34 0 obj << /Type /Page /Contents 35 0 R /Resources 33 0 R /MediaBox [0 0 612 792] /Parent 11 0 R >> endobj 33 0 obj << /Font << /F64 4 0 R /F68 6 0 R /F70 7 0 R /F31 8 0 R /F30 10 0 R /F28 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 38 0 obj << /Length 299 /Filter /FlateDecode >> stream xÚu‘½nà …w?ÅíÂŒqǪ‰”n•¼U\7–œÐú'Ï_8qU Îß¹ÀUIK¦ gŠr¡ 9'? •ÞÅKœ–ȹ_o¦ÞÂxUvdz€›¼ù±šd "›¤ç*Ù”ç(® ê€ÂíBZRªÞÓCÿµŒ&#> endobj 14 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/illdeath.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 39 0 R /BBox [0 0 110 103] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 40 0 R >>/Font << /R8 41 0 R>> >> /Length 596 /Filter /FlateDecode >> stream xœTËnÜ0 ¼ë+tLTM=)ê>ŽÙ5Ðpm »@ÚC¿|Hµwƒé"A<”5$ghæÉzÖóO{ΫywÈöôÛ nˆöûÝÈ{ød¸hÁÞ®;¼˜!8ð±…À¿>ºRÖRèÞl¦Ê”E`†íÄ”¼•„ fƒX^ FN¥æ*X2ÒýÜ -‚{ýΕ¾4©ÀÙ|3G“ÓNÎ.XLZCÂŒ[BÆ]ã.Ipk¬“¹aͪ¢èlS>KBŽÀ×­AÓ%A&ÁælnOq<^H ž`Êôw=‹È Ò ”˜íˆkØš¡X››¸ÄCêD¦iÊ,]¦Z&#@çˆMé\Æ”P]ãêY¯ÜiÚ“&T¬zž «DŠd±yµÐÍ ƒ-7¼P÷TýtFZ_Jx^ZÒ?Þ^Met È PÜójßO´¶ÅFìôht•†©÷Ä‹<­ææÃ—ãxwßL?L Qo«ÌÍÇÃ(Gê<3øtwwœH÷k€): ¶±€CÏ"1Wm¡éƒ+d£9 C¡á>I™Þ£œ.mûä·±/ê­ßgÊ9a½L÷¬Üÿ|OUšîÍÓ̽ëòù¿Á‚·v3â®zI˜[õ&§Â&G·£Ë¹¤¬—)Ÿ•|½ ,ÅæXÙ$F%D£Ö¬Qôûw±n­§åõÚVE¯öõØSÖ—Ò–ä´×R¯[,$×vc¼›>ÿûÚïÍ_ ,bæ endstream endobj 39 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174557) /ModDate (D:20060622174557) /Title (illdeath.eps) /Creator (fig2dev Version 3.2.3 Patchlevel ) /Author (chris@blankenburg \(Chris Jackson\)) >> endobj 40 0 obj << /Type /ExtGState /OPM 1 >> endobj 41 0 obj << /BaseFont /Helvetica-Bold /Type /Font /Subtype /Type1 >> endobj 32 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/sampling.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 42 0 R /BBox [0 0 360 720] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R6 43 0 R >>/Font << /R14 44 0 R/R13 45 0 R/R12 46 0 R/R11 47 0 R/R10 48 0 R>> >> /Length 487 /Filter /FlateDecode >> stream xœíT¹nÛ@í÷+¦¤ mvfölƒ¸qç˜@ Ã…aËDB ä÷³'¹¤)ÜÅ}óžæÜÑ ”DPéSß÷“8‰o?-<ýWñ˜lSüv¤› Wçtx¿àMœ³£öºŸàû]¡$£„}ŠÂZI«-J¥<Œ“Æ—é°_ÅÅW_—(H4À’Ð*ã^¿ß=Sh†¤u0>43-fÛ™9™ƒdí‚ë~óãp÷þ<×à¤?á2>¯ñyäMžXêXZ…†TÂGqýAgØñhÌJPq§ CVúEQq§`2+EÅ¢æ5+º<ÿaЈÒǹå^ß JªÝ^ÛÀ’y@iv{ëcÿN 1&ÉPû× !‚Ûñr¹-?JZgq&FëŽEÔ.Ê™‘ö’—ŽˆŒir3Èëd!íJ´‚iáÓ/0WÔSÃä\ó‰Î¸lQÅçVÖ›…/Yä¨U1gÁNσ/y²õxVQó¬|΃iüTP7b$F0¨‹·5‹hBã’ÖÚj¾/ÚÐêuJg•r7¼eZØ®Øm»¡¬6mÚÓùX—×µ«/hZèà¸õ nã~ø°véb}²s‰þdá}nÛ°‘ùxnÝÿÇýš¸éoå/wcç endstream endobj 42 0 obj << /Producer (GPL Ghostscript 8.01) /CreationDate (D:20050304143217) /ModDate (D:20050304143217) /Title (R Graphics Output) /Creator (R Software) >> endobj 43 0 obj << /Type /ExtGState /Name /R6 /TR /Identity /BG 49 0 R /UCR 50 0 R /OPM 1 /SM 0.02 >> endobj 44 0 obj << /BaseFont /Helvetica /Type /Font /Name /R14 /Subtype /Type1 >> endobj 45 0 obj << /BaseFont /Helvetica-Bold /Type /Font /Name /R13 /Subtype /Type1 >> endobj 46 0 obj << /BaseFont /Helvetica-Oblique /Type /Font /Name /R12 /Subtype /Type1 >> endobj 47 0 obj << /BaseFont /Helvetica-BoldOblique /Type /Font /Name /R11 /Subtype /Type1 >> endobj 48 0 obj << /BaseFont /Symbol /Type /Font /Name /R10 /Subtype /Type1 >> endobj 49 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ 0 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xœc`Ù endstream endobj 50 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ -1 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xœkhÙDÀ€ endstream endobj 36 0 obj << /Font << /F64 4 0 R >> /XObject << /Im3 14 0 R /Im4 32 0 R >> /ProcSet [ /PDF /Text ] >> endobj 66 0 obj << /Length 3120 /Filter /FlateDecode >> stream xÚí[KÛ8¾÷¯ðÎI‰9|S 0Àî,`›ÅÓ‡’Ô6»[ˆly$y:ýï·ŠÔÛtÛN{:ÌÅ")Ьb=ø]üåêâ§×ZÎ’h®gW73&1:žiejvµœ½‹ê;{9ç†Gu¶r%7MK™®«¬Îе¯ß”ÅêòÃÕ¿z-ØpX£ôŒúKße4³!2–m‡ºB¤îºT1$Ѧ}ÿ Š£l½´vÙÛò±)‹…­*ÏÊ*}ð­wé%§Ñ—LEM?»®mé¿–áóÒ·WuZÛÊ—¯m}oíº_ *@:ׂÞѶ Ð>‰$†²Ùœ1’¨féÓõ2´†°~´Ú÷àñ ‡"IÒuø1¼˜LƤ€Ñv !4Ýû_4bº ÞSECõ‚¨ž„ÕD³Nµ©…¹øç"ÍÛäµlÚü³N?fë[,ëV1èB]fŸ|Ù¢"|ÚkЂ,Í}£×{ÕQÁøíÐccP {µÅ†$z6× 5#Æòí&TÔ­Qeí _»)J_ðt¤«MÞ¾úgÑ|Úá o²<·Mÿwì.THbL+¢gs°øÉ‚“‡çÌñg|˜èէ;c¢i¯oCÃúI#(«¼í ¶f€)ÇKqådš˜^(PžjÁ.9‰&†uägj8% Ølúd•{™Ý\rÝ€Y×¾ÉùOWJñ¡~¥er9—Šõdï*,4:……qÒkn˜à„ÅñX!=m2ZÚ÷”òµSm¨:«§×{(Téª)ý°)‹{§øÆ–™­~ NI¢”,Õ%©ÈÞ9ý/´è„ 5V/¡T/¡i„ʦTÐï Š)¦Cp"‰q;´ýE§â:ñÀ0¶¢ô¨ïõs€JI’˜·sñ¿í§ õÃèCT©!UâXEóÁgëY° d¹]Ô•ãUDë¢e-·+°àù}VµøEôFËA'+¶Úæu¶É³EŠ{¸%hô/ŽKOwãeVl«üÁ74Þé„ ²é À˽ìvMß\ÚÜŸ±Ã (!KtÌÌ;N? g¾_£øÝ6˜°¨Êpl*«bis·r”EYí½ëbàOÓ*»Î­¯!Gøp„UÜ3ÍêlákŠ–ý.ŽÃµxs%/"_ÚÆÀ.ú]ôùvÙ °•iq‡(1KœõT¾äC•u¿ Âö¸w¨zÌÀŽ”5c¶Ï[»¶eš;ÕƒêÍ%ðRÕNC î5 ÃO‘-›o½AaSÔíΆÕõv†·ðUú€Ê¯³áVË{¶‚G´çLH)X5=q:ÎaqÝïý<´ß Ê£ßV×Eî4ú§ù­½.SÿAUÜÜ;ÖJÕhíÖé v¬|Ÿ7)̳åMY¡‹ƒ¬ÐåÎæ››mî½úAkq]§Ùºå‚îÐÞ‚k>Ñá ©–f`K]—RêÏjŒ‘Jkç.Àñ €,×0Ô|ipßä¬Ïï³¶q]øgiïã¨qƒ[UþuÚLÓCå7=pvˆv’ƒZÊ8Hˆp ˜‘¶Ž%Zv»»9Nâ"›'l}”7ÔÐŽDCy\ãß2ÆÁ3ÑIâDk’”†M_&§ØþïD FšTJ¤ïÅø–•œ º…¶zOóÙÌx6˜-†nl8Yï”Æö„9qBŒ¬ S|8ã‘k¢~žýè𤠤?4Dó’ " 9>M€<êÐøÉòã9œ«|E 3¬åxl`ž1 FfCfñÐÄu(J"Þ#`üÃh ,zQ”à«ÀË.}<Mîœ) ¤†è>ð«ƒG4î kŽÃ¨¸®ýáàš  ËÐ<óV6çQt¸ ,º"” ¿è¯`lQÌÎwr¤´õcãÁQ½i¹#Ñ"_ÆvÕIM` 8«!”0ÊŽ³Ò.ÒÀѱƒVl6¸Ÿè‰³Îe>lh‚Ø·?P1GÙ 9 š£€Š9¨Œ•A ›ö<¼Þ'GŸæÈèS=Wô90?pÌ¿˜‚Áy8õ ¦í3sl·¨ûó#êguõrD½ãåø±§üóþJÚ éFÝñÿHŸíPéÏ9uáß0ª{ôÔ%ÆÿyôÔí>5âû¢G-û">õ5¦Í ãñ1é¤<%âãì‹D|þIƒá+(¢ãôøD^ø—‹^Ï÷wØ=ÑÄ÷Ù8dGKo$á˜ÒÇBÕI\|A5 Åû"| ÏðÇGŠÉ<›˜ ô”Ü|Ž˜Äwdí‚G¼|æ3IãW@1U“x˜Dáº:ÎQ}Ø´ªV¡Œtæah³&éâcz‹yvtûºÉbŒK"ü*®}Ä}"w›ÆÙä.o •ÍíÂ]ÿÀǤQ¦#Ñ<¥oöˆPPmîVú4Sè™åù¶ªË´*[·yô 2¹¸ó:»Ý–.+ØÈH½‡=#&—s³>Oô—аS7™¤2º¿Ë\‚3´»ô@,Œï'á×ð*þõ0Ýë@ëvQÍLMóè›õvum[RnÚïZÑï¦åáJ°hSfëEæ’we«àƒ$þ:$ÑÉðÎÒ¾´˜òšùÌlF› ø¦É3íÓ ±1på"á]‚+í†Þ2Âömå’™ÜÙ­]WUmW^_pOÇœòáÒ.í¢XmŠN~*qK“Ýø²ãRÒ&…:ß:ÍR±K`r=–YUƒTêþ.„S1…9µî±²õ]±ôåëÔçkÃíl¿"£éò½h?O7›²ø”­Òu]ùŸë‰%LHß“ˆê¯$ÅqTý¾MKŸÑ—ÕíÛ[¶°ŒÊo}1õ•vc›ÛZÐ`Ü_nšK.¢ÿ`ò¶ ï4£ú¡ºkzýø±Ï³Ç·yzmó¼u»ù¸²#Æú”;“Æ„ZãW>ܰè¶L7M±¹}6Ljó/\:0sÿsŒÿöjÚñ©'ÿãƒ9ÍÁÄÐäó"íÝÄÐQ¢ØÂv°k—ù5Í Ý›*cwÙoÂ;i!ôT7ׄukX”Á¨9¨™â EÀkTÈã–GäqóÙøž¿+'r¶™IdRNÜÝ‘g ¡xhW|gH$žLÈ'9×’sw¹Ž?*0C„¼Ìàþ¯»Æ-¬•d€xâÁÙ6þ­÷aŨ* endstream endobj 65 0 obj << /Type /Page /Contents 66 0 R /Resources 64 0 R /MediaBox [0 0 612 792] /Parent 11 0 R >> endobj 64 0 obj << /Font << /F64 4 0 R /F31 8 0 R /F28 9 0 R /F27 19 0 R /F30 10 0 R /F21 21 0 R /F34 20 0 R /F33 18 0 R /F26 67 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 70 0 obj << /Length 639 /Filter /FlateDecode >> stream xÚÍVM›0½ó+8©L<þv«6ÒöÔJܺ=° Ù"A²MXUý÷pœÀÆ‹”í¥âà30…‹Å—äs‘`ÊèÁ”3 ÖšsåºM~% CÁ%á«Ó‹å}«ÒOûä=!•Ä|ywÅPRé)ÃÇCa-p©ßÍP_1 ˆó Q0Ú¦Ê"0)<ÃUýôr¨97.S¹Ð6+–e¿Ȳ}~ìÊî”n÷›ª9RLÙÆx×UŸy9Ö»'–»²ùÓÕëþÐË•ÀI)¤ˆò°óW_Âí¨Ä€±!OÒ±ŠkÎ]C€rf‚¾f"…¦aÒ¡¦-»C½®ŽþõÎ×6ª—˜>ïÚÛ&R4† )ÉîÛç¦j«—Š„Ûî'¡šÆÏÕ¡}É{@5ËA[—æˆàH*Ȳ«÷»žž¢ŽlýúBaS>ú¾PŒüÊa”¤A©A°¹kƒF¥’sêÁíCi®†2 æ#Èȵ‘ð²íÌ­Q¬sWSaß h¯ïÍ sžb?·ŽFcÃ=ÅuÜz4 à¡ðV ]Äy<`~AŒŽSz›¸ïÐ_Îq+=dßñˆ³üÐi0BÐʃVoéçèÛPy3CŒ*ØCæ#̸w÷Ž8¡¸kHÑîýyDD9O1˜7* ÊèWæ-E¦{óf:+~ªêlÛ”8Û¶äcÛ¦L°m gm›väöÿ°mîxĶéqÛ&ד·º6³¯\›tó®Ýë4¸6SצŸêû¿»öi޽ё°41¹2ÀÃXš0’ A " endstream endobj 69 0 obj << /Type /Page /Contents 70 0 R /Resources 68 0 R /MediaBox [0 0 612 792] /Parent 71 0 R >> endobj 51 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p2q1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 72 0 R /BBox [0 0 171 57] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 73 0 R >>>> /Length 135 /Filter /FlateDecode >> stream xœMŽA Ã0 ïû {h%;ŽÒôÜæ ¤ ΡôÿPÉJ K‹vGøK|b¯}Nn/¥å¡ÕÞL¤AÍÛ­Wë¥W›Eù¤Ü‰\Å#¤KÒ ‘Û&åî,›@ÐLKäÓý—D©¹Ì"ÇATÌCÖö‘ƒèï»7â‰?Î- endstream endobj 72 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174558) /ModDate (D:20060622174558) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 73 0 obj << /Type /ExtGState /OPM 1 >> endobj 52 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p2q12.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 74 0 R /BBox [0 0 171 57] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 75 0 R >>>> /Length 158 /Filter /FlateDecode >> stream xœMN;Ã0Ý9s‡lc''ÈÜú•š6r†ª÷— Æ‘"ËðÄûÀéÊHöFîp{\À¸éÿáa*Êíµ6­’‹v)tBƸ®Á*p ÜMÌѧ¸ ¥3ì´ÜM¸öTN¬YU§\GÇNc¼.*ß<~èã4¸êãÄ.! çlË &‰ÇY&èI{¨ó<æîðp9 endstream endobj 74 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174558) /ModDate (D:20060622174558) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 75 0 obj << /Type /ExtGState /OPM 1 >> endobj 53 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p3q12.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 76 0 R /BBox [0 0 171 171] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 77 0 R >>>> /Length 182 /Filter /FlateDecode >> stream xœ]KÂ0 D÷>…×,ÀŽ“8=kè( f¸¿„ó« Š"â™çøtd¤rz½e8]—0¾ì>ð .)Ì µ®V™=™J{ٺÿÂf`ï¸y20‹ÓJZ´’ÿÕݳew¬8@qPÚ°ÜÉ8±§ —>Õ»² ÓdZ|MP(:Éö³âYá~°Ø«.—BLi2£kÎÍêì%7‚¸©Â ,q¬b¨¨?ŒˆVʾ+ÙLi endstream endobj 76 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174558) /ModDate (D:20060622174558) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 77 0 obj << /Type /ExtGState /OPM 1 >> endobj 54 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p3q14.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 78 0 R /BBox [0 0 284 57] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 79 0 R >>>> /Length 175 /Filter /FlateDecode >> stream xœMOK1Ýs Ö.èôã \ëÁÄÑIga¼"…V'MË ïCy#©^ïœn—0®z_@x)Y¹ ‚¾Uߘ²Ö˜i‡㺠O˜'a31ïpgšöÐh7¸›p‘Ì(%h†pI(1¶ 懠Âã –ÕúE(tröÑÞgŠÒ£ zÔO`QmŸ¡NçŠNPg´µl8_ø.*,{h´|­+|·G† endstream endobj 78 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174600) /ModDate (D:20060622174600) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 79 0 obj << /Type /ExtGState /OPM 1 >> endobj 55 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p3q16.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 80 0 R /BBox [0 0 171 171] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 81 0 R >>>> /Length 176 /Filter /FlateDecode >> stream xœeK 1 @÷9EÖ.4é/í \«G: ñþ`ÒvÊ> endobj 81 0 obj << /Type /ExtGState /OPM 1 >> endobj 56 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p3q124.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 82 0 R /BBox [0 0 171 171] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 83 0 R >>>> /Length 196 /Filter /FlateDecode >> stream xœ]M! …÷=E×.´å¯p×êLÌ,Œ÷O¤ÈŒ!„/´ï½ÂéÈHºÚy_átœ>À8×ýÂ3¸,ÈWð‹‚TˆB;´ò,ð„ppÜ-˜ý¨›ºaÏ­ghÍ+Ç€©úhZj©Q|wÛ V­Û”„SK Îë$²/Q?‘ÇTÚ³ÀãPe³=­«RéU›F#W©I¬·™+EßÒm ê³ùÆL “ã?‡\º®øáµuØ~c!7,.ð¾•X¤ endstream endobj 82 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174559) /ModDate (D:20060622174559) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 83 0 obj << /Type /ExtGState /OPM 1 >> endobj 57 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p3q135.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 84 0 R /BBox [0 0 171 171] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 85 0 R >>>> /Length 203 /Filter /FlateDecode >> stream xœU;Â0 †wŸÂ3ØI¤'`†‰BÕˆûKØqRQUU>é8ñéÌHöµó±Áåžqþã¢ÿ¯JFæpƒè°dÊ ’é€.ï‘^0{sÜ5gOë1¹yö¬w0iMKmªäØÛþÐTw{’pn%‰Ý„$(GÓ{¸zVxž4¶øÓz*]\…UH"ȑ힃ľ3Ô.¯nþXº2vœ ©n9(’ŒÇj=Ë^ªî¨£hô–üç—ZV endstream endobj 84 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174559) /ModDate (D:20060622174559) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 85 0 obj << /Type /ExtGState /OPM 1 >> endobj 58 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p3q1246.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 86 0 R /BBox [0 0 171 171] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 87 0 R >>>> /Length 233 /Filter /FlateDecode >> stream xœUQAn1¼ó Ÿ{HÁ6`¿ ç6OˆÔ´ÑæPõÿRÁØn¢•åÃÌ`ö'á‰ú7ïË^?4]ÒÍÎ7`zƒÜ4ULw(Šj€Ÿ`Ð[rÀœj¦eAT68ÔvÕg<{¶6¼×$æãi2SYËr{€ÎFw(1]g" û$ÈÙpq~â¾Å£ç€Ï“ÝâiK%}±gè]F¤×ÍHx $‡‹N¦*{ Xm2{š»PÖ¾‰\ #÷1I÷:Ž=ìžá¥”Wp.¶ ìaõ_—Ò, ZUšEq3´Øañð_EÉzu8¼Ã+^gË endstream endobj 86 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174559) /ModDate (D:20060622174559) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 87 0 obj << /Type /ExtGState /OPM 1 >> endobj 68 0 obj << /Font << /F64 4 0 R /F31 8 0 R /F28 9 0 R /F70 7 0 R >> /XObject << /Im5 51 0 R /Im6 52 0 R /Im7 53 0 R /Im8 54 0 R /Im9 55 0 R /Im10 56 0 R /Im11 57 0 R /Im12 58 0 R >> /ProcSet [ /PDF /Text ] >> endobj 90 0 obj << /Length 582 /Filter /FlateDecode >> stream xÚÍ”O›0Åïù>‚T&öøïô¸j#mO­”[·6!+$Û„Tê·¯Á†° ‰Ô•*UìàÇóóx~yX/–+£4l½cˆF!3h¬cë-ûžäO\‹ôÇúËâóz!÷`( œU£rS/~.@‘Ó¶WL¦ýÒð]|±|¬…dŸšÅ7ÿ kÙ`šM\fCJ#™4Åϳ!¡ÏÊw„T×!£i6q½)¤kS–À B®Ê—Ó¡H3´2±ÓLj¬R¡“ætH‘'Ù±ÍÛ~“ºÙÕ1hŸ8Ƕ-¶á×éXî_‚(ßçÕï¶Üt_®¤˜ \u©û­¿ º‰Ä‚/q\÷åã3.²¿¨iguP§ ÔŒÅÀzu`^¯´ðû(±ÜШ_±é endstream endobj 89 0 obj << /Type /Page /Contents 90 0 R /Resources 88 0 R /MediaBox [0 0 612 792] /Parent 71 0 R >> endobj 59 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p4q159.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 91 0 R /BBox [0 0 398 57] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 92 0 R >>>> /Length 215 /Filter /FlateDecode >> stream xœMP;®Ã0 Ûu Ïohõ‰cçÛ¡@H‡¢÷ž,:iÄ&DRýI|Äíë÷õMÇKI÷/Izùÿ$N'ÒZœ{“ù¹ø™Çâw.¼Cn¡Í$ƒJ˜D Õ0Háaƒ†nNwR-’´š÷P©cҜیM¤ÁU°ÐíÏ-/4ëeëäŒÑ¨ gí­¢Õ&ˆV-Ϫ§_Ÿàαb8¯[ ‹ ë bÙX'¼äÀ¨€Å¦¢{4 ÝÝ´ØËL¹§ˆ›`{Xcµlg:Ó?¦b endstream endobj 91 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174601) /ModDate (D:20060622174601) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 92 0 obj << /Type /ExtGState /OPM 1 >> endobj 60 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p4q13569.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 93 0 R /BBox [0 0 398 171] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 94 0 R >>>> /Length 334 /Filter /FlateDecode >> stream xœURËN1 ¼ç+|æ~äù=C?‰BÕÿ/áÄNv£ªÚÑzfì±÷ð•ûÏŸŸÏðöQàöîúÿ —ÀµQDx1ðè `Q nÐÊKòßá(2M "Y5æÖGܱs–Ö¼n¹è»È¢~L5IK½íÀ1QÇ‹ó_/*»»­Ëe–¯>ˆUOCÃfxp†áH;¹¼´§”f`Ä÷2°…ä*uÇÎYZ ,¹¶µÿˆ«fØôÒ ïØ9Kë^CcS‹0Μ†-çÁY‹³ñ¦ìXƒ…¥V+侇¾ß<ï—ŠÌÄ'8Ê&ðo£sYÇT}¦ ‚cñ9 HJÓ¬Ž;Ƶ\åEff¶ïµ—Œn¹)Ì´Ï¥VÛW™‹Ž.qø¬™ûñjt1‹$·<…RŸíØ‚¼ûX4£æ·–Ô4e›>+ÚùÐÆgóyÿÀµ: endstream endobj 93 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174600) /ModDate (D:20060622174600) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 94 0 obj << /Type /ExtGState /OPM 1 >> endobj 61 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p5q1_6_11_16.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 95 0 R /BBox [0 0 511 57] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 96 0 R >>>> /Length 254 /Filter /FlateDecode >> stream xœMQKNÅ0 ÜûY³’&=kèxðÔ·@Ü_Âñ$¡ªšŒâ{&ùIü,‰û7ö½¼×tû%Iwÿ¿‰Ó+i«^{ùzúZ¶ê{©|A½ÞI_td•‰N@ •óF¨9ÝHµJÒfÞC¥mIKé3:4‘'á¤Ï'—ÜÑlH”mŒÆ¹pÑÑ* Z-B´êy&{Ûÿ»øW–ˆÃyº@'¶+Œ2ˆe[Ûq“™qÛ«^a”!êÎ…/3å‘" R,º°1%+"¢ä¦fr1 0žÔ“_a”!€™à¢sÎ%3af–™H5%ëéz£?(B}] endstream endobj 95 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174601) /ModDate (D:20060622174601) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 96 0 obj << /Type /ExtGState /OPM 1 >> endobj 62 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p5q1_4_6_8_11_12_16.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 97 0 R /BBox [0 0 511 171] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 98 0 R >>>> /Length 390 /Filter /FlateDecode >> stream xœUSINÄ0¼û>s÷âíœaž€Ä¦á€ø¿Dǽ8Ñh”R\U®^ò›Ë#ärüìùö“ž^{þøK¿åÿ•J~N8zà’)¸ —. örz’{úL·ŒàgŠU-¾bã„V½JþHˆ]Þ1’ø!Œ–f=®]˜+88÷ôþ ²o³5òã›Ñ(ÝP±nÎ2\Õº¢Í“—Ü„µV/XƒX_Ö"qиbã„V ¦6fôŸKœ)V=ÍŽWlœÐš×Òhj",^§b­ss¢qÏe» Z,DÈ•âBŶÒ£+6Nh5 jô&æÊP±Üœ¨5»lþ4æ£h>‡ÚÉ[‚ÍGÐ,Òâ¢ôqífœkb(»D<Ýì œúÕ÷ôËÌm…‰k—UÍuj9nÌ×\buþl„ĹAQŸ#ŸùTq+õ €FX>—m\¥1¨×.ïÇ$11¢íæˆÏy…_wžƒf-š²=Ö—‰Ý»å„ås^áCôç%ý¤âÀ endstream endobj 97 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174601) /ModDate (D:20060622174601) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 98 0 obj << /Type /ExtGState /OPM 1 >> endobj 63 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/p5q1_6_7_11_12.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 99 0 R /BBox [0 0 284 171] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 100 0 R >>>> /Length 279 /Filter /FlateDecode >> stream xœ]QAnÃ0 »ë>ï°Y²%;/Øyë ´[‘†ý˜lYŽ3EØšdHú'ÄW ±}Æóú„·Ïî¿€á¡ßoˆá¨–€˜cxB2°7PbQÀ%ž OÉ_pÌ„n˜æ™aSë#ŸñàL­yÅp¢¢ÿeJêGX%`Ú¸½¶ãÌØðäìp{QÙcØÅäÇ—ÄN02¹¡a3<8ݰ·u…l‹—¾‰˜Ù [±KÇV’jªg<8S»Œ'¾œx.É—Z øb²ªAõi£ \;%oÂ1Óz[Ý+ã¹™x-ñNfÐk,P¼Ž§é?, 1Ɉ@\Ó„ƒ0Óœ¦ì^žÆ«kÊ’µ:Û U!þÛF½Žkh|½V!óù€?ÑÙ•ô endstream endobj 99 0 obj << /Producer (GPL Ghostscript 8.50) /CreationDate (D:20060622174601) /ModDate (D:20060622174601) /Creator (GPL Ghostscript 850 \(epswrite\)) >> endobj 100 0 obj << /Type /ExtGState /OPM 1 >> endobj 88 0 obj << /Font << /F64 4 0 R /F31 8 0 R /F28 9 0 R /F70 7 0 R >> /XObject << /Im13 59 0 R /Im14 60 0 R /Im15 61 0 R /Im16 62 0 R /Im17 63 0 R >> /ProcSet [ /PDF /Text ] >> endobj 103 0 obj << /Length 3425 /Filter /FlateDecode >> stream xÚíÛrÛÆõ=_¡Gjjn±wl<}hdÆd&è¡3i 2‘€¶Õ¯ï9{°ÐB¤mÉn:}V‹ƒ½œû»ùêÏß©üÊ£˜ºº¹»¢œ 3Jj¸¼ºÙ^ý¼ú¾úíšf«r_íšf{½f<[Ý]3¹jZ÷OU÷e{¨ú¾¬¯éªß߯›Û®lñ£·öKÿѦòU³)»®ì®¹ù;ì.&»3* çâ*sûþt:›®t€œN¹"™d®J,%‰ft¨·å5•«÷ø'ì/Ȉ€‘‡ÿ!± å$Ó+ÄÀÛj{*ö¹^óŒ¯nv¥»è¶è 'À,vï‘Z\­)%FÊÔ2‰s 8—g.JMØ4uWu=lÍ̪¹sG(Ü¿@ în§ì+˜ë«C@‹Ø SDå>þ•É,…4’ëX½È®1šç@šnL„Ñ ˜ž@1’Ó<,CSH B_Myy½¦J¯¾Æ‡r/Ýdê4 PÅU|œÚŸÇÀ&&§á4Ñè”cT|ê<º¼’Î.Ì€#š "t@cQ{9Ø4m x§«c P¿q³]_ô ÔÈ×úC¨ñSb$©ør$Î2'鈽åã\@öÔµYNrÆ.¸·õ^Y#Šè™r~™bsÊ8á/‰=/£í:&v“$£È&DÉ"ñÕÓ)ñyƒÒ9óDzœ/êÔª~”Ò¨èG ‰ô.îö)GgŽœ™ä™UŘx ·ÓÃX'OßjnT(»šã¹Õ2f~p.b.Ó)œ,u"ñgUÞ±À3gèË((¿<!ÂÝÀÈræ`n¼ðšUxz©7«tÃ=s/Γw}[€Q*,pzä}JÖÐMèü1q;¢ýá†dÆ"ˆÇìŒÃ*䀧õÝîÇ‘쳺œòqêë©_¸_ìéíÜýÚý™wîtÓ†I‚ÀË/xÙ³Â÷ÐÚ« ñ!æøØ4ûÓ¡F¯PQð𬯊ý ÕÖ£©OÜÂ\M”P±óÐ'±ÅÕ€ÎEû£/ôÉ?Ìþ/©)ùéj*yžá<œÁ«‡s08ôj’\¬îNû½ͼŒ„¯ʇs~ŸDýEªd Î?’ê(×ê¬*ÑÙc'œ¿W:¶Íö´A“K§:a²ׄ8cç?(ÛCÊ'¢ Tâ˜,Zr‡hÚšYÂÀ˜OàŒd\8ÓÎN6Ký¸ó»Ð~ ætÿÚÑ–)ð•ÄÌ¥F»Ðy_óµw¯·å±¬·Þ<Íàažêßj§©Â›ÈÀdˆeÜF¦1Eg‘æ„¢/Üzïv•%‘ë ²SWnc/x[Ú`]&)¾Ëÿ¬[´ñy¤À$` ót ‚ æIõíûb³ÖÌ)ܽ°Š†“ðh–=”dÌã½®´šQ³" m Ó]ÚºTÂܹçf×6uµñ;ºØºC2åùªêÝtå¿Ù4‡Cã÷èwEF¥ãF˜3l$ïEžáV0´ëÂsà>›/`+¹—ŽKa’ ¸V½S ôΚTÍɯYÕ_û5nË»¦-÷Ÿð?È 3ùêõ]2§ \øn«×Lçi˨!|ŒÚ7éžÂéMlM,Á {ݪ˜Mó¨‘ñÏ~«ªk7ëè$Ba|ÝÌÀ„ŠNv?J?7S³ð¥_‚Ît]8YŠL"$3Pû’>J¸ š:ÜŒÁfrtíÈ—ðÏÀ—VÓ²¾Nª9:6Dé—éò² ]FN£qU¸&„ò–량×àâ(¸(ƒÕ„ŽðžÂ§I¦VU ^Îæ[|/:æ ¾I ('<7H “ó‹² æ³eÔ%YuyVáå!AQqq5¹Øs+ž/îø.Äçòòäêï‰ípq|ýÃËo}t©ã-3‘öYn]ʼnÓi¹ÓaÈÉ9g§pjÍ{[3í3ÎûÃ_ÓuÕí¾Œò{©¸Ÿ~Nu1>x5lSÔA7¹çÛ <Áà–Ý–ý»²¬S[RcÉþÇŠÚ£h1 SGzÔ*æÖ¡{Ôù4©öÎŸŠœ?t¢|cæÎ=¹Yv%#ùh«^ßyp-×c…™Ÿÿ_Žý„r¬– ì O¾Û²¬GJدt6­± k“üg%z?È©PºÙ¨+—Ø8ç„Y¥9q>‚Ô‚k뙂gA{¼À@‘úNׇ6éÜİ B9Ö2fkøoñ@ve¼½°3æÞ^çÖ´¡`sÚ[)„»Îî×6‡ <¨C2Í#AÔÌE^ý8·É:Òåûã‚Ü`:x,Ò-}‘K"žÀ% Uƒ'òIÄST:žÕzPÆ :Iò";xÞIZp”¢Þ€/Ï·ÏäJŽzšzÔömË%3Ö–K¥'"uU½ACêJ8ðîëQø,:ðVѱ€{Þ&³q¬Ù˜>øŒBŸR´ÓDŒ|¿k›Ó›]ƒ©§1¶Ñ—* a'ÌóºÂ¼EGGÕôÿTãðYúS–ðaŸŠzP8š¹ªÊªüPv‡d—-,ªË]Û²_oã"È ½(Zôú`×ÎÙž1—|V“$pž­.µˆëA¤jÃâÞ‹6d¡!öœÆ\7‰›µ²Í³0Сy¦úûc鿬ƒ 3Øk‹Uð¯¿Ã3†o\Çoq8îm>3ç«O=¨‡ÒX† ²ýeïV.ö$…¾ŒÐQmüÌè/þU·9u®0bœŠ$4X.6’g”¥x °jH¥uÍ]ïª/í/]y%&!«™—˜ŽE[J¤+Àg¹k\‡=NÊÀØwÿeB‹z=ÿô¶èÊ=Öwì»âßE»õºâ ^5ïÝ­Eþ›;—«W>¯`3–šÞ‚ZkvôÊGøÜ1<“Æí‡ðbdBø§.±E±°mø±_dl†>e-l©äxêý*…{<È^ÜC¹]mèu*B¡ï1[ßîžÊ7dq•éUYwm‘·LdL”8Šm{´‡õášý>|ûû©¨ûª¿wÿU>8ljÛ½Û5zI±µXø7”úËøËIBÞGŒ#ÒÍÔ¦¸² Á¨_ÅÏŽ[ýù#Tmʶ/ަ–øG éÆ÷±ts®VáËîÔ¾­&- n¶¨‹ý}Wu¸p³¾ðCW³[w)ö-,A[½Ùõk‡ïk®=íç¶<½Á2Tw~ëªPc‹|÷þ.XñõYæŠSY¨ƒF¶òƒ#Dð¥-Mh3èﮯlòUì~"^K{72Z'”}´ å¿a½<¢çÄÜz0í¢ú½ßõlír85¬ŒêÙhWöÔ¾y’– ™t6±YÐw Ÿ…Ä ¯­CáQ‡¾U;t†+ªEý&žÌ¦'ðê–®NÝ©Øïï\Á•!‚N~‚Lë~ÈÄô/gLþ(Ïp Þ¼ ?/ú7qâõv’Áͩކ$ðT†º¡©5$³÷e ŠÅr#+ªÿmÜ–P‚†[¸ocó¨ä¬¨öÚ&£À\5‡kì'²ÿlªvsBŒ äzˆ\Œ—Æž¸EUˆyD1ØãCB•)‹»Í q¶èÜì»…ÅÏ<Ü"Gð‘Æ„Ú)+qøÅRr¼hÚ!¿¼zâ’à®3¥Å¨m°³kºdŸ²rãð×gb– D.åL "(;´àôÐroa\n$xÐ{gYÖÂÕlàÓ·þu¤IÈ ôñ½Õ¹W§T¦þè°Öã]Ž–ö{$vtOÚ3Ö’ó ™o rÒ%!$db¦+ŠOiÎØƒÌg‡ÇQÑ/t¿À¹ 9ËÍÙSó±Ëî×dkŽ˜$@œJ¹ÁH5'p¬1RP'±6kÓ±4‹8ˆVcÅ_8žäž'Y qÈÀ°òß8!Âwe*R£2#y>x߯Ò=Pc뜕:® únêW >Rù”Í<ïOøÍ@òسcxnkø†æÏö€¸»€%¨í.vPüœŒ?Þ\0ðKÖýù‚½J¦;sÅmû@&o`Oö£„ìðÿØ_%ˆ³ýüÂÿü1Û'¦Æ?[¿¾¨¿äÑD?^Uc’•p䵺Z Ÿö+|÷Õ·7_ýÈkË; endstream endobj 102 0 obj << /Type /Page /Contents 103 0 R /Resources 101 0 R /MediaBox [0 0 612 792] /Parent 71 0 R >> endobj 101 0 obj << /Font << /F68 6 0 R /F64 4 0 R /F31 8 0 R /F28 9 0 R /F30 10 0 R /F27 19 0 R /F29 104 0 R /F26 67 0 R /F34 20 0 R /F21 21 0 R /F33 18 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 107 0 obj << /Length 3715 /Filter /FlateDecode >> stream xÚÍM“ë4òί˜â”Tc}X²¡8°TAícÙbªv«€ƒ“x&†Ä¶óæ ¿~»Õ’-9Ê$óxìî%–¥v«ÕÝê/)»ÿèÓo”¼+’BquwÿpÇ„H´ÊïT¦.²»ûíÝO‹ïÛ¡Z®Oî\«î©Õ«M]îée_ÿ¶dé¢Ú×»¶ÝRŸlZûmSUÛÊ >À“€ÏNÑ¥›Í}ø[Ó.y¶xjèu"ÁÂUEÖ>ÌFúá´}^ªl‘,W¼ÛxÔÿrÿÝ]z·b,)2»ÒMÙWŸ,W\ɳ•pÅ‚åñ¸¯«p )_î‡]{zÜá7SâO¿Ñ©ÏV“¤Lg¦éOÝÛú-ò Ñ õÁ~ˆ"“‰Ìr÷ ò7UÓ·]µµTƧS2Éäø)qô|ÎÉ™ƒB®jwØ0\ÅrÕá–«¦Ï²q%Rž¡Bnó,‰N 0“I!eú†–‹Çª©ºr¿7bÃU ü:ÛÞT¨ o—,[TR!@îë¾êÞb9ÔmCp]{ VIPDzêÍi_vÔ]7ÛÚષ'# ìë v¢–&ÿ'艛<÷¸¹Š-‹ ` €åÜqýó&;×€_ǰbJ/>Ç¢‡vÆ~œÞ©¤Ð"7R‰*™ÈÂRYG”>¢< $@úþnTbÑ6 *30´Ô³¶€µ… ÝˆzS }d9LèDeãæøÊ²D{Dë„ñ€ä8c¥ö)¶œ‰ááñ1Æ-UAeöçÔùUŒçEÂU0›• /Œ0™°båÙÝ*MŠB] Øe•Ýq@Ũ«Ðõ´-öÎä)©÷Ä}qnšA"mçdäv2ÏX¢¹ÛÉŽùVÉÈ:㳤G:PØ‹Ìal„÷!ìtjÀïëõÞ~s,‡]ïðtÖ¼úHOÝô¸à­% ]ŸD)Rðj,Ž'–kˆI%:îŒ`{ª$Í¥¯_X @§sÀ…b“ <õïÈ„«„ j–Xhk¬#Š.9Ð £= r£Ã*•¹BxsÀvÏ$è‹ ÕÜ'#K„ÊçÛÏ' K4Ë.P £ø¼ôð5˜Ç,µ_6ÛFþéDùUþÉ„!aþ©—øÇ£|Ês°Aç@W9¥^䬮H”w ŒB©²:LÉ.,/¿eyŵåÉè\¡À3 f“CÈà ê,õ›dÇ"¨Îd÷-˜ù^‘+ߺþœfiÌ $¹Î§†ˆ‡IV訃 ½¬Ê…oK~NÓØtØצËcrY„þ VÇ.¬Nºé.ÉN¼^vü‚ìò[dê¸ø““¯ã¦ø«…Õ•¹ðô ²ƒÍ'FÍü,¯Ä þŠâ˜D‹åpÍðàk…41lfeD1Àì5:óg¼æŒÙ,CÒSÛ·ªÒŒÔ¹*½*ô .Krð>~_T8þW:ªä UÁçs¡ÞjœÂ´U$é„ å¢$ä¡9^°6JdÙôã˜>.‚Ì -Rç¦=»º¯›Ç9P5Ä2–L±|æ)O‹Õ²_£±¼ %å”dŦKR9úåM„¹ Ô0]–0}®®¡àMѯQSäsÖ2U%¨+ä‚]öú,…¼ÕDš.k¸![Š-†«Dfì/ZÍ<ƲkS‰°"8DvÈ ³OÉcÒ” á°|¦,“ “¼€¬¶ZvVRÛ” –û¾¥®µÕÔ§®†Ê ÷4XÚ, ô›™4Þ«6Ê¡«ßÙªk·§Íð‰ÍŒJ[N‰eß ]ybº”Ý”e‘äH硦dL½dà!δÒÈ×ÝG(‹‚Þƒú!Z:Ц¸?)4›—d•4‘ú‹%pί%…ÿiRD”-¨ÐÞ4Ñ à‡X™‚ž ŸÂÿ[x!Mtwò‚Å ”ŽòàÚ ÌÖ¿yû*ð.yÄ»@zšJ‹æiWE­6ׯ¤>Ì|„ÖƲÀªÌéQó!X3]…‰œW)Æfå‚ìÍÜd€)`#ÂCdF`Ó¬¼_š*Š÷YܼP9 RwO<ÕïEôÜg³`¾Ñê·žêa m ?±¾%”ì–.QýImÓÅÚÀDòÞ0»éÜþTVöÔ]ÒãáÔl,Y0h˜¥GÃf°XÉ®±__I;1Co•unÍxÉͬk[«f ¶ ¯Ì]aÃ;dÖûáßÈk!o­×Kp¬'ºzE!Qûâ%“ 7QŒ—‰Õ3 ˆ3ÙžÔ²¥e³óžIÏn9ë9EÅ®§„åb¡À«)Žþãǰ’:á UÁ&»rØÿÿÌ?[q‰myvÀÈ«$Ý$‹æ‹g ƒÕœ-§«¦ÆŒ˜Ð—)Ô狀3±é7w9¡A2ûSEýfcøãg&†Æk‹Ñ»ò‡Ðýü&&b>»‰ ðÓ×YÒÚlήð¬Ï®ó|ñc{¨(å"«‘¥¦.1³g&sÅUnu³Ëc sºÿ cý€Ÿ=@ÈÔØ.›à™fkŸtVC ˆ‰vá=<°Oæþ°” „MÇ}å7§n¾­ûªìí˜ÇRLže3¸qÀM´@‚iªÅºn÷K¶ÒØâ±^b2±§‘CÙ‘Yì0p—:£Ð0ҷƧ¤ øt?4ñtOpõ`»ÚÓ~K͵…*ûþt0®àìÍðÔy·4‹)v×sI¯ýPcëœÒŠÎ)¾•¨ìÈóžÂn?FTÃSUÙOꡧƹNJÒIsƒ;ÍÇ5}÷+'T3 •fÃ]?Ù\ÑÌà!ˆ,å•‚å‡;ŸÃˆ 3½ë”ã¥éùýFF*êû3§˜Ð|2áG0ÛÔØ½+›Ç±þP»´€ä;%Ìð¶ÞVóåxá3’ ~ì*{w1©‰\sßÖ–È+'\xS|xu­K'zªµ]¨ua+Ïj]œë Ö…ïa)beþÖ€%­ ›íÌsÈ`ÏÈÐkÔæ@¿1ð\ÛϦ2Ù4šcª ×e›TýÂR±9á2Pû÷Eià t°ÛVÖâ‘Rh°1XSd³0 *¸.×õÞ`‹…”xAQòÙ VàÎ̉懎è£JÆÇŠ%ѯG› ÔdŽÏÿµ¡¬œŒÂkú·ÅÊ¢ƒbs{RLD¥*w­ð¬ ¼PÀÏÉDÂû±®6”i€‘_9c…¦ÙWKÀ§¹ ‚ßz"¶$˜ káìÓÜÄØðk1m€ô÷Õ6þïN÷ƒu³k¦JøhØ×Tí)Z>áÖžCVà³¾´¥£ú€¥cŒñuú_!¦·dÁb¶{*cP9û³L!¸ZÄ.dƒ)÷'"W ³TÙÝ$„† fX¼²IÀöÉNZ“7„wÝ«n“ŒÉoÚÃÁÙ6—¨Tå4‘og"FO^ÕØriKlÐp%¶<£›éôŠjøzvÕú:t~®lñ¯eŽO,èöÐS“Š™Ðˆùpø°¯ö΀;„†É1ãh©œÊÅn™-ž­‰5ÌŽd.RJÅ,Rhpjåà íq³–âqÀHž% ÇÜŒÿê£é˃  ?#Pϕ˷ö«ÑvRPÆ H8&>…¹‹Hwcÿ>úúþ£ÿm-˜ä endstream endobj 106 0 obj << /Type /Page /Contents 107 0 R /Resources 105 0 R /MediaBox [0 0 612 792] /Parent 71 0 R >> endobj 105 0 obj << /Font << /F64 4 0 R /F70 7 0 R /F28 9 0 R /F31 8 0 R /F30 10 0 R /F27 19 0 R /F29 104 0 R /F21 21 0 R /F33 18 0 R /F26 67 0 R /F34 20 0 R /F32 108 0 R /F78 109 0 R /F68 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 113 0 obj << /Length 1591 /Filter /FlateDecode >> stream xÚuWË®Û8 Ý߯Èn qmù{v-fŠv€bP »¶À(¶’7¶S?z{ÿ~EÊyYX¢(’âãy¿yzû!OeXæ*_lv‹8IÂu^,òlª$[lêÅ×À¶ËUEæOm£C›88õݾ7Ã`;ajºÚß`'A×3íå`ƃ‘ V¼0»¥Ê‚©FÞ³„8ØêêùeC__Ë•^·ƒ¡c`‚•¯ù1é£ðt|»±í4œ5}ßü³ˆ«8ËLžs©We¬—¾»®?«%Â…ÚÁWÅ‚%)räª"Ìâ‚åÆa¾\Å´umDêgÝ?/ã,èHôO¦9 "òÒýdiæ"ðSËnÔ̹Ž.UÀŒ5.8΃($nVÍ ‰æ>ÐWÂæHy)ߢ,úøù3>1_ãPa1Œz4ƒuG_u>¼P˜y…ÕA[o}/|m7Š„í`úŸÄmêp¹JË"Øxa—g.x]fYyÃZ”ÉZÄc±ýtµo ¥N’ÛW>ºFø±[½µG;¾2 òyìív©¢`9ÁFκq½BГdöši,§ÿ½{“"T*ñŒ·zÄÏÐUumíòLb”7ÃçðJå9Ü]»aj¯üµRiα ©Ä­D4”ò?Iuw”G™bIßÑóMmmúã«m÷¼¿-Ñ$¶*Í\éÞ÷D%ßÓW‹’¹œxoÛÑáõQ‘6¾úÅ>MâKï—a'‹O¿<ð:ĤªðšÒ6[[ƒú^ƹ&O"ßv?¹ôÁyIá 3UÎõKô»ìÎr_¿îœóˆö×8Kc‚Á"!øóL.C3œ¹Ø¦QX–êÚ"7 ö¦5=B Ûk¦ìú®¡Uê„Êô#×híÔlÖâÀÕ*hSûÜv¤õ¥åƒÛ\ÜË“à#sIº¸pò®vˆzP-dÁA·{3\E2燌‡¾›öFçÑ6‚þºªº¾v‰æ:&ÏHš³Þ÷ø rQtœ»¼$<Éß·ˆê¨‡yŒ†Ž4suMÓµ®ø@Ÿ›¤tiŸ§J+ZSu UÌ”“1Lc[ Ñî[êT΍cºÃÙW¥¾ß°s=’PÜz¬ˆvåŠïÖvÇno+–é胦­äc#KN¾‡â:K„è¶{ÛÓK2¶€—*h/*ÎŒ§Ó§.w\·/}cÏg~4o¦a¤#. ‰SN¸.1Å[÷°ŸÿpÒVÃIW¦~3)UoFrIÿ!ï¨öÿà­ã¤Ll¨8 ÄY”Èad&çìRæYtýëÅ!ØÑ.™`¨ÐnØó$1𦾨§ãêѺ“©ç)„þ+®™óÜÀÓ°LÓk)°†|§TpÐäPÖÈ”#{«]ïb9º æ·ÆUN\Þ»•Jcj‹ òjÍH†ô¬£V7‰T©lÈs¡†·‡ÁERùLÝ/mýÒ~ЦcÐ+PVvÔÛ#ƒu¼cêyòÄæœQØ ½èSw‚ ‚ÒØ£Pà½52L­b˜”F7ðà@ 02O¬gnGˆxú{óãEÑ"ÔÄáz­i”‡ëEÕ<ýx sw&G"¿/øŠP‚½¾yå¼`!¼ýÔà?Ô_ÝÓùùó•×¼šU¿ÿí_Ö¸KÉ/õƒ*³ ü5…¦þ޶ùÙÏå?—¹èØ Û%v  3ì¿×ãw™Ï ]ÔÞ?à Ïõ¼ÿ¨Hl´|¯Æòì~ü!šà¡t‡2Ã_xßt-ÿOcØÿQ0R endstream endobj 112 0 obj << /Type /Page /Contents 113 0 R /Resources 111 0 R /MediaBox [0 0 612 792] /Parent 71 0 R >> endobj 110 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/hidden.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 114 0 R /BBox [0 0 360 720] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R6 115 0 R >>/Font << /R14 116 0 R/R13 117 0 R/R12 118 0 R/R11 119 0 R/R10 120 0 R>> >> /Length 762 /Filter /FlateDecode >> stream xœµVMo!½ó+8ÚR—2ÃǵR.¹Tn\õåÒØMe-%©Zõßw`Ù5Û%VR©²ì…}7ÀÀ?J­@êô)ÏÛ^<Š÷Ÿœ¼{n¦w=ÿzÔZ>CÑÎÚ©ñ]|‘Gñ(! Û^~زX (·ßXd—¢í”ÒX§?·½Xmý~½½[¹ùoqÑ{…A‚õÊ»öGŠ™©!12Fv¨xØN\¯ëN+ÒÚ†°‚õÍö²V­•ñ²[J1Æ™˜VÞz`… ­Ù3ZccbŽ"®Þ­§æqÔÕÃÀ ,ÏžxåIµ›«ZeBšáÂ3Š "½uqÖaäùtSûø÷B;ÂsN  eíÏÇÝþéá÷áx—‚¯5ÈTˆýøõyÿôs¿›Î†W$ —ü½çïA RœUtŽÏ°µ–¼¡òi/®F6<Û—`kÒÙx& ¼_K}Ù.À*.Á*æ L· Œr|â}d°û õøpúV¿ðÇ›ÓØK4—Á8Æú±˜òÅãxCÐÛô8G±Á@Ôx‡#ð*MÎs˜kD×À‹bF+=A«Šo R^Û¤gÑ™^ô2ZéÙȶPé‘q8×#£“K.E±àiÄ5{œ$-oøzíøz§SB9~/À9vޱŸØàSvÈA“1â6ÄqDRDÊñ'~éWŠHl,-Æ„£«­+y/üÒ¯­óØdL8ïÉ•¬~éWŠäul2FÜ_F¼ÁéѨÀçØòbvú«¹…¥u±0È6x²1⻂K¿¤’ÛOì…âB‹}ÐFÏw¼eø<¿órJs…ÖÏøìÉøÍÉÛÆo_0ýËã[×X äP‡rsiû–SÉÅ’«Jª÷É×ç±Þ¤í_Q|£jïÄo Vùõ¯©Á8Ôàsš\‡C{žÿ±jñ?-ö5Áqê8ûœ„$¯$RˆÈ+íøNyÅü„mò{6*JWWùaBÕ·ø3©- endstream endobj 114 0 obj << /Producer (GPL Ghostscript 8.01) /CreationDate (D:20050304143213) /ModDate (D:20050304143213) /Title (R Graphics Output) /Creator (R Software) >> endobj 115 0 obj << /Type /ExtGState /Name /R6 /TR /Identity /BG 121 0 R /UCR 122 0 R /OPM 1 /SM 0.02 >> endobj 116 0 obj << /BaseFont /Helvetica /Type /Font /Name /R14 /Subtype /Type1 >> endobj 117 0 obj << /BaseFont /Helvetica-Bold /Type /Font /Name /R13 /Subtype /Type1 >> endobj 118 0 obj << /BaseFont /Helvetica-Oblique /Type /Font /Name /R12 /Subtype /Type1 >> endobj 119 0 obj << /BaseFont /Helvetica-BoldOblique /Type /Font /Name /R11 /Subtype /Type1 >> endobj 120 0 obj << /BaseFont /Symbol /Type /Font /Name /R10 /Subtype /Type1 >> endobj 121 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ 0 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xœc`Ù endstream endobj 122 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ -1 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xœkhÙDÀ€ endstream endobj 111 0 obj << /Font << /F64 4 0 R /F68 6 0 R /F70 7 0 R /F31 8 0 R >> /XObject << /Im18 110 0 R >> /ProcSet [ /PDF /Text ] >> endobj 125 0 obj << /Length 3527 /Filter /FlateDecode >> stream xÚÕZK“Û6¾Ï¯Ðm¥* K<€NíÁÞMvkkSÞT¦*ÛU¡$ŽD["'$å‰þýv£Á§ ÉrAýüº·÷wýAÛYÂ-ôìþaÆ¥dztl˜ñì~3{?çL3¾Xò(Šæ?æõzŸÖuþ!ŠÄ:mò²X,EÍå&Û׋÷ÿ†)Õ`Êh¶ä–Áœn®70\r9Ï<žÿž÷vˆyù@RzÝå›MæÇþ˜VŸ<š—øŸ/Ôç–£¡y=úçá¸oòeݤMv6ô)ov¾ó|l±T‰ÿ+«o¿Lf¬ô²NÛåËCÖä‡Ì÷¯ÚÿWŸ²uãI)CZ”UÐÇsп´îž¶Äm«&`¦gŽlirÖ'ùРµb6â°¨[ìg?$ši–iq7’˜J¯½9Ÿ“¬ ³B¶½ HÇ0}•pÌ•ÂQ/ Ǿ œÑ$ 5ۢ΂½*=ÿ $“7'|‰ÉqÁ3¥o›<ÝeÝäkêGÕP %#ʇu» ÜÇÊ9Kx[h¹@è…_¥«ÖʳÚO·s^g8 %ÉÆD,²Ú‹FíÎñHMå.[7Jmç˱‘áæ^…lLÄLDOþ ¡R&ó*À_.Xóƒ_4¡°JÄIBJ¡®Q õG+ÅRkþ[`.1év¬ç€jbÆt øšð‡¹Î]©kÜ•ú£ÝÕm›M†›7šW Q¢\•…¨ïÑë]˜ ñháq^4 Rð̓çt…~5EÐÝ8 ls\gíhz\`;}„5 ø ±ßø`–ô$”Ý ¢—¾Ëaÿ>PÌÍ)Âö(qacÍŒæ+ ‹¶ìÿjÛMÎq³Ê\’nbïÝù¡>d žÌðÎQ=¦ëÏéÖ³n·…*áãmê ¹£'ÜØfEV¥H¾•“­YÑm ¾ùä;éÀŒ>{?<ÂmÈ Äc©ž‚€Ô¤h­Hx „“ºã&ƒ˜>°„Áëd8FaŠÇ¹} CÝ1tÓf—@‰Ç$ç´ ,eB%ctó,–TÏP”0iù0tR2+—¥sBÚÞÓýþD#×àI[©æ„¤^ŠôQò5¯×eµ¡œX²6iIM'æ)CÜùëC°¶3Ò¦Êl"1Œwÿû x‘ŒÀ²°ìœÌÛ>Ó TÁËØŒÍ©@*4hÕ£ŠH„…Vt‹ PèeAÛõ>óiWÖYËç™\eøDØùwŽ5¨Eh{i  æ_:pÉ»¹¯?e=SÇzæ2Î0‘‘Ûö`l ¨¸ßÊK ¸…‹ï³¤2ú–I.9,´¶ÉZÑYZ XæXHÜiVÌz¼)!°71¢H3måŸa÷7¤—‰ÿ.`4ܨ‘%í\àH¬eÆZo†Æ<íòõŽp퓇Áè:ªº…ήVé|éq‹—‹Mö˜ÁOá»b Ke÷Bn‚ñxfyýK¹-õþ4¦£ƒþhÿ.ÿ÷D 9‘Žy?]ôÀx\’¡]5o¸5Ñ£©‰“¨Ñ#@ýÕ>f,N˜Ë•ì"¬—Iª8Âëç¢D<ó´Ï6[ÿW·!+=¡Ã—e\’¯¾”20‘é~׋ûIƦ'iÀ†Á:§à>g±¶FûÄ"[FOÄ÷ù6_íý·úx›±/ ⸲X¦›OéšTGuE[†§Ï“P½´„0|ôßiз•Ú¶Úä£Ê;¾w B;÷Ï­/Ø¢ ª‚dÅ)±„§g4ªÔeÁŽ ø÷Âe w}€ÆØ[”[q…¦¿Ï&$L±¯ÏÌ Uú®ü<šŸGŒS²s®¸sÓdªÃÅ“¦KüÀL2’ö-Ò¦¬Nôbd•§«}ûª„ ÛÉå)hTÄ¿"¨Ý\Î5LJ=®µ«öÔD3÷@üìÀدgGIг^O0Œ%ßk.ø .­ie”>ó˜ñ¾¼^_ªÇ9ñàòCP³CH;búْܨújTwpùqQr—0CÄ¿ÜÌ]åÁyÃþø­=võu‘´)ëló: Ý!EÆš“ÂãX)Œ_4žº¸*´Å/ÁgÈUî|«c¤»ïïï~»CæF3î@2®ì Â7H8ž­wï?F³ |×Î$˜Æ“z˜ Ë"…ëíg?ßýt÷ÏÅ'®ÅÏ%%SüëS #Ë¥ÏÆ±  EâÕ. D žBÀ„߀a$Ê×Ê«³™;+â¨å\µÔyWøo ¾U³Ø˜GF ‘vÀ^!W}Î3~#¿xy’×!…•O1J»x4DÝ0Cdœ•aPò¨ûBÝòÉ'~ Ls¤Xf¤WQЗ =ª„¸ Œð,¶V€öyáÞ´,øœJÅÂZpG_Ë‘kLü —úy(8Û‰7´QWpÆY¨@7ÜüxWå|ÝåÛ–c‰k ‹´8C=¶D¿†¬v‘ÊÕj!M©òuë1a-Š’`žGv|E€2 ÝßmþnË?»ZeuP°Mçï1ž¿#8Þ—®»ü½»P!£dîÑ8½¤ôè ¤øÒÝzöÙ¡?ôµWY ™ûaë²€˜q,˜…wÌÁ°\ Ô=Ý`HÚhµ×b I7 ’öD2ÜÑØ,èU ðTê@¼ b* .EéκX+`«{²€Å:!­ÃgAÏc1©Šês. m) dówgÿq÷tF(vFx zwkãk ’ÂÛYU'£ ªNÎ*¨º•hÏp‚õ^¡,8°±‘Ü&•q ¦‘b\ÒZªDÎùD ô¤1 XJtÎ5T‹t°ŸÁÕ_ãCÓôï¨3T®„´ÞtÑlPïÅäÝåÂÚÐ!Ž4ôî^» F@ø{îepÀ ²?©zdkÆ.™‡¹¡“[¢O2VËÅÕç"!.D‘ ÍMhöBê#ÿhÒ„ÅV_ÈóÂÙ Çߡ˚)ù¢\Æ•<ñ'”‹ør¹–—_-˜×³§{}jv­¤§îx"é"”í€?’·ÞƒùjIÛsIO„‰¤‹ÐM¶)Íg’MŠ’Ž¿Š×I7dú\Mo-àå€á 9Ý”c¡ ¦ùíÌ©‚G@F£\©\ "eÝ8„(%©°º—Vé!k²Ê'ÙÖÿpäÅ:ÜH>—Õ€ï±Ã4¸ƒ¿xþ®ðë´ J:ZU@Jí È¥2O°²0®¤¦SAÞåÉ9ý%×zB, ëo+9ÙA>®'×Ú¢ÿÛc•¥Ç”d¦/=eþÒV˜à÷œ0ý%-`&ºi˜±¾ŠÆE[/ü®¶< endstream endobj 124 0 obj << /Type /Page /Contents 125 0 R /Resources 123 0 R /MediaBox [0 0 612 792] /Parent 71 0 R >> endobj 123 0 obj << /Font << /F68 6 0 R /F64 4 0 R /F31 8 0 R /F30 10 0 R /F28 9 0 R /F34 20 0 R /F70 7 0 R /F26 67 0 R /F27 19 0 R >> /ProcSet [ /PDF /Text ] >> endobj 128 0 obj << /Length 3459 /Filter /FlateDecode >> stream xÚí]“Û¶ñ=¿âÞÊ›ZñEñô!™ÄvœI¦¾étjû’xm‰TH*Îýû.°à$ÜIw'ç.™¾ˆ$‹ÝÅ~Cß]}õõ«L\b2–]\]_P¡‰¢ì"“Š0./®–o“«UqùþêŸ_¿Ré´«!”ñ‹ûlÚ ö †c”hÃú>Û|ñ)ÿP\Îx&’][´öN&96,˦XtØ´)ºU½Äöú¯‹|½Ø­ó®¬>`§uùé’¦I±.Wu½l±×uÝàÛE]uå%MªÝåŒ&õ®…ûYWn ?C½,Ö­ùb&%1Ò\Ì(…«_óÞ–¾›c—jgùÄ=#§Ø»Ïe·Â»zÞͯ— Ô•uå{::sï´ñóMl9Šªh`©2µ/K;v¾^ß`“ã>¸îªeѬo÷Ûçe |St>µ Üh§ ‚!ü<Îó³]=@]TnSN'Û”§$¥ªß¦ed#s"ø°×ÿr)eÒî˜_2€ÐŽ­Ž”öºòð…dö²€ÂÑ €g)QŒá|¯}¿ô"#FqmûeDiX"FP3=Qœ0e.&½þ™’*'òÒS3ÊMÒĆcDJÚw|—Ê4†K€_ö}n"õˆ‚®&½ÑÔôÃÐÈ<‚ˆ,XÚKÏ‹¡µ&BЧ:=?|ŒèPP4›òßcuJ?ÙË~ >é§E6¬,M#;&#Œ©sÛc§n™wp@¯xœœq­âF°!œ™Sù€ÝÇ"z$¨Sø@‹ä |Á»:@{L–M0›]]®VN›¤zÜÒîÕáò O6 u_)(#^O:-ò a˜÷‚´Ojd(|>7%8ÓIÞú+^¶}ØÀz|4Ù-àÖJg†ÁÛÅÅTEû…òpè×ëÚÊÎÏVJ!’«Km›ûDæDæb†ì·}˜ÆA€a?ú²XÔÐÆvD$C¯©î¶Z;"cúg’úxKŠ_vyïïÒ„Rl-+ô|©ý Å¶Ð2°ïŠ|±Â»Pü3TBVôSá¢nØ8ÌÝâ5_,v!YÞ6E×¼«>UˆÉ*¶.àrÖ´Ý$ˆðbÏsŸ€½ «¿È‡Æz?rÑ•ëc£Z@@ËN†ý&&¥$1´ð3Dt$8pèTRçTÊЩœÎƒ¨ À¢„«@VŽpÁИíšMz1°rî´¸­÷&­6)}þ1 q—N:—Z?Ñq9QP?§ìüÊÿ»%‘\>s³ß¹OΜŠsöæVgföçcn}Ñê)ðüÇÝhü«EøsÒ"üO¬EøŸD¢AoÓ°AÀ‘æÂÛˆßìùâ;;æŒ$¦k]÷  ж7l9áM–†˜à¡¨àTÚ$žL³§ËO<. Oɨ{F§oIÜ#+õÌðt¬Ã¾ UŠ„S¦j ˜Ý¨»,×Ù ‘|ª Q\EÖ÷© °Ÿ@<·Ö1Î ³“t„ê)Ôâï ûYÙÁd· =#ÙX€50Ê{ùpSlʶŠÚb_¸ÚvТ¯%æ½é3;À ɯÙ\E†Ö4€1~HAò´,¢´ÌxˆÞ5ÄÇ(­à:éôSd¨ŒX®ŽŒ´G&­t˜9)Ÿ –Ž¥(k|*h4;¬ ÷˜žÚG¨t~ÚçkèiÑÜ”§„š½:¬ëø†Qê>HVwpúˆúL·ñ»”±8«= Á„XðÙ‹w)•‘¹ ‘ •¿ N™Ç!™~J#»Ï*–m]úk,,FS‡Îç'Ú5 D;È‚®/ †dbZörBô.ø=«Æ†´˜åÙ‰D’ûD ™ÆIžˆ·!?VT]sƒ¨s¹ßQ6Æä*K«¼ôb·kr+*ÕäóÁÉÀå9HÌü%½Ò÷¡Rµ¥¥™GÙ¡ÀT &Â}Î饂 %h­ï𰫆ü[4‘™=fèºSà #÷tž7.#†ñiõËhæî•juO bŠ|LŒËA“óŒ&¯‹:mQ öðud< ¾èàvÏ $ r(Ü`JiÑ9ž])ldGZU4뉂-F~X,ž˜Nå3uøà¶J–oË 6‚³MàÁe‡Ð®cB;o9¬íX,vÛ!9§Øt”O‘ø–ˆ;*0 ƒ²«[¶B–e{tÙ󮔢G7³à 6É­©4R?…Ã$Ï’’'ÆŠÂ`EÖhΆt©NÖýÖU˜DŽœD£[—Wj,A×É¢^ï6žùƒ-,]AA[Ú³O:ûƒ е®ú rØW h€ÙƒòÞ[ˆÒüÑ!Ä(µÁ;ÓÑì•@Ý'TÐTñ JÍÑ‚ItØë¨ –rÀôUd>ˆ±¨ÝÌ6s8ß¼“âÆ%š Œõ¯ÿ¢å´\%†P{Ç÷ÉölOÊ©6qqy™Þ!‘ 7Æòíãã–í^þ¿ÚmæX«zþë˱LÉ>Ú&”!À$Y&ï#ˆ›K¦{nj㕜fGå gE».f‹QMD*à O‘ÂÑTGe?èG¥ØÃŠî¬=QÑœšÖ{p¥j ÆwRUw4M î:2î üø®”O¢ûl¡Œ…òë8aùèš¾‰;˜š?ÀI>²ó?F·,5ú°DW¦,Ê”Œ’l,Ñý>†&X ”.W4quœö:oëfާ JÍýÓÎÖ$ºnþ³e‘w«6PL“M‘·»Æºî¶¯UÌõ®ÃnEÓ€M(ÒÄwý¼ÂKû ƒöwœ²Å MCÍAÊU2© ´îœêoù¢[ûòõ—®6Ö¿ÇN¸9”%îµ-åÙØm_ Ù¶~êv·Ù¾mï,Çtˆ nÑ}çœQwëNx°bgrŒ„”þh(» ¾®|ñ弸®o9Ô»2Ðt<|½g±€¦õ}<©/eõ6\dzNÔ—1'öd¬$z:NìŸ"=‡ÂN4C&øžÛMÙ—±Bb6HacpâÔj¨Ûùò—¨=+Dh©µ/¿Z3L:!:£Æ)ë`À  ,a„ {G‡“ö-¾Xá>ÆwNV@£u£:¼ÝìÖ]9ë÷7ís^ø…»ÖX–ÒvÙµ(j)=¼à¸àÄУ ÀÇŽÿ…½Ö“„Ù‚±©”ª°$Ø@‚îEË€û8 azj;ßnûÓçcRÐvŽÕ§‘cõ©GÏÌdSÆQþ,÷ùÐcDX›*M“~Ë7Ûuz‚ùI“K;yLÁ •ÂVVâÔÿ ¶˜GÖWÊ$oVy@´ØüÖý ‚Òá_3´ö·ø¿ðêÕÿŽYb–0*ŒöÑht”‰½(²Laìά½"Ü–MÞÕN┿Zmg=ö)ý¢(¾Æ*}ïLO^7…O‰3·cöB<‹rkÿ"Àý9ƒFrÀu½s¡"¸s9‰í”Vëÿ`Ô“U÷öåÿ_ÀüÙ¡´wV/ÚkS¶ŸÂ¿ûé ÞØÏ›ºZ¬Êz]veÀ ;'>·7Õ²©7…]–û× ûç!î/ lFíYqð¥|²‘:ã÷«®¾ú Ê_& endstream endobj 127 0 obj << /Type /Page /Contents 128 0 R /Resources 126 0 R /MediaBox [0 0 612 792] /Parent 129 0 R >> endobj 126 0 obj << /Font << /F64 4 0 R /F70 7 0 R /F31 8 0 R /F30 10 0 R /F28 9 0 R /F27 19 0 R /F29 104 0 R /F21 21 0 R /F34 20 0 R /F33 18 0 R /F26 67 0 R /F32 108 0 R /F78 109 0 R /F68 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 132 0 obj << /Length 2981 /Filter /FlateDecode >> stream xÚí˒ܶñ‹«¸ Œ7Á8IU[¹lç°_d¸3Üj9ä†=þ>ÝhC΂ڕ-©rÈel4€~wãñÝÕWß<·z“±ÌJ»¹ºÙ¥XjÝÆš”Ie6WûÍËä¾mnÛ¢ëÊ i’7Â$ų‹­T.ÙÚ¦.wøa“}ÑmÙ´y_65‚LRÖÔU õ-µn†z‡ýìb«¸I^ÄþPv„Pàüïòã}5.òÝ¿.©ëí…àIÞшc³/ªªØS×Í)e·kœg¯®~ÜðÍV–™ÀN×ç·~\š"k;à WrÚ ŸššÍ ý÷‡‚7M{¤VYUCw!’§óüÂÿóòvhÃ&[ö‚hú:ú¢CAd"¹Ä‚ úk‹{zQ÷}ç×ð±+by*M†’bÔ§ƒ¦˜ú¨á ÿm3ܪ÷ô±/~ã\ÖžøÌ Äò¤€ÖrêÝ·Í=µ®‹ªA£xKŸŽ…_ç]QÁxúzþïÈÄ7Ïeº±,K•CËSÖ±”k`ŒéL_‚𪙶Ùf†„âµ"y{(+ÎV¥Š‰T=к—ˆ6‰¤?’ˆÖ$MÆsná3p xs® Ãš¯©1²çmÚ­ð'gÊZâϬó#¸ÛÌFêŽEÞQ퉖|Ió}ÑîÀTÀ°éÛ[ÄØ­O ðò‘ œ;ÕKù¼AÎòjÀ ¤·sl€?æ»ÊzO ÜyåSÓƒ´dðF´«¶ë Ú•ïzlêþÐQ;¿)¨6¯»û*¯û0}^‡yó®Žã"}Cè×a ÁÁðæ~a‰§¹ÝAäè韈€ÁüH¡Y¦ÏDòw P½f°Šiñ¨¹¦,ËÄÜ\Ë0i7\¿.v=~(Ïåí Ý¡iû-Ê–zH=m™_—UÙ¿'¤=j {i¼JòÝÐPq Ö>„øn”&vÖy?´yEPÐvýàãvG!sk,SÚ,åáuªx:ÆhO=·äH>†Í<ô‘ù ¤øÕ” Ø—Ç‚½\²/oÍf7T}@ki²6p5íDru(ÚMUø”¤¤@‹Ç‡r¿/Â"?çí¦ŽÉ~  !â£÷zÃÇQq­[Pe*W”RR&»œÙÏ+ ½¸à(Š¡Þmõ¾ÄL‰ð U‡RÅ4St~uJƒ~T‡Nh$£tÎKP˜›éÛ‹¦ë›v\ý†ôm Ø¿ˆèÒ)ß`éïCr Þä³Xð°vtµ{H¬÷`­#V0ÀÀŠà†å÷¯Ã\*yº™ïsj½E«£þµXï˜4ê Á!µs#yæåÉ/PfÁ kËë Éðï}pQ™ È(éRg¡Ê°àe5ýõ]MiË4&’zDÙScŠ.X`xÈ™¡"(dhA8GëêoÜp¡áW ^éukÍTIÁª]QÜ(Ù•ïö‰ZUé=´€µ"îY5»±¨4A9ؘì™.ëí˜â׋P‚¥Â<ª±Ð J¬ f©Ä q+8“™Ä”Ê Ì{ä÷ÏÖÌ9³Hýå뀶´.ì<÷¿¾‰, V£³Ñ¸/#«Y&x]MÎ}*c©ÓóÕþY 4@SXí.B´afìÆ?u`ŠÇ¦§°î/QŠ8H1  YEfQÌ¥ú„#mTÒ¸‹¬–2±”öŸ"ËùÖi9µ;¤Ìw‘EÁ`YQ²8Sr:_öÛ‹­°X()³Y Ç ¡_FßBqi„qfR»Î29\n$$'5 9æBfí\äà‘ȼUTÂÓh€† 8’» К'h9Ö(ظ<ä-l}–·_˜žÇ¤¿cCY“+î}mB]½O•ͶšCÕ8j"0ĵÌ]¥Pö” áÜYÔÀ‚ýˆõ ;Í!N¸etûéŒ:Îýž ¼ñ‚÷àÅ–ój‘ÎJ:B)ÚÖóÉ9mNÃEr RrØz5@»¤ÅD¨O ðS‰‚ H}Y ìƒ#Qû´£xè/žÜ82 “Z‚·[¦ƒŠŽ„8™º„ÒÂÏ–6 fî,»É‚±ûú%} o°Iàåmƒ¼¼7|‡„#— ¹M·‰Ek؈BÎqŸ—U3góò–°K­Þ4UØG3¢)Ä+»Ü‡­¥Äån5%¦s¯Š…T uTú¸„1†êˆ„ÓEÜŒ’¡ …1rÊ1(Æ“Ü"_þ‘$g~?C.ÊЂ Øï¦svÖrŸzzî[Ѧø6Ÿœûô#¹o©C 6¦?'íR‰+é¤cÔ"ÿ™î²TÒ0®Áâ5ž:‰§èL=Yg*Ѧôý¨3¬”‡âñZT@y¨åÑÉâåb=TR¶Q’)øó˜nL°R‚ým„IÈ“Y枈`™RNÊ2¥>nðSþsÌ82f`o¯A :h;œ¶ “âæ§-æ[ãñ¨É—‚CF}Ž™§Ú¤ˆ‰–*¹ ß¶î÷e{,mkû™Jöå¹Êƒ’=6ÓéXåcjçYf•gQŸÚç+áÂÉôAµ¼Îß‹š)¬ùXš»zéx,Šr&²Éu¿ j^‹ú ?_¡‹•Àôl»%‚›ÈPŠ9ÿWìP¬{L±ö*v+`«â´ôÇb,¾>C¤ÿ[‘B|Qƒ_Ô PP1“‚JÊé3‹Zn[çåø A 5 )e¶à¿1KeI]Þ`Ã%~Ó˜&Ç×6n®Rkbñ¸VçaíL|ZºGió†]ÎÙÖâëÖO²n½°îØÅº‘Ó}‘÷‡B`ê´¹ýB¾pV ŸùÂÇÝè ö+¸…+Ⱥ‚üT®à>¥+ØÕB6x`6DÏô³Ù—Š•Ü2Çõª…Aí/a—áÏM„˜mK성Åt;›-”¦.Ä¡uïÄnñU†ßë㣺Ãó6"ký6ãIvm;-yöÁ ˜AÏ-ngKÆá1èÝWå®ÄÛ‚ÔÆŽ_èiF4úp–ÉìCì¬E,ˆ}¦f®ÏóƒíH3´­‹ƒ–ñÕG8_Ñ)úìµ:F¸ª)Ãÿe± ÇdÂùçYruáx’_WáfEÌ®c.ËcYå-uœ‹.\ÉÐͶš¶¼-g·>ù=H¾÷D×h“˼ï‹óK¤ŸšF–±£À—/Ý€I)Æ×;t×)t¸¨øôÔÈß×ဃ§B§g=þZl¨Ã2ÊiO(ÿ|ñ+Mî, :^Rb{è²æ‘óË|¯!Pf"Ù©¡Õ þ0w+3Ž—Ïd%)ŸŽ<»c,›@€9Ý„Üç»;ÿpW(ë]5ì‘VüÚu‡·ý ]Ô3WɆh¦·Qð¹ŽC®}²—å@ÿá5„ZÍ‘Úõp¼&÷Ç€g€6·Ì¬·E]´ók·ðr«{x ×Ƶþ¶‚~¹äºñ÷•Ðï_¥¢'P"Ó‚†C¥Çkø£î˜³ ˆ’æ£ïk>ìöÊ-ÜþD¨;´8WéƒxåèØ}>fqì®ÂÛ™À\7! Ù”I™-e^{HgÏ^{Äf`;EõwѨn³'…A—ž?hA|¸vôLh—÷Þ<LvâÆ'tiv»¡m ºjÆïB  윭¶x=Å;Àç,ë›9¸¸/;Ð õÑ]0I-ìüø ›jþ~zpv›üà¡ÊkíbÚ™ùøg!á^Hø»³³ž‰E“ùH?¾ÔƒX^á…ÞaþÎnrÅl¼F˦ë±,8tÆ…÷1Ø>{†#‡öŽÞ pzo|œÓ÷ãsÀðä€ÖDÄmÌÿWcjäY` A$Eáù{a§'uBçW?\}õ_ Ÿ‡f endstream endobj 131 0 obj << /Type /Page /Contents 132 0 R /Resources 130 0 R /MediaBox [0 0 612 792] /Parent 129 0 R >> endobj 130 0 obj << /Font << /F64 4 0 R /F27 19 0 R /F68 6 0 R /F31 8 0 R /F30 10 0 R /F34 20 0 R /F28 9 0 R /F21 21 0 R /F33 18 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 135 0 obj << /Length 2106 /Filter /FlateDecode >> stream xÚXÍoì¸ ¿¿¿"Ø“ÈèYò÷-ðú±Å+Ð=ôÐ׃2ÖdÔµ­d'›ÿ¾¤(y쉳ÉIEQ$EýHé/‡/_)ë;ž³,/ÅÝátdzŒU@*‹Š‰¬¸;´wÿIÄnÏÓ4M~Ñ㨇§Ý^iÒOݨ÷n”£ ÓªÎQÿEçÝÿñÅR¼à+êü.%Á½ë‰«JïÖ”¢D¦}äÚ ÁDYÞð–ù‚Wp–We”§aûLd‰ÄF$yüM>)¢™OÓpµëÉX¢¯ìÁoOçíÅáäBW$ã9°<Ði7ê£ìˆîÌi|Ùñ4‘V±Ý¾Ur€5Ñ!Wõ³2eMS¾ñÇÊÆ}V °RÜí9gM%Ú;–"Ñ£SZXòD÷—NõjÍõòwÝOý¾Ó¿¡NªÓgcZšS v/£ÜOjPÖÛSÞúØþ%­—ev¼Hž‰)®<ëvV€Q+…[…{TéÆâfœ×ïh·ÉLš¢7K`ÿ÷®Ch©îºÉ–tÃåcàŸ\ @4îxr¦¤Æ©‘:>.@L+Ç0u²¦§^o=‹¿4(DäYI BD“%°ýà.Âø.Åuó¬Ã·fz:›)²Ÿ1R±çT8Dшä‡]/c<-X•‹$Þ‘‚5U@LNÒõÐBPŽÊÅmu¨9š¾—CT«/ãýÆþl,õ…á5AMwOCÔøíMâ¢aY1#ËG*ˆ²ÚV!ì Gu™FDzóÁS‘3‘—ЩYÖT#(ù}€‹BÀ1#àuu…k>¸ïijç5ƒ=ãÁ#WÒi¸³8à AÌ+ÍŒ†ˆš¶Ĉ:+€å"eUÃÿX @VqõçJAª ØJÒÎ|¥,áÖÔª]ª•Ì„ùïc´†iÄ.l)­~Ü =ïy$>P¥š¼q{DšAºŸóÐàŒÙ=@Âÿà(™±O›i)¬*nÒfQU#*tNÔzXU™ôÚZc÷¹Ÿ!B:P‹¡á[^  U'ø”hæ÷êFÕS¿ÓVÚ×]Y$€ÁYÓ¦ Cæ;²”/©iõ Ý|RV A~gŽ>EÞoeŸ1äD‚‰É Û'šx5  Фf0¶Ç‹s¬‚_;yÚ`{ÛëAû· œ»X"éÎï0Y¸[E¥Y™ÆýZmá8 ¸Å1ÏâìËYÏDzØJÜ×òðkC½çýíc;¬ÚÒNzßßo"5„Í¿‚{ì×p^_AÅPã)g%Ÿ—,ï h¼E¸·P6¥Ù'1„–7 ÈŸ~¤YõF-$~'¾æÔ³B•-¢^«Às–.ú (J“Þ†ÙÙtµ ³¨m}â”ÃúˆzÙ†Þ³vú±SQ^tè*:åÕ&(âuËÅEÃDZC¸@ò„ú$:]‡þ3ßñ\JK›;ò4ž®¿=Þ8jÿÈqCRR3˜a¿‹"]"Ãý'óÆÚ”k 0†O˺~˜·X•ñ‘õµxdæA‡ªÓpXÛ~¼©DÁçUníŽ{È€¾»¨£þ‘¦‚øâBK ‘¦Û.½fúŒHã‘j1žV ^ûðÊx9ÂÇÑôp즽…£›+‡¼tq²×.ü˜ÌœÝä«“,«BL\·ÎÑX«ÜÅÀ¥¥–ô­é'ác%kŠÄôz¤g bºZUP’guñá³§žŸ†Á'© Ÿ:hÞªò’¼3¾ÈÃÎYbÄ-kÊ…'`£âvqÞÿwà.z¥ÁúO þüJás"Ò4yd_—ðV»yA©¯#5´tbrTƒ›æz:à0æ¤+„G-¡* lâ9kò|½é7ä«nkáj†¨ ³ F8Vᣤÿ¨XÂu–Å·‹Kbð_68¦'O r`ÒêêÆà}ñ¿0~?ï-?ëž4¹¦â‹ïÊõGä–‰ÛaÙW”s͆©OTþ±õ«ÕÏ8Ëáöl=Ç‹Šå—„u:?&)¸l,ÎÊ„³Ì'äøH*Šùog£þÆï¤¹–ƃA=òù­(Y–Ë/VÜÒ¿M`ŸÎ Oþå‚4Mж"D[™àó˜z³j>|Ü–èøÏÛ°ºÅ /pîËß_þZë endstream endobj 134 0 obj << /Type /Page /Contents 135 0 R /Resources 133 0 R /MediaBox [0 0 612 792] /Parent 129 0 R >> endobj 133 0 obj << /Font << /F68 6 0 R /F65 5 0 R /F70 7 0 R /F64 4 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 139 0 obj << /Length 1834 /Filter /FlateDecode >> stream xÚ­WK“ÛÆ¾ëWð°J„ç‰Á¤Ê®’_§ÊN*Ùä¢è0K —°A€@­6¿>ÝÓ¤fW”e^0žþúÝÍoï^}õc¡V6·…(Vw»—27E¹*´É…Ô«»jõ6ûf½‘¼Èê1~üê¬íÖBgtd²qÿ{Ú4«|[E{ßÒª÷ÿ=Õ=Ü1ÍóõF3“ýsïúcã‡õ»»¿~õ£a a/r©Ê#1|wMNÄ’ –ë™ô­ïˆxOUí+ÚŒ{Orûî¡÷ÃPwQ°nGßm×w­ëŸ`µ²È­(WÎs«£5\ÓÀc· Ò¨ì=ZÀ ÛSÓݸ_ëì‰0@GöÝ›5—:û7êûšè]” ÆÍØ»v86®¼*?ú¾îz7FÁtLEw=Ò¸†Žל¡Dr—<; uû0¿â›Ê.Ø ìs¡Ë?êá7R|mÇ®®uí¥ÑÀîÛí©wÛ5*NVÓg’aÛ{ßFà©F¢xô}$©Ûµb`58„Ûú æÆÉA³ø:;œš±Þ #\ÒÝÏ®ÿ …ìðéû(™Pk_W†œÐì£gxvè*ß d®r«Ôåû» ’àC&ú lÆ=(GKðtíÛx¾¯0[íÑpJ€ƒ"Ѱ§ìhi{-…Î0øK‹@õü¬â$²­#pöþzþRÀZˆ)þ~÷Ë¿~Nd ¤·dr¢ i4óðÒ”9/l´FATÃéþW¿Ñt:«Á°cvñýZE¤0Ù›#¤Ô‡úÞjžˆÒ»ížVOÞõ¸í xéðû¯ñÀ,ègë⓽èÔµ‘GûPc^Ç}$|Ü×À  S‚¤¥Î¶È÷ž¾UíÚnð¨b FÈùpbÖ!ÒË)ÒK5…6#â·½ ѱ2@®Þ7>á1QXðŸ|A‘ž¨k6/˹°ÎŠÛ챆J@ Ž 5, ›“2AÑ¡BfmÎK{i5ÃðLb`m>‚Æè݂ʜ ÇË6;ˆþøâP7=ZØPÍ€cL°ž2Ž»ž¾PބީOÑ~Í8B¨Õg:ˆ¦˜.ÖfoˆjÖ2²ß+EÛzHAï¡´W¡Îb¿ä+XT$,¬7<ñPÍS™Æ…¿™É#ÜC:Ó˜)&ª‡…JÃöX®°ÏWe° Ñ_‚ K¨•[õ`דns‚Q¡Ûpèé²”—vùUýçƒX¼¡yžM‘ m!H‚Ô߬7ô¶­{ÿ–ÿYð×ïR}Z=¿|GãÕFâãPЄbsmÆÃP©Â ËJXPò0ÝO}ÿnÒÒ®àl.€ Z0X˜ž@ÝRÆGÚ±œ…–°<.¦Êø‚N$C^©)R@€ÊBÒŽ0ê ñL©%øl ‘R) ÿ-S´ƒmá¿ÿB *–>R7ûH&ba-R@€@‰ ÈZ#ŠÏ’)L ¨Ì¥fEwy©•±úv •*—@“ûmŽ8:ÞÜü¾ð¶ Éòâì#Ž5œ)þi þg‘݈Cw×ÌœÃê§½(é#Î@â2¬å¦¼A#‘ôQŒ:.@Sæ€ÿŸ-A¼¸ 3Ã'}Äe¨ çJÐ @/– ®@&·ç¨qfµýR *—@ò*@Ðà žù¹-£îs¦`0)QMaÎ%hu¿W£2„-8°Æ]‘3ÐénJVon@:ç„…¿qoJ&¬` lùBÆð.¨Pò‹xHå;Ãd‡?·Qeà$R>3èžÇ™ƒûÿr.é‹y¢ÑŠŠ›*_˜F{‰H^=7|šHßBT\ÉÄhÏ-ü_ÅÙþþ—FÎÉ ”¯~¸{õÛ#µ endstream endobj 138 0 obj << /Type /Page /Contents 139 0 R /Resources 137 0 R /MediaBox [0 0 612 792] /Parent 129 0 R >> endobj 137 0 obj << /Font << /F64 4 0 R /F70 7 0 R /F65 5 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 142 0 obj << /Length 1786 /Filter /FlateDecode >> stream xڽ˒ã4ð¾_‘cRl´ÖÓòŠe‹­‚*^Åà Iœ Ç~ì0O·ZòØí-Nj·ú­VwË_ܼxõÖèUÁ #Ìêæ°âR²ÜØ•Ñ9R¯nö«_×ùf«U–­³ÍVYXÕæ÷›¯WÙjË9+t ²ˆ"ž"*.$%‰xÜ«LRñ ª¥U&P‰IÓSå…¬4•ºŠJ_Ee®¢ÊŸ¤Š>Ú *‘”U\UqUìE2öJjžJŠJ­¶¹%Æ×›­0|=öåa¬ë» ÏÖîž6†–Ö~<\Wõ%}žÆz¨¶ýà†€Ø»Á{ÕÆÅ•–CWþ9–ÍnÃõúž(w[öö@ëÙU]?G‰õ®múr7ÕFèõ{d<^{Ï|8¶Ñ·yPnŽh‹TdŒÍàEœ1zíêš¶ªfOZªýèêþ%`ól}h;Ú.ÝîH丰äó’ieàt¼]â,|"pÍ>%%g¦OQÌäq?X9K²²O·Ñ3Œ!â†êT÷]“ò•Èn?ù¨ ¡˜0rÖö¶/»÷È놪q¢tZ°~(2–3 9÷D`r𩈇¶®[TqWîIðí=­Î+äÿÎ ®Ës}mh\&©!J{›WFló2m8“êáÌP¿OovêO©,0L2’ïb¼%âs³Œ÷-j×ÞÑ=AþRÂzîÚý¸ ÛýˆÙ‰ T¨ÿe@õ´>IJۛeí̬lY>Ûl Ô’¥7¿e:ó˜—´ûýÍ·?}`¬ŸîÜ{ á‰ ²ùRøB©ö枺öv‡&æWVVê1pc y‘¦œLâÒ@Íæy3èÜWGP\ÙT‘ÎD:Yõ$æ ñƒ]D…Œ$dy”  ±.ÌcssñÜŠow‡÷Øï<„H4Þ£Þ¼ÞpÈÓŸ¡pgë-TÚ@°/ÝpôeŒ ´w†$Æ`ÀÆR  Xœ<¼àD˜8eÌBJ¼0Ú®¿kh«mêûTíØQ>¶»ëáF…ô¤Ö>‚Ï>}›@þèÒ#ò.@ùÐ!"㙋ì7ÉW•k4í…P.Š5 ‡iW䡈÷Èú‚GéÄ0 2ˆÈçrWî«æÝ⪞Ú}Y'²ãf™ b~ÙØ ›NC~ÐGOR郋í^ €ÒWD݆­ß²L FÅ‹h/Dá½Æ³-  YÔðq}7ï¬ É’>Â>›‚ÈÎ5}‹èebTÍPâ6òH»>¹¡«þJÔq“³ÌLÍâ‡d7±¹™Õq«õ[4Í7sM¾p,]7 XqçÚ5m•Èð—;}•fÊIÜt lFèÜö}ågü¢ù$jëÚñÝ‘>j_õr[ô2!ꆡ¡*½-ð±ó€Ó,Ìh•ä0Þt]ÙŸ[hé˜XHEG¨¥!ðœªzÿ O± ù¡—yý’p——jA翨Làˆ:Ó1UGìz%ý턱äè†yTþà3bwt-aÙÓlv³íhíÊÝržC¡ª¡€äìñl†ã¨ÚÕ3Jß:-ù‡›ûª¼”öùq6á§×À02Y¬ã:‹~ÆïÁ*ìUu=öÇEqz[½cA¡PVÃ1Ö´XKɧØð› ä.0ÝFd1‰Å™L ”­|q¯Ä|Bà3j\> |I¡a†AM!²l PδT„ü""5+r{3L桬]¼d$3E±š÷J¨`YÂÞœåj;qtIø.¡VL3áŸAH¾2`—´4*•ƒõLjzŦcÇ?#û$¡ÍCÿ¤Í.µ©„6 ds]3×räïdþL})ï¬b™œ+L…ÒH¦ø¿ôn!æ ‚åX3¦ ÎÙžÈmÔËx}0aŠ+F=ÏÉhÔã„Q×$Œ|^z ùŸÒó¹Ú>”žü£ågÚ½… Ç'|åɤ¬O¦ßNøøF‰}¸^ú-h6}(côÇ)hQÛ“M¼‚ö”¾åÇ#Þjk4®VZ>û~Üè„”Œçb¥Ð éÑ™ètoîM¢Ó½N½ %þÙâ`¥ÔL¨Àý…&§Ñ×Ó¹íš[áÓ°vå© ?ƒë§-‚"ã¾ÄÉ¿)Ãç4™¾z›gsWÁ%§’W5=*sMÙŽ©(º€Þ?%éÃÈ´Ð( ¼þÆ`\ÕDÓÊð?ÀZ&íůo\÷>ÃÌ·ÒÿÙ•½Ÿ{¤ sÌâl)ãÌ%³ø†[œÝ{ÉÀvJ­¾qçþØÉ¿Dœé©Kø÷á¤Ä“ëÿ—”Á˜Fû>8“˜ã8$frýºŽôF@ññ+ÃcCþâ” ;–$žã΋/o^ü žÞÚO endstream endobj 141 0 obj << /Type /Page /Contents 142 0 R /Resources 140 0 R /MediaBox [0 0 612 792] /Parent 129 0 R >> endobj 140 0 obj << /Font << /F65 5 0 R /F64 4 0 R /F31 8 0 R /F88 136 0 R /F68 6 0 R /F28 9 0 R /F21 21 0 R /F34 20 0 R /F27 19 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 145 0 obj << /Length 3252 /Filter /FlateDecode >> stream xÚÍË’ã¶ñ£¦2‚‰'A'›*§Ê[qªœŠãñ)›%qF´%RæcgåC¾=Ýh€/a^»›­œ6è'Ý þåö«¯ßu•±Ìsu{wÅ¥d©±WF§LH}u»»ú×J©ëµàbUo·y[ÖU‹¯rUW~Ø—Û=r‚œò®,ªŽ`×—~•¶Ë»‚†œ¾ÜÕ‡C}-ôêpÅjs¦/\yO‘½oó*à”‡Áöù5`Õëßþíë·’Od–Æ€Ìü*!i#‘^–¥Ò"ŠbJ¥WkÎT¦‹Kf§ÚãL$öj‚ö8Hí*!乪5 Ù@•!ÆÕZf)˸RœeÚëÿvÂÙtÕW»¢9œËêžÞõ®8а=Ûò]’ˆ¢%@·Ï»0òÓG³àܾõ£™zÞ-åÒçµd™å Ÿ¿¶É ­®Á¾$(,K”~š H˜ÒÁÚ:x òYŒÑSh Pßù§s5„]‡³›ÂÙ[QüÈ®ÀMX…ÕýŒ¼kÊóåÚüFåïa^‰Sk#! ¯'C"ý:e65AfäÏrðòªËËŠ6\ªV¿Mí;Õdi€K8Õ£þ{ÙP`5eáhg,ØB1“ º1 žiøxó@yƒ.­\}ë\`µ (ŽÚŒ;$£o\œO %·s—é»2Çõ$‡pFÏ=’”Κ†à$ D…5FNuµ#Ò,6JYuÎ×F¯áDùX we~_Wܨ.X§íO§Céέ(—-wÜ] :UíWƒ¨èE%ÎÎBøƒÖx9`0áƒOÍŸ¢fãJ³DŠgÌ–=7Rò®¿#R“cYõs¦4hà8°àžZ¸ù‡á„iï¬SÚ¿dg|®A.Q§^ŒÃÃn„´¡ 1­ÀU謺ø9|ã£_O'¢ö¹ŒŒ‘hk,ƒS|È&<µK-*ŤT£¯¹]Ý÷G:¸(È>AÆ(f•y>ø‰aÞõÕ}2²·(ªóz'¼;ñ ¼¡…ì4¯ãö’mžr‹ýùzm’¼cÍ<ÿ´öƒfS⹊ßÞ%:¡Ñ‡É ½$Lè0œ€…ßÄ\ý×ël\„qc.fO`8~áRŸ…ŸåÌðÄéƒxl)–)5WêÛÎzÊíB0¶ãq0çÁðÌé‹Ï8æv<ÝÜ Ë q®¥9Í/¯VíÔñ §¯~­hSUyøø`S~K¨SV¼0¡öz屌Ä¿š`ÝÄÎÅhÒüU;§ª¡úQ0ßk%üc%T.?J^#˜Ÿ Øki}A%Jñ•(_&$¾ v̇òX¶Å">”¿b)\Ê}]ï˜_Ú^‘× çÊ<®î†mÆtˆ ‚AÎ&?Qá@»–Sí*¸ÄoõK®1ŠYf줢”Ê.x"F|’×|åN>„`ýÏ Ž©¦Ü"a‡Xtûz‡•L‡v€Ã+ÂÌœmÑÑÃTé(§± ßñt³º¼ñóüa¸ Êm‘7ލI)•ÃS<œ ý>c&~j (u{oÛ"LÂa6½kz72a!_¨`E Å”È-½Î+k„l Fž àÓø»j{§@KWÐ*îëþ°£1f"ølúÊŠSÄv˜ª8dÔ“ó (©|ð]y‡š½ƒ,“ z‡—Qï¨"H©þêK¢ñdhhÍÜÂè¿9DM±Ý×¥S&ä¤ÎÊP®O¬œ,¬œPÇN>Ä>žê¦Ë«&{ ¯@@¤ê°-)Ìâº=àô“΀€æûCW®?p0·\ËbbŒé‘Mçé$C}¶’œ:&fqBº¸Æ—ËMãùvÀ²ÝÀ] g› mÉþˆ½)BËÅi³ô-Hž—W»¬£e,hR>uW|%Na » ò¤e˜¸‡!r_÷‡_ €‰&”dß1*åótdFrº|„ñ‘˜¹$Æ …>( †Na°ã]Ôq€³@E¤“ÉðÐ*ƒóâß-áÚZôâº_­ÇÌɇèËéo=±ºr•aÑGûEœ‡V(êÛ€®×è‰æš\{˜Ox¤‹éê65œ¦•GI&œfÙü|à bÅK<‘Êé17W °ã›tÜë%Â’ÕîøN±K2†Ùt(P\ÁóÄrxâCÙãZ1“Nû<óm>X5÷ ®;ª…y¼üÕ)³cWö-¦ÙB1É4WéÏ·½,â‹s€” µìcZPr]þ”RKS>UƒÉ¨éÑ@RdÌ")šI{Ùùž9ÍÜÞŒ§bÖýŽ­˜AQšEVlânˆüMp©¿ú¡Í­‡¶óàsŒ1ÐðX,?½5>BÊØ‚Žs¾X2f+Åg‹aÐԴʛh dNàË0Œúr†«©o£R[!žå1e‰–SÏmµÞKOÔ¯0¾1ó„㮥@~M¹ÇXLxšE‹Ü7¦Ûú—ºoB—gäF&3LŒÛ™?W|‡µ<â°“FÒÔa©›tÉTšaªþ1–[ȶð®ÏîªpÞîûö&®•Õÿ³Mw—Ä&òYI`B2sèÐÌýEGÓïÆ¢·è.³)ãZ|B ]T— AÃ%IjYªå|óüÔcÑÃ3½Úw®úƒT—CÊ/Ó¬ ßOâ}Ÿ} )z¤žééÚԮ֌ܽ$Šq;„Ôû¢bHñÑk*HŒ°Ó«%¤à651tð¬F¯–Tîž=sµ8éàn›â0¶…o‚ ÁFÌU˜jjïÛCåÇ®·8“™yQ[Wðt¼qª]–¯êj7Dbr!`gW–Ò†;»¸œ‚Yó$LR=™âË"0¦»ŽHWßðzŠPªÖØ/¼¨‚üsb ½x× ž™»Õþö?þ‡î$÷=ëÜþýçüoÓßló÷uÀG,¿ ÞüøŠw¬µào¯°õ„öT®’uª…!é[Hr„èÏô¶ÝçÕ½35¼Ô~~øO—¬4Vr*TÊ8á¢Ã&a7f€’"I§mò#/â̰jΩ…=#ìÎ@¢]ìz[fwôeh®¸ïcë>Í5ÚL{Y&4¬ôj_P¿Ìø¾T§®™‚ÙòØÉ „?ÇïF凶Žõ¨î{wÙ ºd2>/CЩhJjˆÑß=ø,¼>†wp¸)`[„é´¨{e¤×ϰ¾\Uĺ'ëz”0-߸¦‚=‚KËŒSñçWiŠafħï‰]¿õNÙI†·+›|Sð~×}sÝ,x‡{×ø'ÒøËÉÖï_çп¡ç®È»=þ¸bµ¿…DèÔð±ŒRfú˜¼¢‰ýš$7‹_“hE5ÿIgC6ü.I’ÈR)KÕp”'ϵõ¿‰¬ X:ê:š%ã_wuíw@мl.̨X8êý½Áÿ L´àP«õÆ#+¢ÇäE¯åä'nþJrÿ[²L8âÀgú|šEÏš‰üï‚X=ù¿e*øk÷áׂ¡(3jÌàTÓËûÕ‡"äÒTâ…ÿsæÿÍàÝ@·lafM5›` lvÜû¡Åo_}wûÕ–ÚTZ endstream endobj 144 0 obj << /Type /Page /Contents 145 0 R /Resources 143 0 R /MediaBox [0 0 612 792] /Parent 129 0 R >> endobj 143 0 obj << /Font << /F64 4 0 R /F31 8 0 R /F27 19 0 R /F28 9 0 R /F65 5 0 R /F88 136 0 R /F68 6 0 R /F30 10 0 R /F34 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 148 0 obj << /Length 2739 /Filter /FlateDecode >> stream xÚ­YKÜÆ¾ï¯˜K€DÓf“Ýd3ˆD€•È€KÚ@Ë.‡»Ã˜1ÉÑj/ùí©Wó1ËÑ&@Nl«_ÕU_}Õ|s{óÝÛØm´V©µáæö~££H% Šm¢ÂÈnn›_¶¡²»½‚`ûáÜ4eó°ûõö‡ïÞ¦ñ¼gb” ÒMÀ]ê¾f¥ØlR•ÆaŒ:{QÚk§`Ҽݹ`Ûîö¡‰·Ÿƒ °i·Ã±`YÝŠê¶“mžUÕô™Ç·³ñÓ†O¾½†0P‘Ó^çþÜäCÙ6<×c9/¦ÏN§®=ue6xA·Ónûp®‹fèÕnnûv§í¶íX¡=K£cÑ€ª|ÍêSUÈfi` ªÄ9l 1y]ÇlÛ/Ø çíöP ušâÀ¯™H³AZ}1¬Y$RA2Z$Ͼ¬XD'*B¯ƒ«‹S?~ ]ùue`(çÆNïW†…#Ö±W(›C™g›#ööÅ}TU» -XC66tYÓ—x&=-Åm³F>• ȳŠ_¾`¯¬:tÖn?¡#ùQ;oÜ8P\baÜ®ÈO hƒíÐòÎje“6Pqômw"ã:J4ÜÜéc§,  S6”%üˆ^ÍSë?Áúu°íKt–Ý•‡’ü¬ ïÌD•b§pó)ؼá þ—Ý>†`…ÓV¸hzùóžŸ øØ€_úÜ›ÿæÇS‘uhwúz¾ûÌÿúçÛŸþù£ÈØß°õzœä™:XÚø€!*ü..4ïôÞVdà_³|X|6°B½fk£Rcd¯2Ï;ÝÈÅàPeÏ­Y¤¡ a_Ã/‡ì‰í½p~nrïd›õ=„öAmùy'tEÞvÿU&ʇêi>{2¡†æÆÛsÆã#QÃsôÃùPý¸öT¿¹™óc×6e‡ŸB¨—}‘õäîÐ寋9’ qŸ‡øR¶ç%8p#zwÅ}Û‰ªì{Ö=ö¾€24ÏrhˆÜ‚â¡ðÜüÖpè6²¤ÛãY¾ ¶]øD*òòþi%Ð"­Àv>Š®¹ÅÈDH’9v%ÔqìA§à7>ŸàA¿œ0¬#|8fƒŒw”Á2Ý“ÈÊÏ•'÷Ëð–1,É:éÚÞõEÇ(ðÝüè`gvŒÔ*k1¥„x5MÑíöÀö6²ÛwèÒ¡œYJÞdÙ1;p3ùˆä”Ñê0ä#cj')· ?Æo–E'C ;M9_ò¶> ôôš{HÂ.ÝÁŒ»â*ÞÍcÐáÛ<èH@C$'À­&ó1Éß Ñz,f:í¹’Q¯{f…Êö×ÌSÍ+{ ¸t¤lbYb³Ðëc-6þ· îiçjÀMh#þŒ9?`.B)Û¸P…\ž]¨ÐsèÂkßd§þØ=¿Rœv¨N^ôò•üœ&¹+!)w²0:ÅaþwIÝ“Ou;l_]G4qxt'Jñ0Ž3à$x<óyß²h¾rxõ¼{ÀÚ<'Þ€öJ£íç0ŒÝ̈{~P1¢Mì T2~Ôå×áLQ:NAvê µæ®‹bô´ux³f$K`ƒáéT¬ø‰1*šÈÄœiŽle•¤è‰‰ý×,6¦*0ñX>KÊ›Ire/°Æ Œ_€L ¨lžsl˜¢Ú\(€Ò‘ %@áÅ e ©³¯e}®YJ ’ø¬‚ªü #¥¨ÊcÛøã3¥Y²âÍ; vöÂ9OY—ÕÅPtè߯|×À °¯1ÁÃéðª5&vZ±ö³€è¿~n=í,Ì;fœö~¸b@¨Â‚Éaˆ†À¸5àPŽb~61}9÷¼†ª}Ø/M"›ù„ H{±üJÓ Ä%°±‡K%hâ?Ú©!… t¸k‡£ˆ8±^%Î[L4¬íqk‹'e¼\g,¬Zª,‡*rü0Ù¾XÄ€A£ñ¸–8JàXîÏ•ôlYÖ«|DŠ<½‡ŽÏ,Àо ¤ƒ*ûÌ׊UmÙ«–pªc¡[_E–ýT푈W Ÿrx°µÌƒ®2r¢¼–ÑVë ºø h{4gÿÐPRê‹Ày<–9%tôž'ÈG…†r #úFþš+£#K°ôrˆhí.1†ØP4ä8ͼ X©Jl|iæyr¯Ê~Àü&/^k1D‡P…,íðáûŸÿñáöµ¾Bl¤’4P˜Ê¾Eê Æ±¨NÜ:e"CP\Y{ì5zÉRóιÅ9^Ô{ ÇDd€Ãu‹*Wƒ»§Ñ¯l,Xö¼gdÀzµ“õcoN÷³¢{4öbûóPSãd±J“ȱ[bùm€ùk±ûÚš ôþ‘ ÊY _>»\G4µ¬?P|¦W|Ñ%*JÜ‹õ ÌÚ…’,‚¶ /?Æ‹ q€[Äù~-—ýÐ ¹Åå<~f}j;)õhÖhc?*K¶UÆk%©T ؤK8$ð¯|™WP¯ûjc¶ä×¢‡cã¢_ùÒ†õKQÉ[ŒDÞeWfMÎÅ,Í#x‚ç‚â4vïeÂi[.ñ1BºÐ—SÛ{¡±²…D3øÆªvȘƭ¹Å®˜ŸøÑÒå Bø~x ¸¶V(ëÙM›Zw£•3Ñbíý–8]ÂdýœYóÅW‚÷D%¦×çK€¥Æ*°ÑòŒ¯{m8z-/ÕR)l³œ`5䓱óñëÍ9^8¤^ZÍËL‘ËáÍj¶²c§™iWOû&«ýL|ýt­6»pÞËÀ”õЪX®ª?[t¤G6&®€îÓx«¶r)áÅÈ‘‰#¾yÊ≔¦+4Å€þ0ÆJ¸‚õÔþ€€n‡bu(W O†lFÕé³£¸ET7Ùú%Çáh&{ºh óPLËb*õ@&±Q À;ž»r„$©> «ˆœtËÑ/ŸÃê…p` ÚiÝúù–vÀ©«™ëW¢ÄUbÈTǬyà­…Àû¢¢k¼V rŒÐ5.µœSÆ\Pãÿw!^\»Ëëbk%ÏPåæûÛ›ßoo‚ÛÐIÀ¡äõÍ/¿›|PQê6¤ZoðF\[d!ÕæãÍû›7ôÈl,g"׬FÅ! æ€b¥ÏR,ì 4Q0e\ UNG¬õS;HÍ,÷dpp.¹ÉzÎðM«H…¯F[NC§±2Ó… ¤™c{xåú›·ûˆÏ•å!Óñâ.Ð1õ>!wãÅ ¹ öx੽ Ѭ,PCMìbå´gJPÏOL–òi8·G9,<Û`ñ" tùi(s!Ý:UØxŸ*ÈMT'°É—)S¸xVŽÍÌã´üVÂ.DÆÖ³ ýî3ÿˆ+ÆÊÿ½ˆöo9‡ü‘#w¤ÅïçÙ*,l›a¼­åßAO§ñ‡ãâ\J—gbÛSÀ©ä熄ɂ¬Î:BŽœ8ý<Љ`¾gµûÔÑ€éç3®La,„ؘã9Çõ‹_ñ‚³Ñ¿-I…ä„$:¢0€hœŸý˜mëé7Òˆçóã¤Eްm.’uŸwE1#Ùs°´*:³‡ ŠœL«S<ÿ„UØj endstream endobj 147 0 obj << /Type /Page /Contents 148 0 R /Resources 146 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 146 0 obj << /Font << /F68 6 0 R /F96 149 0 R /F64 4 0 R /F65 5 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 153 0 obj << /Length 2409 /Filter /FlateDecode >> stream xÚ½YK㸾ϯð%€œ´µ|“šdd`˜}`½È!›ƒlËÓšÈR$÷cùí©bQ²d³›^äbRd‘õdÕGúýúÍWŒ^dif„Y¬÷ .ej[mS!õb½[ü3ù:¯ª·Ë­¿]°ÅŠó4ÓaâÐ~aší›öp¬òåÊ0–¼£¦ëó¾ î¨y(ò¶» ³ÇÍçbÛÏVü°þîça~—÷óí¶ùm˜úrÈû¶¼ŸÍþs’áº"﯋ûülkRòA!ÓŒ“üóûòp<QUþ»¨Êë¦ÙÑwÑõ%ð*ºÙ°rÝæuWöeSqY÷…äœÙTgvn®÷yêÂS¬¢$?ÌÆ©YQ™`)·LZúB?àHÆ„½ÂŽZOÕþ­\ÄrÅ´°•°nÂ…z0̹ÔWã—2N½†Ÿù1%.S~L*.F~L‹ì%üÄV ü„Ð\Dô3VŸô“L({ÁϼœŸ½f˜ÍÔÌk–9ÇÐkZp%_£•µ’J~©•°’ÛQ+%2Ë^Ãoê5&"üç"›D‰/ñš|ATJf"^ÛêS”€9µ} ?9zMIËÙÌkBP ×¤ÒúUZ¬J)ñšt⤕ÌÀo)-d¦• dÓLJ%µJÒÌi‚d›ŒWͧÕ)ù½ ²È̸ÔfA‘P“"±â*Í”¾°w´Ë‡¶D g) L!ƒîðÓLs$¨"$KîaW„ÎM³ußÑWÞÃŽ-Q˜v,†éЂìKùºzÔ µ»b ¿·K’TÍ ­ï7}sè†ó:dã ÒÔu»™:Ü•ýusìéc²ƒSÞKýX :"Ù“-˜œŒ”=–.W äùÛ¾/Z¢Ø•]uh`‡"°ÁÇÕ:¸Í–Éä¦m>µE×ùꃓ^cä6Ѹ-bÑ8ÞÎyØ„2tÁWB³?Pçдjfnøö6ô½¶Ø6È;ð°4:A…K¾¯·ayYËÂÀ™Ðž½Êkk¨¦‡µÝÂD´ ¢i튦òz:ÔŠaQ³§–Só5˜ ußQ#RIq¨[†¶»xCaÛÁâÚgl6Åž4ÒlTù· ŸÒaŽDíO¬(2´Ñ2êìŠnÛ–vàóvéÏWÙýOöÇz;D0̃åzêmó°Õ¦ öØùD ­m6}^ªîx8äí}”5BÃü$N8žAñøÁû…1ÑSÞ@‡4»¢JCr! LD˜ú\ª‡$R€)qà× FÅ-þ€’Ä‘Eƒ (ø°3ÁqÞÔà;KyX.5Ñ?–b0§É’ºASÞч•ºžvŠ=ì=Ü•Æù¨òãèÍû›*¯ó¾A‹áàà—|S¡Ì8„¢Í6$inO{žÔ@$œeलþD4954nšIò*†a¦v%Õhö•¶Yòݨ¤¢¬íu¾,%`¨H™{=„±{«J>±ªà&Ì‚(^„‰D¸ ‰M5/‰—ÛH Qͯ‘M4À>Ù„G< ÷‘ÏÝu¹½&Ùwà]0IôËés8•Áe}°Yd NÈ ¸€Ã¹´3IPZ1Ð9ŸB=çgÇä2Â$!3ž¹9ƒÀ¬{N0ñq)‚£ÛìÿbtñŒÑg›\a©0!γùÙDe¦QŸ{Òœ  !fl•ÁEÁ ʨÛ‘˜ó¼Ù6]Ñ’_öÌ#'RÇGŸ#, C™‘EÙÅä0)Çcð%P°…I3+R(¨9xULU¦ˆ •çI1¼ƒ{¡XLHŸð >óàSCrÜ©üÆÍ?(™Z:(—lWÒÉTņ̃~‰|¢´°3þŽiˆ#nõIv ¥™°ˆÃ5˜ÈÎB*&w¼°sqóˆ•8„P¦OqÌU„¹8ÔðM×tlñFgP&¸–D„š’w›H•‘¿‹Kì…Kž9륵ÉÚ×F+.Ó[LjcáR—=•ÎljÝ鄵asÀEÛ뼯òAÛ?!ò±r@çSŒû“°×¶¹É5ãjÀÎØ.¹K>ƬÇ.— 4\ÎÅèëCwˆl.Vs›}³¦z–ÿol~ß’™L%hàƒ™ ‹ôyiEe ´ó VÓÍ &óYè—Ñ©qáÐ^Ÿ×ÃhM£›¢¿+Šðp’ºÌˆç.Ìïg dò1o=21䉂láÚ’F,ù°±ƒÀ49Ö¥m^mUÀv†ÖÐ6›|SV¾R#¨RàLNÍÀqÑÿ™ âŒW.‚Y$!ÝÚGÜ*ÁïŽÜô)ÿü î>ѹԹIfa,’¡VŸpI·°í‡KO¯0ò„:^(t,3ÈqÙ”]@š3D€—ªc@þ޳tÙÜóy¸,=RmE6sÏéaGãÛ§ŒeÙ̬1À5HæBÌ5/ Bù£Wîð ¿N 9^`¨÷ùØõÔkêqñ¹u9b'©$Ü2yÈ:†)•Ü#ˆ‡¢óýqØiO iÁ€‚:þ8à•$PÂͳ¼ñ/2W‘ÛZ¨uZj„Åœ’»”ø½8„—kìà 2NDEÑà6øþwpYÂ;Û±ÂD&án™W-ćó¼%²ð†áÓM+zp3@ÌðífïzÛó7!ÚÝíx?Á<ÿ|„MS%þû/á?üýùþð|÷üŸœ‘gÌ?Á±’â‰ÿ>Í}†é XžNQA½GŽÏ4AŽÙ*Õ6X]øbùæïë7ÿúî† endstream endobj 152 0 obj << /Type /Page /Contents 153 0 R /Resources 151 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 151 0 obj << /Font << /F65 5 0 R /F64 4 0 R /F68 6 0 R /F31 8 0 R /F28 9 0 R /F30 10 0 R /F27 19 0 R /F33 18 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 156 0 obj << /Length 1873 /Filter /FlateDecode >> stream xÚ­XK“ÛD¾çWø(“õ0ïGªàª  0'ÂaÖÖî dÉHr²›¿žéÑËV–%ÎI£y}ýžîþfûêËïµ\9â4׫íÝŠIK ã+­ áB­¶ûÕïÙÏMQuEu¿Þpª³î!_ÿ±ýªÉA8'ÜŠâC{H[fwÃÐê~O}ûg¾ëðʪ^s•½ÇŸ}ÑKÿÔŽhq·]qð]¾Çß]½f*{Îù¦€ù´ë.ÌÜÁÍ鼯öÃEEÓŸ­ÞRÊ÷yµ‹ÇLüåÍš…ûdæaP¶ÕÆ "øjÃq*Iã-U´ª  ˆ´K²ùÆ·°¹ê) ~ï‹î!ñtFl›'šº:}1È„á!÷U;£/¸m`¡èb”Cì‰ý­#^´ùDzƒ¶Ç ¾Äß“!5D9³ÌZçâ–_G`øÙàga¦°øŒ <É:™o(»¡b* §Zú¿H;‡/ q#Õˆ”ÎFm„ëÿ¥Ö×bÊ“JæÄ9&<*°È¦"\²ð©/0ù3M˜œë%>µÕ>Æ_È'F¶I‹ÊJ*fZ¤Jä¯)½ÙÀó%ìµHbàN})QN´3î fRw-æD‹ðà«KLæ‚DÝ`9´øšª`ŠX«FLC¬ ËÌK=D<#Û¤E)™™ú¢½rôE–YDÒ/G%*ãöR¢’«™:7÷ÅÅxQþêhôéÁEG~”Ü7r>.DäÅA³Ÿ!¢¤hÅ­3”@ÒÔ¤+BŸ»ÆèYÄUVÉHÂëƒx³vHÿŸØñé¡)¤F+íH¡”I\°kE!{åBŠ!,ƒ[«¸Ò¹üµ2W:}âÈGb¢\Hd%z„%N˜rôŒ§âA98( d1¥=؇âçNs– ªœ`E„”ÙH+_à5™/ëû͘}½IÑC8%‰1f!ÃÞpG,¤Á³má»ÏÛ]SÜâÓB£/…ï¡n† /Êùj›ïú×'¤tŽ`ö²çœ§ "ò¨¦Wßm_ý sÛÉ endstream endobj 155 0 obj << /Type /Page /Contents 156 0 R /Resources 154 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 154 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F70 7 0 R /F28 9 0 R /F31 8 0 R /F30 10 0 R /F88 136 0 R /F27 19 0 R >> /ProcSet [ /PDF /Text ] >> endobj 159 0 obj << /Length 855 /Filter /FlateDecode >> stream xÚÕVMÛ6½ï¯ЋŒX gHÉCr(=詾µ9(^:+À²SËYdÿ}‡¢$Ûk."#í!Cäx8o†oøûêîí½s…žŠÕ¦¥„%W±•)VÅ_åûEER–ÿ´õñÐ|m×þ-\×O]èwËôÿzÿTšúºwÛ¦;FVx'yñ—´~KŸ?êmX|Z}|{OæÌ¿¶Â!Xá&÷Ùf:ñHQMZ ¼¡ŒVÿ©¤kµM»N”x¯å2.Œõ¦+š”ƒ1se  ¥@>‹'ciņ¤\Ž;%¥–3̪áÀÔô¹ÚEÚ¹H¯Á19p†|@äòëü”Ãî*ÊÁ4`NR{}¹•ÞbÄÜ€!5œ1Fô ®c”Ö¢›bDÒÍ0{ ˜j.˜sªxê!¥´ô×ù iÀ)H0s5a®a26`nИs…’Ì ޾±Ó¤e2UT¨Í”µ4Hî¦ É¦rR‚“§æ­´šæxÏ(›©°»Ó='vr#¬/¸V^ÒÜϱ,dYö>´3xVÍâÙW»¿:TÎ:„52Ê–•ä/qôU@á”»49ødÚò½Ý´·Ì&îε‚ÈF$^f¥©ˆÖÈŒ¨•3³™—„Væª &¼áùTñ\5ùú]&ÊWÁ¼ˆW:ýü ,¬„ñö•¬¤¾è-˜]…‘‹@i¯ª`œMUÐõÜ*üŒÌíF.ׇ(,Ú³º2;8Ÿ½º¯ÃËÿöW÷Šð¹%7 Ñ©i¸#ߺáE@ÂzÈÕN íìYí€_¾#éMúü=¬…×úÅ{´Ù­NµòLu|û°Ÿ^‹;cù5„~ÔyZ€)ákö»E…ÚÅ{/Ô2­šÍM¹ ‡°;F‘-‡z×5ÇIýÇ@Z¶õsÒù’ Ô]³}þÜ?„í6<$ñtÆÁz#zŠâaȤ¾"Ö^Vçs4N¾ì¾†u³ynv_xoeY'ñ®n{‡,‰s* ÷›ôÝìí·m†]’s£ œŠ¯™³ÓüËÀK(´™à­ på—o-ç'ìòC½~LNÃ6´)ﳸb/B~¬ —ŽTQ¡Žçxï{þ¿û°ºûLÇÍ endstream endobj 158 0 obj << /Type /Page /Contents 159 0 R /Resources 157 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 157 0 obj << /Font << /F88 136 0 R /F65 5 0 R /F64 4 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 162 0 obj << /Length 2273 /Filter /FlateDecode >> stream xÚÕYKãÆ¾ï¯|¢©Ã~°In2À $€ǘ ‡8Jjˆä,IÍŒ.þí©êª–H 5»Z/bä"ö³º»_=ôçûw¿ÿ`Í,¹Uvv¿I­Ej³™MR¡t2»ßÌþó¥ÊMT•£V¹qu_neý@ýŽgú¶¨»²/›Z̗ƨè/õÅŠªÙ¸=5WnßÌU=Ïm-æK'S”¨ß½ŸI¢mÛT4ÖõE½™ÿûþ¯³x¶”Rä ¿ÎËâ@?“>Œ*Д4çégddh¤hy¥+Ö;šñOÝ» û‡àV7—IôBKŠŽwÓgÝàÜ2¥hK8bãY´š«8:ô´§æ;4p÷–šeÝ;Ï-×Ñš];žš›zö«ƒp_—„/®nýÈúd”‰b2ß³0a‡*Þƒe<ܲ{tëòç8VkZƒ§ú[ŧSýÙÅzØÁ#þ4_Ú¶O{UWQÿKúÂÀÏqS‡¥‚Í_èstEÛ-xö°ú[÷w?ÞÿðïylSôµîNç,¦ö»9t ,øX}[¾Œ6ý=Ps0î¥X÷£ió6Åuót’Á`×¾ìz|Ú7r©¾ÍðÛ€|.,1K`6Kêù sdìFäÆ0»ùVÿœ£ ƒ¸lUÅ‘žk¨õìeW÷ÔëytÝÔˆ½¬yxÇÜlëÖ¼¾Ù2½°íB ÇTWÊÇC±§æ¶A…·i´vm>oÐGSF¡«T#1äýòôV”«Vë6‡5"5ßõ¡Zy³’Šî cE Ø×»¶£¾?x¸©šËMUÐly¾!:°Þkìúòaîyë:ÇG´åÎ1ùfL^M2 æÏìí‚\}ËRN.ìidù,«~B#¬±Îa á~;—Yôp¨œ¸¶55¼là{è<¼)–Œ”õ¦\Ó¡÷¼+=BÓ3¾ô*l Åý–aš#ø¢“›ª¢…SzãEÌ—½vÄ¢[àL3šØåß9…a4ì¶þ[ðLÿ¶h«¯fžâ4bÖÛÛOê9†°ÿn ¹P ½ _…øöEhw¿+áš&@÷½–bcˆaØG5ÆïÉûÕ }WaA6=d(>¶ÍCëºÎ+>´gO¨åàÆ¶ˆ,Nƒ9~¤%*Y‘§:Ã%F“Á›„ÉùIRMPÊ`Ùl°èÀn@Ñ)Š™ÈÒdDQé n"E9$¹Àxïú˽…j{‘PØ«àæ5F+ÒÔ~& óÁ¼ÅóY|°#Šê«SÔæ g‡10Ö™_=“˜ÃÒsǼnyºŽí‘Ö]ã«Ô™æ6¾*ù빌¹ ÞÔ/^.Q ,ÖÑ›BÈ{¤‡]4ö}8ŽëŠnIʧÀ?X3†|²ÕRd_4aü6íÆµar…§X`¤+6>éÁÁbÝ6]Ç»w¼­¥Œ†‡,FÓCŸ‡}‚_1Dùøm&ß_ìÅ@ºíúÑ9ï§ÀÔ»×BÒBËìSÂNÇFt LäKûª]~9É«*ù+HêÿôP_ÝÍçX"úWÔØ\E%jáë¬yomM›¶›L¥2Bà â³Ö¾òêS÷É…µ:ìX°~}[#àéT¿uïÑnVÈîÇy!–õ¬º£R† ñGŠw¡áã]ør¼ -JELˆÒÍè±ï¥Áõý࣠ø‰W!¦…V·”±¿u5Œ†Öþ\DluM5™ä‚_ R©FÑ*§T˜é7ô­ÊúŠXXèÞO‰ 8˜IýZdË·e–ƒŸÑ*lë\¸ñ.AOvh1  Pz5n¸r¯nzÚÏØ(êe&âX޹á+QÊøäèweUƪ¢®!éƒ$ 38GÏŽ&8áI¼fÏ=~—<â¹îQfjW0°*:·‡”zã<'¹(Ö(–/L¬xCÎ`ª©Ýõ<¶¨©D××0HŸu‡àëB)ÊñìùßN 3‘N'…XãKòèê´7¶kÕãÞñe¼g=‡öÀEda¸›o\ P²T$¹ü2§5Žþaì,ã‚àå‰)`’¼1$Ò×´ÃV!Îb¡ÉÆ6‹²_°¹NÞÐhatzKÔ°ËXä`”Ÿf‰õ®ç&–è«ÊK– M{øz_<ܧ”³ˆ|JyG¹ïС˜E²0×C §Uvö(¡N@rQ¸f©“Xè©2‘@Elæ­p؇ò…<\|T-B1ö'°*[j–5˜@`ª%ìÁF—CHÏ„åO–†Ea²´Ç}Ó¢ÓÁR]–F‡ö±¡J,ñ0–…J^6ªßÁbªfg={j4ªô8ÒA”L˲àu` ㌌;Zw¦ûâÞ…š§×ªðX«¼gÓš+DZ[·++AŒŸÏÁd 9}Ç•þ¸fÅ4j·†»ðÌ{ÄÑXÀò¼Áæ3@&ŸÓ‡f‚©4àêæð°ãÉz9u{àò„ïiLÕÁ48§4”e”͉á)ë;|‹Õž[aæÌ ?OŸÇ¶A¡n¨W…JcJÿjøÁgÞqQ9K±ŒÔ6^zžPéµÇßò|í‰7«æÀ‚f•8—\³‹Ú]f=€£7€Ìë+È -Ûð·Ay °Ö„±)Ǥb iÊ €·å‹Û€Ü§L#±Â&öJ±’´û5}0ã\ž6an §†&>k`zöli$ù]ç"‡¼”öREöü_YRj©¼Ç·…îÙV:`õ±có‚>E¨¤ 6²þ/"¥þ«‚¦^•e´˜ª+%©Hs}[]éj–>.½>-:¶7že>ë,ÿn2{B×ÔÐ:T&öèÊ|Nbð» GŠYÈ‚Fñ×zq{£Ö¡?Æðû#ú“۪ʆ«Ê^Ø¡¢<ïõêqrY=6¿AõØþªÇ5ûÉÚ/`ÎÚÝ)¦ÿÓw?þí§û;IÙè[4Ïò*<°L,ýtõ8O„RRèXX=ªŒ¾ûîþÝo™åX endstream endobj 161 0 obj << /Type /Page /Contents 162 0 R /Resources 160 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 160 0 obj << /Font << /F64 4 0 R /F68 6 0 R /F88 136 0 R /F65 5 0 R /F31 8 0 R /F27 19 0 R >> /ProcSet [ /PDF /Text ] >> endobj 165 0 obj << /Length 2567 /Filter /FlateDecode >> stream xÚÙŽÛÈñÝ_10j÷É#ÁÈ.ÖHò”…H€8”Ô1K‘Z’Z{öëSÕUÍkè±çE}ëêºçǧwï?¤ö¡EªÓ‡§óƒ²¹È”~H]&´qO§‡ÿ$Ýý÷éèæ€RHó à\}ñ§[Ùõ 8ÇèR‘š4BöC9ø«o†Ý^ç.9– -ʺoqe“ƒ§“{ïO´:·->I©¿TÍ3Ûî”K~ßiøº«-}ïÏxröG&l•W?x`.쇖~ÿð]ûËÂ$Ã¥dà*Hð°Ï•HÕÃ^)Q8VBøÎɤìûûÕÓºá³MØ·g†¥Ÿ-NªYBùn(+>º²é«¡Š0|%X»ùñ¥Q½òNåÄ¥Ån¯¤”ÉÏ_Çqºç{sDt[O8T.RFñ¯]ÁW©J®å .dòy§€Ñðlpt¿å":Ö·Wþ2¨A/ž®ªÞñZ²HpsîÚëóÚ´Ñ"¹Ør®ýuƒu-…ÓÅÓž|M8ÑV˜)²8»µý°¿uíÑ÷=˜¾~j¦k’fO ÆfK(¯·űš¿²&¹Õí°È.áà¹+o—ž H'Ͼñð„ £0¡kÙ½ÐCy¨}/v{#3ð5ð]="½ñý¶â_&ØVu Þb£8p5{¤‹RÉ¥8Uná{f Ä—ÃN–VLO‹ Ó!‚]Pöd“ sÒ@%šäß Úò V]/°ñ˜èuz *OHÖ¨t}ÃFœE>>ÿo÷±m*i.òb„i§'2Ñs j0¡œá|抸¯&ypK4ÉhT.E*íÊhTXÁ)áâØ6¨Ê“oŽž¯ð%(@Ô Dï …Mž+¼þÙö Ý‘À"¼T±‹xPß}ÿˆF–B c—¯>7‘‹ˆ÷Èn -20Mk]òSÛì·Ìh&‹ÑùZ<*;¾;–õñ^³naO1W¤}YÊ0¢e=‡5Ê»ø(>Ó;¼0]ŒÕÁº#ôû§ª̇–É}ŠNÁÁà·¹Bö‹¥X¯9¬©¤nŸdóèÄàzxô²;q\麶ctc°™ÅE2§Ê3HPVXPNÄ2G*©jŒ 9RN¤KiX-ÂÏá!'áaçÁµ› x¸ mäte…šðîäDæFX4‘4GŸí=Ñ£7R‹7‡‹ð8pÎ\šÂÈPÒT}iO2¢›ÉÝ½Ê ‘géò¿’´PéÈã­<þZ>#Ñb8Ñh Tr¸ P]ïo÷ò…§»7BÊs¡ bb"AcKi…HË&4¤ÉæK–Z°qàEtƒ˜”@ôÒÝ*¾)(`›¼ I¦”?»,Bµ0ÔNÁ^ 99[ÖûFÍ%Ì$Ô‚c"þ÷†\J‡xÏ«P…$H" Kq÷fYN¼…¹àd.ÓG®€‡uoqT@yšÎ¬3ÓEòÑoÕ{ã”0n•ê/¾¾}’NÎÞ¶jKvi˜ëâQuŽi«©ysòPÛÕ˜ä­Ê“Ûv€ SÞèr•òôU>€# ¸àR9ýJXØG†ò [ÆkD!³ïΟҎÎDYÍÄêÊ`=дjïÃíŽkÐùX·üï24t*#‰þ<„”„Cø°<ïXõb•flR2nŠ›‹ê‘Üy,Ú ·”úØ^“`ieÍÕLu aêÙh‹±@fÊXÚ;ò‡øP·±Fªš ¤!rÊܽ]«B Á<Â<ºÞ3ÕcÒ… Ä-µUZÁ%ôev÷ #Gþ§]f“UÃpëv`hí¡ ÷¶1aɬ‚á$®ž•f«ø=©-Æ0üO‚ÐsEg"=ÃÀYhÄ1là0Âs$[Á#fRáçj¸P¨©)Ô¯ª>8 ØÍ 8Öû¡Ey¤“s¼Š},ßqQ’~_|ÉÐËÞSÍužA®{•‚Ê«Ø5”Ñ^±îôò'ÒAþF¿ð—Ý>…þufOøÇòw\>Òåðƒ’3º×uÉåÇ!ÔÂø¥Âæ~gGúõ‘Ùa-¿8²¤ˆ~®%zü‘ÂÈÂÊÔ¥q/‹ÌAŒïežå™v.îtZËl«@]²Jà*ƒü§²q¤4³Å¸Ï²ÂšÂÆ}š[ (¿ÞŒŸ»¼Èe1íu§½M¡ŽÉGîspn›}‹û‘Éß·Wq¿=º˜?ôÓåŽ=ŽÎÉ2— /·êb?ln¾ëƒUgÜìd)M¤èHñ§Ðø²÷ûsçƒ+å*¹„–)£n ¾BŸ˜bMÆ-üÂKD<8xJ°<ùòÄ\y¦Ž^×o©«y¥qÈ„=Ú.u˜3B[C Œ¢Y^€õÑ‚iãÂj]Ór%^À 0@qî "Ÿ^"V´ˆ#¨÷뙿oõ'Ý8 Uõé=Ƥnš…u1NHb a~9av¾ÇêqF¬~A݈‘¦ÛÙ¨ÓØ ‚H÷kÌ}ët ¦!Ò/›5¤º±Æ½!Ôm`=4ÓSô†5N„¨Áuû¾êÂÐ$¥àÍ æ¬Ä mã<œÃ}Ýö¥½¶Ø´wƒ‡WØÈS4JEªVƒÊÏÔÜk)u*Ü”‚¿"¥œ²Q¬ÅC`×*¾Ÿ&!ö'ó͉&¹Z½=ôË}5mhÜ ÐaÈ PXuí—˜ðñ¦äïn•?[ø\…zQOêf٠ȾÎEC*I`— íýow¶™ òÀ8ž¿ÕÚA‘•k½®pkÈÖWj¥XtÆZºŸ€ù{Í4«™Ã.ƒŽn¡3 ¡àel ¨Ú±š½]Ä®bnúŠÇnç ‰r‘Nʱúá“Ö¶i»+þnÍîÈZ˜½´ ú_… ‹?¡Oª0ph认ŸUG'ssçF7ŸàþPöqÙ2ÖSWî”S· ÁTºH‰ûXòè{Š•EôãÌÖ%ÔÏÃ(;¼öÕ|cóPT„§aE¥,hô¢Í0Ì *ŽÛà„´éj¸ì‘,§‡9òk ~p¿n傺úyöuui[ Ô©^L¼pBÔðùæø,µðã¼ßÆ)–z8—‡0†š›v£SX›be9Ø}Ír2aå"`" Ë!'Ö™0V½òâ %2'k¦6ŒNWÖ+ë²6ŽÁmT°Y–µp±Lá'ŒxIóõ•q šµlp -Ûæ@”F…>ŽLÊ@£ †*-ù%ôy¦ÛY’;TÛ‡Ã,~’¬Q±e6±eƳEc[¿Ð!'¼¥Ä ŠÑEHÇ5Óì†4öˆj»üŸ×êœ\?žpO°Ðbè8³OÎH1 GMFÙ‡½…Íq$#{÷óÓ»ÿ-ð”É endstream endobj 164 0 obj << /Type /Page /Contents 165 0 R /Resources 163 0 R /MediaBox [0 0 612 792] /Parent 150 0 R >> endobj 163 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F68 6 0 R /F70 7 0 R /F31 8 0 R /F28 9 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 168 0 obj << /Length 2336 /Filter /FlateDecode >> stream xÚµYKãÈ ¾Ï¯è£ Œ+õ~ ØØ=»ÁÛ{I6Ôv¹[‰-9’<=ýïÃ*R/wõLg‚œ$S,‹ÅÇGúûûøÑú»À‚•öîþx'”b(Ö8&•¹»?Üýmós¬šíN¾éÛ¶×n+̆C}Žýöï÷9z!Çf¸¾ã(àþ)nwÊëÍñÚ쇺mh…Y¬0–)#ǸQÃÎý¹ Ý‚t?ñƤÏç¡«öCÛ ã~±«!ÒO³9烤$ŸØó!òkU»Û‰À™Q^ †ì«ýÛ‹ lÖôul†ôÌ2À¨'¬™õtI!F=»ÂI4sn:ÈÇ$ÍoŽm‡»Tøx¬·Òl>¥SƆ6Œ~køÜ·éó§ÄXuuÒ&ó!át=Ûî4—pu+ðÉ7ûê´¿žÐFySºNµTS*Á” £¢¿sΑK.Ç1§ýÈ# öÐ,Ì×ö]A‚aNª‘á ;{L"þMüβà”Ç=´vpoL=Ú}§DÑúeï¬tÏO±‹õvJÆ^»Åÿ_OÁ™+Eóí¥ø{*ùTÌó¯úÝÄ0<¡°C]=¶MuÂ_àÝÝ ¾f/£ÝðÛW™žÃ!vþ]7CLZœ]ý™¡~eP šBšÙI°§ð¨ÎŸ¶;Ëù2üÎ ßWŸèU²‡vÌK±–3* ¦Òþú½üDÏß0ÖǵË;ý5GtÖClwBÂÓ0oá»D*gJqÇŸ†IcœÒøË2c 7.ËçoJ–$Y0«µn”,À¥#Ypé‚{iÆ_A8ÏÍW$+’,™ô΋0J©ÊZ;ÊòÜ›@’%ó2„"ã®nIBàr·¶î/Pü¦}¨êÓtÓÃS5‡`®4crD¿ ¯mâç¡äæÚ2gºjè/W ¦žV\’à7jF.ho” =– mÈY‘˜ü>Ñ.ÝxÎ:–ÒãN* wxãCs–\È á™Á,3C_晀ú±`ý®$10 ÉûµÄb®ÁL¿àÅKU\‘ Œ4d@$Ó §ÕqˆÝ’úZe!@1¾”ÀDÎŒ Éi¾$Oq7Ýl_LvÖ-j¬klR8ûi¡R¥ó»wëX5‡ÒISὊ¥mõæ~ 5¹}Œ`jÒð¹NùyeþŒcrî’N2—èÒñ&p#5!´T×´9ºÄDªðqn»ˆoůàñ3#’/UW#\sÝW”ò5•ˆYʾm†º¹¶×~—@âÏU÷¯­^Ä*´Ý!žJÙ ¼.W1V¹éª´ð™¨«š#¦š3Gèê*R€zñ?„Ý p¸ ;†nõ—S]Vº'µ«Žh‡ú˜Œyp‘‘#Ž]{F.:å냽J> #”,Eæ²%Tz+|ÜbF‚êËXXzBm¥´l÷s¸Æ\k,ü/¥Z Ö™ýþBÕÿ $ˆÏ¨9 AxÐЪ>n…¦„ÿmá¦ÊóŒ–õùø W u®²j?Uï¤g6x>‡ä¨Þäï¶„ b8> $âAš«,ˆ¶þ*¸ÑP‚B+ %WR'ÁÒŠW¾–¨o%fþ¯JL¬¿Ñİ]€; €<ùžL&6V™• ­$Owe“-L̸µbe2.|ÞQr'Þq©¯/Áª«­@žÝÄúo½„÷@·ûm›vþ)6c 0"}(¶/¥¼gçÚ1\i.àü¢âÀj§¥s›Cì÷]ýéýT[É)9uÕ#/PQÚ¾çlë+_7'bËš-˜<29Ä)½ù1Én;t.ÈpJ‡µ!©îcßç¶_ˆ±ÆBmê¯ûôaUõj×#SÆ…@ìâØw磼 5ÌÖÅSuéc‚ÒnžIÒ¹zÁÏÏ©V©$òÐâIÜWý€> endobj 166 0 obj << /Font << /F68 6 0 R /F64 4 0 R /F65 5 0 R /F31 8 0 R /F34 20 0 R /F28 9 0 R /F30 10 0 R /F88 136 0 R /F27 19 0 R /F21 21 0 R /F26 67 0 R >> /ProcSet [ /PDF /Text ] >> endobj 172 0 obj << /Length 2003 /Filter /FlateDecode >> stream xÚ¥XKä¸ ¾Ï¯¨Cp!]½‡H€]ì¹d·÷”ÙƒÇåê6â²kmWÏt~}HQ~u»¦;ØCAES$E~¤êï÷>þ`Í.°`¥ÝÝŸvÂjfÚYã˜TfwÜý;ûeȇr°œgbÆI¾&©×$½ÿíþ»ƒaÁùÝAL’î™&—¤1)ƒW‚9í<×ûƒÂåOÍ Å€Î~¡óAj¸ƒ¤ OR¿ÿz)‹¡<îÒðìç²ëZ\ò¾ÏJZ Õ¹ì“P½t•Zí8‰»~Dvº6ÅPµMúdé;#™vü¢<]vîϲu`NN|=¨nêIþ@ñ¬Ü “MFÄ-P•f×f¨jbFÅ.][”}On–\0cäÚÑ“”tYÙ e×ãÜg9‘ª½4Ùž[6DêéqÚvÄÜ—IB{Zðôw°Ð.Ëë¾%r‘×5jŽó¨$~üIJõX CÕ<¤° ˆšíFËì—2V =MËúB³K¼3”r]ÐL¾¶ïtíà ŽîõXyU÷ì[ñ"€&ÍV¼4×óçQÚ‰ãSÕ£V¡" SóÅÇP‘Æ|3TsNL!Ðìáâ ­ÛˆO=Ô‚u|,= Ìäg\Ú t誯´•DËiù^±Y¢P´¸ý„ŒyWEìÁm"Ô×3Ry¡‡2å:|õ¥ÂZU´ ‚ݱlŠ$Õì’˜-ìýƒ±ï¯g)X5mwÎëh#.Û†ÆÐ>«ÛÄØè%ZÞ$Q×~’“>p‰õí v´GŒu¯³ÐzŠdŸ:?_jJ@•})·T?S¢é”u Â3W)íôd­’ z à¤Ä[ìA)yè –Tdid.)•X„ Äl™‘éwbD±På•¥Žii•1©+ä&„2 ‚lpaíJ-µ¨_@+דþǪ/ó¾\›?G³2Ì{±†„¢íÀÐKÛé’äL9!j‡¾Uâ–„°L™7=àÉš¸¤Øð€¶Ý‚ ¢‹ˆ%AºF †s E$±n™ôô$6¨ý‰´¼'R]ý©¬Ÿ'zt :"³¾E¨$\õK\åë¦ì¯ÔÕ͸ö‰^äO8½£½ª9Š¿H—w1Ó%ÑÅD:þ6t<Ñ­óò RŒíaòÏ4þºU( ë´*#ÌÑj§ÅØ‘Š íÇnU ­ƒ{³+Mêü˜ÿ7ïRÐÓü„ÈÔv¯ŠÌVM‘Æ/jŠoÔ¦Nö1ªp«¨Hˆ[=².»§c†ñ¼%`Âò1†óÑ0œÇ;Œý†e\ûµ¯çä“–²VZ­¼x$ÊVE@†è±t;ÄË‘M`%-ël,*5à áY0ßG¬ª0×ÐÌ`·»y—ˆÐþ¶ð7õDxsŸŸiœËGl&çò±ê%ÓÊÇa¶çýi4ßdJ£¾üšVïÈŒ?w4GXÇ”“ëkùñçýÁIJ”8þš@`żù>Äá@Ãú•HÉd,4ó.p( J)/ËOf„‡†3R6þžãô˜­ÐÇ…Š(ziœ“Œ+£…/ÿÌùÇÉ[ÇMà 7Ð3™Q8`€€QÏǽP†Tø#Ç©ñ8î,T /ƒ%Ša"(oýÒ: Åÿuz¼;ι‚׸—‰â…¶pwÖŒ*…„‚ãŒÛ‚Ö×FÜ °.€u jìd¯ÒF3[çYPNYýëÔÖÁã](£\prúóA8+ƒŠÂÇÛ4rqw7!ßÂÃjT¡LÏ]ˆf•ÏhæC"`»Ù¡"Sñ·º&YGàcÀ,krúÏ ¯b1 ó[£OÌ9wÚÌ›4v{᳇ë¹Äî1*J¯÷×("Á¶`§§kÑ>‘![š›¯Üé]ÌATpz}O?M˜X¥ŠøB%C½KÄOÀf@Ü»T9Ǫ¹j—ß݉Ð{åE+²P}[ø=¶_*E%—!¤!œSç%AMi¦÷LªŸ°÷[Ý¥…× Ÿ*÷¿Rw¹4Ë1?{M»4L¤Ý§€y*î_7¤fƒ^HÛò‚c‡‘‡^^Ñ€º&_ìžè#`ˆ9y­ê’£Ê¼¡Íù¥·¡žpžY·PpÓÊgV©f®LdSU-.‘Ô‰öEŸ{̇iFÍ-¹ 7ÌÜ1Ý|ö‘†SØÚ®*ò˜°nöÉçšþ/c|rÎb^?n¹ŒD9^Ïçgš.e%MH7öNÊÕåÜÏÕDªú-ؼöS~uåú{H©ÉÓù^òñy1ýº|s$¶ˆWøÿÙ|µé¿“}úønê§ò†ÇùÄ8ô—²¨°c+Ææya&öSK3 uD0LJècJ`Šžßßø,ÎÚß endstream endobj 171 0 obj << /Type /Page /Contents 172 0 R /Resources 170 0 R /MediaBox [0 0 612 792] /Parent 169 0 R >> endobj 170 0 obj << /Font << /F65 5 0 R /F68 6 0 R /F64 4 0 R /F31 8 0 R /F27 19 0 R /F88 136 0 R /F28 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 176 0 obj << /Length 1252 /Filter /FlateDecode >> stream xÚ­VKoã6¾çWø(6+RïC ´Ehi»u‹M´ÄÄl%ÑKRÎîþú_²ä(A=Ø"‡Ãyñ›Ç÷û›o>Ù¦FuAŠÍþqƒ³ •˜lмD$Í7ûvóWô]§™¨æ1É£sŒóˆu_â"¶ñ.%I¤˜ŽÿÞÿ¢ò™¨£›ÄÉhÄ™JN5Sžu®µ ¨"$°jb“"JÌ'Ÿ¶’éQn­,ÕØyí)ž‰¬ TMÊu ¤š›‡ªrbxHò$?¼bÎQyá|æúèT7ÂDâlb<³öšh8#½á_™(ÞeeíÜú¿Ù‘¢Fymv£:σð®‹á¨ŠF5Ò‚ ›2:0GÔ–è5—á´ŠT±ŽÌz—,Ýš™gaƒ\”«ùsÀWpå®|ïŠ$‰>õTKþõª7OÔгbv·uç3TÙý­û¼ö”WJÞÂ5Éï,Z¦¸d­Û¼ˆ«#;B7S,ÜâàÔ‰5ü!IHdcòùÔñ†kûÔ@£þ6uŸŽ+½}#Zåÿ-£Äðó‚ŽM_KŠ ÕY¶ ç1Æx A‰#ñh¾É <áp-} ½•v×là€òišµA)€÷ƒ¹eÑ'.‚´?uÌbÛ$å xˤ“@_QµR­Ò4Còѧ¹êÅ¿lÅoR£ª*—W*Ùiç²:-k„I¾„?$4žÀƒÚdØ6p£ÇŸ@ÎiªG“¥Yš‡Bc.¥IF³„Ì¿@UmWü ¸BYž ï¾÷ÿÃï?ÞÝïýîîÏçê™9gT‚sWPgí †à5 !©ƒ×Å%‚1”Ë8KBF5£” Ê'Ä…Ãî…œçÅnvœ¿]3|\ÁŸ9`¼ÿô‰-èEâïY0Ü>$ii~>a{•$ÕÆ== V( B†ž†ùÛ(ognÿÍŸÍ ðþÔ ­Ök ã4³àx)4+.&áĬÉL)&Åâð¼•rBáÚ±a~G=јfW¦Y€MFÀÚIÂì%gwÖ2 T<ŰáƒÒ.~ФP/âg@¿½Æ£Íq¦Kù6yeŒm9»V \…ñÉŒ=jÃŒ3/ D2éJǼöREJÈÃÄä•¿wŽ4¡õ#Ѭtì‰ -: uÛ˜ÓjûŽÁš$!´Ô€]À•«ì¥a½¹Ûßüçñ€ endstream endobj 175 0 obj << /Type /Page /Contents 176 0 R /Resources 174 0 R /MediaBox [0 0 612 792] /Parent 169 0 R >> endobj 174 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F31 8 0 R /F28 9 0 R /F88 136 0 R /F68 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 179 0 obj << /Length 1554 /Filter /FlateDecode >> stream xÚWKÛ6¾ï¯ð­23¢(êqLÒiZí¡é–è5ITD*ÉþûÎp(ÙÞhÑb9çñÍÃ|—Âßq!XYT;‘¬’å®é>?°2çRŽ›e8âñ^$¼þ¹çõîGûðü-g‡EèáFêÛãÃë÷E¾«Y]dÅîxÞñ¼b%ÏvBä¬N³Ý±Ýý•/Æí¼Îw±ûL&_ÃV$þ¢<ø‹¦OOZMtîæé‹Á _ðŸêˆeœìILgü¾‰4qs™è)J|÷fÏ…Lþ ‰O«Ä|3½òº‹bRÆ_íY /Euí8Z§ÛýßÇ_À`QžÃ—³ZJ²Ì[¸À3¸*p!¢*HêM×íªÒÕÉ)“DÁ;vö´Y™yV'Œ8ÿÜçi² ~nã÷Og"ù{ÿáñÿÐšÞ Æ]´£kQöS°;½·øólšOè±Ld¾,5Ù9˜4rÍ™‚6@ø˜¦Ùä=Àç%«kyïxÀxcÑÖ:Mì¿<Ú „N£}¨ íƒS€¡QNß^I“¦S1paäUÒØYO‡´_ä‚'o6=!B‚Fó¼éõ–DÆÊê%' B*êzЏy;££%ûà•¬*X!ªè•‚¤™¡5 ¤zp±  ­Ìñ½¢R¦Kir¶“ïxÚm ˜xöRBz [yùøDšôÀǺ`ãìuȽÐ@’T÷ä°$ CˆPA]ï´Ê+"öæñâ‰Bú â²ÎÛÚ›á‘Î5»H8 2QV!¢@:O¶¿c|±ºLº‹º‚Ív¢ï<Ü‘·­>nÓ®ÀÜêxÏù¹}ÚÑk€…jGoe†É$¯èåŒq%0MÓä­µÞAŽ#ø=Œ°>T¬ˆµ!r€L°<0—é-æ¨DÈõ®ß²b…åg%Î~œ£ôó<4˜v1tã!âYc¬.­M”[´Ea'å‚ 1î‘”{êGo!´wjµšZÚéi²“[×(l’³"ç÷akæ%>Ðgb´ë¥*éƒvΨzHÅ{!–¹s,4¥hЩ>ˆ• iv„5¢­Õ]€*Ðz ý¤ ¢ Å20ÜY‡­¬;lUøhr!®&ÃZ°#‘Я2±È‚prŠt2 ›k¼¬(}q1Íš®ß¸ùÙ›S™¾›TÎÒäð»Šu4Ddã»Ø|€—³-sÞ£¾èd ÑbÂÕ&\¯`ÂdæB'ÊmÔWžKÆK±@t3'ómù¬”kWzE,Ì:ï Œñ¹Ê ß°õr +/þçË«Ö&L¢.VArçâ¾^oÛ Øëcκ—ÞP0V yâJVfW¯Mú‹ê0E_Y (*å­ã–YBÀ¤áŽK‚;­¡g Ø&q}Ь3ùV*ž¨®£"¿öävf\_óâÀË‚qYo¦(CP CI™ü|v¨øÊÐãR™¬ž×$8}^“à.u\XœV ݵ˜ =Î]í¤Õ_© àÀBüPBÚPn€äT?všÖ¡mäFt' pÎAçn*’~îüMÏLhäÈ6Ø©WqAŸð03g€ó¿Q2S0dÏ=Q;óiÏ¡væb)de öi•âQcÑÊU t݆” b¹›­å&ÛG‘„AîC,7ã3Öñ¦?R„ }±0J¶&&,ÉRƒŸ‡ŽcKOt`Õ4óu_pñ¸ÄN×üÜŒuª½k˜Ð ùu”ÛΔ,eu¶òŒªù¤Cm­pÔ.4-âr)ÀÕZz¶25ËXµÖ¬ /ä¨LY^ÝT’¬u ȃçNËô@G“Æ,ðqV*ÊuJxö~ÎRþŸFËú:JX(!×Jü…ӷବK(yà ¢Œ“M…‡?þI» = endstream endobj 178 0 obj << /Type /Page /Contents 179 0 R /Resources 177 0 R /MediaBox [0 0 612 792] /Parent 169 0 R >> endobj 173 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./msm-manual-028.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 180 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 181 0 R>> /ExtGState << >>/ColorSpace << /sRGB 182 0 R >>>> /Length 1557 /Filter /FlateDecode >> stream xœ­XKoV7Ýß_áe²ÀõÌø¹•JH­D© Ä‚Gª%¥$)Uÿ}ÏøñÝ!Ä×v‘O:²=w^g|rϹwîÃöÜ}p©ù]£“Ⱦ°ãÖ|bwsá~q¿oßÝþüÃc÷äl#BpÁüž=ùi ¾$÷×ö⥠îíFîþÞm¤Ü[!_ÄI&_‹»ÞJõ¡:IÅssW[>b5±Ï°ÁVÅת°xâîSc@ ðËR|‰7_ ˜½Å”=e'œ}ÅÌ>aÉÓÀÕ×ä„’—nO’çàf")ŽäÖCO…bøÑŒ2qŠž#0MœƒOX¯ÉÇÔqöM$/(FN¹‹ÏÝ>2Ö3ü×à [f4zj¬ŽqÊšÅÕg¬§à›Úã| ÇßÓô0‘— <µŽaë+h|Ìч䘛o}]‚8i g-sðÒíGññ ?½›ªŸ!SRÇ9àX?Ç‘XH³t\Õ1u;öï—¨… G<\a¨#m¥ã¢]FõÒ|rmªH›î—<“Ó´•³O8{Q„кÞÝVÜ<'G¹i€hNËÒÛI„|Óuñ-v\µ ½I¿Äèst”ê´¯‰Çº†Ý×ѵ‚x’Œ| eÄ‹m¹Û/èy¬Ç:ò)ê(â‰Y©\;¹iîõ— æé:ù¬öΔŽ;Û¿fÛàòµt.:à•sg÷ÖBzx.kh\ëš ,(i8l˜ÐlpPŒÚ Ö§ƒ‹fÃãó™‚7·¤àö æÑS$ÑÿêPÿ¹0~Ö. .öÞ:¿v'áÔ¿Û¾?ï–¿~”boýlúö³ŒéBö,ñaAàœ9|Ä—‰mÄ|øò˜í˜² èõœôs÷dß['%â@f™bÿØZŸÐnhIóaÀfCaû&4”ÚqÿÄ„vü@ÖƒMÉÊ#“,0¬d:bNö–ðÖæ«§ Ó%Çùøãvhq<}œq ¦å|>þ8frXÎ×£ AΓ¿×\“É[ #ÉóòœP f´^&³Œ þæÆ´ûÏl×KO‡hÕѪž_^_ u‡£3ç_œ<½¼»»xënÿ¼9u0ÈO>^~L9Ÿ¾ÅÈ)ÆGírJoyŠ»œâµð9¥ª¡6#§tN‰‘SÒ†ÜXr r޳‘S¸ÅÅÊ)-u6r òjÊ©°äß”ShD©»œ¢6îš%§Hå\ØåT—#¼Ë)­Û.§9#§ñw¹7åAŒóCNäžÐ.§ºü¨»œÒ°+írJ[±Ëƒ%§¦^¯%§ –)9³C~M9…üù7唪6r Ý)VN©|#§ Šúù%§dÉ—)§pçw¹ºä”Ö+9¥ia#§Ð&…Œœâ2ÏO9ÅSÎ.9Å¢eÜåÔh»]Nñ’kSNÁÍ’ŒœBôîÿTAÑçTë”B ÚÃÔB½z“Z!`µX]ˆj1"C-†ò/‹A-Ö+$jÁÕ®µBÑŒ¨EjÖP‹j¥ŸÔ¢îÔêJ˜vj)ƒrØ©Õ[Mvj©²Í²S‹æ½¼¨¥Ê5—ZÚ:5ìÔ"P—‹¡–¶Š¥–Le¾¨…Öj¨Åó¡·¨…VHÕP ­Ð_V‹Z(ýxùLj¡ô]9/jÁl3/M³dC-Š]5¨E2íMjT µ0u‡½I-”qPsR+¬ÖžÔBýÆK`RK_Jd¨ÒTþ“ZaR{Q 8Ø— ÚH,µô¥• µ0Úz=µÂ|©-jÁ­>š&µp!UóPìðI¬Ö¯Ð¯{.&­ÐŠùsV}é]¢oBh­I&Ò+&»Gð QÞ\lîKÿKÐaŽ@ú Væ#p—{ÇÝŸË v¢58°1ø­Sb¤Þñ»ÁÿŸŒ¾ðE£¥·Šš§7ï¯ÝíÝ«» GG> endobj 181 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 183 0 R >> endobj 182 0 obj [/ICCBased 184 0 R] endobj 183 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus] >> endobj 184 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 177 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F68 6 0 R /F70 7 0 R >> /XObject << /Im19 173 0 R >> /ProcSet [ /PDF /Text ] >> endobj 187 0 obj << /Length 3024 /Filter /FlateDecode >> stream xÚ•ɎܺñCh€=‘Úƒøâ Fà%H29Å9p$ö4c-m-‚ü{j£–i¶/Ýd‘,k¯Ò»‡7¿¼Ï’›2,3Ý<œnT‡yVÜdiê8½y¨oþ˜f²Cg&w«ÓàË­J{{¯Ó(x¾UQ`^x2õüoÇɵf’-sWÙa2®›^n³4oÿýðç•„e’ÜÜ+–©\òñöœÊŠ ë»û³«kÛñüW3|»zÜôayÐöµmÆ;˜äq`öØ÷Ó8 æÂÇj3™ÑNàsîÞ3NÀD'Áiè[¦s:[ÍMà $’^Q.´Ä _ÞçÑV(* ušÜDŒyðjÓnr@ØI1ÑaRøíáí}\¨àálG+Ì„3Žskk!­gà£ìr]m/~º‰žÏ$XªLSÍ (1 –ðỶ´óø+G³;÷½Üö1J£Ø _À&SH-pbÕXZ4ÆWš0Öy[W_ŸÝtÊm7öÐ-7 ÞêˆõŸíßBZT¤;-*Ö"ï´æU3KƳÑŽt¢Xt {Fã¶ùñ?Àšx‘¨%Çð-•€A¨‚ÎæVG«uÄ Å¿ Å4­Øf7·và1é8Zñ°(Ö¬ÈO•€á¥”ßj Y¸,›Qð­Gãž\gž!í?â Š9_TÐÏÓežjqËW ¶šx£“ê*¶ÚqXG\MH ®ÍKGq˜D™·—vlLJ¡Î´ßƒ, yÜÕ_H‘ùXºµÄ"L‹uåÞ~Ô:A9âÿÁ5i¦år“§ˆhÓÆ5æ±±r¿ÙêâD…y¹ç!hvœ‚ꃺ\PÈ81C?ƒ}\“™§¡.–k‘¾ð˜ I[. ­¢ã@ì¶CÒx¼QUœ‚çüET¼’ ìÀOB+ÓdÁó([¼—±5B¦Êà ŸÞÑ¡d_Äåè8T‘Þ¿~SC¦Ý×/îHÒ Á=´ƒ`UáTÃuÃÉâ¿ÃÅÖw¼‡µT­oš‰F##MW-<à².³°ÔÙ°9ÂX';5ÔÀÆ?Äë2 Buºþ¢˜øø 8x@M |Gëuæ:_ö KÙ¤ÿ0ŠMLEð!¥›¼†vb{Ä\Øó÷½­2=‰;½ˆ×T+ù[’b"!˜o%ÄÌ€ðSæñ+K@Z-X¼}¬¸¥ù€I%†Z€äq)Kµ ·Q.ú vš‡Ž/}Ÿe‰BÀá*-LKô*'Ï4|WãH,×~à˜T¨òå’wØ‹0.R¿a°Ô*Éh'†oŠypSmO”Î Hýú&40Êó}z÷VEQtpmœ†E¶¨%¦p‹V ´× ׎n sÐ[&ö«MEŽ—ÉqêœI«]DÝâ^£ ÏÑ[!à…§Þîë–.½ž=[3Lbšü–½i"êKc:¤˜ð§‘XÖ5ïŠ\Û"„Ê|ù–[Va‘Ä~ßïxGQl¥  ‚•%šü'9ïü²šdQüþžÿ½Â¡ˆåÆ;^A&¿õ–‹Ë_Q<ÿýÌìðgø_Œÿ#^“왲£ç/=¥J%ŠÂL<:¯9“&aö£®4_"ɽÿ°è>Y(^LžYÝ$/0ó~pG&¤õ\zZeaç?+Æ;VeÓÈ]=ç_^µbˆÄÙUÔ{ˆ3TXü—ô ë p&/Àò\„¢ôÛ4ÙM ¾œqâ›ÑÕàÙ òÏ#“‡Êò‰Eoÿv$ðÓùÞʉ°yœ÷£Ý¾Dù—HÑÙŸ(Z¥Ýmé‘ú½8§•è™(cÛy¿–áÙSM«;ýNtV‹N=»F’Ú§«Ùˆ}C¶³ø$óîep„ŒrA®‡øŸú:ù¾€7”¯b;E–¸(9Ç¡¥.8˜¨DÃv­Üh—?ܺrœ£g$›¢¶½¸v6‚q‚`n†šgµ¥·:#7ÂØPËáÏ3x<רûGÃJgûw eø‡Ž×DÉ`´SÄk©©\‡Y¹xñhq¥„H¾Ë¬¹á?ö‚8BwÇi@щ ’¦Ç[d9¤œE±ªo¤nÌÃÊŽ<ãÞC².û+EánM:,\íš x›‘€²‚ØŒ€àùòm§Äy«C§¸†ÿ ^PÈsy`y‡ÆÞ´`¬æ‘}™Š9LÁÿÒÓ‰•–Ø3»F‡Žq¸“Ü|– 6QZÅK”¦›9Jðv5Ÿ>¢[FeÉ^”öH¥0rS'‡} ŽciæWa ‚þ·a­“3X\ÏG“RyXäé…Q•,uX>h9߈¼#÷³èc½ˆ‹dÇ›önì1r[ƒH®` ?H™VŒqÐIIT$+ÂHe{Þúž$ 8ò|ThÁ?»ÆŽT%‡a=ñ35_RÑ™:̸H®€†çYô§[^úAüm"³%†D™¤5q4žû¹©D¿äæ„r=-IÉÒª3H™©¸Ç²ïú-ÔTñͼŸrÏ£øç¬¯¬Q€F]@®S0h8ØÀ·X˜S£…©˜>C‘Uö@Á"òW™àüÐIàš ë§B®$Ôº6*Ãm#îÛ’rðÎ¥ cîŸã³ƒØËUhéû̈¸gb/r¢rÜÚ8ª,_É©¤r,ƒ‹LkU£Puzµa)_Ë”sÐXKf‰ÊŸ±tž²C2°ØÁ¼8»Òjs+Tð<&o¦}ù ¹ÁÙºQb>4Íx«éÜò¯Þœ=jîÕà?iJÍgt­ùêÚ¹=z %`Û«›þé~ÿ둸 ò7¼ò«ß&Fù­Ü…¡oTû«vׯ–VB|ÕJˆãlÏzF*ìù·}‡*&r8úŒÐ™ú ð“ëÏÍ×3×UÍ\ pÜKp{FÁæƒ [c2D¶ té3Ø7€™TŸž~3ÎS®‹9·.3z¡Ž–’‡K4T¾§À?_wF6“)Fåºz­• §Dh»‘Ù`eyì›Yü8ÌÈYÃ?»d\zì:íªÈk-2"ðöáQŠùpžO铤…÷t)Ér¹Ô ²ÙÈ.S×€.½#…¨ ÖÌ¿év7¥lÉX‡´<¿¶ÔHqpÊM×$%'M?¾2‹%ðˆçXƒÈÎÝëjAÁòëÎÀQ“+6›Þü6V@±¥²¥õòÞ ã´~ÏŠÁõ~Π”â(Nuªh<ŒÅc›±çA»(,®ïü<ºnÁ%Û‘ôy÷°^€l#ϰ㟅õ<•ï· 8Ã~~:3Ìua´¾bƒEº2O×ïјä·ÈT>ßËwÞm_A9,}_N‚ò•˜t—,úAü¬YËÙ^öswøi•]¹o»ÁÀƒÏ¥Íš¯YP9t }íËÑÍNÏ–?«Í·w%/Ø\UhÑ;ãBÄ£ÏMü»àײCȱdÿ$ß¹óD§Á~žÁ­_¡TŽ=¡«ö°(|SâÚ›?>¼ù?1£úà endstream endobj 186 0 obj << /Type /Page /Contents 187 0 R /Resources 185 0 R /MediaBox [0 0 612 792] /Parent 169 0 R >> endobj 185 0 obj << /Font << /F64 4 0 R /F70 7 0 R /F65 5 0 R /F88 136 0 R /F34 20 0 R /F68 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 190 0 obj << /Length 3376 /Filter /FlateDecode >> stream xÚZYä¶~÷¯˜7kmY¤îyðÞÄŒöø)Àl‰3-X-µuìnû×§.JT·Æ» Ѐ(²D‹u|Uì·O_}ó.KʰÌtöðôü Ò"Ìòô!KóPÇéÃSýðï`2ÇÖ>tý3>“à2ØGš~ydœÌ$Dæå1 LÓ¿Wó0Ønâ/ÇG8Ò$x¥ÑóÜUSÓwÿyú'°“zìè¨ óT?DÌ­AÜ„çñ,ô>ûEfEîÈarõ×ÉÓÕÌKÝós:5Âøs?0/¦{TipÅiºŒÃ$.J…e*‚çãËÐÏø2N`.û>Št×t/ü^õ* > `ÌÐÀ>Û1|<¤e|ÛN§~~91åt²ØH‚ÚL†»Ì`¥ÁÑ™ ¥N}¹Œ§~’õ]·aªªï¦¦›áD´‡hËüÔœQèe ‡×WvA4q‹hJa ¦šfÓb[Ó`º±Áã…Êüö¨¢ÀMÕšJšMÇ_íôÑÚîfÎþbÑÐYó(°äØÁÞëÅîm€t¯Hu„æÙ\¹1NMÛró(c'Û^žç䟨,øÁ}|²ƒ×èúÉM'*@oÂ2tØš{~õ¤ñ5w=ýÙ±ÀZ]d–µzdgG jg‰ ¦(UXí“9_Z+CÀo·´¸Á:ƒ-Þ>4Ž267?£Q1«†¿íe~ÓY˜ùæ]¬|SK¢0‹Rg;¿3‰Î²°ÌãI’0I ØA˜”²ì!=xD¡XT UÆð}–‰â±w¸aÞ}‰z¬³ÅõB‡®º­-œûÚ¶Ü~ã]ó2Ó»v¶žiÐwóùhenRžÛ é`F»š[Yõ(ãm²üȶcûÅéd¦½5¤„eé™ ¿²4+#}´ <ݡԨªi|Úe«yjÈÃ’þ1áÂn)û)ýý ]?šé*½ngÞšg‹*”óÎ6t,Qtý„®Y wEA†ƒh&¦A«Åç`MÛÀN*´gMÞhlj?R›Ë¥½²£Z 5Ý$£˜Œý"ÎÚM–hÅÀO¦Rt¶éâl_10KÆðl«id{gLfº1«‹ÌÙNvRvh4¿³7ô µ²Ãdg™«W«udØ¡ÿÂ/Ã…4fÿ-îµP 2ƒWÆ/hËøœG5ü¸ó°Ø9V'{vtèèiO9ñ”oh> ѢÅ zYîÚÏ·$fA ­p´»’ÿÙV¢ý}U£}†x„Yðöʽ5œªÆÜNovb Í5–ïÇ{…„%4fç3Ì.'L-+ ²ã„Ö`ÀŒ‚Ir?®â+ƒïÃ5`ê¸tX‚Çɵ)ä£P"Lâí0“ª.‘›d-ðœ»ß:v.w,Q3†`G èáæ4¡Ÿâ%Š( ~ǹ:q«j†j>Ãb]ÅQ5Vl¥ð¥[wMj¯Ü~ÇÑ`(Ý xêq¶ xCŽÎ:¯Ü½è }l¦Tù¸2)ÂTe~ñãý¹ Í£ØQo0.n–…‡a9X¥‡<{NP8¼˜fàA8[ŽF\u‹ï&Al»‚§ MC5eНG:K8û7ÍSiçž4¸' â“V`<£Œô[Rå´K&’çª÷–#*NæFö€6RÞž#Ùlïo‡,Š‚§Ÿ~ùÍqGîI¾G¯§Ä .œVߨ«ßá+€©?·X•‡e¼œ,‰:~é P FÔ›5D7qà?T„;ë%£cõ?(Y’.Ô¸øÎ”y˜žÚBxøÁà~2DàaÝHüNsbHk6@æTs¬ojˆ4BIØG1¾FÔÛyh*™mâWBø{È.£¤\¬IH"ÙÅaZn‘ݰ§a¢”ìÐɤ…–-kñ±V¤!$0ÿgd‡¥Z¦ùËžf«(Lá ï™_ ¼Ái1ϋ׽»¯+ ^8[ÓÝbˆ­¦ÝFvœ(@Km1y,ÈdÁŸ+œ¿ØáÜL„ yG…¯qŒ5Ê]èÓ²©:XÓ¡•^ÛÙîj?6¸ÿãšÕvWëÔíú wŒèø9ÿBB+£2a¸YÖ×.¦õiðdu´"Z 8r¢c¼HDQÀv„48a¡ì/ BÍè’G͹Ÿœ[¥ÅM®ØQ”c¬ù˜¸UôâHA¡ŠŒ*¢Ô»ZXc¢ ‚ˆÖtŽ´@ükÓƒxçaó¯™dÙ9Ò­;'Ô Ñzƒ–ÁdZD¢Ø³ û'éæn7,“cÔK*kÅÈû6èŸ8N߃NüÁÊ)ÆzFøN À¸"%ÀX hÔ­/¸€‘ œŒ|¿'îÚŸñêÎÎ^Úþèô’¥“#s“œ·í+GG:1Ÿ?obË?טƒÜ¨PY,Æ€‡Ø€K+<ý‰ÔTù½’ ¥7Üeø1ÊZôÂ8·š(P…|³¡.AÖde6Rv…jÈÖØ6§¾¯y£ü^…¬¨”-ê¹Ã…ížóVa±Á ”.kɾaHLÐ<bT@Ÿ7V%‰K‘Þ„,îó¨{>à­XÇ>fzbö,*Ï3)(ʼÒÏZŠ$뤒#É!)áû(Š—D¾ ˆÁëûAc`ŒgQ*Ëè¼A‰«ßXÖhãŸ×,Zk8¾­ìÄ*–$Û›b1E™ñvü %>n2 DTNW¹Fz?úa¤¢¶9ܪ.ÀÎ 3ß~î¤/¢èWÀIâ;„*áøÔ:$ÏÙD:½ÐµÖÔ#S’à‚2t×ä9y  ¸²Nþšâ€_þ!l@óž ˆSYرDùð§¥h†ŽÀÆ’ë‰æ®(@ý×€Ïò5Þb­vè[ä‚˱|Bõp±a á;Qy –U¬†Âlj}·Õ6rlqÁŽ-vQˆrÚúÈ]Êüâ  3íu´ŽºåÆRtzJŠ *U;×|à@rWq+rî\¸ÜºteièB!Òlr 1;S+·×½¸±¸Ðš½‰Žœ…öŠ‹0pSZ-]Z7üÆL ;·$v¹É5gF?8ÂÌBKNÜ#9ÑžÜg²èÕšat“hþòÍÎ^jsu¤Vö`B!ÐósŽ0(ˆY`'×=#šû‹QäwK(ˆGÄ)ÿ¢Ö ÎtÏÂbßͼ¤#5C–ïƒ1˜(±ŽgFŽ(?žšê´G4h{¶˜1¹]4š×Ú4Ì–|v°—~ ’ãë¬ð ùÞÂù^ì€u«(Tº=ºÕkAà ŽHç‰_ä®' þÈ¡1BB¾žt÷€Ké‚_òÅ^¾bD êF#K¸€Œƒcá–r~^UÖûv¹µ þ«0Ò¼œÈÈu•ZÊWÑ6ãYÎ4U½;ÀáÆ±'ØvêÛ}\U¬àu»(ýºßÈ‹ìW¢P­SÙCTìU˰( Öð”\o…ºØ¸zíØÑcD‰ï1ÔÖcìhb®è>dߣ3ˆÒ¢náƒsó"4ßËÃ&Uöš›M׫Pqó®×¯ÛÂùu›…À©V^Qßæ‘ÅÍœhëúÁQ]¤ÕüÁÉ›¨}ÆF7ŸAOkíEJPWÉÒ¸|¼ùêe05^L½Ùó€3ûñ¼`_ O˜¾š[#˜»À&)愉b™8`˜Kpƒç‹·™ -?•9ŠõÐðeÁ¯»0; ³xq;€/ãgµ‘XK=¥‚En•ê˳aªõVËu»ésW_WX©•Þ^\ìª)8ø¼P_CúdYÏûÇÂRHhZ‘ØÍ… ˜‰«ÆÐCZ,_S ‡A8‚]W`@­%4ré,NtpjêÚJôûÑ ´}@4¾. ÄN°µ½lI´WÁ(*EKèÇäÏ›–î%ÚBd¯Z®†®Ôû£Ê-»neU: Å]Ò= ¾m®=±ÕŸ{kÐÀ-C:Ò ¡qpæ®2T®¢É™Ì,ÝœÁÇîþÄ ¤üý> endobj 188 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F31 8 0 R /F27 19 0 R /F70 7 0 R /F30 10 0 R /F68 6 0 R /F34 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 193 0 obj << /Length 3095 /Filter /FlateDecode >> stream xÚÅ]Û¸ñý~Å"(PˆY‰E E ´ÀMÑkŠÞ}hú@Ë´Í‹,ù$9›ý÷á eK«½ÜS 09$‡3ÃùÖŸ¿ûÝûB?T¢*dñðxxÈt) £ m„TúáqÿðïäÝf[¤iò¦mÎohø–þ„ŸRmþóøÀ“ßá)+‘›ì!%ëF·ÙªžlK+ô*:ºÖõ¾¦ 10àåÚ$;|‹ëH7 ´©ïhaiG;vvOßúÑÛ† ô–ÍÕ b³ÕE‘|dZßÖ.îî\?ø® Ì¥s®2¡„šd™¢Üa`ò¤FN¤Q¬iºnåá*Pt==[`ðÝ')Õ®Û=ÿla”¯¼F%…ªd8@×øS‡Î׃Àa}:p“<@g&©R<¢ ƒ6eˆ‹®³ ²ž|ƒe$ >ùg>úKFdù$€ía…ë̈JMÆhP·†{†S‡$>ÑŒ˜€ ë®{Ï^ ôp õî@ÿ¾Ý“‰øýÕ2ÅÃu÷8ÍŒÝ c£Fð>–¸¬P¨´z“ì–‹)ØÃL-PèÁˆ5¾V³¦,mzdÀþWÿYpüøÊqa÷,˜Ô *¯ÄˆÌ@ ’æ.FHS&O_Öž­·˜ÄüuMý„É' fd¢pŒI>¥©Ɇ( ;$t“%#>]¥’vE…¥*æòéÚ /&#'“ƒ‹o °»÷¥ã‹ã3-­ø©%føKÅKDõ-myî®t–#E–Ô'W¦!Èl Én€‘‘Œ  `Ûµh4Bæâ‚Ë)Û;€‘MµÜäÚ^RCÜ×îi* Œ(_4n$ŒHì %[¨ä=г\ Àž/Mˆ†Ì`|ãÙOŒÖ^.Îò1Pú.Ζ„‡¾¸ŠÄíill²RZýéz¾ 4ܹñÉ Ã$k #>ÂN]?Òðá ’ ZF @4NPnscà1?Ãq D{?Ô]¼»¥Á£JÔ=Á[rlmGž“ÎàÑæ£÷Ø;Š®×&®ôW^ºóŽé¤xÄ3‡³bdà\…œò_D„NrX16 ¾¾œÌñrNiò;sÿ55¾eÛªR!«eºG”ÅD4x¡Œ ÿ²˜”†(¯>$° ˆt}Ì,ºÞ$‡'ÿp Õ¡;»®½!ïµ0ï ,MÏ×úD£hŸëï¨Á7©òŸq¯}¦Aï|„­ôœ[Ø6& wfóu³8Õ¨!Ã=be±ûM*Òê×¾•,§,á)×f?Ov×21eNÄŠ¤â«!9!Ér!áΉ{¸X"ÀLA¸F+¾ÏɦÜ+qEc\ÑËd 1ÖÝù¼œŠùbî]3ËGi9 ¢¹‡$;:ÕºaŒ$“½‡B >ªØèìðÌùSö²ÊÚïF•™>TU2×PwC¦œÂݨæíávÀn%ækXD8°Ïm¤Ñ…LÅsXÈù™Ž)uÁÉ“k:g p‹©¡ð3ðëÎìYI/÷n¨Á¹Pª`%ö}ùHñg˦,îièy *†’&ù°wäëq鉯¹SrœFÒ,ð 7Þ$ÀÙ5+ÆŒ%5úz•ÝçΠ³ê6¬Ä³„¦}p+•dW^É)Dæ 3ÁcÑbÆpä‰G2D›†ÁââÉ—… àyöÒó"ÑœU-ÙšKWjs)„›)òÝ­-¸H{=ï ÂIÆ>¶Ù@'Œ¢s×Ab/ËO™"3åZú ”dödòk..¯„6SVJ9\°ã‹È'E÷¾rCz ƒ(9&iaô¢Ñ…'–f*-IúøLež|Ä÷yò†T 0´ r•¾ûêÏ–Súëy±u¨·¶Þ@©P©ä_èžx½fÅ3Ãp8)ühKÿó'þí¼Î°öºÑðR*¢ÂKU’íw~ì‘–FîH®*›õ‰¤Hoæ¸"úB²œ;0Îà`á®Áž7Y“Åjþ’H=¹?]zòq¾»òÁE¬¿Ñ…<2ÔH9$¹Þ'f.žÐX‚§ TʇlWAímëúÚQ°ê}y/ìd“8¤g†uCJƒËÝ‘Rs¼ÐE$¯A] v®aèȹ,_°{fL'Æ>õ-^æ · ¢c“ë­RA(ž``jÑ¥`Á* YU40·\‡S'‡ÁàÿÜÄ(ŽK ‘srˆ3†¤Áƒ£¨Ku*Q¹H­–>N§S¾}Í-û½ëÚØ˜îðœZÍoÌrQå‹ÔÑÐ S\¦#`ή€·ã@«5µ’4 ðàûk·zFBoK-‰š:“ÝQôÁÀb0€ÛxÏù´ø3càn°¡p ¸‘Àÿc,A ¦¹L~¼^.¤¼ˆbŒäùávº¼¼`!«•NnŒ<8e&IùªÇgr_(·+No‘gEÔSÞ"ïóJ-ªÉa'b‹¥ÉŽl†C =C²Ö³0òÞz K% Bë™O õÔÝδ€ºyïÜI¦Iä™~Í—©ÐÚü’7F&̬ힱz…Ìv¦¬0!S¤qPéL¯°€ôO¹(ÀJo÷«¢«Ò)|ƒO• @øËQÇܺÏ~XÁQ sCñ?֙בü}‰æ×¢¿EˆyIˆ4 ©Ê¨ò†d›‰¼bŒW¥³]ÕíØïûuÙÁwhТ!j`âÏ  ÷P£VËZÍmJTüÞsÏ¥2IèÄW1þ¬è¾‚´ðÿ$Æû¥š´w×î™fê™f·îRU, -3­b®]±±PqÌ óôÏ©­{¤š¢˜5{i€¡‹þ>ÕBj5Ï ’Ǹ¨n‘”³|ú øzpœz_Ê䋯^žT”…\Sÿ_™˜š|q?B¨`^x,X𒇻}ù»ÐÌ|5 úvŒÞ8zòëÿ .M"SúGTÑÙèc$îêm;\ÛŽ §HÌÑÝ$'8Cê´›NSY¼Ò+a¬³[aóå•T.ÏD™«»¯*òÇxóäæaÓ*ˆ ÂTù7ó*l€Ñ7™7µa•›UÅTÛê•T{W÷Τu:~†„…BJ„/ð…#_7à™ú¿¸„é²ñxr³»&í%ŠVŠ¡e¥š.RNL{Ö÷KÓ·~ü­lo©"·ÉÊEs È+2¾ïÓ§t,Ñ#íýÑÃ;Ë’B>1ÏÛñ ¿;^ ©ê»ÁýŒKé[ ?Äxç®ôëTý&4ݾp“#|¼Rs*~¤\ oÊèï"_@Ô HNÝh¶¸•kКp[xý\Â(}ùŸ•¼cEZ’èÔðHÆ“ sF¡Ër EÎû”ŠÔ¨ W\«"y¹ú«+3숲äƦ ;¿ûþñ»ÿÔà  endstream endobj 192 0 obj << /Type /Page /Contents 193 0 R /Resources 191 0 R /MediaBox [0 0 612 792] /Parent 194 0 R >> endobj 191 0 obj << /Font << /F65 5 0 R /F64 4 0 R /F70 7 0 R /F96 149 0 R /F68 6 0 R /F31 8 0 R /F28 9 0 R /F27 19 0 R /F30 10 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 197 0 obj << /Length 838 /Filter /FlateDecode >> stream xÚÕV±r1 íó[P$Å)–lËvËLRÐPpà !YhÈ$7 ŸvmÉw¹ÝM Õ¾ñÊ϶üžä·û‹ë[ŽCÂÄÃþë€ÞCâû‡áã%_í<;w‰%6|”¸é•«fA^¢>íß nØ!B‰$+ &% J‚J¨$²Â º6…P<#)®‘PáEÒ)v0T@„HwBÉ-’„£¹¦-·/+…ÏJó 7 n3BûºÎTB4ZÜD~1S¿vŒPŒ—È­08eˆxÎ@ V‚77¿ÇûÃø0ÿÃÅûÓ%>îãÕnÎUýÐÙˆ? õ³ÿy¸û>¯²;Y¦eS6LaJ?(vàNá|$*‰]LJ›|²Ð š®<äÐb"AjÃ1ç%6¤T@Á¢Nó²o1Å[HÈ‹Æ-sÒ…åÿ›ã†‘œÑ­»²ÒQ9 o>$¹i¥ héØðg=‚î‚ä|†\§+WœÊÝ©õRs§#@¯XÎgt1wºuÏÖK v‘sÇNsŠ,YXñoìþm:±•1€?Â.(Îðu3Ït>š¤ä¿åNp²ÃJ~Óëήº›Ó\oåHiRæ-‹2mÅäêòiðú]8êQT—%rŽø\#NšI¢¢ï¿> endobj 195 0 obj << /Font << /F65 5 0 R /F104 198 0 R /F64 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 202 0 obj << /Length 1235 /Filter /FlateDecode >> stream xÚ…VKÛ6¾ûWø(µ–‘’-¤ EQ¬‘KÓ-s×D%ÒÕcí¯ï ‡tí­ƒÂ€õif8C~ó ÞïVµZ·e«…^ïžÖ\ʲÖÍZ«ºR­w‡õï¯6[Q1VV¶ 격.P³Í–7U©«Í»Ÿ×l½å¼lUv¡“1¯K™ ض¨ê䢿eÕÜuÑdU)¬ÊZ^ ¾¸Ð¥¬ï¹,»àeö&ËV\`Ó& ++‰.>6Í?àP€CÞÃ6[ Ö§>Ìåi´/¦·¾³å0 _˜byAø ÎÏn°ß³ün¾ÆwÁÀ–c¬ÕO»‡lÍ/‰è…pݰúkUÖW2Z\Á¨Êë’àáÓ Øúǰú ~Y·ÍN·W^ßǨ®k jÊš‹µPÀ©–tÒa8™ÑùgàŠëb>Zuö“_6\ö@*㤲(ýz²ÝœU';vÖÏæÙNdâ<)¬éŽ„¦ÙÌ¢*Î6ɬÍQÍL S|p9ÚƒËêÂ/ÃÞŽ1÷[¨“¶ªn+ ä°LÂ0¸™š^ºT ñ”.õ?x˜Âý:'úX1aÄ +~1㟘ñä ŠàÒq¨îã0¯Ùõ c¢l`¼3rìƒßÃÐÍ3þYoÃ’ÞLÈÖUu^‡‰—M±;R‚Ù¥t` û´=ÓÐÓ‰AüÉ9Öýe«=åO¥pNÍ*c~M¯ÜxêMİ0xéñ´ø.—‘¢$¡ò9²Z³[§ùl†SUº-¦Ôú­Ï“³PBŸ³›ì¶ Æ´Ÿ)Bއ4(¤Á&Æ®¿+$lX¶*SvêÜZáóB5<Û@Gó¦x^K‘`ü‡;žÜԭ΋ຽãx+QVµ¸å­ƒ&¦Q&4tqÞsºÌ2˜é®3}Ÿæy<ü¸tóÕTÏ÷v&­ýLY ë†Ò§ ]5®K¶fLá¿Aòu ¤Á¯M˜rØãwÆ[:ß'Á΃X©7RÒ¼ÕÑü Ã’pœóð> endobj 199 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./msm-manual-030.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 203 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 204 0 R/F3 205 0 R>> /ExtGState << >>/ColorSpace << /sRGB 206 0 R >>>> /Length 5547 /Filter /FlateDecode >> stream xœµœK¯Éq…÷÷WôƹP¹ò]¹• À™´´G4ì)XÃíŸïˆ8'2£ïp¼MÎBvVUVU>â‹Åtûæ–nßÝþöô»ÛßnuçyË£³ßRMÇŸGÏ·,O%Yÿ³<â*zèàT-pˆîì<¨~šNÖyŽS—g-k¢‹^Fõ¥£=Ëk8ßÔW¨Ú^l’w(¯%hiØE'}Lª‹N©<9-R‘×(Ç_S«jé˜ôW†OÇïC_T–Ñ5íyË`”iµµŒÕ&ý•ÁX­?²œ\Òß«aŽ&Ú2³L[ÿkÕW÷U›.A#Iu¬ãü—ÎÕç›Ç•‚–‰•jÔY'X–©ƒçÓŠ^Xu¶ç-ËQÊQw}ÐYfÞeדa\¦m*$Y‘Ò´,Iµ˜¶Y—º­Mù’çkãG˜ó2íy˪TSÔMNÐCçZÐ×QfÔSÄÖ²4-ê|=þäø’•tœQ7AwoAË xE=u`l-ÿ§Ô¨íFƒÎº]ubÝt¾-ýFw Oï/ç‹ön_n~è÷·Û›ç-\ž:Ó­Œ^™«ËÝ@§õlá"®Ciך¸Mº›üú-Æ·?ñ0>~+{ñ?dÙ»ßþÇ ÷¿ÿ€–ñ//˰–ñùöÃíÕùúöö»§ß¾µSÿü±—íÉáØöùÇ&Y‘u îƒÓ ®¬Ó\öýxôK®}ÙnŽÎëÚ n0Þ>0Öa0bOüyƒçÇnPN[ؼel +}ê»dl K¥,=«dl k‹¬%«dlÀÊ„»ˆ)<™_…&‘€ÎT @Ο?°D2rïŸðg­›vÇ¥ëGËd'Ó£ûG˺/û–}=œŽOI6Á¹ô{×Eö†S÷¾—ÿy³Å WÉüè?Œž?gNŽïül|gÜÔyäëV%ÈHÓîáÍþáÝ-½`ŠHܤ분 Säí}x÷ñÏQþ¯nlÓ¢>9Á^ýë÷ï^ËD¸½úŸ×2÷n¯þüþÝ_¿}wûã«¿ûãë׺½ýFÏüBÀH?»ܲ?²£µ¡FCœî¨‘ª5dCµÈ“¨Ñ-ÞX¨!ÛµÅ=D ùOš5ä˜knÔÐX!mÔË÷ºQCF Á„£!†¨QmCY¨!aNN5ªEa 5$hše£†,€  ††\s£†DdµoÔ(X45$ž³@š¨!ážÅ]ŽM¯·Q£ “Žò$G@¤¡îFSïd¡FÆjæ¨!q«õ™¨!améw¨IÔh$¢FÅ9j<GŒçì¨!·£†,̳ÔÐ…úŒ¨1Z;j,T!j G¢F·Ý{£F×AºQC‚èÔUðª5D#Ô'jÈ_#t&jÈaW ¨‘85mÆF"ÝÀòÔP]úF E< †êœ6j( õ€ªñ|€ŠF¼ž¡†ê³nÔ(òØZ@ ÕDC C©ºQC5Bg †¢Bu †êPCQ èÔPËF E/¢…¡†ê26j”3a5T£?@ Õ©nÔÐ~ÔPó5dØ;jˆî9 †h $QCF­A¶£†èÖjˆÎ9 †¢â ¨!í‰ÓB§2I0¾‰¢Ñ¢†h 2QcÚ0ߨ!s㛨±Ð“¨1¹&8jÈ”Eÿˆ¢{ ¨!ã¨!㉨!({µ€¢ûPcOÔñ@Ô×'jˆz1ºžL`·Îò~Él—óyÑÑI7¡qýa:ë…‚.˜5«´n–}˜¶ýÖÒv§Ýß…ó ƒ>l˪/ÌŽÝ·'ƃ½_Ýå Æú'«|/ö>mÕ±ã)ã÷¦»”%”p¼-Gª~–»¸ i|’1ž.k/«|G‚ ÷§3 &ÛÅ4øÑ„ØÕ1>46Ò„ØÖ ó­aÕ,JšÅD¶ k¤ÕzÔó­ê ZVùŒŽ—U¾Õ¨ b Búl¾U¬âš4nH0Y˜©A¢%Ä ¢#!m¾>YåL¸?Yå/$˜,ÒŒub‚ í+æÛÒ 1&„, ­Q_˜oKO$Ä\Ëz•rÔ ±¥ bK7$Ä–îHˆqý*²ÊõDB̵üŸš¢NHˆ-][y†­bK$Ä–¾îbE®+:Ñcu¢Äþêvû;Û]B¬Ì~—+²÷»ã¯»„XÕð!G¾vBÌ· O3ù%BFìy“¥w&JΘ[:4‘¹³bK‡&J;!+¶ônrß½Ðݯ˜Ë2 N‹YÄ÷h^L1èñ¼˜ùSçÅtlþT^Ìã Ï{QǜҚÈRõ,7æGyrŒMbvÌ›xzÌ›„ü˜7ñ™7 2oâ)2ord÷w°›¼,K–Ûùi2?úÁ<4Qæ‡?˜)óÃ?•*»›?Ȥíw¹2ê•ó—ñ- Dé—%‚5"A¥˜Ù5ÚW~YÛ/J³F{ ïÆ¼šáU9[ZGŠÂFfŒù%iðiƲ]̦^p—FÃtI³¥y4ƒÅ´hôTÖg84úa¨Ø®«×ůFãd%ì™qza™¹3ZݳÆÌ™-͛ѡb×…5Ó'‹œàÌliÆLwŸ¾ŒÈ‚_Í–éÌïÑ•Q‰Æv’îž<™>øè`Ét/vƒ#£k< 3d:3yôc¶´=@Cš#¿b0ÀŒY^ŒÈ ëĬ˜-͉éFŒ˜-͇Q‰Š1³a¶4fI˜0[š³¥Y0[š³¥0ò'KÃÌÙÒbè--Á¾$Ì—-Í{Q +Ƭ]¥ myßÒŒ—-ÍwÙÒl—%áºliSfKó\|Q¥å²¥9..¿Zmv–U/*»üw(ùó¾®Ë† ?³Šk26@ ×jÄ­†_©žKfÙ£å\ûЗWsíc(æ ¿¼–kü¼”‹ƒ›qw•\ëw«‘âXÜ?kž~—qA…ŸuW U\”±A.±Š‹26¨%VqQÆèòjîà³Ë™´åÑ"®q}A —lß—p%¡ÅÇK¸¸ó|ª„‹óÏ+¶ºW@@ÚB» ¸–¼+à:¹|Ë·’®?1U^\¾•Ú—UoéÜz¬xës‚û¯Q»õ£0ß^$Ãü†P€a~ChÍ0ŸÀÅ0ŸåC ó; æ³Òˆa>C†ù°”a> 5æO¤0æðæ–Ø Ìgü.d00ù5óKQækˆ¼¿ ñ“a~†Ê0¿ Re˜_P«Ï0ŸÕP ó Âc†ù4!æWÀÃ|–Ù0̧}É0¿"d˜_cqÖ¨x. ó+?A˜ï…Zó©<Ì_a>ô0Ÿ§õ0ß¿·`˜Ï|˜‡ùOÎÃ|vÞÃ|ZëæW|™âa>Ÿ‚‡ù…q.ÃüâÅZó™Gó0¿8O Ì/ ·æÞ ÃürW‡%á6Ãür÷Á‡~UC˜Ï|›‡ù^†01Â|…¹´Ã|M‰Ìæ0Ìw.c˜¿ø ‹í"3„ù#!íË0$vaþHþ†…ù [i‡ùƒ ó•Mçóu–ÌækZçÚa¾¿×óyæ&óæëç`c‡ù"##Ì÷ÏÁæ+]æ¯íB˜?NŽ+„ù˜ú+Ì_(†0œØV<ÌŸ,ób˜?Iu óç]‘•üiù2óÛæOv’aþä£c˜?ù©ÃüÉr8†ù¬³ð0ŸÕŸæ3èaþůxæ_¬Ìb˜ñÁ2èeŽñ®®ê—JѨðí>E_6ƒÙú~ Í¥Ðai&…1xæQ8ÞÓ¢ÙµôÊ`š…ÊPMå9Úº„˜ûwb0¹FsBd‡4obðË(ælõ-Á90gB:cÆÄ˜^Ue¾Ä˜^e¶ÄűLWBÞáL ¤—'qiI\ü´‘ŽÄuyy”%A´ZÕTæGhß,;Bú†l'܈Éo7iFLÏ5‹ð/ÙhEL¦èDÌË˪,ç4™’ 1§I™ ¡Ò °!l«6„îHë†Ðñ‡ö°!t{`Q“Ùéô¢$غ# h6„n ´)ºS‹ªÌ†°M6…݆î #غ\Á†H9c‰  ¡K?úB5lØI.K›ÁlˆTNìô´!t½g•Ù¶àÃf0B—xÉÁ†ÐEiwØ©\Ç´!t•‡-"U/"ƒ ¡ ;Þl]ÙOY™ ¡K;lØ©v>oغÖ#Í B{‰Á†ÐÕï6„.÷(ʃ ¡ë=lغàÛÔ¢ ‘ÓÒ´!l°þÁ†Ð- Á¦°’š‰Á†Ð=iت;l ³!’Dž°å`Cè¦á "h³!T£¿°!T#Í"h³!t×AÿaCè¶“`k˜ ¡Ec°!‚6B5mcÊ m-Úlˆ Í†Úlˆ¤ñ3l ³!T÷P4´åˆƒ6"h³!‚Îlm6Dж/9» ´e¡—þzESžÉáBªéYÊêa”7 Œ Pµ@Æ(ŽZ Cƒ»^­N~Ít ¥Ê7±Nê¡„ˤK8±J걄‹¤>•pò˜¦Þ•HÅ„Íó(9 I'6𬄴“ŸÔóNlOÞÄ3OÞ$¤ž¼‰çž¼IH>Ý÷~7yYú‰5BåŸxðƒ (ý`ŠG?š‚òÃ?•ƒº }Wi”'¡(WÖi½‡gY(&~Á<ë¢~”‡ª/®‹z<Ų¨GQ/ Œ¯Rõœ5?xk¨Ü7kè²™6k¨66k(„…7”K`“ÅTd “Å(M"k¬Ê'°F“mÖ tÖóŽ5®ð͆t†EKγlÖÐNÎÀî¬Q'جú­Ååž5jøVãâLΗÉa¬¡¡Æ¬á•:dĈ•¬Qîêžf½gÆð¬ÁŸœ5k>ÈÛ5&ø…§AÔ`"o¡†â¨á¡©£FeE Qãlþ;Pãì~CQ‹ßc52}gG< qÔÈü*ÔQ#sŠ;jdÆD Ä75 §—£FññDÔ׆ë5ŠWØ5 ÿÁG MîEÔ(•ã¨Q˜JwÔ(Í+ €òÚrDÒïQCÿY¡ˆ…•-Ž:LÂ÷Š–xDÂÔ’£† #TÔ5Š£>Q£žXQ5êÉ÷KÔaÆŠ& Fõ: K@ AÙ*žT£¢¨Q™RwÔ¨ü ×Q£ò+ÅÏ£ õú–Å]öýJ¹¬Øß¿{ºýTL'¯¼¼icýƒ}.k$üæml<¼Aùëu:ȯƒ ¥YÂ]—ðŒíü_þýã»ï_ËÍîýÝ_Ö>þÎ(£´#Füíÿý÷»os0ÈøÝÓÿªÿ endstream endobj 203 0 obj << /CreationDate (D:20241107141836) /ModDate (D:20241107141836) /Title (R Graphics Output) /Producer (R 4.4.1) /Creator (R) >> endobj 204 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 207 0 R >> endobj 205 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 207 0 R >> endobj 206 0 obj [/ICCBased 208 0 R] endobj 207 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus] >> endobj 208 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 200 0 obj << /Font << /F65 5 0 R /F88 136 0 R /F64 4 0 R /F70 7 0 R >> /XObject << /Im20 199 0 R >> /ProcSet [ /PDF /Text ] >> endobj 211 0 obj << /Length 3132 /Filter /FlateDecode >> stream xÚÝZ[¯ã¶~?¿Â2ºVE]( A6EÒ¤@-ö (°›Ù’m%²äè²'Û_ß¹Q›çl¶MEŸD‘Ô3œùæÚ_?>üñ[o2?Ó¡Þ<7*ŠüT›NR?Œ’Íc±yçõí¥ªKÙowQzû’ŸÃYÇ­ ¼¼ªÇN:ÚãÍŒ¿åÝO8©ÝªÄûÀ}yßo•7^®CÕ6þv—„Ú{<çVý+hÄÁ,cèò¦¯p²Ìh†’:ì¾.ùGnåµlŠíÝ›R~–ˆ&øm¨ uê¡ZÜÕÃ7wV·³c×É(LòAúßIKoy©v·jâÀµkeßÃTŵ´ ¾ùç¼ËCÙUýPz?ÊÏåJ’K¯3|Øv·:ñÀ’Q ¼×‡C;6CÕœàã0öŽ´,4X4¬8z±襢ÎÄ+ªãïƒ „“:ŒõÀýyÿ’¨JžmS‹¼vß—Ý´IYØ/»v<ù%çÌÁ£tºS6nòkn‡tŒMâ½uÙ< 2ïÒeÝóGìÐÀSÅÁkW5‡êZ—ܽ—'j9 ¸Aœ4´Ü;œ+‘3|¼– ~ Ù„½`=2©Ï*%¤"–Š ¿Ñ±Ã0… Žîí§ Øv[ì…8þQö ù’ÑÜ0dkËÃÐÊš”2àyÉ©.ã…'][È“C•×.}fGØ¡D‘¢íRòM`xÉ´l”ùáÌ­µÚ>|Ú¤ }~‘VÛ¥ÈÀüA+§±êT5V⪬ÏòÔ3À%¡Ÿ˜xB ”Ïï#|g§®”Ï»­2Þi¼PnTæÆÀDùIl&|íÊì'¾M9¡¼ÒÞ÷§”¤$¡„XàzóÙPÿíiàŽ„wÁ(e"èª+Jx%¦W’Örÿ:à±§+{HÚeaA+Њ×ðJ3›> µJ4#å:òS˜Xæ5ãeOg¹¤x ŒÇ6švÚD3q¥¥¼÷a-Þc¹Nb·=Éøóë-èçýÃåä¿äÈù¯͇³Ðj—½äÙ%6óNúa°‡­‹;©ê|_Ë8AL".O™‚h¶úñz­§áí©À wIƒeö4Þ£ðå« Ýh5ûÏ0+B?Ê"È¢ÚOBÑü î¹Ì»¾m$…F:ðNm[4À×víqG´»!ÈàÜ]kÇ™Ÿ&‘]ü-(Õö"‰AŽ>>Û®nœZ ®'ëâl².öÍ”ÿ0ä 8OSðÙQ2ï`u¨`OÀ¦À¶^|ød/Â3"zµå#‚ÆÌWá%y·¯`ËD‚q²ø4ŸÎ‚6… åá}_OœUáå>cC'RkÞ”µ­†ø+G•`|Ý÷¥EùXOçÄo¤E¬=91lRnˆµ;‡Å‰GE>—lã6‘–|@×hk9™#?m€ ëÛ´ùì’bM|ºQ(>¥%ÎU˜ž*Þã”름ÐÒ—õ|,ûºk[çR6ư)›VÏ>¥ø€V^|¨z Wœ bn<…W³gŽŸuòÁ¡FowQöT?L¨èÂòõµ”¦9€n×€à™ðH‰ _´ÅºHÎçCÇWWp†L© nù‰î¡vá5ìׇׂFK¹«bÆÇ+ .RAxª|´Ô;é"ž‰„’ÈaFQö(kì×ûÜýú4VP8ï¾Cc4Eù/æ‡Æ·¸nÎŽôTÖ5õ.Š~ /sÅ©u™½ûà˜ÒQ’¿`6 SÁ3ê%ßI¶ÅtâŽòº=µcÏÓX¦`vj$_zoQ+¡ X€yš˜OµÐû JyV˜n´Ÿ¥‘ÁYšÒ0Ð%J„®BÍW©XŸgÍú09LÉ Àɔל ·*&ŠŒ;'wb¸4˜tm·GNWfòlKÒKgïâäe¸äO– …J0(¾!Bˆc×¼ê¸Eö1ýx@œ]…ßÃtb$“ÚkøÜfRC êÈ$†PO•ÛБCÙ¤soS¨ÚţCW2 1+²TdRߤ7 ‰ÝÅfrðoœ®´GL†lÂê’ >åA'ÊoCéðœœBOI¶s:D¨'š@1„ò¨’®úó§€²-›X¬ëj öç*þ•d^ù IÅ3:òíšdʃɭêÜd—XŒÍ9¹•UgF½ºþÙÅÕæ!—Kä7•à¦ô5á‰" *™lpv]øi¼ô±S¤dé§íDÙK’æK–û-Ô Uä›`ªDj™,(ÄìÚ³ä%¥xÞbÒ«™ÑZú{@¯ƒZ{‹w뉯狧ϱmùQ¬Å¶úÖ¶d“Ù?,mŸøû|¯GÛ”: ÛUXãXX¿º\óÃëÝ(FÈ{Kö/é_ö° 𕚈üÏŽ#‰ý˜°¬[0€bÎ *ðÒ›ÅÜÏó€Ï$˜ëg'&D*t:<$ºg±/oìu Zp¾D;uíxÊš–b¢´±>]¿UEs?M¯óÃOë-þüÈ€4FSÞ8¹}>È–ŠûÖ•š›Hÿ‹èE”_Ò<);7#ó (ÇsèÀû5fÁÐÅn s".DZáÍÞüº—nP³ï…È“¹_îšøfÁJœDç¼T_] níd¹ñ²sÑ©=U&6În™?ô,h w0dr5„-<¶)wà^ƒ7ÙymÃ,["ÅôƒEd,!q­(Ù!»!ªØc‰ª£˜š’Æz¿sÅn÷+~yƒR/ÑÕï|ÏyµZÙŠü$µ;p†· ³5â 0C7¤h£"at[å–ˆy#ŒpyšÃHÑÄ¡C³¾BÐÀL ÿIf©5¢$€(™kA”º´Õ°¦ÚìÓ¾w,‰yC-b(p!".{·à¢}mâÏ28 ‡Ügiõê«ÌÜøf^ìÊeF0ÑK3Šg§Ætm*8É™Rô_mS¥NEä?ókÌ•|JÓt­éŽÅR?PégjanØéJ`ì§©Z1ë{);$4¤(ѾÉ2[}:;úŒ’7ΣHÍo$Ñïà:ÏIòé IþS÷²ìñ¹ÚäGWF÷Óy—„‘ç‚KàZÿÄš„RÏŠ'?p1 Xsù߀÷ä ¯–ˆÓð×ËŸKøþ.œ°Ã;U` ü WèÇæ`ïëì=ˆÁ‹-ž½øíµ\¦Æ…ÙÍ–o9u8{ S冈çÏ[°^þ~rûE9Èœ£Œ, ßа~bÖTìqúõÌ$H€rLàp– 䪡^Tñªô8;¢cDËšC$è©l¿Hõ|¹À4~m2$_um)Úú&ý~|/™|¯r]öøñü³Šü_àÑÚòÍêG2óTà ýGöÒ/¡#©eÐŽ!YAHá?+øvÍ ÕÚÁ YN"0®¬²<¤ö£,„åŠ_89† à‘‚Cýj$ý"4X½ Dt㊉Öè¸t –Õዤ@Dß“·ûDͧp{ÏüðÍãÃÏíÁFm"ûHWq¥~¼9\Þýl „Š \Ílžhêec2?ÄÏêÍÛ‡¿?|ÿ\zÜÃÆ¢”ÿ»3kœùýÿ&IBÿ·Ú*qá(¶Vù7 6ts endstream endobj 210 0 obj << /Type /Page /Contents 211 0 R /Resources 209 0 R /MediaBox [0 0 612 792] /Parent 194 0 R >> endobj 209 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F70 7 0 R /F68 6 0 R /F31 8 0 R /F27 19 0 R /F30 10 0 R /F29 104 0 R /F28 9 0 R /F21 21 0 R /F34 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 214 0 obj << /Length 2791 /Filter /FlateDecode >> stream xÚ½kÛ¸ñûý (Pµ>DJ*—¢AÓ¢¸·ßöòA+s×ÂÉ’«Gr{¿¾3œ¡,yµÛ´h‹15Λóà~¸ûîÝG—lr‘;í6weŒH]¶q6ÚØÍÝqs¿½;ùÝA'z[ÖEßWeQã§ÙþÝ]ß6´7ø~ p?CÕUIUO¿G€uÕÃNËí8ø#áýîóÝ_Þ}4j&„–J¤Öm$±ÿIš”°tºq"OM†X4#œr„§™”œ!ÉÍÁ ™æ„Ñ0†™a$"×öÊJÊ*À X3Î…fK„“v£Eâ !íQ½dûõä;¿¢¡QÂ¥×f…b&L>!Dä³mÆóƒïØ>¬jŽþâá¿f`oùºæÝ´3";”¹e·Vè9•0U\uX‚_šãŠØN •ço"*1 ±ç &±C`6Õ¹ €€ÏKÑg?øn-0”Õà ÷–VH5 €fžm?ŒÃ AêšÄXDeÕ²I@¸î ¹g‘øÝ ÷\ãnÕoZfïwÊn)Ê¡~^!0IÖ³K'½üI~»þ›¨L\t¯X–nèN÷K4†Q…‹êÌ«ª|Ùi»-êž@EÇ{MÛ*Œ2LLpÀ8l»[ŠíCt@íà_Üꊦ¯ÐÒ·t;_Ôկŀ²M»]{¦VR¤Ò,Sìdìý€‹à¶X\°éc¡<õP5í¹"€}=„’5 8Ýùá\4„wo’Ï,Ä©E{}EE‘äp*˜_°F`ŒQ‡ÊÈ¥+1(Ýz Z ‘ôíÔv‚@«èŸÏ—¡ Cð <{¹tí/Óݬ‡gƦŸ¯¾z:M›ýx¦s«ri¸F%ßœ²çQËI:˦V”rÂjL¯)§W¢c{&Á(L» “Wn¼Ý~ÿ4V]çœýr<Ê6çbñgß5@ÄÿŠ®‘!ߌʷ1X1&ƒ/1K ôޘόX÷-Á–—äð•¬Ì%Hÿß+fÙÿ¸˜¥"_ÌŠFj\¢OmËÆº†PˆZܬi+d6YX¬i ‚鋼£ ÕÐvéž²E?L®‚g“ÌZ¨!FfÛs{ô˜ŸŒL·_«áDЗg÷È—ÓbPúÇSgn2ÀÖÃÚ@ÅK“·îä%ªù…Cj'¸:¾#ÍúUNn[³lœÊWœ©–ÜM–}sAdC\Ó!ˆZs¿-­KNþVÇbEž] op­ÉS‘CVXd»»X+°v·/—Ðê:`¡ç2!ü¡›cO[-©È,)ãZ¥2`.õ¿²Í„pàz7z¢‹™Yöµ/1r‚t,Gû0Uò%@C嚬‰g…ý†¬üÿZÜ7+p¦)t‡\$¹æ¼Ú&* {…«|Kƻ铥YtÞk•Û$n* ³Ä¯æsf%ñã6%þ€?®Ž¾/Cp4nÐÏCÛÀ¹¸Ð'$ÆÒÇÐÜ8ŠZºJhwÓˆSàTÍö·l@2®0³—Eìî8´„K—(›ÆDµ)[pKÉ@ºÝ™¾x¨Šžxãˆ3tíq,céPÙI²¬4rVÑÇcÅ}|¾ø{b´KÑøúp,†‚¾¹iE‹]OõåÉŸýï_ˆïÄ õ ×⇠¢”lųç’Ùr9<ú"”§y9ü¹¡,×Ðç|:pg«²í§&ÖÓPZà| öÀ<©sÑLÍ1„Q¨ÄÍ’5ÖëÈšyôVì^Š’š%(J0þ/DTµËÈz.gë !¹£™ŽcMw#[1%¥1¶‹Ç!¤xBÛRª-o©±B¤\Z•'‡†ÐçS#€Cç àÐÇC¬.ºlŒê|‡(ôˆœ aUÐÏ_‹K]4‡¿ù*È¿hº@(©žÛµ¾=·W4R3·/¦)=øá«÷ñZ ©Ö¦ƒ«ùz¾½ÑG¹°1ë]ðûЈ9œ*<ù¥:ŽEýÛ…wÒÐ~54踗 g³ôM…úˆá–Àù–¶ãh“S€÷Ÿ Náà¶©4q<Ùƒç5É&DM¤©^‹ÈK &ýcü8`ûÇY ¦…sÕÏãŸé(¨j–î4dÖéÝ+dÖT. 7”Á˜YÏýy%ùj%®3Ø¥(.žP;£°,„ææÏž Ô”ÂâqlÊà¢gç,µæÚd^èÝM¬3wù|ÞGƾƒÜz¾áÉ/x‡áùÂÌϘz`¨ÿðÌ z’‹T¥73«Ü)0*\¸}$Úù^ìö©kÇKOkÎ9v;ö!×À*$y\ø¢<ÑjýÁ%•Àpê¾O«eîÚïךlðÕd·z¥Ãи"ï'¯³É„ ˜!½Òø¤0§Nò”«O2æZ–ÑÎ0PÿY°!3c”^ÊØ6/¬úµ¢Ñ0}4kpµÂÜ+è0ó›÷$¸Í¡~Â謨@JJJO X>e,Áë|ÞGžè³lüðMÉw? ‡ñ›è¦Á¢¿@x1µŸ¤•Ãid”áÊæŠí¯¹  oÌäI€P©Ô\ [à@ÞVª±âuí˼ÎO!¿|ÉW¢N:‘]Gõ7—/ßXB·ùÄ`MUUÌ*RÜÜÛ ¿ŠÍP.‰@šI]ò Þ‚=*0Q!„ñw-]¸˜N–Å—WRE’¼ŒG½W®"¹=Az†­ÖGÛ¥ðèÛ‚à쾞ˡbC4êDh›Ý6k¡²™€Î˜NzúàW‰#aQ?Sæ8Öyü]<Ã!~x¾‘ó^ÁØ«’3IªÈîŸ%/ÄÜËy±&šÓ½CF£a6ۯŠÅ] ,h„íRê&¸„4e3ã‚:@ëùUv¾ cgpBê^ž SFF°ýT¯Ñ€éÛ™)žç=ãJñÈ„òeÑí }Ïô'àwUÃűG|”¼™&nÞyUl·¬s´' ¡jÉ5ׄMá·Ÿ ¸Þª=ýjÚâ ÎDb‚aÂ95xJ§›Jhñq¥yòCx½Á/"¦)þÖÝ!ïíyF¨¦ÌØ}\.-1kDªæ±óÿ=÷2ï>fÙÌ3x˜â£?ì:šö¥•Çê©ú÷:H¾"Ÿ˜u xгÁž61ôÈ©ïõ~­kþÝîfr¡Åû騽ޛ}²·{·O÷Ù>ÿ”Di¢D7‘x£Ñ'lÈCUAIúâ|©§¯F(\ò€Ë0ôBˆ5uÿXÔåXWŠ‚%ÅO0Ý#ÓY7ðŒ/:Œ2 .®³ÂkÜ~óChœ¹YCO#‹,n5RûR ¦üR:. „•«„@:"鈤'$ Háâ­qU˜žé^îAŽ8$èÀHOËH&Lã–É FGHÜÒB®Å KyL÷ÐC'îó’¯J#;Ãw¢>P¬’G®q¡"޹áÊÚš×´FË'E óÈxªCÔÍïd aÖx&¯i½™g‘@Ô+ÚÎ^ œ¾ð‚›TÍÖØÚ×T5¬PÙ&“Ï$mâ;×1y¡kºÆÔ½¦«‰ºNNÌ–öÅ?T1$jhÔMÀ K*HK×ÔÞ ÇLqo(îoßß3#4¤h6Dÿ†d,b~÷§»ïþ jGY endstream endobj 213 0 obj << /Type /Page /Contents 214 0 R /Resources 212 0 R /MediaBox [0 0 612 792] /Parent 194 0 R >> endobj 212 0 obj << /Font << /F64 4 0 R /F31 8 0 R /F27 19 0 R /F30 10 0 R /F33 18 0 R /F34 20 0 R /F70 7 0 R /F65 5 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 217 0 obj << /Length 1178 /Filter /FlateDecode >> stream xÚVKoã6¾çWøÐƒ\DÜá›<¶hhÛ‹o» ¬â(‰G2,yÓþûÅ!ig%/šƒá!g4/~ó‘¿on>|4zå™7¬6+.%³Æ­Œ¶LH½Ú<¬>W|]¨„Z×\Áúëæ¯¬jΙ×d'ÈNi²ÓLÌÙI´Cà ²;=g¦ÈLa ãsvú'îL43©ŠXN% ³ÉNHæy4ûåîŸC»Û‡I§±Þ_ÆÛì^ÚèâÏnlß›}\ñš'AP*¼–Y U¸?˜ÅD³@»®ž‹‡æ2$þnã_@ㆠž(œÙÍ×”Šb©{ž¥Ê1©¯ždõãÝrÏ”ùz’»ä•»ÜuO’c&‡TžBÚ³vîxäR•”‹0 UªÔ&É;Ï!¡œRc:K|`3URHîsqéÈ$3¤&²©J«”L.`u¾JªDØt–©sÜ0GÞƒ\-³h®O¥Yª2…„Ô&™’×!P4$‰[$ ô”7ÍršþC5õWÖüVÖi$ª&¸Ï}—Z­˜°4²ÜgpsØåH¤‘ÚÇ)Å9ˆðbßÒŸï£ÊA¬LA C`é´Éã”Îe~å°°Å*ó•ÎS |•+l~øÈAñ¸fÞ:´œ,¾E‹ ¢Gj>üÑ~ß5ݶÜ+Ëœg‚“QÿkäBôiWgÛÃî©CÃßõÝ„ä¹<"Ÿ]I¤6ˆ6Ð?§X¡Ç’$h–"ɺHöÝ„Z3Zg€—…V¹ËÓÂ2ÝSâ=4Š„5ÛæÌ!€MF‚%œ¡=È4/’gº9MD-÷Å·Õ®,¸È p˜›´k”™Û¥²ì2qâ~É9Ë–iÒÿ—(3ÑÛÜçL©0Y‘. ¥|=⇖›r扱„Ëãœiæ|$Ei¹·¤(¿"£v(ÝQÎø* ïsW¤N]ÁûO'¼1arÚZ/`5”ñg‡Yúç {Ë»’9¹p›'€çÆ ¯æ ùË’7˜.ê¢7W.êPY.z­KnÚgo¦  à+#‚xÉ S/—+Ìåf—;ݾ¢ ’²P*E%ˆW |•›{}Ží0f¶u—MÆfŒÙ¾mqu8_ êt8U\¼õ˜ Ê›rûôœ!aÚQé}Ãd[ƒ!ê>'w|òL tÈ÷3ò¶Ðºú ŽX .L5¾®9T}ÔŒÍý¾¢b×Ñ^üÌTýi<œÆ¸9<÷k¡«Wò‘õcKºçpFQš¶ä›$‚*FŠòŒÓøYèMPlÛãØäE3N‰?õÇ]› òÚSä&þ½>÷ûv²^Au‹–BáE.ÿZâ!aÖCÁWÍ1 kU,àØ> endobj 215 0 obj << /Font << /F65 5 0 R /F104 198 0 R /F64 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 220 0 obj << /Length 3348 /Filter /FlateDecode >> stream xÚ½ZO“ë¶ ¿ï§ðÑž>3ÿITmƒ &]Æ 6jÀ=«æPí‹¡$ÕÒº%ÍM³±Cx€0tEÓW~ŽDi;zž‹ªë™ô@OXˆ¡dÚÓ±Ú©¹/jìx–>5ë0MÅýeËU¡ Ä0é鋺¤̬q5…4Ž]¼*ªŽÝh(v5SÏ]Ù—ÍÐÇnäORªCég­ ð0x×Þgò+/Ç…Ý”ö /³•.ƒM€žž*!e¾2"ÏY O‰IˆS%§iª‚‡´<”[F9Ð=ƒS t‰Éˆëè] Æ0©Á™VüÁÓµ°rQa”Y÷ûGž]E³ƒå$  n¸$&8 (Èb–‹bfù;J9±æ’”&eF;©D’0ŸD¦»ïîï~½KAúd•®”‡×++a`¸ýéîç_’Õ¾ýi•åòÕ“ç<­2 ±wo½úéo0˜N×.×"ËÀž  Uée=7NºŠÈ3ëLƒ Œ›§ÐG;âyG®Z~ï—î˺fG>]ê¡:×%‡@•d`/ ài9ËçãOnƒÓ[ˆ· µ‚¿ƒ¾WL.´–37žØ l)1Ú€”:¶ÁÌR™Hs=5Õâ`ÞyF4O¹ø$ãåBA Ž&Ž\<Ö!MÀÇÝÌÇçÓª7ê Þ¤Cú%ìL‰,(1´´cP÷oOÇ–¬¯ ô±ujC«e¶‡’"}èuôa˜‚—¾ÄHüÛ–S§ÊEî½7J çr?P,WËepB  "¤Hs Ï}Iß9-¨X ]YôôòŠZïŠ}Ã\9ðHQ(JFŠ%,NàÞˆÒ?÷Cy‚l±g@›GJN’ETë8ä{í’©Z~;Xð‡eãE3IÕÄsÍÔðyž¹ˆJºÛÉ2â¨Çb VAŸOí¡¬‰òT ÇëÜ[²{&äfãõ[Ò¥ôŸG°Ù/€Ò_*Ÿ(½}³õ·Wƒ]×tb0Oñ&Bû¶¸,U5®fu:û§*žƒùã×-»ö±lÊjàÁvåvI‰`Vöåp!ˆÄs(VO®/ ¹Æ¹.ª&xh™a"¿øF•ž]nÁ$êÆ$*¬T,ákè›&‰X:_eÒCNNgq9ŸA°0`„ÉâZ°ˆÔÉ7wím‰MHƒr1-:‘iñ¼0§I:æþmqPô¯hpÀ:X•Îüäj irô=mœVžExöÏà‰-².È*H²Q–O‰Êà$`Y@JØÔD(]×’ʉ¦åR†t®¤Ð£ÖÝU»LÖ—°=lB™÷#j8:@#x=4-|Ý´5‚ãAó‰3¥Rëï™TÍÙ÷uYtœ‹ñ@šÚ©Mºö„â„ù­@@óûÞºIØêéSØ„­½'Vê FÆŽi§¶gRÕÀwuýF 1'ÌbÉ %1»àØ÷{TÙùz=v¬?,f„ppž|¤Ùúå™ä6¤m\ C_Ö|t­øØÊV†³jÕÖí#DкæÑ …\újÇfá.à ûKßϲ?«–_¤€rJ8ŒPFi4Ûcu8`ÀÇ÷¹J3,èéûCèx.Ô ›‡b(>,…gD¦®á©oqêO NoHݸ§(±øyÆ#4¾QˆƒF±‡(ëó JX4 eæDžÍ¶}Q?S„{žD øÈaôú~GŸj8ù(ôŸ•þ\ÄJÌ`Ïšd•e½á$v­Ü¼ª7—FÞŽ _p›øùXž#øm˯AžsѧÂÞ-`á`:+5íÚv€RœÏ„ßЃÛPêŠàC¡prµ­wÄ«ÅBÎÈW4ºD`ÈÒG4ô½ÍL²þX Ã8á ü¶† _ávÞWg ÞåË8ÕÀ‡˜4±ñ$Îѹ¶ÁL˦Ü®-dl%N8š$Ù˜+SÂä*”ñû±ôe=OCl ûS8~Š2-1PÌÃO}ØvH–B†Ñ¹§O9ïsd9•‡°É‘‡zLÏŽ5Çjtú¥ „Ciè#-OdÉ UÐÂEIiß<¡f¦ øê×`{³~Ž8Áÿ•ë¿^î°NæUœmÖýº¶SÔŠá6¹ Dªº]¢q«eŽíåñˆ62¿•É|ýNqNÆg¨*ŠÒ>8Ò_v…ÍÑ#t¶0‹/Ëဠ+¾8€»ß‡yÁéãëM ÛÿoÎg4@•{Ú–Jk€¡[I°dH2×ÚÚDÞLd:¿Âr³TS°.#$ùu·k¡uFå7^·T¾`X؈íwK–ÆÖk³åÓÙôÂlXøŒçºV¦§'ÐNe_8ß’v&‡æD»E[Âê;÷êmS›ò~I„¶Ó'hI }½ÈøŒ¸7¸þ2É¥zÉ ô[Ü@}™ÓÉ—Ü }7?ÈÕ› ;52žñ¶zÃ*§a™·&·fq¹S˜?—öv½'BNÖûe9)½d50/D±ˆíegƒ}‘²ãSšLå§±53B‚A5.&ï‰t)¸~»\¿]®_/af•$Î]€f„ÔÜùïz×»±Äç¨<ÇÔPƒô×]˜4SzàÞ!  ÖÛ‡® Å0øNuihø«Ú‹ \м£cïâàt±¨Û ó˜C^§?Uõá+Lž]¸’ža´ Keu¨–k’ S©€â¥²#žÆfê‹2™Ÿ^©r¯×êÃXí¨Ë›NŠ(hc[þü^²ÍeK†ø±Üû³­´¼á’šš€‚®·ÚXÀ8|É:aTéÌ¥›€ÉÍý‹gAò»bWÕãÍA†›j!ì©ÌMÌw/„ggߊ`äû!˜©·&]ˆv™Hy%ÖM2I¹ž¬š†§àocŽcÝKƒ¹ÅÁ&úY8v§Y¾¥BLÝKù¿Jn®¥¼œ™×…Tï8ÕÃs¢Zy€”«µ\ÿÈË<|ÏêÂ5¡ïò¯óõ:HÝçÖ/™£ †s piUb¢ßú"ÞÉB,ÝÅ|…­¥¥[%DoÇöR3¢Û·ÍP`)»ah÷ï²£[*hWMÀ—ŒÏmô—ˆÃ?O:yË "ç+,` ËhœËîTá…;Kõ—¶Ùâ¤äƒvìDÚ %èBÿèúerÙ¸ endstream endobj 219 0 obj << /Type /Page /Contents 220 0 R /Resources 218 0 R /MediaBox [0 0 612 792] /Parent 222 0 R >> endobj 218 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F27 19 0 R /F30 10 0 R /F29 104 0 R /F33 18 0 R /F26 67 0 R /F31 8 0 R /F34 20 0 R /F68 6 0 R /F106 221 0 R /F70 7 0 R /F28 9 0 R /F21 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 225 0 obj << /Length 2357 /Filter /FlateDecode >> stream xÚµXݓ۶÷_¡ÉK©é‰!âƒI¯3±'é¸3ö$µÒδî%AkŠ”IÊçËCþöìb~èx×k’¾HÀb±Xüö|¹~ñåw*]dq¦¸Z¬÷ &D¬•Y(©c.äb½[ü+²U×¶]®SQÞXè¨¨Š®ÈK¢~Zråå…¸t´¯Z莞}[7mÏuµ+ª­Šv[æm[¼O¾Í»¢®ˆ÷ÜÔ›|S”p€mãåJ&Yô¥I"Û õœÛ¼,—ÿ^ÿ®!GךŠ_$¤ÿ©=yžñU9°xòY+‘ñ˜%j±b,Τ`cá>öf¹âJF›%O¢K‡ÝÝGt*Z¢r€ë3QsOCªÉ„Ž…Aëw>Ô5Mã4Íz]›%3ÑárÃ:"•Ñë` -™Œ¬·ÐÝÑ6Þž½amiÑÇünr†ké,ÖœÃ};£˜‹©T_Å”×…E?‚¨+„Öúèi»"?Ô•K.0«Á£ör>—:-®Õ\\»2-ŸW&r@P©8Tï»Ì1ÒÅ0R›A»ó³Ó¥í‚B'"u5êʺ ¥îB.€8WØ‚‰Zcý¹‰µèÃýããê3P¿O˜Ÿ G¶g»-ö÷.Ër-¢³mNE×¹(×iÔ5yÕ™8/ªÎ"a ×v hy˜¶h<0ôIæC’ñçæe[Ó‰Ûc^‚,Å! “XöD‘ÆCM^™8Ý?ú*ë Ÿñ» Ä…‹ÿ0 KbQã9{†ƒÀ‡•ñ™°Ö «º*ï‰zªw¶¤!¥Åñ–Kµ³MyßËj»¼Ã:åîidœq15´ók®¡p57’´‡ˆt ì”Í=‘ÎCAmÚ“w^J·ëe¸,κç2¯<««Iðÿ¡"ç­<[Mäßþžsñê›%2úû’%I´Ú7Ö5uÆåQU{>ï|]Hã ²Îä²”üíëvšEk¬Û"_Û[§3ΨbâèÎS.m¿„žMJÝl ‹˜›>êM랉3ÞGùäµ,è„~ºg`:ΆznØß#ü·¶ó÷ðß„ëДb§)òMi2ÃÅ)a@A×ìƒì›¹Ž‡Ç²oxöEÓvÆ:6|œ1„f!i(8$WƒH³ ùæŽ(Áƒah?^ ú¯vx_œ1Ë­çÀÕ"{½¯O,þ`ß‚è+Oc~.,&!MA󇥄8#ºdÓzF<óàÍ#b&±sŒ¶À2VB¶l)S!r”æB#ô°:6çë8È1&Sh¬ËÎ6h4dbpÛbõ–è\Þj}î Fßc9Aå¡n =ÍUab5TÄ÷‰LN¶;Ö»Û/^~÷—w_Íx‹k†û˜¸;®1„³¶yPcïSt¡Ð¨i‚ï\w…ÐüïÑäy 7Å9loˆ~ªÏ¢k°]uUèyF–6í,‰¹”P“:¢½µ%$eܹzcóíh‹Ó"  ü¼Ú@äxrø¤’"úÆ€º®/”\·+O&¢4‰³Ì ði„ï\b\§=¤ÛúR¢VRùú‰£cŽ÷.€”u@Jý sCvëÞ&ˆQÃj} -„›T~×¶s K*øß3ô]º·if@WyÕõû— ¤í `Ûn/g4ȽÙIÿ‚ÀQ¸EKŸ2\SÕÑfÿ>”ã礼ŽPbE§ÅL(2býÖ=Ó†Ñ9§;„ …‘ó?XÊi:tT×v¦€´^]N禘1öDµ€õ˜öhÁ%ú<&»aL8CY¸lþðcÃ$°£Ú÷{Z¿kúLr$jJ‡Ý«=[h@È ¸©KLeú‚(ô¦¯÷D§Bƒ‰#¹*o"|L»E¬n¹ØùÌŽ ž+ 8è_Æ÷l†Q+a¨’9:¥“ô…†Ì ð:„öÒ°ÁüH¿2¯}§>'Ðà˜”]—Ápfc •œ(§K íM}ò †Ee}(`Ó––W#Â3€8œ)j¸€‹T”6÷ØäJÅ©Pcd·õ'Ba^£bmæ>åÐEø%¡µeWæ‘[Ƥú;;÷a Lhtß§myv¿==R祂6ºWªñì/ ÊOv¶Ë‹’ž9°ÝŒ_ø º¦À:ðÌ•Ü+ûfxCɯFvX…„0}gùOiHœùŠä5ãC1ÀŒûÐø3Ôrx¸üp¢ÿ?­è¿Ù@.ÃËoñ'¹!j³Ô„qOK˜fÐÍ\¾ùãr¥ °Måô{yÂ9æ×ŠÔãê7ŠÀíÁÚ׎ÍvÜþfƦ·Z8ÐæÔŸó+Ò§ Oëñ–ðÌ|€Ÿz¿‡© öpØÃ4íy=ÈWsÂ<Ø› ‰LûÀEZ$Ï‚ú)Ðþ‹5Ƙrøøœš.Nï‡eñÁ–ű®wþp_Û™ëÑg?ä Ÿýüçø<ó ?ÐSë¿„7SYTþ“ĔśåÝ€=£?3 ¾"É2š¡1‘’jmô Ž €$…âsŽáä«.gJ ÇôyYK­F¹$QIú[L‡S&ÔÌBp‘ uA²T=RY&cŽˆ”}¯ƒ0ÈøâÛõ‹_¾8á endstream endobj 224 0 obj << /Type /Page /Contents 225 0 R /Resources 223 0 R /MediaBox [0 0 612 792] /Parent 222 0 R >> endobj 223 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F31 8 0 R /F27 19 0 R /F68 6 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 228 0 obj << /Length 1671 /Filter /FlateDecode >> stream xÚµW[³Û4~ï¯8œ¸ºX²Ý¡Ì´ö™rûmñÍ»šsçê`älÎŒp”Êt2ÀÅbžs%Ôu7•I.²ÿ˜ô€LJÉÏÓ`pÈ5KøGÊX)Yª²±#³\gäÈD¤Ùì:é A„t° ¡óc@!ãœs|[¸Uiœ+6ÅÊ´E]Ñ®›¦^šeQmaßÇ%KÇê¾4ΖEe½Ä|R以;³ ÄâïK ç©äl° T¢å5ŒYÂ/¦á–x‹ °Wb±DÉOºh—ès,Mr~ŒÅ! 5` (‰ó¬Ðÿ®+Õ|Œ¥9ó>Ìt*اØ%Å‚ƒy6ò¡Ô ÚÅY*Ùg‰—ì}ÈÕ87˜J¥@rèŸÅ®+Ë’qn¤™ðXy"ÆX¾¨j.¨bÒ8—´ˆÓ$!ÎÄ µŽÖËz;/‹? –vu½~ \æ2Á Ðè“£F?ç À' j„ Yì`žÈó¨ÝÙ¬°¿K¦¢Ñº¶Øƒkš5þ@òõ&È/ëCK$²;×´$¶/ÊõÓ}½¶÷2_½˜q©¢ŸivW”%Qˠɺ0Ûªv€L"pÛ4ueëƒ+fZEн„Ñr&X䕉¡`ÁF¢wŶ§Göà‚·F,;¢È¡xt¨@ÿò¡¨¶Ä95 –ŽŒ‚Y0 u |4j>U®dé\€C õpÇ–¾i¬Á3JE/m{gmER`mkï@0ªir¤È8ÌR‡îÑù°Õ'ÊQ#T†MË^Ì ¡)èf<²3¡¢ÛW‘O!\¾+ÚÝT5ùP°S—‡RÔ®‰4ÕšRw „kAm ;O³àivª6ê:N¹îv¦Ä{T7.b*ĉ<\x-S8’¡$7›ÒÕDu%äH&øß×Ò¶±p⊜&ù 5õa»£õQÞ“‰ɓUÀìþ1Û W˜M¬iÜåròµŸ¤‘»±UKäºpîkŸ}›$£Î¬s@`z@d†v¤¤°½ÐNˆP§Eò¤&[¯ÂšˆÛõ:ØY7•8Áªz Pð¦iÃZP_ù¶ŽC§>æDÕåÌ©|úmêÆB׉C7ÎB ØŽ±÷gðZ Å/b® 3¨ó×›]µnœ}«Kû?¦)B–i²ïdïÝ“ ”Qç×ú(‹A'ÿË,c‘ïº2Zax‘(ªYÒ™ ¼AÝ·^(‰v5úôŽ}>#1~ÿù%4ÇIñ¤µ…XဌÖbÄ¢·6häGC[]©bZó½Ï„6 †b‚Ê–ø°Þ9¶ëªXÁŒî^\íLµµg ª}ž„™ˆu’ç¨ùT–§I,„˜Êr|òmðøQªt ÿÐ u,• —á¥4¼jáŸîrÛ²ƒ)¥o¼N£&ÕRv.鄽'•³ì¤qæÐ­sÒõkzæ¯Ì-‚– Õ¯}~Âaƒå†…÷4ø%üp»ÃòwHbš<§áûÅ·?½ üµi͈ ˆ×Syý%\#2?áÅÑ÷£M?ìÃqv‚Ö>|ª¿Ñì½9Q5 çžtÂc‘÷àœŸ]/–ÌóMѸ&£¥á¯eÚåç©;ÞõÊ”å³)øhNûC9öñÿ2O]ŒdÇÏ‚§F×>6„u)ž~Rßšûb >ü{ûgîÄE•+hËá÷8<;dŽ’O^/žüiïK endstream endobj 227 0 obj << /Type /Page /Contents 228 0 R /Resources 226 0 R /MediaBox [0 0 612 792] /Parent 222 0 R >> endobj 226 0 obj << /Font << /F65 5 0 R /F64 4 0 R /F68 6 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 231 0 obj << /Length 1363 /Filter /FlateDecode >> stream xÚ­XK›H¾çWøho éôc¥¬´‘’ÃJQë[² m-†àyHûã·º«1mÏŒ“9¹º(ê«wþ´z÷á‹Hg:Ö‚‰Ùj3£œÇR¨™HeÌx:[³ïóOYgª²6Ý"„Ì³Ö ñPö;¤òæ>kˬD:Ó#Ñ7þwgÊɽÉênñÏꯙEŒÇš"ʪ~Ù—MreÝÇ0(M‰ŒS-g¥±NÏLsѤÈß=Ø…*)þDø3ñ€Ä”Iðôƒ¤ÄrIdº´4.¬w0âõ0lQ¿$&Js1 l™JM—Ñ’”‹ ÀüJFÀR;È9UâP‰z {ÆCHNH"OÉ…PBØ@²Dý+0üèB&—~Q­˜ÉS¥Ò_ ɹœ $*ÌœH'Jå?ãá1LÐÓ@*.8’+I^Q‘üe¿Î`GAh= Oü økÙåUÖuå¦Ì³±ïÚf­Ë ;ùlp4Eáy­}ÅÓ›ÆÏ “åçg§qJžŸS"ßÖݵÞÿïÚk²C#m¬LDø’BÚ ¹–æ)0ö"¡L³ŒB…K°C3y-Ù7yÆŽe* <Ó±`)€1cŠÓ7ñì&¡hƒ™'`& £¦$ã·€ñÁˆ4ã±"Ô{FéDÆ3~ #O „>„‘kñ&žÁ`†ž‚ ’ø0j¦Çæœl€Îtfs¨5®ÔF›¶Ù#eË·ï¼}S˜ª[^IÙåìHø0öë!‹Í“.ã†9¼39vžíW'fÓÚà Á휎{ÙocO㌆¯“]jÕe}[>N$Š“r Š‚Ù¢ùÑxÿJøù&ðÞ0¨:Þwû õŠ*ÌËnâDœ~„R‚*—̳ͮ›:Έ‘$†Uÿ4o¸Å?aC{·±eû³ÉZã§NÞØNL\䤡ÛIÐåjþÅŠ ³ ¬ªC×»éYÛ†VbÄÊÍš3é”òŸ““qü&q%5ÔÖqVÀ™œ!eT’⬚ÏýÖú s¨ÎjŒÙŨרþ«gÌ»½tóìÞz«›å,ÏÿqùX•]oå@à£[†+ù¼%|¿Ñäxó9È„XÉwŸWïþû‹yW endstream endobj 230 0 obj << /Type /Page /Contents 231 0 R /Resources 229 0 R /MediaBox [0 0 612 792] /Parent 222 0 R >> endobj 229 0 obj << /Font << /F65 5 0 R /F64 4 0 R /F68 6 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 234 0 obj << /Length 1119 /Filter /FlateDecode >> stream xÚÕW=ÛFíïW¨¤Óz¿? §Q§ ÈÕŠ<<ýï3³»”HKRD…¸ξy3ó(ý²}øðI«•#Ns½ÚîWœj"^iejµ-Wf ùà×MiÆÖm[m¤!–³Õ†1âÔ’W¸P€ÕÒÄ›/TQ0'œ|„…cŽƒ-Ò«P|„bRs:…¢NImŠ[éä P"A}ÇMNÝf‰ê…è ¡Ä,j©1âÙ=t+¸›Bi „ €²F(z„1ªÔ,*m¸fȬtÜÜu²Åc§°˜íO£¾J#¨[ yâŠHk– 0Üa‚ŒIi¿©5N”YëäŒ2£(ÐŽ}-¸‘·#Ê‹œ´|pׇOÖN&08`01~Žý!ºê+9ô ¤È‡ª/z,ѧhyWÁ‘ýǺêô‡!ﱸ20Vbzâª@HÉÿD'0Äá7B>Æ|oo|Iƒ”Á@0U±†ý”À*1d}΂!8Pbî¦D¦Ôœj@Ñ(áwPüj= NLÀ¤ô?ÐÁÿ¥h{»"¸Ä|Î):b¦ˆò)„äw+‚Bf.ÛRëS ´3?¤ !¯óÅA•×Uaû \p˜ùæ ¥¼ôM,,«šÁwÇ5WY^÷Ñißvq1ŒÛ|?TTЏçäð¶f4k¾‰·y—üߪÒwkI³G¼WY_¥óf—Ž>¹·Mý-®¬¹^à¤Â㨪«ÞqÑîãUs/ùPùfèI"i*.‰£ÀÁÆøç²L lmÓz…¬á¥´Îû¾B* ôjJÀ$#L;þ\ad¶mŠÉ–©¼* 3«Ç-D‚r½€­QŠŽ‘¬×ºŒ/žãªhñÐØLáÍ’{{_ŒE:ÕÏ_'4V¯kwù®ª+(âXÂÅ·Ÿ™Söþ7y¡-¶ÀtZ>ïzè^àôˆ_HÆ’7i῾@*£ù<-÷¼ÆÙê—B)b˜š7„µßi)ĸã¥óÇ¥-¬¶8€Ãø8áMjwX5a]tû>y`!bé$~æÏÆí©mË&ør«â„Y™a©†©)µ>{®Ê2hÏ»¿CF†‚íЖ¾Ž®QJÒæ‘¡³ÿŽè-晼O]8ø97úõCÒ*ÄmãA)8••ù“õF2™m× ¶«ýEnín“ø–˜ù `a´°þZaQ⸵^wó-òžVIaQäuñZÇÙ ’Céû¢«v£9hbø" 9a•V»l÷mÜÞ¿pTôsxÎÇIœÇ†J:ƆߥùìüWÍè²óÛ÷Í “?-ˆL×3ðêd^Ú‚Øñ£ £øðëöáÝߊ™ endstream endobj 233 0 obj << /Type /Page /Contents 234 0 R /Resources 232 0 R /MediaBox [0 0 612 792] /Parent 222 0 R >> endobj 232 0 obj << /Font << /F65 5 0 R /F88 136 0 R /F64 4 0 R /F68 6 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 237 0 obj << /Length 2034 /Filter /FlateDecode >> stream xÚÝXKã6¾Ï¯ðaÈX‹áSCö°‹É"{Ùñm’[V·X’!ÉÓéüúT±HZrËN2É^}Y,×ó«b±ÿ¹ÿðõ·™Þ”¬Ìd¶Ù?o„)X–›Mfr&•Ùì›OÉþXoS™I½&ùù\WS}@J™t—ö©F:îŸéÛt‡f+Mò¹9\ìi$Φó2luôìOc=|F‘AÚ8ÙÉ«²ƒ_TöT]N6j›¶9Ùáô¶ÍL¶©*MòÃå|îÇzûÓþ?¾I…`¥ñ¶Oh»Ò29}U#nDòä|$ÝêîDf˜–òð?* .(y=²„¦…ð<“3“´ãª0ńΙ¦Yž‹¨íHÂêSÝÖÝ´ E„Újꇵ 2L)ùWÿp‹÷À½/|¼H¾_‘%»6—ÿe%-„0Ø\1Îó%`÷Ç v^Ú-†{q‡)‘E$ã)¦¿ïLÄ•¾+ò’WQÝ‚è«K¦®q|Ð|5—›o)¨ þ­3Lpñ‡PëbP{ IvàCÔâ튘òýÿ¡÷¯5èãz‚e9ëÒÒðäõXkV‚B<’&8Ü¡å¢Ë<êA°h›±:Ùql~ä\VᲃÅ\â8í44?ûr+%\ð² iÔ³1Qq~;&–%黎ЮûìTw0‰+ƹë'â=2¼v.pîÜÍ\xæg¨(ݶçSMGnTÄ?ÒfÚŠ¤÷Ë#‡A^]Ù1öôXV§Ç¶?Ô8땼6 æ2ÑÆ TÌã†*L¨ÈIlî>¯G¸Ÿ ÖÑ|#©œàŒÊ C8SñìP[CçзD,èóVÛ!°wéšÑ¯8%Úá02ô1OöÛ‚c($›ÒºELDŠ­ä%ùûÕÖ˜d¤£Sß½¤S=´´…<šÊcµx|À<»ó#ÀäሢÓíºgp;øíä­²UÕ_ºiÍÀ°.ƒ=Ѧ骡¶cv7¼Gû ‚Öîö…¯..)¸¸²ÆÃ½²— Ñúr9×=á ÖO5¼üº?áÄf ÝBPyÅ¢Âìé®$ Iß ÿÝ÷‡‚öÏ)Bgò&LVŠ·È™¸^.Taìïþéíì(Yòò^¬{e XÇàÊ(çz€˜¶õÑ SŸýyGç?Ô>¿H” ºâ6ÍLæt»ÊÏ$“å+ RìªÑ‡¹Ä0Óýi©Ø‘„—jEhÇít¤yÖåkð?·aÑöa%RåϺC hÿÃÁvcƒö^ev´ºmBð…63¬b­é¦0s»ÇœÂëä"yvþ¼º‘¶N|±@eökF#õÞW–€æùØ(´ Iœž†é¡>×Ð3 dK-h\D‡×p­óí;CIÎá¹´U0¾L­uÚ<ù¤²Ÿp•A}]蹚û| Ñ!t? øžÄs5ìBÑŒuZAä'Ûùßͬs¼G¨Ç5s_¶«­ä×f„GŸ(ëéä ò¦kù‚žWO ?TîÁNÖe1/J¾,ÇP´ÎTP¬[¼’*û[_³{¾ªàkLb±Œ¯Éc|ƒ‡JÜNW½Ê…j•ŠJ¡ÇDÜ«€û5v‰y‰5ÄHϧM̉^óÌÒ÷Á¶µÙÚkönÄ=ˆ7‡eW>© u ß}>†àÏußtíÇåÌõßmd\©?Ñwb'‰ˆ7X÷ÎÄAXåÏ% ûâ– Q.Z ® ,E/½(}´1ÉDÔ,»ƒŠÇý&W³"ôâut(´5ËrVÄÕ*`»ÝDÄ_ÛŒ/|x#óXá%ÁÓºŒ^Š/k5ÆÚDI:öš«CÆD¸_‰å—5šØÝBv æW†³,ú›y‹d½,©†nÿs¦„Þ¤hqÊY"ç‡û¿Ùm\ endstream endobj 236 0 obj << /Type /Page /Contents 237 0 R /Resources 235 0 R /MediaBox [0 0 612 792] /Parent 222 0 R >> endobj 235 0 obj << /Font << /F64 4 0 R /F70 7 0 R /F31 8 0 R /F30 10 0 R /F28 9 0 R /F68 6 0 R /F88 136 0 R /F65 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 240 0 obj << /Length 2226 /Filter /FlateDecode >> stream xÚÍY[oä¶~ß_1}ÐÃ;ÅyH‘] m²4Fê,Py${„ÕHÆH³—ßsHŠ’Æ¯ mŒ‘¨ÃsýÎ…ôß®_}óF«%Vs½¹¾Û°‚U¨V†p¡6×Õæ&ã¹ÜæšÒLäìJäþÄ6g…[‘Û÷×ßä\Ë69cΰ GàîöӌӰ¦ óézß%Q*ìÖ ²ôöP¢ EZ—,Km‘QŒÛâÄÐ †!V{´ß£ÂF¸>Ã5)1ÞìŒ+RÐÉ"¸RUóÎs[þ„kß¼aT.¢¢ˆ5:Š{ŠUØáÜNß×›²ÛÕŽ»4¤à 1RøÏvëžåbyhî»ß¨¢ïò×ðÃ’jbì“zäZJÕÚ ×Í¡öFÿÐõñcÙns.Ñm9‹O<ŠEh1DûÊsï©<(pŽ2޽¡WàR§z.Ý~/3X „(1öVF„J©•T©ð‚rÅ,‘úý#9”³+fŽ:¤OÎ -Â#€Ù˜ hNÛÃgü)¹kã³2ñQèÙâB\H´=<îdŒÍ\´Žöp퉞ÅäÔ)9ê’=sÚr­fÞ”ÎFÈ9(KŠâ‰\{lˆ;+¢¶BOqSDó…Q:WÞo‰ÊÆ#\y„ëK‹¤^IêªJxjÖ¢fPR¨èvSæOþ9V+–ÆåÞ~¦Ãƒ[™Šº€&Ôé"°á®PK® ¢Xà% ŒÄdýg½;nY‘ÕåØt÷P†ÍÆ}íÊq?-9ªþtN]UÛ/qÚ]Ae+ÁHm/ù‡ȹΆ‡ºÞ!+n²c½ëï»flúð±ì*ÿ;•ë!°øpìwõ0€À+/ÅÐå4c „VN«–êöXQ3·ØfðÜ½É Ò‰©NÇÚ¯÷w~¹ª¡ŸšÎÛ;oÐKGøÌgšHÁ£¼“ «`'"DX™•(—ý0ú§¶ù°e4«Û/¸÷¤ûrËiöqËTöÜ7[®ÂJç—ŽÍP{r¿My-ñ¡¿ ãŽý~"Âd¬dSà~Ý™5”Û&dn¡uñ‰¶lïûc3î;”ÈÞ›û€å´AŽýC?Ô•» «¿n5$8¥o„y5’J‹uoЃT:;ð·l‡Þ?Uõ°;6·(_Qþ~Þ]ÊV…_G4×ãĤl¥ÐÅD{ÃÅû@Ýq?•»ªs«³õv»=@Ú¿Ýð"l¼ëÞOUjðóÑÍuømßTUÝy'0 -…›5 ~*.Ô=ó#8!µ/9)yö? ÷¥ï7§þ4¸x諺ü3ú]ZÖUX-Ãï]ß¶=‚úÓÄý(¥ýùLsüOÐÞ=Ÿ)šÀ¶ÓÃ'ù¾ uâ¶®C‘úR>Ž4±di' ~¹KƱì†E™;”ã±ùì#*Ø2¢ …´f éÏž„ C憳|‚‹ …‰<QvÉ„%À§7x˜òh2òÀhK(Æè„]ù “i&¢ôuBà &Šš ð‡Î¸#tBièÖgM÷ÇzLÉTPécÁø((Ød(B‰Éâ‘IZé©>$üÇÊ7 ¢8|%Î;|)®I†E0s&.'² î¶>oÝÇþ¶¼mÚfüâ\'[R„êiÛGM¿îªØß›nÑçS˜Ѐm„ʇ„†XÃQÙ.íì,Œzæw9sÝíÏ9Á ¸v:Ðòé€ EDÁLôz­ÒfJ8o0óLL©ç`J½<‰MÚ ñ˜œ'µ=—´“´ÓàƒU,&!¾2_½±?UþµÁ®ló©¹cùÛíNS}€3*‡d6|u¿Àžˆ"¾‘7nNM˜ëË ´,ti¡- žv]+êçNÁYv8µcóÐ6®-ûkËðë‡&ÎÖ9„ ˜C+Š0Vá æ˜€Å§&¨ðÙ zKúࢰ п‚Ga snÏrw⚆®zÊÍÀuNP¿>$e`Œbü©’Щ6ÊÏ à©$K5ë•ipºjÖÿ¾¯¾C“Š¡ *ð³s£4Qíµ¸és ý£áá2î~Nè Ó…Õg.ʹL‚Ý€Ð?v@ëÁGªµ4š’°, ñÿ—³yeá"¨¯º¦[bqÞúGÂ<¨­šý®ÒñÕà¥KÓö+Ç ˜©^ά¨Øß`¶Ç#€>;…•Ÿ8oÄAÔ_b´Sïó×gº’0%^Úãå„Q³nr"4¹ï°³0> eðèã.§Üª? ÃÓCßtÉÃU®u?ýAøÛ¤ •2ËQG®fÅÂU貺Lbë;;|¿4Ë3¡—׿$’a[8JÄÒß¼žÙäî|å&°*{Ù(†ÿ:) ÕŒ”óÅÜÊß‹¸ãz2îRžÉ§âMd>ƒ|Ú7nv€²<€ƒ‡ñÂtuµ¬SÓÛùÚñB¯Ïj5ìi5o“{ÂЋª‘¿ †i¾æ".Ä¥‹ü«×ׯþœt%J endstream endobj 239 0 obj << /Type /Page /Contents 240 0 R /Resources 238 0 R /MediaBox [0 0 612 792] /Parent 241 0 R >> endobj 238 0 obj << /Font << /F65 5 0 R /F104 198 0 R /F68 6 0 R /F64 4 0 R /F70 7 0 R /F31 8 0 R /F28 9 0 R /F30 10 0 R /F27 19 0 R /F29 104 0 R /F33 18 0 R /F34 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 244 0 obj << /Length 1996 /Filter /FlateDecode >> stream xÚÙŽãFî}¾Â DâJ]:j±`È<ìb_’ÆîC&@d«ÜVF¶¼:º3²H]¶zÆ 4ÄbѼŠd‘õϧw?|LìÆ —èdótÜ(›­õ&‰S¡M¼y*6¿FVlw±”ÑϾkòƒßît,£}~øLPwjêþù4,x¿+Ï ]ëòÒµßÓ¢õ]W^ž·¿=ýë‡FÍE;#,ˆ–$ô&1›D¸ÔdH’ˆ$³#•Ñ') ÓÉÝNŠ87;°E:¢,WØi‘)7ÈV’htº©aÍ4Š ²™Úè§XÅÎÑû5Û@!ЙÙü{EåLØDovJXg/„aTº™}’±\‘gD–ÚoyÒ<êI»æÉ…^±P±;ôbg- õнl *¬H ˜ž ç2Úz Q”¸èPŸ¯}—we}i“Bê¾*hwÏTE}ñ´[^SÕÏL¾UÑ•‚V]MÛׯou½lUùKG›ý¥ð ú¡Æ½×mƒŠ;“dA`L*gÆh ^esÎíyÅb-…³£É ÉçüÙJÔ(ÿ¥,|K®0¨5†.æì£Œ’&:ö—:‚¥Ä3)ÖÍSç¥ì|³/źFI*Ò)8‚G€yy¾VþL¾€ew*[‚ξ;Õ8B;}D…ë†v<.þÌñ‡˜ÜJÏT­«Š¼ˆ¹N?å—ù¯± °ÈcSŸÉ J¥B¹„ÝÀš•‘QãÛ¾ê®ô=äœr5–•…kR%”ItM&¤5 ×ûÂÃoÎe13T8í¢sݲ"Uùy«dä«/´‘T}!ÛaÝBû–àcpyUŸ+„78¾Å`“v6°Þ8¡R·Œ²yéŒyÀ,h¡¤TÌÎO¤M8 •ÑÑë©fŠëÕUA«Ž±¿7þ@ÑR¤ùn¹Ó§ò-kÒÎòi‰VN ¾EÙú¼eä멬ÈT¹´‘’X 4è›FÿÛfàgÂåmÛŸæxhø^ꎀ}YC5(!HÂñæZ·m¹¯ÂO ;1¢¦÷3 ÂÕÅ ­ ùÊ›ÁW8ÁœÉY¤/׌ëŠõ¾õÍ :-7°ÎØà&ü²áÆÄ‘! rÆ/ݪYá2"yÅØË[&dV¾i (Ö=£¿".žÄÙHƒ­&¦òN¾lˆ âäÒÍU\1L#M ׎UC!$ܤ0ºžŽWƒ*1yþp8ÔMr)0¬ù{bºé0ˆÙp"™¸6à4§­¾ þ»MàâuaÍ ¼z®8Ð3w0eÇßö¦ã¹ó1"óî¶"?  p8-™qMÁ®©©÷ù>„,âËöPAÀ—p?i_*^Ùüµá²I¹\þ΃–íµEà»1@ìù ²æ¥Z³âô+üÿ­í÷€¯ß¿§2óýo+5Wá”"}bnøwÄŒ¼9 WDzëøbA¨ÅJ/V†;7¿.â$Ýî”Ú¡†…r»³¢ñj§/‘ ‰ÝÊjÅ;q’­ÉÑoʑХfZ) ½À#rÜš‹þ r4ËÑ/%ÝLª³nf³*[•“Ê59ñha9æ O™4Vé¸J´Í̺µ.ÇÝØó¦cU2ÉIâÌ®ËÑkrÒ‡í‘p>“OœÝÒoC¼¥fMNö¸)ÝLŽsòó±ër,˱,Ç~5’ïãm‘D,ŒÓÌ®¤Y|›fåÈC¾F”ÜFç×8¥ê"ý‘y„ÈÞ”*ˆÙ†¨ôPœ3ÞøŽ =´ÑÇ’æáPåŸýÅ7yE‹SYžo‘ÿäÍçÐzãÍù2\…¯øÚx…û‰Ä*™Ìåj˜ã§f½ëÝ1N`Él»ŸxŒ2ýÆÀÆ¥éÝÀcœY<“ÓçØägOCØWƒ­„]xé±›p ·:,zhnvÜ^rpÂä.qpƒ»ܵÙY% p,”O¯ûIßò}C©Ý:ˆøÀè½m=ÿ敯ú¾õS°rM*|øæühõx€ãÈHë«£ãm~¤ÆmÀ0„'z€&©<ÒXb,w.PF'ßÙûPÃýà»åTŠïãÊâ0qS÷'a9piû³²Åq7B? ؎€¯rjßýùZïxiÓ[ÖØµ±6Ò$0oéxªÑ MÕOŽãÌœn1ðù:™é”—0} Ä…Ÿ·´j}·5Ïö{=¹õÄé« L‘wùÀE‰ºó„äl‡Ï‡þóÖ*üìha]¼ò>ƒ öp–ÐFS¶nl¬a¸‡ãå·ÜÙûîÕ‡ÐÀV|&7‡!÷JþA‹K-/O #'N7“¦Ñþ S÷×ëÈhWRn§`n²7 ÿÿsÞ5åŸ+å!› å­tü8•™1t26qݰ9Ô Z•ü]„H?Í›­Ê¢ç><Ǭ”º7¾)ÞÊN“…çÒé5ãž¾K&îëH¥Â™{” ËØÛp¼ káà rK£ÕTz ôøñáɱmÇØ´7±i96™]x*@f Ðlcz±“iôÓøë÷MCåC5c®Ã»¢•ô®ß|àN£K¨*.ZãlãD–q:ØÐ!½ûééÝ_úöÒ endstream endobj 243 0 obj << /Type /Page /Contents 244 0 R /Resources 242 0 R /MediaBox [0 0 612 792] /Parent 241 0 R >> endobj 242 0 obj << /Font << /F64 4 0 R /F31 8 0 R /F33 18 0 R /F30 10 0 R /F27 19 0 R /F28 9 0 R /F70 7 0 R /F65 5 0 R /F88 136 0 R /F68 6 0 R /F106 221 0 R >> /ProcSet [ /PDF /Text ] >> endobj 247 0 obj << /Length 2907 /Filter /FlateDecode >> stream xÚ½Zݓ۸ Ï_áGí4æñC¤Èvv¦s™K'¹N{ÛéCÛ­­Í*gË{–œË¾ôo/@’(ÓÙÝôz/&E‚àÿxóê›7¦\9æŒ4«›»•PŠUÆ®Œ®˜Tzu³]ý³86ÃéØ5Û«µÔª¸}ÄV5=Þ·ÛmÓQÿ}}üñJðâp%tñ‰Èö‡m³»ú÷ÍŸ¿ySñ¹¤Ò¬8ñߺ~8ž6ÃáH|îNÝfhMK´‚ !âLvµVÂ7÷ Müîý{’z‘eOïޤc»…e”ÕZÊÊs^ Áœ+ÿ¹î3ºKΜ’Q‰}¿Ï(*++iê#h¨¤*vm? %±ßvÔÞ\Y^Ô·»@"`UZ:\UœÕöÔÖÔôÍC}¬‡ð2Y+Œæ£§8ÜÔ›û0cW÷ãá.´§asØ7d‹R²riŠ-(~lo¯$/NÈü5’ý ™b¯î©=u-ˆÜ‡÷tëõi/xñáJõ~_3/M”Ì•e*ìO°$Øš@_S3Ü›fÝ~á80¹ϸ'× zøL¸kAfÂç¶x skXíç ÷í¯sÿ• œ Z­áÄhåHï¿¡´sBÎL©¢#\ ‘RhaЫ¸ àÞ4¬REƒ¿j¤–çh€¨þÅ9Ïè[±ª´Q‹Ÿ‚ÕÊ0W)‹%+` nëJ¢2·nËJ®V3²K̪,³Ä6Ò0¡åœ-|mà˜;›:Ï,_éÜxʾ°t÷ÔÒSm¥úŸ–n³Ì’¥¯¿0@ÈYiD\"8\%B+ã’o©ã¡•`Ö†i"ç-È%Œ}ÌrôZà ”?œ=*áð”…NŒþayúiÔ‡ì„C‰]A F,l¿§óŸÙzð\^ͶNç¶N1[•4ƒÆa%Þàzf'Ø–j5£ùèg*à©T†'nJFfFzIŽÉ™Ò°» ÓÚDX²¸’Y`Q´RãòDf?py:.#—Ó<ßæò™6¥f•ϰ¹~±ÍeÞæÆýBF¯£Ë F7/7z¸ñ4jpê!ÕÑÔØUÔ ©±mðºù\o†Ý# nûæø G›-Üã¥0Å_hHÂ¥Þ]âí±v>´8‰˜uá5»ú¶Ù¥|Ö.h(½ag[uÐä»&²>œŽÁ2zfÖohý÷3ì–ZÐA ¶¹ öá´oºÀ„†5ÝN»-õo¥èÒCxDüC=<°½ýØl†ž&¨éç>f””\0 ~ã’{ô÷Œ–à쪯<ÜÌsf0§¼ÞnqçÌ´Ì"Vï? -ÓV¥þ3bÎË@çýÐB\û“7 „€þ¡Ù´w4Üv€RBá¹ÑîJ'8Jè~EOoæAÇocAêëÍDû$ QF¹€âæºÃ²  »p²ºkùöÛk;“½¤«ÎéP¼u̘r©+œ»vQÝQ…ˆÒ“ü"$N7DgbaÝâþ`¬üw6Ð9\99Œ‘ƒé"LñcÑÁ ›ºðYõ²l>Þrïh0/èŽÚ—? 83e|XfmAÁM4¼m¢øu8:ATb° ZÛS­°ôUW*öÑq Á ðC,N}Û}˜U KØåîǵ/sa=.2‚ѦAo ¬6*1a6_*L0²¯;š~H“™\úh-Ó\-¢»âÉ g­Nn¸öc®Z¡œbÀ.ÔH©®Cýù¾FÓ-E#g ó¹r ›kwÙË×VU¯%š!½_½“·¾˜®VІ ‹°1ݶ9îýîH-Æ„^ _¿6±~-2[æ‹ÕÑSsh¬‚Ó!í ËìªÌ3W•ÔHÚ>–úéšµÆ×5’ ý CóTxeÓº©sæ»4L[s©3´+™0ãú>g¼I3ãʤà–õ&^YÍ‹wõ°Ð¯¯÷¡·ôr¢ƒKƒå`]âIP}ÙíˬÛ'5Í `b² sûÎ*3¤2 @,÷´03O$ŸCý(WÓw—K'Ç>™éœ•„žSø{Ì(®™,GÐtÉB_}.žYÆ:ÃÍš¯2DNøÚ•Ì‹¡<Û“~ÈðÓ~¿_VM}‘I–ÚWgÊC˜ö##X̱%Ø-W·ÌÈQ»ßd¸¸yæLʼۛZ,Ôo2| “¸ÄÕ¥°¢žqIÉ€34pEÉXPÇú ¦)ƒâ")ÉH'Š®¦ Ý: Q4r€‹¤T_Òëé.ð> ƒvö 5tð:]ø»(2Nnû ê,K™éWµ1ˆ.‹–šû[-½ .Äð*ÌäHpÀX¥Û>Eð—¹ÄÀÊ|i-‘O8ìº~2=²S¥°;L”OÛ¦uT’ñsûÑø¡[Lžà+æG1Ç©„éTo«ð ý"ÑŠTÔ3 £’˜+ú¯È@á[ç¿„âc(ÉBÏ—d¡¥êŸ‹7¢'jº¸×دÃ|"ƒÈœnÑ#ç<æ°GÅÏè7% ÈP"YúY`(F¹|&—޶CÖGÞdn*å^®]=ú®íÃeñ-}þÍ® µlËÃzĤ[4}oñzQƒí´«q‰"|Ü·îuÛú¸¥)‹<Ç»‹ÒZ_ÌyLþ”9ìîb¶û"ïæ°çs¶’ˆÙÁX6ˬ  ­¾Û_äc‚TUZÎΨNú8‡D©> endobj 245 0 obj << /Font << /F64 4 0 R /F70 7 0 R /F31 8 0 R /F28 9 0 R /F21 21 0 R /F34 20 0 R /F27 19 0 R /F65 5 0 R /F88 136 0 R /F68 6 0 R /F30 10 0 R >> /ProcSet [ /PDF /Text ] >> endobj 250 0 obj << /Length 3463 /Filter /FlateDecode >> stream xÚÝ\KsǾóW 7 ¬]Ïûá”rP,'vY*'fÊÛ€$”@H‹Î¯OÏ.vwfг;K‚’âÒ0èééÇ×éÅotBàPÎK­ÌD*Yr+'×7?ÿJ& øð» ·ÌäCµôf" + ,%“õäÇ‹]¼¸¼øò%&ª´š›Éå fK-ÔDJ[*ª'—‹ÉÏÓoî6×·«ífVH.ÍôëÕáv¿ºš12½;¾M™þ0£r:ßÏo–·ËýaVP E¦ßo¯çõ"&Éô"Ézµy)¼c©˜~½ÜV·ÔŸ¿Ùîëóã¶W‡åþ÷Ê•_/¿ûòN<޹!%åîL¯÷nÉÅËË‹ßN$uI˜/ ‰ ˆ–LØzÓw77ŸßÖÌâT¬¤J7¼Áš¥ÒÛí~u=_×ûÔ•-¥”ÍúÝ~{õÌ­‚7 ‹hýþÕü°¼nö „!eI¥šxkwMX9½®W35¥5”Wg¡px1)HiíQÕ!*œø@˜ÝªrTYIÎ+=oß®n+E#|ªRÑžóÈ›õx%%:`íÙT”B0Ÿ³g˜…”ÂèÀ>`/íK½Ô¦úóYÁÁÜ0®)+y§£`¿ÂþTŸ©éQqÁ¹,%œ¢ ²´‚¶ôíb¹¶¡j•ó—!ã¹O›G$ ˆ]RS‹]¥-‚‚$¬­\ö-¢C^JNbØ–¤ :韒¦YÏŽq–ŒÙç9’;Fà‹ˆ_wŽûŸÍêÍ ÔÝ¢íþfPèëí‡åsÙ»Ýn¹ÏrØõ¬PmÝ!ÆJ©.;G£¨½[ÍbêÀkˆa¾«¢D¿›5G>8œF2Ñ!SѲºF8aegŽTŠtoœS«M· (§Âž¸OaD‘5jƒš”„;cñS¾îŒ+m„nQFÔ¸YÎ7ÏÀˆ™ƒ GQGkû8sߣ¦zã‡Bìã¾å¬Žp”Ây ¡Cw_à 5Gmés¼oyGì‹–*0uZ£ûsF +•Öžs…¹„0(Ò‰Ázr Ñ¢ÚÛK%“êhQ@8ëÅÂhO+K¬ºu 6ˆ÷ä¶ÝBŠá:Ü3Ä÷†qpÉPì²ÞœÜ”/eŸ¨ó3À_¥C‚aó›ê5Ëû§k_.p&Ø)´DäÓ£ŒujÎÙ ëü"²`#Ä)ŽEQÊ1ÃKBT ¤ˆcc üz«²ð#¹®X¨â€oPÙ)OÁn§<¹zh (¹”.©tÉ’-Â}Ÿqßoß›|˜ƒ3¶õ'‡¼ßkŸûá*¼‚“†5o„°Àh/š€­2yv0פ„… F¤M¾N– ól”‰HÊ@(¬)-•œ–VÇ×9ðÆ~¼QQyƒeÆÌ´ýœ0GTþ­³0GŸsD6æè~̱O½˜Ù”‘uVe˜n1çåýnq`Ívãü8rö®~ÏH¨ä¬ÐŒÓú%Š$ÊO+[J'PÆ´XèàδZ#+)nbXM I ÈЗ}FQ]eUÃÊp®6ùÆë2.fSXp1Þ*ïó››ù úüUiÅÞÍwK$Rô+´[·éNЭ´ö¡º µ<‚ˆ½„³!꺼YIŽEá&:„® ®'rPXÀhD)Ì÷ ¨ƒË€mð1ÞJvƒz87æ™bÐ$Ê?Öõ6êEH±AL?Ú¬5{•2{Š©¬Zy¾ÉÁñ¢ì´u´`W°÷ ¡x|õ;ÒOº4êmmzèÙRP1–`í@=4Ù Íê¹Û·†zeº.ÎOËÕÕÝz=ˆ?Í ™.ÍëõúÁÈq¸ž¯³ c~<ùd—Lrø‹°H –d™ aJN„ŸVÎÓØ 5(õø¡4Y¥«Q…äU—½î?ãE<Šâ¸"‹\šë3eŸ¢T–åq_·“܃:„Ïî… ¸§hŽÚ”pÚ}HDÏH á°þ@øØ$ö*’°ÔTäHYȘŸXE)>g— ôçBß®,ÀÓ k¡ÂÓÇkØ~Ø®ƒ¨æ¶›ÿµ9Í‚üõõ sæ qYSƒ¹Œ£Ÿc¬CJÝ|þDž¬dŽ|ƒ¥¢,’ºÁ]PÆ*/Ýe.t8¬P`™‰A|‹†:â‚8k=äÅj³î,U«rмÃê¿ËcûÜÝ¿ºKSìÜw ¹ØáãšgéËQÈÏmi˜Zw9ªxo9 , 4ç~† Ìs÷\ÊD÷nþ6Pc€,h«ÛS¸ÛE¹Ü§e'}_;àÂõum¼í¦<ðcí˜.ÉÝÎñDÆŒT‘¡‘Ø×Ö±F\åy´jšÎ~_çðëzt`VMB¸ˆßÝÿ—õ˜ÄU®u/V‡ÝÇ·n¼úëÌõöcž×HûíFYש¡yX&Ga{N_¬çDîžG²$2XêL}‡ßÄ›T\.¹2Ã^×ç×÷ènàsqhÕã‹à‡Î¼ ê–w÷°/–·óÌx+‹«qA夊tw;l\à°Ø¥]ÓŸÙ$®B ¡õˆ«ŒÞpTßá:üg¹áH%‘>k8:²óNk§ ,ñ֥ȹ&<ÒÌÛÞ ’–B:‰’´<š+4C 8øúDÌ(Xú¨q’®'‚·DÔ°º "¨)Áö ¹$=ºÂ‡wË=VÝPBo:G*@>R ÷ï5˜z^9ku°“07JÈ¢¤<´.¤ŸìZ¨G·Ý=Mœo à 0 [ª"³Ð1¯·FŸUØ`&Òo4þLTfN[ízÛǵΚS$ºÌ¯¡ÙÔ²˜8dP\§ºûÆÓOÖLCΓ¤ ¦_¹IÊzx*åe: ÀaBðá¶+;.øÇÛ»n$5À.éX»E¶€©á@ÞBGÞ_¼H}ðáŒÕô½ V„žm*«œ¶¤‰nÇ-T@9ÞúÈ{ô^ÞÈVÌ_Є‘¸q/bb é¨N]¬!ƒÞp¥A‚ý­Zql¥g9DG‹U397…ª“CAz íO’²D Ö˸vù¡í\±Â›píä½·¢¦TVöNÊ™j ʤê!9Âc$¼&GÀTUw7=÷--ZšæR¸ÜÐLŒ›G¤Šñ¥è†b\’Í;K¦ïµBZå÷|ÜãŠ411ÜÚVvÚ?é$¹kgI‰å¾I§–&$|^ˆ¸ Ì ¹›"7®E”]-|C…=J¯ã87mÃ¥H¼qJ‡:͉@æ„ïƒ5t¡ôãa •{îGÂÉ,„·®Ø¿ÌI¼œq9Ýßm®ç·ËEÝmÛ<` t§ d=+׳BvO¸Þ9ÿ3u¸)–dC9Vj_ìu@§=©±í(ÞáÖh¬ÍÈ£¾Ÿ¸¼0ƒ¦kC¼‡.º§I†y¥®ý’ÈîC›ñç[j. TîÄV×3¤I¼š<Ü(¨Éûsþ©ÿ ¯p·IÈAX¼þf2JTÐ(‘ßÐLr”`†xJñ9Q•¦(›¹ÿs¹Ñ 3I{q‡O_Z°LS)Þa~¯¯^^Žy¬¥Ð‚N?¬nßÕ¯nr‹Sll&å’Oç›…{!ÐÎèôp·_XJ˜ ¶—ûývŸFmW…ÜèD:ìèÿÂ'i¬‡Lǘ“,!§bð½:ðšF˜0ñGEž` Ÿ1>Ê`÷Ý Uð`¢sËiØEPÕøœ˜h”Ù*2#hÅjÉZM³èšjÍ ¨EÙHQ2A1z–¹‹DZ¢É+f”‡-£D2,¹çPò…’H ‘ÛqÆ¢<Ù¸ %‘Šžæ|Ñ3;ñ'¨)Ï“Žy éØX:9Ý84²ª”Šž%ʳ"òVDþ,VDžÂŠÈ¬ˆFâþ‘¡‘ ‚DóÏÉÔfÔÍÜ ‰cÏ µ‹“ì uù{à\<.ðdj³éqŒ…rë©D¤~VÐqêJkXפ~‰‡±àk€–gß²=Ž \÷V2Ÿ‹aÝ{lÒ7S–ñ^Ts¯W¨ž” 1>'˜s¿ÛâÿpÇ/ºÜÕZ·èá i0ìÙéœÎô*}rù“²& ÈP?iüI÷éÀåz6ÔÁPRÞû„â‰Ú;b<àŠ“ ³³um/ûâËÀP 9Uä'õlìèýšëÄú‰"¼‘7Î?lü &¯^Žú “BR{,´Ý+¨A‘ªÙÓÙ•ó'(Œ«ÁäSú«: ü*“µEÔ¶½Q;AøVQº5:½8©ÍÇ«ïì’0›à;òØjþ0? óhT È‘³û‰zYŒmË~:1Þ ˆÐÝì?\„=å§î-?)8†–qù9T|Ôß%ÂTŽqSƒüê^ׄfÌ=ÕÄÜOTiÕ\<2_­#Þô+È(™þsµï®ß{5ß¿ŸÁ{[7 þ{ýÞÍv±\×/Ñõê·WÇÑDMü>8ÔvR·frsè·Þ"S2Õ ®¬4%¦*¨»—m¦ñ„jdö?þè\ endstream endobj 249 0 obj << /Type /Page /Contents 250 0 R /Resources 248 0 R /MediaBox [0 0 612 792] /Parent 241 0 R >> endobj 248 0 obj << /Font << /F64 4 0 R /F30 10 0 R /F65 5 0 R /F26 67 0 R /F29 104 0 R /F27 19 0 R /F33 18 0 R /F32 108 0 R /F21 21 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 253 0 obj << /Length 2947 /Filter /FlateDecode >> stream xÚ½]¤¸ñý~E¿œÔ#Íø° ¤l¤\r+]t»—hç’‡\hpO“£¡èÙ—üöT¹Ê`fvNy¢\.»Êv}óýý7߽Ͳ].r£Ìîþ¸“q"RïL’ ¥“Ý}µû×þ<œ’èæÎDÑ~‹Ñø_úŒõÙÞòäõð[Žo.c{=3®*Æ‚ 7ô±OÅùÒXQooþ}ÿ×]´»“Rä sûx.ƾ~Z,éu[Í2”F¼$TâAÀËÛ-š™ö‹$H@DÂÎ]e›…lM=Œáv§óù}×»û:Û¢}“û}‡êMð^Ó¥Ïé}– côZ†ó•mG\{—/ŽÛ\PvŸŠ¾†w^‘|ñ¦O·›Ã÷¿üô2#^‰ÈÓŒYb…“g¿{kB½ò´ ¾ŠÅús×c_ÔíbéHjª+8áÞýo72Ùw72Ú"¿‚—¢/Îv´ýÀL〩RZÄY oèø}è€t•¹Õ#q«yÜÛ/¤.i8ž &x¸™¢·t~¿ÿâ†ÌW7w2ö;>Z< `OPw¤ïxb„³©»ábËú×(R%“]ÇrZSh}}¸QÑþ:ÖpsâæNþ­»œžˆ,ȺàÁÈ>±@e+šæóÝb#tCÉ'ÆJÃõ´ø•´".p|•ì?ÕÝu ©€-‘”ݵ©hîT §OHÁ“M‡s×ênˆÚ––ÞQËð“LèDûwü5Òš¨Tº3 W:C*#¢d§…‘üŠ)‚¥ðD0›å4!yq¨Ÿ©Hòx§Dœj"z³!‡ŒD»ÿNb¨ÿ¿+û0"MÍî. š_Åi%?±ä·kIaî´ÌDš%K½Q·h ùž• 4Å=âëm_·ˆ2{tx¨¿q"÷?2Ù#Ú7« ‹fè:Xúæ‰Ã#ê¼£lQ·>ÓÎe‡ƒIH| rŠ_RbPF1Ÿ•¢âÎôaEݰË'+Ç-¥E.Óù•d¼ñJ‰0/QÄyòšr*mvÑ×hÅ‹üÌ‚Ÿú½ù-4,&QžÆ=BÂnN%”ôAýr€¢Ï쉒MètÑ$"^>Ì=rÐ9*ÁÌö×3„K/ Y4ù“> m Ö,ö´ 5Ï·L&= dM[1IŠÌL,'—ï‚üx¯I£)L0Ú³†.ž!L/‚LMAJ¦<² RÓI­³·„­ fkøx-4Ñ8†Û¬š¥oB–ï[àÈëÑ4™ü‡¢<Ѽm¬»xGá÷(hH†VŽdƱ‹‰ˆ/ädº±7Ý„¹nåfþ¶dúü¶ço Àé¶n’dr'R²ÒÀd(ŽOÞ©4ûƶã‰î‚Ä»s_¿ä¾Ë‹ñ\n’Gç2 €Ê¦†‰nãH³œÄÁý^.¶À–¹t‘âèN×0èŽÊŸÂ»~±@î;€¨>q ‡ù W|W79l(¿ÖJÌþàãë¶EF2Ùg®:OÁc®,¹ÆD·.ñªÑgo®Î¯'”I‘K©O茡n€åÞÍ„V‚ã¥àF}¼€í”àÐã•xSö¥s½Ê¾b•»íáïco°qˆuFy­òžw E[ä£ÏV’}6Œ•Àð†t“¡ì7]0 Ɉçíi°HÿÜž#/?0[Ûë¢ÌéI´ôv˜—,¢‹eÎ2BEX…¨ Ä{…ÛðûP4Gn±>?mÂê¡—á"Ìqjò’2xôú=ÝÂVås»(süLb-Êý;™h—lB˜Ê<ƒër Å¡Z ]-oePÜ>½ ‘¾`\]ɤŠÈYë¿¡‡6ª4Ù¸ò³îÄÏ“¢9Ÿ à'VÚ³´y@ ±‚Æû°ù¾hìÀŠý#KRžºÁ¶/T Á÷x£»1Ésâ,g¥"Ñ´~¾ôéÒ,9<” 8ÔM=2­ #&(~æ&€ŽÔä5qx'³*Òp¹ [F†ªïÐ'»eC¬•±dÕ‹Á'†#I³NgáënÛ}}E4YDHÒP¤Ä¶‡ŠõŒ¢gâgå”0¨ˆèvrŸDD4íyn/[D´TÈ)À¦¸¾4Ý£íIíKv¢®µy Ï›M¦ #ZXã»â©>_Ï w&µ{qÛÔ§®«g¡(:¨û4v‘0sÉ`WH¹ =!Ý4VôÝÅÕK̦{`Ò~BÔãhI;„; ˜7µmNÇSªã ;X)žŽ3—«º™Ž1¸t¸B“û`í´~Ëóæªä‹)·Î§´üd› my)xs§`¸ö”¡X•‹ºX’÷ÝhׇªÛz¬Á%S7H*‘Gfé Ö Ëpâ7pëèÀʱùL£É…‚´pÆÚÎG¥MzæÒ]Ûªè/ÚêÌEÜ”ã—{ûÃ?6êF™; W8Æ‹BÕ, Ç(Þ4ÅÑ¥®*ÉöÍÕUÿ9-º4>ÿFTˆ”H’)|ßá>ÒÊGK߇Ú5 |©Š˜ÙªJ³=*Õ8Ö^,B’|ò¦ˆZ{SÄqÒå¤î‚•™ëFpP¹H”Z¥TÅX +"£S®,€µÂr­Nø¾pÝQ&d¤7ï{™UD± /\Òpí-gíÈàØwg‚èš_€Æ=8ÃKk\°2‹ ækÊ[3É\_J#dœ¯êlÍpùŒTF³%§Q¨:±ˆ¥þ²!ÇSKåR”¿‘ˈD„oA(¾“j¨b|V¯Ã‰ò)-;ÚO[ U‰žzXãB4ÿ'¦¸ÌÚ©N_ᇥKÌœp-_†k”A"a]©<]7•pWËëtÃó|ors‹êY“FB ɽôß48¡Ít©ôïEl¦Šx[®{ÄÇ?ò/ P|¤ÁîV?mÿYìÓÅý¸0A„ô¸àgÆË?h|õßœ¯L@ï©Ë BN¤§Á;ör#ÔY­ƒNEˆ‚'Ž]Óï¢ì1ÞÿÒV~?.WõTÖ’Yoû•)a"óEŸ`Dšå¡Oºùz’›~<ëˆ)ôZù®ío-ÄyÊ©wš¯€é¢‚»õ.™ç8(™i]º½Ž·ì-MÍ}cj!%iÜá÷? ìÔE4TÛÓÔF_E‰-w‰\ª 8ý4Û¸å ¬Fn¶ñ”K¢1E­âÓ›)ÈÅ$ã‹a#çÇ0aa ƒÊ^l[ñž T,¤Ü½Ë”÷+ÊëÈ ìÁ›s4Í…Jõ2Aû0Õ9Å\§¨\zÕÌôó^:¡ý´;M¦|ƒ…2E͹zæÕ€®,¯=ü¥hè‡ |½Ýˆ.X¹sV„Hâo øâR×£€§ü1eÚ2\:Ð+—®E ÒcË›Wüÿ±ðõ>J`è;I 3ÞxÝJ^Ís3‘}Í=âm‡.v©gÎ`р궬ù&öG4³Ê½²Xžv>V…bþ5Õ»”‘Ù·D\1`9èøÎöFŸrËTç_÷Ó”3&‘Ë»[º;WwãªñGĶÕʪ7Új¾{t¸gÿ꟢`J½Ü¨ý ¹Œ e\ÙÂ=îÕ[ŸGU¾\0yžç¾‘<Ÿp#v$RdYþz*©"«É½,š~“›=4–Ni',Ÿ ûf´"Nqæ›î¿ùmLCý endstream endobj 252 0 obj << /Type /Page /Contents 253 0 R /Resources 251 0 R /MediaBox [0 0 612 792] /Parent 241 0 R >> endobj 251 0 obj << /Font << /F88 136 0 R /F68 6 0 R /F64 4 0 R /F31 8 0 R /F27 19 0 R /F28 9 0 R /F65 5 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 256 0 obj << /Length 896 /Filter /FlateDecode >> stream xÚ­WKsÓ0¾÷WäH!–eɃ™†0¥Ã áD,° ¶©­´åÂogm­(uš ôЉVÚǧoV_,NŸ¥éL)"1[|›QÆH"Ò™à ‰Ÿ-òÙ§ÏN†вÎõŠ:áià~W¦µŸCeyQ7e·,µª2†s§Ñæ°Oçƒ_“Ç[Š©Sü²x; g¥Drñè4 aäìßäºê£J);ƒîoÊÓW””mé#‡Î:ùûÉÕïv´þúC/möËVër>[• Š—¥²¹ÉlÑhM.ïFžke }£À%›osš!µ.¾¬¯Tc”Õm6ÐþG-×V£3O¸øx~~›L1áÓTƶÎ(ó“¤èl\L{@Zµ¶Q¦²“~{œÞɲۦs:dóØŒ‚Êã3Á·*¸3Hˆd̼T«Õ“)OCú¡×+å9\žúnyìúòKÅ;Ë&`áX žÆXNÚ”À$±Ç”†úçÄ@þ-çA“<ð6¶†gĶë bDR—¼wêÆ”ërˆùS¯LQ×¹“ukMÙS4‘öªåjàO5ˆòÚØîPÜjÄdë!iÚ48C`€µ>¸hàÀXSWNxÒý¢¢aB¸L¦±õÁ¤Ê«^qã4›8HHÈ„±“]^ cQ·7BuÀeïëµcbEÐò]Ç %±Ë­8ã> “û¨ OÂÿ‰Ê0jBcàœïF…LÙlG¥±HoE·¢FwÜÕµ8Kwx¥$¤¯ y\üˆF‡n8Ë­$’ïðJC¼§c^›>šN÷j~Ö8âúñ2ƒöo÷5ÏÞÜT0E®F@c¾®ûâŸpò^5ªÔV7­›ËŒ“T?¯°…Çó—çHÇGXõÍá š¦[g!á €&2qNdJÄœ¦Fœv7‚F*ð’bÚ§[?H¡R䂆c牉ìÍûQì‰#Øã÷çݕzŽyælÝÉ^B’=dœÂ°¹önÓÇ<úL÷4ö÷=”ß~Å!þ® ³,†ò“Cõ]<ß, ÷FAä¾îÁS$‰ñÝòи[û«ú{°ùà=ÓÄeêCÞs>ˆ$IaÇ=‰"ï ÕÖ?êuS‘Í;˜âšâ³*ÞþÇ@Â$èè±÷÷1O^-Nþ¸˜û endstream endobj 255 0 obj << /Type /Page /Contents 256 0 R /Resources 254 0 R /MediaBox [0 0 612 792] /Parent 241 0 R >> endobj 254 0 obj << /Font << /F88 136 0 R /F65 5 0 R /F64 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 259 0 obj << /Length 2735 /Filter /FlateDecode >> stream xÚYK¹¾ûW貈Œ:$û D6°½âñæçУnzÓRËýðxrØßž¯XÅ~hZëÒd±Xdë­·÷oþú> W©—F&ZÝV:Ñ^˜¤«(Œ=㇫û|õïuÑvå)ëŠv³ÕF©õçw›­ 0ø ß/›ÿÜÿ}µ b/1zµÕÚKCÙû¹ÃÆÍ6–Þl}û Œˆ1n ”Œ¢ÄXjê&ãè˜ •M4°WK“D@aœðLù ¼4V[Ò:aÒÿhÊsWžAVéuw,x_¬&ûBå™8Å¥ìŽS{Z  šJýðG±ïk*a{~0 ŠïÚ[&‡#\QÛc½1áú©å[Nž„¦Ù9çÁ¾>UÊäÅy_0¼ÍwÚ›U[­u3òʃ&;·eWÖg~I^Äó' JËž95ò… Ç2ÇÑ<þ˜5ÿÝhµ®7:\gÄS/_²&;¸[ëáÅ‚x}ÏDü·œŸÊîXž·-+ANn˸õAïßýÎ"4ñ*òÒØOH„~z)´x«½ ˜ ½ ê툨¼ ÒŒ™58Ï„>uO¬Ò8M~ ƒ„F Y[TåY65E{”$ùï$‚¢zÞDáÜú:]¿oê#ZáÑ`·…obçñß$$gòeÞÓã.˜ î`ï¤#³ Ò(Ïž[}U¡ò½”H«õs‘5- ‚õP@g ?[ MÞ~ú|'äxK>Ëý‘‡ÄxæY5‘C¬*Úíg>8Û%Mö(XôÊöÚ&Hf\FÌ¥0íÌDpÅ„•¹º¡$IìÅ¡~UG°!ZMpJ9±b»´¼cúð,|Üä@˾¬Kj¦9JžÇZX9t{³}ßɆb”깃9YŽS/Ž®,ø£˜_’¬ ž-0>Þª ‡%[1ußíë“Lò²íšòØèY JÜÓ7ãÏ©vD°ñRÙ7ÿ!TŸ¬ØV“[Vn®#÷pÉhJraÖüé„V\’xî)?‡ºñ“ñUºþ×&Q¬[ɺoeÀ,ñb¡w¶v?d_àâ[ŸRËS~5&Ò‘tïÂÄܹG~3tNûx:}|wÿ[Ý,ùw šŽwë÷Äx+aß7‡¸õtª¡ !X¶YK¬ì)ÊÑ"‡ RÅìùþòí±ÂˆD(Z{®ÍãAXå/ó|@îNkàЋ¦z&wüRÁ‚Ðócß¡.;? ÉHÙù…·_à!˜à܉R¦1Ò¨`xt o¥&€„¿,/¥X&0ÎyÖžU2²h“Ð0zs#:l`}¾-¡eæ#ÒµP‰+ßnOœØNaã°÷òYó'HCî'áÍU­*Oe×.y èe2$–UMäå }ãéØ8,èKJpMQ¬͸\~†ëv ÖÈj}5&!ÖÀýÑ¡©ËlB'3ëB|en‚ísr£Ï0òœ<ß™0s åDxZEžRWvê,aήöb3°ÛBš]²¤ºÚK‚Á ÀU˜*É5ƒ@ÜR-šúȲËÃRÒk/ÒÃadÝ8nÙäL4øtòHDµs§ÍDC+"»&±9X€ÖÅåB¨æ…ÿMÍNÁ¢d ÆHa¯8yÔ[¾p9žéxªSGR2Ñ%+‚/ðÇâ8ùAM™`Fú ]8h®)zÔ ±nÊŒ {hOëTp9Þì«òý]‚ùûx;áÒ)5AÚ*Ï“ÕÈqâÈéxê­ *’Ò½‘*T|{*lHœjˆÌÅp¸ /ÖÑuUÅqÊÆ‰nÚå9ÌÚy”Ò&y q¨âœ%‰¨›n‹ÄüôJÒ(ÛÎWtoøU~¾5†”Ypœ8$C51D™èyôà„.º¶ †ÔyÑ>rQk´ð¤Sö£<õ'žT%»§ª<ÖuÎ0Ñ|ªZ’•º<ƒ0¬ÈlÖÊ(²€µ+÷}•!Ð0¤åúkVíš7Jç`9U­/¸HÙº«$”#tG{ÍDêwDD邏¼Kc^"«üJXéÏ6çJ$ÙHô¸D1sºÅ™QbÆCQ`CÓ½Ôë‚Ý‹u¥ÔÆj½/¨¿P䢡œôU’Ö=ûŒ³ð©R½x'RÔ¾90Ûs/›Æ¾Ð#=ƒÎ…YÉOI#ËH4ÃcµL’‰Zªyûçh=¯4¢þ¶åo…”ŒjÉ1ƒ§9þ]ªî§Íw:Æ6þp^¤‘øix•Phß%n³Ï»_Ï™KLÙ)ªW%½ŠB¤/þœÌÂ…Â`r¡déBK„ø>óë ·{õ6Ñp›_‘È[Q¥iJضi`7¤!j!aûöÐî2¶Ý56D‹<ÿ“?Tó:nzÛNÛ]ºsºsË]¶Ã™~ƒ™7å]wlŠÂûÆ—vW˜ôåGr¾ìe؉&Ü-)|E·@Š,»eÜÝ\ã¶î‡Á2±èeL^"gõ`¶²'°¾ÓLÒ‚$,Ü@ºÉŽîšºäA6×í´ÂoBœ=ÄîþŸ_Þ9ݸn¿!žDi27Ë/”â#·ñqÖ¾I’ﺌ9%aÌsJ‹`{„øÞ¨€PÃÐ=^+b/ñýi‘0É^Z>À:;¹u6Oùà‡ AUWviÉí”H!df$ÝrŸUÜ>¼£®H¼>g]ßPdðÃtåiÒ.¿ßwܾà&¡Y!bÙ5iœþÂk®E½X?u½X5ëÅmšgÐ2gæ/‚ƒdÄíu–Aïa ‡ôV;„âô'j6Êê'HÍHê?꾑3ler²y•ŸrôwºCƒ·Ÿ>oð²SJr?©¹-ÀäÁÐ –u% æ€HDæ9TÑA5¿t‚2Û˜ÅfÜ+= ·"5éuqÕ ÐxôTV•À 1@3þ\*[ÜEÚåà€¿'·Á)çˆ 9Úºyæ¹M("*ÕöPáäív¡¸ ^Í ‘GGzš¸¹HÎ:lšVj?H@øªûUõ|›ˆ;å—*³eæ JKY¸©}BBƒ.pÚ‡ E¶è¨Ê ] àß7$˜ÒCÉ€¬z¬›²;ž„–Ý®{ÔþkêŽÙÞ¯ù[Õ{‘䘉à¶Z¹Ëû<óüRK1uí×3ë.(7+q µÓiæ<¡ºêýóêIR7W1%K‹V äþHL3Ä–•7P¨ôðmå°¯›œÿ%£‹Ô²õ(xô^]çŽuf"à-¹îêPgø™3ÀöañÍø#…€u… ×yÝ È⻂À,æwÀ€¥ÍTåëþ«ÑÂ+Ùþ…ÚBIt£CÞm‹ë?]:”E>ÏQ2WëQ̆W‡†Ž™²·ü1 ÿ¸QŽ!Œ$þë.shâ®ÂÆ¥<…ü¯ì%‘pØÿNß¼»óœ_îT endstream endobj 258 0 obj << /Type /Page /Contents 259 0 R /Resources 257 0 R /MediaBox [0 0 612 792] /Parent 260 0 R >> endobj 257 0 obj << /Font << /F65 5 0 R /F64 4 0 R /F70 7 0 R /F27 19 0 R /F31 8 0 R /F30 10 0 R /F88 136 0 R >> /ProcSet [ /PDF /Text ] >> endobj 264 0 obj << /Length 1154 /Filter /FlateDecode >> stream xÚVßoÛ6~÷_!Ý c+R"-­õCº¦Àìa¨±—4´LÇD%Ê“èÄî_¿;‘²­DAŠÀáéîøñãý’>­&ï¿dY“\0¬¶M²Y ø‚°„«Mp~Wj?‹D‡#·nÕ㻽5‡j¹¤NóëÅ¿yžÏîWqQJrî‘öem¿Å¯xÿgÅhð¹žü½-êA£+ÔOØŒb¬YÌHžäîv7f± e‰ÕIyh¤Õ3 õ†ÿiø$OΫ޺µÝ«BoOÚ<øÝίÒmQJèžoqÌ ª=zUoT‰¡Jé%Æ9I3¸DÇeµÓ­óPF5²t¨ÛFVjÆxø„”êæ»óÙÖÍ€LÔ%/òƒ:ž™wz³QÆÉK@B@¼õ£Óu<['Ò;ʲ­´Vn=´jƒ­·xåPZµVZõöIÛ×¾Œ™E)Í›±: nÂrÜ(Iâ㇫t–þº¨z~Ýg;-TJ§(=¸>Ô.0h«¶¨!ÇF·¶Ñë‹Ãƒ'ÏÓ,üZ{.&› 0P%O,\5 °ñ¥Á¯J#„^JCUÎ:Ž”PšÞ{I¨à,|8TÊXwäç%4 §çM0DG`éz„õ>sßÊ¡ºÒ]!8;&Qô»×z ÉgÉëWè2ó]Ä$]\¡WHû&zQÈÙ¡°Ð;]·À°!båi&xË fÆN5j„H†Wî1ÆNÉ ¿TE7³xÚrB©ÌC7Œ8?uXú8~&÷çäÃh, oÊÒq™cðÐç¼O8¨ü4Øé¨Ñ̲ôï&HoÐáFI–œ> endobj 261 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/fev_viterbi.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 265 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 266 0 R>> /ExtGState << >>/ColorSpace << /sRGB 267 0 R >>>> /Length 1046 /Filter /FlateDecode >> stream xœ­WMo7 ½Ï¯à¥ÀúU¤¾Iê0Щé!Èa“:@µÑx ý÷}iF²á¤$¯ýüÄoŠÔ2]Ó5}š^Ó' ÅXOÉïɳ7IÈ%6AèîŠ~§ÛéÇÓo?¿ ——“5ÖZ?/_þŠÿ¦@Ooß‘¥?&¦ ü\O¬è—)yã-9'¦Xº™2N3yLtœ²3™ÉÅ`b,΄@ÞF­3Eúifgb$ïØˆqV­Ž£Š).ªGR0a>/p"uõ,lr!ÕT±áã€cRŸ+Žž8ZS\ÃÉ“ c²à‰áv¬öàø¬â¬ŽJaS²b?+êþkB$çYÝT GFaØæײ ö‘>AÑfR2Î|fÃaà ì—'Mt¸ø‘‡ÿðÏfã¤á‡|—9k¼‚zE0šÀ ö…Ť¡^‚ú€Xõ+Vûþh>ÄY-d—wð/ ¼&.ôüŠUì¬Õ°+Fãtý>©cÃyÄãõHy°ÿ(³6uÇèf[}9šìzÿINš¯;+ÆÃ_žËZ1ê=`7ëƒÛÙ5ŒzØÏñvœ´>kÿ)V{]ü呇ãnà™€½ö‡‘Çý‘Ñ_猌ño˜Œ¡º}$ õ™Ûtöý†ü¯¼Gch<ùÒþñÚHàqXõyïuz°‹ÚVŠ‹Þ×Σ~ò+UÌ:/tŒÄY_ˆZÿ4j…YûEš§É¥NÃov¬ˆm–Þ`pe­w…Gº|Ì7uã#÷Y ¾Â΋DV¾Á¯ ºòv^ èËÊ78ð˜Ö¸0+_aç´Æ×ùû–¿§'òwú€]òJ°zöQ4ÓˆúQ±6@Ò°ö7´ ÖžÑþz:ßϺ¿,ÌÃxéÒl·ˆ‹em£A|“uAóërZÅe“u½›ìGñMÖZ£¼‹»MÖ=½¹ƒø`½>Ú-ºiïq÷µêy,Ù<òãrç+ì¼Ø S{áøty®|…wx5¤n¿Á¯[cåÛYùÐÂñérölH%QŠT¢ºTûö©ÜQ¸u¯JǯÆjöy–NÛ¥ƒÁªtÞ.­ûÖÖ¸ËWHû¹í¾n×7Нâü¨eÛœš<þHËØ=.P· ^oÇ¥þár¸n…ol‚$X…YŸ×pöíî§Ã2G»NtøxuG÷wg¸5´;Üžþ:nïÏÞÑþâæ Hˈ} eÎÅôþpº:þy{ERÚÔ¤¨ÏUój»0Ó±¶Òùvá2/l~óYáy§=Ëc‚‹Š–E”Ñïùí†Doˆ~Qxzõ··Ùº:+\šê{ìF‘¤Ï$}s—ÚB—{t Þ.»çí÷þœøÉ¶ùÌÒÀ{£î?4ʪñõô/âŽÓ„ endstream endobj 265 0 obj << /CreationDate (D:20140103094218) /ModDate (D:20140103094218) /Title (R Graphics Output) /Producer (R 3.0.2) /Creator (R) >> endobj 266 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 268 0 R >> endobj 267 0 obj [/ICCBased 269 0 R] endobj 268 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/space] >> endobj 269 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 262 0 obj << /Font << /F88 136 0 R /F68 6 0 R /F64 4 0 R /F65 5 0 R /F28 9 0 R /F31 8 0 R >> /XObject << /Im21 261 0 R >> /ProcSet [ /PDF /Text ] >> endobj 272 0 obj << /Length 2476 /Filter /FlateDecode >> stream xÚYK“ܶ¾ûWì‘Sµà»*>(’]R*«ØÒÚ9Ä9`†Øf9ä˜ähµ9ä·§Ýàk8–’Ëâ1`£ßý5öÏ÷ß½ú1‰nr‘':¹¹¸QQ&R¥o’8:Œoî‹›÷»Ù†:ŽMa+œFAYÓVg÷}ÙÔ´©…Šxûd÷åoRjÛÑF¿QÁÁô´0üqYåÆÏeq6L¸Ùïϧ’ÁKY?Ò±s]ضòë(èzÓ3GІ½av¼ßì¶›Þÿåf«"‘GŒJä1ËÓÙöóFÅ-6[géhtty®iøMÆÒÔ|NÁJÝÂÀÝ”§áÛɧ)ñ„ëï7»o¹Ø_À 4-!oÌL. i˜^ˆ²Ë¹Ô‹ë㜮‡q¸>¡kaË] #^«Å×& ¹ý·4h@•ÖôÔmguÓŸ>–ݾ2]G^R/Lƒ÷uÙ—è xä3ú†©Îž·æö¥PkšÖ‘–Á#9•µ¦­Hý©­¾¥™ÞªaÒ„Ä…I¸Õ4™±»7äóøÃ©mvfWVÀ·í„ãkÍçîeGøÑþ~f>”¶î™ÃfÁ)GNw¶jðøó&‰fz 5æùܱu@äB<ž„¸ÖZDiÚsŒˆ<›¦‚0aœøc¦Ý¨,x<§|^Á6™ò»ã a•Š< ýRm6QZ2I<*˜/åñ|¤EU>a~°Uyhš‚öl×—Gòb\v‡æ\ñO;¦Ñ{b9òÌtþøï¡ûÞ‘Æq“ã´| ]JªLÈhP+D[ßží÷eÛõ°XÑ8¼y–Í¥ì(“µöØ ‹›ms¤Ù:Y,’dª~”ÆI°bßP(5ØwoªJ¬z‹Pi¶j…Z ™êÁ© Ka8cWå㡯^hU€&Á‰lëœ ·ŽÖÔC~wÁêvÑLiêæ”Ù³DHε÷\ö‡5)Ð-¿Áåc‘%Éè™ÛPæÁ{Ì:$ÜóéT•¶À°‹rOاømK³«xˤ°Ü½¬p¤âP¤ù7è5¡8÷~d÷MÝ,ø¸qdˆ_ÎÌÈЃ?å’ît¤DGBÅ‹\õTS’©±æHJþ—D¹HÂAY^¯Ez$²h˜lŸËÎ2ÙgXZ*ׂ*ƒS‘@+VÓ"O-̤YQî"P‘”¾âaNæð㣭mË–ƒ3nø³zʵÙÂëÞÝÝ¡HiМû}ƒÙ-ÉdY‘ðWg1œ`ˆžëiu¦”ã9k"'F¤Wù€ €…’/"ÐãxjË=æ? º<¹Lçµ®;—=Ë¿ŠWÞ¼Þ¨0~¥UazãëYïíâ0kõøl»Æ;E*§ò7é˜j <×+âCŽåàCj˜‘R‰ÈÒd’ÜÀ`¶XÇ©ŽbýRŒòÈ3‚~(˜©»Seêž‹”ω‚E¦ ¢jô¯”Èþ 1œHüiKc»ƒž´Ç?ò–v¡BD™Ÿ{R¥ŒúÑr)h(Ts»Í‰ j©G"Ù„Æ´®>ò¤“ÿóSüÌWþ›íŒsÿ½ùŒ¨V J›)ˆq»îü‡†kÚŽ/èλAïG‹ïiøéþÃ/wü;zèìG¸ŽÄP:q8ç…£mz¾*;¦ŽÌŽÇ7¦­&òQG×D§ë2¨SÉÅu j ‘]ÒÓ“sû/I]~>²ºNhäé}€©Dó“Û5~ç¬=ÕÙÏG¯}lÀì³0P4zÄš¦AÁ:.àW'"Ö,8ÃL 4–@ø]Y¾×º3í“«PˆÒ?OzÎ?®(Ñî¹êK:…­-Ÿ«¸®ÁfT[&€3ÇÅ'Î~‘äòÚv”†aC‰XèÛ•ü”MtòÇ] @Æ$GxÌ41Õ÷4d‚¹Ã245ü³5ûÍ8ÁìÔ”uï¤Æ,7|â'N!§ŠWƒÜÊa“–Ù @ÈyLØE§XA‹KûÚrzÑЀm¢»J'ÁÁÛöÉ~2àöƒÎ2ü¥¦®ÌÑùƒÕñŒñгÿiÖžl]PËxÁÓÚE½¨‡‰_9¸èíPçI½V_ة̋o–ù9`êâÔMo¡ŽÐù—ÝE‹âÚêzÒ®O\µ(±º3C Û<|²kÀÃUËwØêÄ ïî×+­[’ =¶šV(,`¦ÊËY4{×­OÞ*†g ÑèÌLÖöŸ9U~1GðB±’0Ü…þ/sæ\ðÖbÔ“G7ÔöùÒ¦Wsźn¯§R1tiM‡ 9ŒcÃÄ_‰ó¥{‡áø° ?>Œ.mKÛ¾¤Õ²çx š—ä«YbxÀáhöûMs8i+î`ê’NŸw¢š9„àDõš”qÒ6Êuðw¤‹”"³×zà ߛp,Èl–Þ›sKÛÜ Òb-Ü· =¹N!q v­wÔ‰<2iÈìó[,ø—*Šs‘Ž`’)÷扞 PrcâûdZsôJ/@í¡B¬qiÿUÃp~…€2»À¿óˆNE˜µ£5¬õ@:Y–M^¢‚‡õ]5Æ5¡¹o!KMö¯ ÷ HÿsÀÑV–Þ0q±ú†‰ïJãS‚!ñîîooøëO¯?~ZQR®D"‡&¦ä{ø¹1f¹ÖºðLDã»ÅÇWP¡ÄÕ}'>®Ü’¦"ýî–h׿èÂ`v¡ ÁÏA-™‘Z”¢¡¡:\)c‚âixkXÔ†•î‹É€®øHúÅ€ã}#@’aê£ ç·ꇩ‹œ\©~€†D$3¾h¨@{k`ÓаoÚÖv'®©hôüݽ¶+ÖNÞÐ0{’X ¥°¯7yÇškD¡È³pê³»®»F.8j×î_U哨¯¥#|FÌ'IÿÄÿl€î~ùtï“¡†Æ=™{‡He}A5-'â2>×´"FPÿCi÷ é³/xÌWÜû¢d‘á£ôÒ×ä3ßýpÿÝòh) endstream endobj 271 0 obj << /Type /Page /Contents 272 0 R /Resources 270 0 R /MediaBox [0 0 612 792] /Parent 260 0 R >> endobj 270 0 obj << /Font << /F64 4 0 R /F65 5 0 R /F70 7 0 R /F88 136 0 R /F68 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 275 0 obj << /Length 2334 /Filter /FlateDecode >> stream xÚYKsܸ¾ûW¨öâ™*"A‚+ÉA±åĉW»%ió¨õ JÃ2‡œåceU*ÿ}»Ñ >FääD Ðh ß_cþ|óæìƒÖ'¹ÈS™žÜÜDJ‹4S'©Ê„ŒÕÉÍöäçÕn¿¿«×A†«¿~ÿÃû‹O×?ÿB?ÿDŸÿ¬¹ùÛI‰\©“€¿v«âÔ.†Ëy`yY<¼/»Þ®¾½ÿýƒÀųi2»aI‘¨¾0'™4ë@ÁEnvÅ:Yºª‹µT«ú±…cÚòv-ÃÕЗMM³e‡_µ2UÕXâbK }CßÁ¿­#µb®M̓ƒi;苖~>ìÊÍŽ†SÛ[&Ý7Û¢ªï’‡­ûŽ™ÞñÎ& 5:ùP)É÷^д¥é‹D•y¸:ßË=ÊŒƒ®D#dIK($Žf¶ g/ó#7}Ó²öÕLû2ÎEæ`N2ï¾Û‹O?¼ûñüêÚc«,©Œ1Èþ”a.Ò$qWg›¦îzS÷¸òñËàp=N®“„¡Hu²ô(DƒæÉ#°üøjö‡ªðÜ@Åb¨.Ð[Þý¶j6ýæ­çJ¸¡RrºSÄñêúPlÊ»GÏiI(¢X¿tÜå¹OòD¤“"ïH.°^[ÐÐ:3|놾Ý`FCnH‰$ZªÉ9…RN›¾èJ8º®‡Ã¡é¬+§1Ä ~“ã0™n Ç‚>‡¡$êdehÓ=ó‡Èkz"+;ž¢ˆÄÛpÂâ¶):°U¤WýÓ€b‘LÕfûHo‡Âpdx4ÍE¼pyJƒÏx½ŸžŒ%ˆïõ(” ·Î¸©†­1”«»†ï1óÙSÏ"•ˆdôÚ·ûÂx½3VBÃ>&ó1J„ Ç»¾í¶>.2y½Ä%ˆ14c¹ÌZo»9>ŽI Ô©ãèÍ4J.§›mLåg ̵Éê@Mz|à×íš¡bí›'©sQp¢5õý“dZ<—K}yR «…Ó€»\_þåÂë3)uzœÙÀsc%—žû‹¥Ëí8Z¸JÇ™WPPŸfC‘‡£=Ñw@¤n‘„6ŸCë»Sú #˜‰| 2Zš†òjl™OIïV†•åf’·æŒÇ)øH¶ÔO7´Z2U³|am‡SÍ¡/÷egàRC+E+P_ÝVÎe‹„óæË:‚+t¼Z™ã\Ó—Y7”½¹­xÑz¯MYšBÜžÈv |‰™Jd'áªjîi`yÑвŠãÜÑÌ.‹?m1mMY£WãÊŠ_Ä&¸ ²yÙ—èø”¾1Ïk0ö“ïÝ’¯‹¥‘|1×µL¶>q¶C[Ö÷T‘öæk¹öô£*I¡U¹kš-×k2™(GÞ*¼ósTP±­`i[Ô;¬Mïh.”†>·%®›Š©g¨Ðk¼€uú@*«ŒšF6}à ì;ò²T~÷OD˜,AÓùOÿz4E££Ti xÜÕeίŠë²…‚Œ`±'ØëŠ~’ý‡ éýe¨7¬Vç=HN „PNžKpªêöWg€èÜÿmÈÍ2ž@ÞîÒ•¦Ù©¡fß$ð;Ã1™<Šz \õT„Sg½’må¾Ö7;9@{ºù²#rÉ ͺ›ÿÐ×éÖFN 6j] =ö4Oÿ”Ž'½ÿx}cšÛ¢Z$éï>~çm±ª²þ²$/!@ú²ôÓ· â¹(8Ýò‘všE{NRï)×›’ Y Ù¨è+9}€LY¤‰ì³”jj=îŠá3¡ «K/š€Še{? …™Û4‡ß íŽÇz™ŽWÝRÍKzõØ L à¹*1ã/{Ë-®cÅ]EUìÁV´žêA\)@»,?ê¶_ŦIªa—y2SÝÓˆ0œù’fp‡1UÙúœk.yƈSSâÁy*[0M½±- ËìQ4=¯>°ˆ;£Öž¬…d`JtÇETa¹Líý,îÇñì†)ŸßMƒ)ê¨ûNÓÈ¡‘4Š!Ûbhü:4}Á‹äsî†O»Z^8÷µEX·0*;¬W"›¡gØæmb¡ä´ A!ކhîË~yZê?-ÃÎ2OûwvÞðcÌ{åT¥„6àŒ¡#G˜.0†ÄR๩ ~`̦†:«Ž€@_KÉ#ž5P.5ú.­r‘eéKíO&¦öè9]Ë\h­'.A(Ñßù@ÿ8ëÉ^ÑftÄ’N4:&Ž-dÁ…,‰ Ç YPh¿;žxñˆ*É<‰çÓÇË¿¸¼ö¿^È<ñZ„8Êÿ¿‡ [ã5ù¯@Ë\m×#@Ó\öµ[Âo¡a84õ–*¬Á÷¢Ñv§š18ÝSc%>5xAR&”^â¾—ÿ@=}î³lÿ½Ž£Ie”&ÅSu ¬¸‘7Òîy‡V^ZëxÕÅOÇ+ÌfÜýŽæMÛß Vç">jJŸ7}’ˆ8N^3½LFÁ»vsMØø"1†¬¶4{èÌ­~[:8º™¬þf ¬ûȘ±aßôÌÒ½áj8 Æ8(¥BÛ‡4¬¡Ñ·ÑÖ×ê ­TjM0^Œ×“½PÞœ-ªjGò[®Rü§-¼ ÅÚ¢Úš¼ɉdåvÚ‹2…‹0ÍW¿&A ÆhöĪf5XOÄ;µn¥ßqLAüÙÔºlÊ9öÿ³HPS úÄîå‘¥ËÞÙxz|ÝÆ1x-‚†9ÄLÝ–v£Úc%.m3ý³Ë~LÏa‘ÝÔñ½\ÇjuþýÅõë\€¤ôî‚hÊúè ¾9U1µò­oËÖÚøñÙ—Ð'}P× í†Ç³ùbî‹Þ†3ÖÊ?ɉ´O½øyGŸIFüEÅF*ö‡ÁmàÊ“¬msknË 1M@UîÆxÓ¹bOD~»ŽrpQ˜@ÐQZ°L‡žÈÉ9pÊŸ†<ÊÁd-Ø·'#~ÐVÔϢߛ ð+[Y=óÀ¬sN¯…îÔÝ«§rlÜŒnO Žn‹Wú\ðî¼<Ãw4€È1¿)H\{sqóæw€57$ endstream endobj 274 0 obj << /Type /Page /Contents 275 0 R /Resources 273 0 R /MediaBox [0 0 612 792] /Parent 260 0 R >> endobj 273 0 obj << /Font << /F88 136 0 R /F64 4 0 R /F65 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 278 0 obj << /Length 1254 /Filter /FlateDecode >> stream xÚVKoã6¾ï¯ðQ.VŒHŠ¢t(P´É¢[´] M[Ýh‰ŽÕèaˆÒ&ù÷áP¶•(‹^DŠ’3ß7¯ïïÞ]}ÈóMÁŠLd›»ý†ë„er“)Í„T›»jówTõÓ®±Û8K’èж¿ÚÇëÚŸ•\î<½§1¬ýs÷ÓF$<ÛÄœéTÒeßøÅ ­7ËG38¸‘ãîÕ‡,½P)B3žæp ,Š ÔãÁ6H« i”-þï‹+¯‰ŒéLlªÝ6y¾l¹Šl9öý÷{u4,-À¥¦µ£Ü¥@v¨¹¡ÞmEMcÝwš(TdºêÅM•í\=>ÓϬ†Ý JÀÇ4“m´W€ˆ¢…PpV¨€ÚӊňL>Ìß“3¥ÈU"ˆ+¿3ÍgHÎên… ®8ãâäSn(¯ ŒÐÒ/¬\!$—,˳Y<¼J†p—{3ËT#`ß|;ϘÙ‹§ÙaÍ $ÓÅK?:e¹K'º;XxRidª 'ŠÐ•¶¯lCS@òµ>EÁ¤LçW®üåÓõÍÏ¿­©ƒ¡zRgWÎ2]Ì"Mý°Š¦”,çz–Bç­ƒöAi9 ˜–Ž=¸ŽGÔ›çhÿ×KÓ´o[’r–CÒ9+ÀÃíàG+a+ˆ<ÓKÈYëZž`×7·ÿXyˆã Í¿Ž™W<Áz{UöM7:v»r£ÖL'ÅÙ'âT@?z{šbp5 ­ÝÛΘèw® (äQÆE2LX8… öî%À&É—¶¶æ©n§@ÒYÝò$²M}è{t6 YÐukBöL“" é”v ¤¥ç±.éüë|¢Bw$@6àÁ®iigi4x-¬ã B¹=f¿O'uHê”^’¥1çLïæÔ:çL­!ÿ!µþ~¬ŒO‰jNp j9µ¶C¨ãzñ*¹’¥ÉÉ%[Óa´Ç¨ð[­\(–¥|雸գ…/ WØ&XpºênÀpÆT‘.A©Áç®À¬+ðê´œLÃn»Ç5—–š¥yúZÁzOãs?Ñdv”e•²Â7Œ'ç[‹Õ§n^B}4價·g})òY‰•®îîiá–†›§ëð )­‘is[³S4¤RHðœ4úkËAé~è@ç üã×'ÅÙ.h´â¦^ãžÆÉ :™²Ò7%ëêëJä+é4gR\Ì [žG÷Þ?OϾ¾\%Œç§¬¯Q­Y!ÅeÕCÛ\˜ø Ã‰Åà}2í± V,Ú×XŠ‚q-—¼c|{ú- Mè`cï×:Û¦/C¼]J‚¨+ÍÜõ†Ž$‡]¸òN6YªõqO…ûÙóïkú+Êqµ5Ï4Ù…–¤ßÏÚȆËÎ¥‚ÏÍŠ{—„³o¤Šqyâµ< µcÿB8¸¾û®Êxç&Vš–™’MkôåŠÉsî99=$èê¤X6\³sÖ]ÙLÕì ãÒQM ~§!ˆ ¶±Æ… 罄€.UÊÄû®¿ZIÜ|ws÷î?!òO endstream endobj 277 0 obj << /Type /Page /Contents 278 0 R /Resources 276 0 R /MediaBox [0 0 612 792] /Parent 260 0 R >> endobj 276 0 obj << /Font << /F88 136 0 R /F64 4 0 R /F65 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 281 0 obj << /Length 1335 /Filter /FlateDecode >> stream xÚ•WK“Û6 ¾ï¯poÒÌšKR%í¡3ymÚ2™gzhzeÚRW=zdë_€ µ²ãÌ6Aývss÷ ²•ˆY+¹ÚìW"ŠX ,•¤LFÉj³[ýDáß›?îWKQ)X"WœDÚ¡%¡su‘`q–{¡>Y ÷šÖ®ÔáZ&<8LõN»Óñ*g¹’ ¯“ˆqž¯ÖR2©éØTöT<⢂J7Gb‹ƒÛÚ›Þ©Kê2Éâ(þÞàå•’³8U^æP‡2 ¾…" ô@ªwz,êf »Íž˜EÓ1zã€cðì³Þ‘ha}>L­îF§ªèvD˜ãX›ÎqGCPÕ÷>ÈX°HF?ãÄ~êJÔÏPrµŽTÌR ª,O\‚7aÆCÙøVkk9}U=eº¦î\ÆêŽÖÇ['u:ê{²$Ë–pÈ\#2ºæ×p­8·)ûÊÖÃ"®xÊãøüð—º­›¢oNá:Š$Å s$ P=‘Þç>ÑÜ…hP)Ÿ,Z[¡ä.ËŽc1…bj'£DÏU]Vt~EP™)\‹ rGÜhƒŸâä®Þ:•¥éÖ”ïÛ2þÃÔŒ)iF±…µ,M”…¬;3mG"‹­™YŸ.ø°è±‡-$‘Sé– yìJ'Í•Ûõ¶§sÆ ·pŸ3ÁÕ”5fÔýÞzT:kÚâä͵³uk±Šé^z>‡±lWò -ëÐüfØ0ýˆÈùl.ŽRå"è(Ãõ!„ª51!TÔÕ„\¨PØ»æ®öí/J+œÊsUö—â5ÝìèÃ8+‹ã±©K?Q $sæp·ÁDž+ŽñÔ¹w’J'ì^{rª­DGÐQ JX7ûÒÃø ȃ_¦tîùñÎI£|{„÷•ðµóÛ‡* £(Zß§ò„r±f3–x &1nÞ|ØÜüN endstream endobj 280 0 obj << /Type /Page /Contents 281 0 R /Resources 279 0 R /MediaBox [0 0 612 792] /Parent 260 0 R >> endobj 279 0 obj << /Font << /F68 6 0 R /F106 221 0 R /F64 4 0 R /F65 5 0 R /F88 136 0 R /F112 282 0 R /F31 8 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 285 0 obj << /Length 2422 /Filter /FlateDecode >> stream xÚ­YÛnÜH}ÏWømÕ@¬QÝtñ›cgì860ˆ½³XLزºìÖŽZjè’¤çë—,Rj©/^,f_\¬"Uj‘§ÈÃò‡§w?ý§gB‡JÇòìéåL(&°›$”Êœ=-Ï~ ¾¸×,D¸*wíâ÷§;xLŸeaËŸÒa–ʳs)CÇôÌoâ÷ʉ¢à:\œË$ ¾ðxUÿ ÁVKnYC–"x(Êr!x¥1AH¯K¢Éë„’a–eg½êiåhêfKrýBãcWç a‚•m»"§µ_š…6A ßÒý¡E˜¦Ãöð«´ÔÁÕÊnÖ¶Úÿí¶,ߣ÷uµ¬«÷¸¸Â¤¡DŸf†ý(²Ø„¤qh²Æ,Ô*c—IvÙ:ÂÄä“w6ÿ£Å­qÛàžµ×¬}\ÙfSº–Õ¬¾aõÓª^ovOê,2°Éuÿ²&xÙ.b°}!~d£«ºïjU}Ùmg;GºÛü±àtôô7ÿ…ãN¾]/]ÙÂ#ø²ºAAË¢u¶u´ºiê×ÂRÔi¿ÝŠTyiaýkÉÜv£Þ5M}'RªP5ò?²î›Ê–´¥ÇlÒ­øõ_ê-é4àÆâ'ù`üXç…ë¶ø®!Ƽýì]S8üF€¦áœ‚©‰v[§#è‹tGÉð«ßÓCF~L„Ä…ÈÔW)ce¬¼ëË-I2ŠÔ1)Bé=Œ© Æ”¡Ã‡#cŒ&>øÊ5\¸æqÀLcÀÁm±\ºŠL÷0à͇€£ìŽ‚÷6 uÕºnï…# Ô‹sð/‚PBÕsSWùª¨Ë¼ ^ˆã ~†‰klåç&h·Õ²©×Ž´EE«e_½ÒJ‡¦›ÒVi—›ÂU]{VF‡if†álçÛ?¸%„¸rGBœÆa”¥ÓÇY !°Â–â§tYn^B¦ïÇHË·’‰æ@ût!¥ '!”‰ þî¬ûà 8<¸pS˜°M~úÙuß«hòÚØå  WŠ ¯!„2÷©ïr„RYÖx”¿>~°”ÛfYØœ&»`ú$Ró Œ?çíÔC]•ÙÎk„ó$PYĵÂt§|ºÓJ KµŠwÕoA?f‡"åPQ|¶¾²ÁÌh\âbr˜¯ÀÐ/‰”®ÀÎB¹Ø¶j¸ž[à@¬Zó®iIIi 4#`qÕJ¶@h¡AÛ7ß ñ7ücËÁ²_®=ÙÃcñ¡€œÖ5ˆÛ#œ ŠSœî!TË‹”šÆfô&¤#ò¦É€üöfÊÞLØ›ŸÐ›2 ü˜!ßy-ªvQ:ùZ<òxU‚ƒXÿ…Ÿºe݇-xuw¼¶Û#ê ë#ÛOåk À'æ.h|Ã{üŒ{°á½[oXMQ‚µÛñ]~ÃìÃTöÖu«¼îœ·V{Ì@©!-Í|Rƒ‘ò(þW·§¼ýô+ Eõâr>¯0í h~WN,¬½q,%0;š×üËøÄ±Ù Lo$;•„Q"ö ”’ü¹LµÚ!)¤ÂÐ7GRÊHòÔBséG(I¶ë|}Hf ‹ŸØènÈÆ§·ÈW¶ðžbÞ«kgKÀyskçóZ*ˆ5^@8¡ÛR¦÷{:Ô?0úW×ôîo'Q‘“œ×NácÃ./œ(­sš;Ù`ÕS‹b±^÷Ú3^à"¾‹Ù’î[Ñô\C9ÓEƒŒ ‹ÔåfSnÉ,ÀCãœñÀ†3<ìÊ!ó×9}6Üb „…>O9î¸Àô™&’|upR@òŠ’—ÙÕ .žg»,– YLJHcÑ~˦Ítn7}±rUåúüü®î·¶ÿáû8M6¬ªYr딘]Ó÷‰-<4ãl Mèðt–„'PΊĴ3Ý‘˜"ÎOBm‚•XÏ[ªõ–¦+æà(œ 0ƒ±ÑE´+C (xij9ñ[m¤¹à^]kVÂÑÒÒåðiÇá¦hyõ4*NÂX7C؉Â%t˜i½ßþĉòä8ÑbÇ€#¹¯IµqMy@Ê=O’7J' 6ÒBRýýX/`¸·èÃï@­Ú=«a—û¢ZBøü©¤ÚƒVT\Àì—…€sÆÏü¢‚¹ ¦ É÷ÏçÜ@ã^d$4O)5Oø¡ÐÒ™$›£cBP´Æö#¯‘­ãÖ8÷0à ÈóKKâ•¶³$QÂô”eßvðDãaÒÒªçC(øÒ5n|"ó¨(ŒõÑ:D?q¨Cdö—ê˜0Å4"n#Å!S4ix@m„˜V$£1íÊz°ÃŒï@4Ý]ÁxËã]]yÊ­9%ï1?„°6Þ|Lw…–Z#)³ĪÞX#ê¨g¡÷êx…‡M¦ð1ÃÉÿìX½s¢yˉõՈx©eð™ÇËj ™Ï!ò•Vó›#PŽÙ·]0rc\X&2nhÐó–DŸWá•Û¬š#ùáå𾦳eÑmÇW«±çÄè'ã ÚGùorìÇžZÅI´£VéÐòh¼={=.v<ùÎÄŽ%ƒ¼»àóSÊQ x f·lwµòJ…˜u’¨BïâtŠWÚúßÈhÆŽö*xå¹ìБ<6MøXÞ8Waº:åù"TGî–pͳ=¹mC‘8 0¼ªk˜lø gÄpî@‡»ü(:š½4õš¤Mã‹ÛÀY€[AüóÎ>—Ž V'ó·‡RÌå_ÍvúBꇅ™ï£'tÄÆpäó—ä‹eÆ·P‚XœÜ ƒ|p/¬~Ê{6zòÚ³å[XßÝ^’ê lxËa5ЃUÍ»ù Á8¹Tc¾˜u¿¬‘Ìäùü$~ˆ*)é+˜#‰¢ DweTá«qœ¯úXcè -wþj˧$Ÿ:Ѐ»H°¬G%~§_‘Ý_CNë‡ßå¯$ö kú¢hÿÎüµ±›!•M²Ëp¾èþ‹ÎÊãù:z‹`$䎽ÿœü÷+éX†@€ß ãt„¤É!×Q˜(üïP¦) cP÷îãÓ»ÿ*Ë endstream endobj 284 0 obj << /Type /Page /Contents 285 0 R /Resources 283 0 R /MediaBox [0 0 612 792] /Parent 286 0 R >> endobj 283 0 obj << /Font << /F68 6 0 R /F64 4 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 289 0 obj << /Length 2521 /Filter /FlateDecode >> stream xÚ­XÉrÜ8½û+tdEXl ê&[¶dÙr+,M;fÚ} X !YÃÅ’þ¾3‘‹µi1})€ØX|/——xwûæ·™8Êã°»rh¼Ì2½¥ñ¯fÆdôDÿž¥i5í£ŸLó\ÐG§œÅš¥ÐÉcÁT 'óä\ÃÎßÅ9‹>»–G§õÜ´©á4.yôÅOßøö¢¨×“ŽBýê7Æÿeìø€‘ŒÁq]gºÎñƒ -¸ÃÖ?’„`§äÛÖ}ÛOüdøö®2´sn;ƒðbÇÖs ³'ž†ÆƒÞ À3 ?Eï!1‡sRÀml‹¾+o°µÙCŸ–±Ò*ˆHNÒ$K0–A«Öô¤ž<™Þ¡GyzÈÒè¼ýÁ•xókÀSt}ósŸ‹Ñ.Ö.•FW~ú¦\ Ë¢\¬}HæÑ-¹Fºú!çHá“ïM‹Ütô|Èû£®nIÙ,W•éýaÍ]oaIt|"z_o›z ÙÀ-ðû®sînc)ÓqÊu@Ü{R¶KŽàqšm“#Ô‰Ì%r“%r5à9Zxjt F{j¾JE–žŒéÁÈ2úc–²<òsÑ” 2ë'ˆU~ qógþ¬3Cϧ5>Û9²€É¡êíñÇ–]íã ýéÇN´" ž7‚ £×ms˜—‡]‰åZ8R¸® ×0íýžœŸÂô§Þ´6×îJ ><K[;šiàvÆed—¦;ð”‚/§ñÓÕªB—õ á M\˜Œ‚Òãû}l~Â?å³,ÿ‘È$Má7=ISゥa>€ïM$Q1ϲmïÍGïEb¹ÎÀG«; vÆv傆(pBç2þ8ÓIäW~)ǧ 耕KòU®´¢zéfàw Y´*jSQw^ôõ âþUÔl››êºa¹Bü÷!¼ÏR.‘ìfhk—71ÊÞSKé:§KnXÔ! NÓ5Nw]SZâ|OÔ:f)ÛâD'È Ï™#Eg9Ñ*½˜$JX’C6Þ¨,ñ”¼G˜…w©:"caŽbTM_š¢Æ<–åÑW0¢Þ?1îl3tôð„¸/èŒF1:è´ø@¾—ÊŸWMmêÞ"(¸ÅQ “5àT­}~»ë®}Pÿ›_ŽÁ¤ØÔ÷‹S„üWýDÐl'<8gcÂûtzE›¾¹ÿ÷“ô×Ó†$3‘oÇRéœÆÑãÈùè. î’'Bls“zn.0 &¨†¾_gºTQ¨…‰¶)ËÆRðL4åA˜}çÛsÓ=‹¨)!£$C—»°Ë€½nŒ–Xž aà^+ÇiUk»ÇŽºþ…y´tñ˜rÔ¡xz8mqk™ÿÓBƒe'Œë‘g‚'kìUÀ^°˜1¹=óØ;ð@Î]øör(Aá1¯±ýÚâþa\ƒv>75Íî$)[†$}JRÐéVÆ`PÄ>õæ¡¶‡âIÌÇØp;ËYdJ<Q¿’ü¡,‘¹Xæðà*‹9—›¬q~¤‹÷L±]E0½!÷:XT -àâR ÷}ð-ò‡@þy€aâÁOœûÁ›f‰ô–ˆ>è|õ³ßQPÖÂ,À%‹NixY<Û¥í¼ÜÄ‘"OmÁMèÒËжüáцU ?$–ÐûA¬¡RcBîBíXLM­Cø» ±G㣞8È8ƒèžêl‡ò7(‡™ÿIy:M󇣦™œ‘L™J^š;Œ Š–xQÝ™¶GòÀûOiné‘p¡À™ÀÆ Š8Üá2 -$W„NÕÔ/aHªâ*ªñ+P-ï…S'±Jů—–zê\EÒÉ!A%“Ìä 0B”å ߌ²ÈòW!S“ 5¨:¢wCkŠïa J¸tƒjr¡+.†‡…ó\A:Foüì{ßÞ,ì]Ó=Z¬788K퇯+§o¡o±Ì_‚æ ¥Zæ%+¼qá“>Žýbè :€ƒªvµ&´er¸HRÃsåâÞ²?Õ1ðr÷ÑßÊ£÷N|»ÿ¦<::o]A¾Z3àܫκ1æSÉËó<ÊO2æ´BÆYà•©dÌæÇ‚{ݧxSg]åÿ¼ËMl­Ã¾£îñkþ3” j»© ÕÒhÅÄYBâlrþïýÂxmvµ+ØÞ*”í ¬ª¡ã?œ½Õ`üî[ÔƒÀ]¸~Ô±[ãêC³gs¡·5Á¢X-C59ŠŒ‹‚®Q û¥©§µ’WÈ8”7ïoX>½ZËéÒÛ/¶žwëkÖ}€j²j ²#6°™°Î7³2ÈñOæŸ)º BçÙg…ˆEÎ'ß,ÀW†çtä¦ôÀÒzᯠ,ý7øm^ÉÉ8Ùò»_ÑSHð2!è?kh_ P<Ù‰é°ëª¹¦]íÃ3Óq’‰u)Ô–/‚tJcÊÇõâè- (¿î ¯=ö‰LÎRþ¿5Þ-Àg³tç³ÓéÝ‚T®†â2‹.‹òñ€z×:–Lí.Á c|„Sœiá ] @Ëúº§ÙÉp§üÉÐÂ5žô÷CЬ´²Fhq§¿píhÉàïç¡ÛW,»/)—ƒCnΓ< ¿{³¢=²…ûõâl¼)eôöuÈK‚uMˈ¼^òXkïà2ù7nßü “Ï© endstream endobj 288 0 obj << /Type /Page /Contents 289 0 R /Resources 287 0 R /MediaBox [0 0 612 792] /Parent 286 0 R >> endobj 287 0 obj << /Font << /F64 4 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 292 0 obj << /Length 1091 /Filter /FlateDecode >> stream xÚ­VKoÛ8¾çWøH+V$MRÊ-›Ú Š­w{hz`$Z&"‹%§ðþú>äØŽƒ^öb çA¿ofè?ŸîÄ|VáJP1[,g„1,E9\bÊølÑÌ~ ŒþÌr^èßà,§E‰¾­”Ûtzø–D¢kü9îUý2Ø>èºOÚ¯áH9µÖÃêWF ³yRôäõ=+ÁÒuÞ!xY÷’6R}“Æ%ï؃”¨Õ~- tcTÛÛa4u´«ºÞ:Uû“wÙÏÅýŒÌe5Ë ÁOw³Kp®$ª­³½r;¿ò§µÆ¶NmV™10:3¼DinRÖ Ñgi]´l |¥•óÑ©~ØtªÓIÊ5FÕé ®óç,“í5£ÓPo;»QyHº8ÎwŒ ް7º“Å!}%&„BLð]dœ#O¨ÑØ>ÆÑ.ætç!ç’â©àÅ~È¥Õ¥B”4iQ°¤% Øîk†¥š tU]µ[ãœÎ?k×–ú_¯.&X ú'#´BÉù.Ö‹öxüÒ]ê98_E+Tl¡Ìòq·ÑQÙZÛôzr»ÌŸŠ‚ŽQ=êaŒ'%r"‰mRø¨>F³ÖymûÑô[»âå•{ åé³|:È­ƒ <ÆA·¶î†³DÉ )'Ä¿ùŒ|å¦LÚàQ7¦6½>CYɱ,å e”\’² T‘Š7®h⊖óùÄ•˜¸š'®®ðµ'€I¨Æ‘תc]Ûõf› (x„Îï¸ÒQPÃn½mì?X÷[èä 5p7gž3Z íÁYNPÚäy~o oˆbd„õ¶Mþ!až\ý;ø9Ç‚ ¼³Ôžçu£F¥«^u»Á gЯf £Oø[ÃpXàŒ½‘PM #J̉8m¾'/øq:…¦pTܤï4‹aÉ «¨mu¯êÒâ=¾~§ØÞ!Àë…ÓÚ>8™£•iÝÇØÇøø˜6Ç%¯þ÷žB ð¸HOCÅßX('æS@ÿ¤Ä ÀßQ#¼¿0YûÁùèïÃ`Ä{pÒƒ4De¸“©„§JC)Ê¡¯àûllgæV] vè×ç ’Îfl_Ò~^úºº‰›A“B!{D…þ¯ž8í|Wæi:T >?i(3î"x!3ø^«õ³3M«ßƒº¯€£Ê– ÓðÎK £^Á£vÏÆ' ÓåÖ¹Ðß`|¶Û¾¢›^2xž{ÿáÕ'k»0D&àSvÉ=¾%àî[&(ö# Ú]ÔÙ ôúÜh7}›ÂºÖ~> endobj 290 0 obj << /Font << /F64 4 0 R /F70 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 294 0 obj [667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500] endobj 295 0 obj [778 556 500 500 500 389 389] endobj 296 0 obj << /Length 122 /Filter /FlateDecode >> stream xÚ-ɱA…á“($§ñ ç Ì\v³T’µSH¨¢B© $:óÈ@\#Qþß_‡õTQUE&ªMGã…Ö-nÿu8³M [Yð,ÎVº]ï'†v=WéN;SÜ3uzÀ3üãéxîý:côÁEâ†_Ïìœ endstream endobj 198 0 obj << /Type /Font /Subtype /Type3 /Name /F104 /FontMatrix [0.01204 0 0 0.01204 0 0] /FontBBox [ 10 40 28 51 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 96 /LastChar 96 /Widths 297 0 R /Encoding 298 0 R /CharProcs 299 0 R >> endobj 297 0 obj [43.59 ] endobj 298 0 obj << /Type /Encoding /Differences [96/a96] >> endobj 299 0 obj << /a96 296 0 R >> endobj 300 0 obj [600 600 600 600 600 600 600 600 600 600 600 600] endobj 301 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 302 0 obj [575] endobj 303 0 obj [1083.3 458.3 1083.3 736.1 1083.3 736.1 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1361.1 736.1 736.1 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1083.3 1361.1 1361.1 1083.3 1083.3 1361.1 1361.1 736.1 736.1 1361.1 1361.1 1361.1 1083.3 1361.1 1361.1 875 875 1361.1 1361.1 1361.1 1083.3 441 1361.1] endobj 304 0 obj [613.5 666.7 743.8 677.1 549.8 827.6 840.3 849.8 712 666.7 831.1 726 815.2 681.6 791.7 841.7 864.6 930.6 886.4 674.7 855.3 1144.8 726 578.1 918.1 1361.1 1361.1 1361.1 1361.1 458.3 458.3 736.1 736.1 736.1 736.1 736.1 736.1 736.1 736.1 736.1 736.1 736.1 736.1 458.3 458.3 1083.3 736.1 1083.3 736.1 749 1036.1 1037 996 1109.9 1007 867.4 1064 1110.4 626.7 772.9 1138.9 955.6 1284 1075.7 1047.5 875.4 1082.2 1030 856.3 832.3 943.9 827.8 1279.2 1112.9 824.3 943.1 597.2 597.2 597.2 1361.1 1361.1 597.2 774.4 633.3 649.4 739.7 677 684 700.6 827.6 533.6 588.2 758.1 480.3 1228 880.8 702.8 739.7 658.9 671.3 670.1 563.7 846.1 722.2 1009 791.7] endobj 305 0 obj [830.6 1097.2 1027.8 911.1 888.9 980.6 958.3 1027.8 958.3 1027.8 958.3 680.6 680.6 402.8 402.8 645.8 402.8 437.5 680.6 680.6 680.6 680.6 680.6 980.6 611.1 680.6 958.3 1027.8 680.6 1177.8 1316.7 1027.8 402.8 402.8 680.6 1097.2 680.6 1097.2 1027.8 402.8 541.7 541.7 680.6 1027.8 402.8 472.2 402.8 680.6 680.6 680.6 680.6 680.6 680.6 680.6 680.6 680.6 680.6 680.6 402.8 402.8 1027.8 1027.8] endobj 306 0 obj [458.3 458.3 416.7 416.7 472.2 472.2 472.2 472.2 583.3 583.3 472.2 472.2 333.3 555.6 577.8 577.8 597.2 597.2 736.1 736.1 527.8 527.8 583.3 583.3 583.3 583.3 750 750 750 750 1044.4 1044.4 791.7 791.7 583.3 583.3 638.9 638.9 638.9 638.9 805.6 805.6 805.6 805.6 1277.8 1277.8 811.1 811.1 875 875 666.7 666.7 666.7 666.7 666.7 666.7 888.9 888.9 888.9 888.9 888.9 888.9 888.9 666.7 875 875 875 875 611.1 611.1 833.3 1111.1 472.2 555.6 1111.1 1511.1 1111.1 1511.1 1111.1 1511.1 1055.6 944.5 472.2 833.3 833.3 833.3 833.3 833.3 1444.5 1277.8 555.6 1111.1 1111.1 1111.1 1111.1 1111.1 944.5 1277.8 555.6 1000 1444.5 555.6 1000 1444.5 472.2 472.2 527.8 527.8 527.8 527.8 666.7 666.7 1000] endobj 307 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8] endobj 308 0 obj [706.4 938.5 877 781.8 754 843.3 815.5 877 815.5 877 815.5 677.6 646.8 646.8 970.2 970.2 323.4 354.2 569.5 569.5 569.5 569.5 569.5 843.3 507.9 569.5 815.5 877 569.5 1013.9 1136.9 877 323.4 323.4 569.5 938.5 569.5 938.5 877 323.4 446.4 446.4 569.5 877 323.4 384.9 323.4 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 323.4 323.4 323.4 877 538.7 538.7 877 843.3 798.6 815.5 860.1 767.9 737.1 883.9 843.3 412.7 583.3 874 706.4 1027.8 843.3 877 767.9 877 829.4 631 815.5 843.3 843.3 1150.8 843.3 843.3 692.5 323.4 569.5 323.4 569.5 323.4 323.4 569.5 631 507.9 631 507.9 354.2 569.5 631 323.4 354.2 600.2 323.4 938.5 631 569.5 631 600.2 446.4 452.6 446.4 631 600.2 815.5 600.2] endobj 309 0 obj [892.9 339.3 892.9 585.3 892.9 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 585.3 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 1138.9 892.9 892.9 1138.9 1138.9 585.3 585.3 1138.9 1138.9 1138.9 892.9 1138.9 1138.9 708.3 708.3 1138.9 1138.9 1138.9 892.9 329.4 1138.9 769.8 769.8 1015.9 1015.9 0 0 646.8 646.8 769.8 585.3 831.4 831.4 892.9 892.9 708.3 917.6 753.4 620.2 889.5 616.1 818.4 688.5 978.7 646.5 782.2 871.7 791.7 1342.7 935.6 905.8 809.2 935.9 981 702.2 647.8 717.8 719.9 1135.1 818.9 764.4 823.1 769.8 769.8 769.8 769.8 769.8 708.3 708.3 523.8 523.8 523.8 523.8 585.3 585.3 462.3 462.3 339.3 585.3 585.3 708.3 585.3 339.3 938.5] endobj 310 0 obj [519.3 476.1 519.8 588.6 544.1 422.8 668.8 677.6 694.6 572.8 519.8 668 592.7 662 526.8 632.9 686.9 713.8 756 719.7 539.7 689.9 950 592.7 439.2 751.4 1138.9 1138.9 1138.9 1138.9 339.3 339.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 339.3 339.3 892.9 585.3 892.9 585.3 610.1 859.1 863.2 819.4 934.1 838.7 724.5 889.4 935.6 506.3 632 959.9 783.7 1089.4 904.9 868.9 727.3 899.7 860.6 701.5 674.8 778.2 674.6 1074.4 936.9 671.5 778.4 462.3 462.3 462.3 1138.9 1138.9 478.2 619.7 502.4 510.5 594.7 542 557.1 557.3 668.8 404.2 472.7 607.3 361.3 1013.7 706.2 563.9 588.9 523.6 530.4 539.2 431.6 675.4 571.4 826.4 647.8] endobj 311 0 obj [500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8] endobj 312 0 obj [639.7 565.6 517.7 444.4 405.9 437.5 496.5 469.4 353.9 576.2 583.3 602.6 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.8 361.1 572.5 484.7 715.9 571.5 490.3 465.1] endobj 313 0 obj [500 500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389] endobj 314 0 obj [556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444] endobj 315 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 0 0 0 0 0 0 600 600] endobj 316 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760 276 500 564 333 760 333 400 564 300 300 333 500 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500] endobj 317 0 obj << /Length1 1371 /Length2 5949 /Length3 0 /Length 6883 /Filter /FlateDecode >> stream xÚt4œ]×6ÒFïA7Bt£÷Þkt¢Øaf´¨‰ÑkD a½Dˆ=º z-H!z¾Iž<ïû>ïÿ¯õ}kֺ眽¯½÷Ùg_×á`50æWrB:@Õ‘ ¿XPÑS¶`°ˆ,LÄÁaÃÀ¡Û‰8Ì (4 ‰þ„ Áàlª ¨‡DÚÞp@H—’ƒa0Xêo % ¨B|`N€ž D@ÑD*HOÌŃ«ó÷àr䄤¤$ø~‡JPÌ‚ô W¨®¢##aPŒÿ?Rpɺb0žÒ‚‚¾¾¾´å"ÏÍøÂ0®€ Eù@€_-úèŸÖˆ8Wú/‡1Òã AAœs„"иo„àªÆZºÀO(â/°î_>àÏåBBÿJ÷'úW"âw0ÄÑéá AøÃ.€3 î¨ë `ü0|áô £‘¸xˆ‡8à¿Ô• ®Ã?ý¡Q0O Z ƒÿêQðWÜ5«!œTPMôë|ª0Ôwïþ‚†ëŽ@ú"þÞ9ÃNοÚpòö4EÀ¼¼¡Zª08Ñ¿m.P ƒ%Ä%¨õstüUÀÄßúÛ)ôËŒë!(Àé 8ãÚ€Áœ¡¸?¢4Ä `PÞР€ÿtüsG$$8Á1€Ô† úwvœêü×7̰ãè'€ýþµ²Á1Ì ‰€ûÿþ{Ä‚¦JwôTxÿ´ü/§²2Òàø…ÅÀ€¸( [ý3öçÿ«…pFRwOÙç¸þ„øg.}$޹P€ëßD·‹q¡ÿ3݇üÿXþ+ËÿJôÿ>‘º7þÛÏõàÿñC<`pÿ?s½18è!qZ@ü7Ôú—t•‘p§ÿöia 8-(!\àÿºFZæu2€a]ÿ¢Ë_vÓ_BƒÃP$öëiø…ÀàÿòáÔåèŽ{>Ð8NþvAqâùgI5„#Òé—Ê„q† P"Üq;1 @'G'¨ßo‚$àš œ‘(¢_•qÔ/#Ñ?;z£P8yý=®êßûßZ†Bý ŽDSHG™‡nU›Ž*”}ù×åÆ8ÖÌÓ¹ù¦Po½OÈ®¥r—?°€:TJím§˜]Qã:Pœf9Øn¨¹ñ&Ù°ñ4ðÌ.Ñhd­‘èãðõ®¡üm¥êNfB&~ÅõÀs¯@³ûî—ð[´9r¼¼%É ò¨|;4üª;‹gúM¬®—‹ëŸòÇšÆXß/üÀ‘ë9NÏvÃÏ â¡Ú÷#ÿpp8F•=ô“E;‘—(h'V¤ ÀrQ8îxüÞ\©‰0º•áƒ%=ó¥ªþÎå'Út“E/cä&³$Ç÷L?ìH×1c` 6 G=ÄòË= Õm¡¾Õšíëø 7sÒ8o³TƒÂ9Š4œ“ËØ{‹ì2™`!ÇçìÌÆIøN¼oÛn¶îìš¶ð&ÅÓK Å~ô¸y(G½Üœ,~v|U°2¢¡{%Õož}ZÿÎõÑãÜ 5£^tlM~€UçÏ\—?øÝ.¹E¾ÄxXÏKwûIÒ ž:Ôl$ï}>/hIpíµª­ 9  ¦°k–Š\Æ_ˆ$×I|yȧ%L§Lö¹$S²G;}\ÞÎ~–Ýme®O=>¿b©b ¹ŸˆR&ûCM;¯êô© ã∀~ð66Ôl¬Â ¤«Ík7r«Y&Â\ÜõÑ™Êcy µöeèîzÅÉš%i)M„ߨ:–‚4]³›¿Í¹¥®Z/¥ÁnÖXp¬èãÕ‹y- Æx¯¤Å2öL&K¿’䎋 ä Û>h„«©4-Ñ<¡ ÏV’õ"“³ó¤×W†gd-.FÜB¬®Nªl¾z"n|“õ¢“ _˜§v‡ñê‡{ÆIi‹„7÷¿ÂMKn\{ýP+ﻂ•o Áå~GBNËOö… #Øìæù ´“&TýeÚíë¯yÐ뤣Ã÷Mœ¤>(Có£)„O[ÅõCo=q©jÝ~Ì•¡ÇY%QCÙ@ùc¹pzÙÅ(–ªWøZŒ­úOs9y óÎô–lEÌ`ªj\L5_£î7g7ޔľæ·-ïñ·³{3ÙüÀí?\Ù/•,x[)N-mL±M„õ:i%ªñòn-ë6ë>m¿-–p/É]­í.<¯üeS„?T›øSu÷JBêµ—r,X•뵪¤nˆr-6‹F’YÕºÀ#ΦÜÈwîò°Ì¦ö© <j¿Š˜m‡ïvÆ—F*“z¾Œ=³tæ½ÖÔ³5%GÒFR›c$y]²Žpl×ÞPÝÍ{Æ*šõN—*uc‹Ä/g>éÇt¶²XÌÚ [äôÀ]>\ê{ëžds—{â2jêàŠäí½7ò ‹šÙ9öøqךBnwÔqS¢ˆÞ,ׯUgkôN”ä]² ~¦ò)(ÚTà2©Z´Jã’Hö•  W(âIGá²ub)ëñ}•3+¿þ¿2D»Š{-» ìÅwØ‘ù¤àØO˜‚ŽýtoVnÅÔ9ãÏ M™Á–Ä*òÒdÅü·1òšå¡¥mÛ§Ç{Ø„T¿PÆ ĵœSZ¬E~éçNÒw$Ÿ0nÄ ‘N½9ÿå{/®ó-)Xî×+®ŸÑ(Ãä¿­oìíÌøDš©[+¹ºW"ÓëÊ®,R<—¼Ìr• ãòÞÏÕ–.æÇúZ7 } ¥D î5þ|,:ùÃã>9€äfVÍÜZp°éžÊºöSvoÀ”Ëeíàãñ.À6Îr}È„6&³«[*Ãò ù€¥šÅŒ·wè­†#“í¬âÌ1ïe{ÂebIjÙÖ˜^y̵—e?ã.;ÄÒk•iêÍǨ\ Ée]|—Q"i„ƒ6aä‰î›¯ø)ݨOnb¶R—Šõ̪µÉ?½’€Ò.~M@Tqì, UPßíJõîÁL„<¹9s9’N´ëuôЬ›9FÙZ&W©èèŠÍÙ‹WnV0:Ó÷úúûjÒäl=2 ¾. oé‡\è}a¾’N‚×J¹‹ž™lø¸Hn7ÒÔq:8.¯>Ý‘å“dÑëFž}Ayƒ é¤,Sœ–#Ë1ô{~wpmqZÔû;ëWH/A F'F܆L =ý:ÖÛÕ‰½IѶ06úÍ­pÿß¾”Ú°`B•ý‚¤àe£®$û&>Æs7¶0Þ©žR÷XRC1ºÇÏû´ÂŠÝÞŸ©=úâ`½K^NžÃû¨Z¾ÖwsÎç´z)ð€èV2âZa†v9ä‰Wãйl"Œ•"S*y·h){ìÃ[Üwµ\Weµ1u·ˆyF’ žæ Ó±´€ŸÊèTW6çƒÓ¢Ô )k­µ‘(–̾“>:mF’ÌÖ%éõUúØ> é׳¯7(Ûžì0‹ÅZ‘Ø Îœ¼- ¸&e_&¹HK½Ü1­N¥Ê©û ?ÐnüB ·4'ɲµh¼–&#aÊÑï.siE—DYÙ~ãžD¨Ö¾F^j©iDÚ5À¦ž±õÙ‚¢""pÖhÏ;xÍҵĽÅGÔìÚX~>í&•Žù›ÁLÉ/E)!í"Ôqø§”ãwÏl?&òÖŸâ Jg"Oø–h+¡…ä>d”Ã÷ +T`*¹ÜÿÜò’h)°»[»§O1 ï'3OÖKTùÜQ0Gsc¨„÷f\?‡²Çf¿Ä0Éõ,ã§Â{çx¾tª¥t#½nÊ´DŽ7 ®Sƽß²*"Ñ¥˜Ø¥@¾nc¬7!ù: Âæª?N©’—k¢øòQr¿.êVBV¶ÓZ4';˜ey”‚ñ¶ª3è?U3ífe¢ï|oÍ2Ÿ€¦öUûùí¨´|jGüM‰ùd,ñ#jCIBÒÏÕ²$~pÎûŒ…Dß_Qì+».Ë-ª×ä-° [7Øð­†ŒU*¢ \EdpõOÆâY~\w=f”Г;~>*A‡îFÔÞx0LQ7Rì+,:O1Þê$è°«lÅ]~|ÍE´0Wdã|NƒOÐS?¬ƒ<•yJæU&y?M?†Þsc‹d‹æ¸=ÈWï)-¥ ^aÁPiè °€6mÅÕr%NQ6:ôÁáÅ=ÿ øîŸçlUÀÌþN.õÐJX뜩r4c4%œçHÄš¹òé^ò¢4ƒ,e彃™‡êÇ,„9ÈöýÎ0 lÖꆆ.¹ŸÉ´ÄWYµ™½å‹V¯ÇæÁ*5yÇw¾É}‚®8qœ¬ƒå¾”Y n‰¯¯¿µúÅv GžïîsfõÓÙ”|ü§Ùø)ïèÞи5óqâí^7å4.-“oe0Æ”¤¿pi¶^yÝ~•±=7r™×UR ‚†µ·°F!ñ§hÐÞÎþÞï¹é{N*ý¹2‡Û75:š+^„æwuZ²+Õ$Ñçb«÷F) ^j òä-FºÅ„.Bu>*Þ œR5•=ö]Ð@¿úªípªXç`õþfÇùlW=wÐØ¥2íM=¶Ñ[b'’_ìš]JTÐÂ*µ|:™ÙäãY  ÁÆÁ!îœõÔHÑy’²Y!vüvä›’' õt´Z,Ž™?>?®^l‚ _¬ÚtŠžÓöŠ3¥p»1ßy9 ¡: ¤¶HÿóXÛœ’QN)ê…´Ç OÝ%y-²²¾ËErî )ƒ—f.ÜK ™Ü¯‡ˆ¾P¿Øy„â±8÷Qç¥[aÆ7GO›à IÙVÅ•„¶t‘ºn k™8Rñ¥$ô÷oÝ N°mo‹"÷Ð}§«¿"õÃÿñvuã™ä¾:ÄbzÆ­* 007!Õ”Yî,jt(\¼7bÑÐÐO òe¿IngtdÙïÍíµ´œP’€D\WŒwž}2 ]¤TíëLò»Ê- Ûé%sL¤µ¯%ÚÈ~@vô;GO8?“ózþ¶žF»£¤T•Õr¦y\G•±wÔ±íÇךlž}w½@æ˰æf©ˆæõÈn¼p¬vüAû%‰£¤Tö÷7ãx_;š.•0›˜,áseq³Ô©éØ:ÍpÔ´²}½0ŽÐé,Îæ ”ðŠð×8gøøì$ëÖ¢ÙãýÜæpQq/ak­G!‹i1ofñZvòÙ"!"ÜD9ÄøúÚÕ,—?, I`×&tjîñ¨ÉÐ/÷ ÐSÚ#9Ð7©{89®Óù·ÑE[˜§é™MU©`ŽYÞgº´l`9ùz¬?Nì}[”µìØ ©±È£}¥ ž„Ú}·¤aw1šs6ᱟÌ|XÙ¸£gå›Ê|²gtúAu¼)ˆ?ÿǪÁ7gîÛ;>g¢QC%mjÚf!ƒVR-2‘;¨2k,tg`G¦ÆÏvt7lV?,½?c³4ÑMÂüåû³êѤ«c×R&ûª{»ß(›ip…,ÂVé¬Vµ Í•d_o¬<“«?T(§ÞtÁ£Œ¹EjҧݦʽÖGëŠLá n&ê²|óŽâßp±ó9! Ò]G¨•¿îÊ Öâ®Ña±ø2èû–ŠO×ðÇUÀ¶tÌ 4E€ñб˚T¨”­”ÞvOD¼—:p®ješõü^‰¦¥¶•ÔJ?õçqLÙë(š–(Ý2Hda4Vn=)Žçæ>:„ =3¯ü,,ºØ ´áÑÄq­‡³”ãKÄEÚŽËÒ½¼Æ7[¯rižÂ…Ël;=hδò™e›çîß>·×èîùïÌÛ]¸½O7š¬“Ý[¾ö7ŒƒP‚õ%mtÏ\®µÍú3¯Ìë¼à£MhGÒˆk’²ëd“ÓYq’L–Ò¯wì$Éa¸òUFö™S ÅåwU Ë]JS·7y™$ýý ·½û(÷R†,î]dylN‰øM~ Óa}…öŽNrŠ®ž’CÑ«TZ(|ƒ7…¥ö›…˜;ùÏ͈i“'Tl¸Ïnƒ·GŽˆß4ºÏé4¬Ær¿¦½z3tò¤øÆãÔZøk‡%ô>cÅEþ¶´V@='`ìy1þ¤ ?/=±ìî¼Ká%y)ìá€b5àÌ&ýb’ÖwAÆ2-CÞ l**è>Up‰k¿¬Ÿèõh+í²(^•$wG¼IÁa§#^+Õ\Qº‘qÃN߀ô¶»è‹o4³Æ 'AS2"²Of¶úje·ÒcS[‚Áèx¤çwŠšŸÎlbŠJÑ„yë_¼h¶ðm˜›Í'xÌîÄßÔ{…™žà3Þw±ÙÙÔæ€Ã£Ê¶ø5ú,ÆîUoðj&rí’P6j‰3 ¯™çq. …„ã6µzˆ?Ó@>\ªU‚5ß§uJ(C6£'–÷¦Œ^ÉÌhÝ¡Ý ²äÊý@Çh@-ÒŠ/ïüxd_üÝÃ÷ÔÿÒÇҪśä ]0È ¹¤=ù¹Èø>µ·È º:g¦¢¬|«ûéÔo@m‡-eà²î[±\m¶›%ÒPø1·Ìx z#3¦Æ»®Nr“”\dÑóÉ™$¥ª_rW3çѹ•ˆÉ÷%ôÕÌ„ õPqÛk™O»I§uä*2´)6ªª•Þà9‚k/HÆó Ϭäî…^ôäò記z%¹çà¥Ä ø†~ü ‹GàEk?êpÇô8f­ÓhõàõD²2È9n8—ÚìĶ*®Çwƒ]•yô#Mg*boó›D8IÉ'Þürÿ_~ù½0ø…È*mo·S>îpˆO/ÐVä“a2¾4Liï ™¬Á¿Ú_÷(Éûa¡Í‘.)˜ÕNã…mšQ¨S³fè…\¥ ³ùeÌM*£ÖkÏ ñ—Í.ôí.SŸÖ³½a0ª=☻QZkÖ`–®Þ™Z~À&\Ït뺵ønµe8ÄR}Þ“eYûÚ¸€«é¶?O^ö€Qއÿå5µÐEøÕNvü¯ŸrçT(‡V¬azkXû®E•'?5ñ‚£Ê×ÒºCu”Ó’-ãò¿\Ÿ§ù¹WBÕÒãëe3ýVQl×,¦.´€HMF24¤û97ok‘)VßN/â³=‹:óø­Gu9w;:†ùí<öÆh¦7˜H&aîcÛ7J­´l)02Ý%e]¬·,kjëôð\··Ò°±4˜h`ú?eC?Œ endstream endobj 318 0 obj << /Type /FontDescriptor /FontName /UAGOMC+CMBX10 /Flags 4 /FontBBox [-56 -250 1164 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 114 /XHeight 444 /CharSet (/one) /FontFile 317 0 R >> endobj 319 0 obj << /Length1 1907 /Length2 8985 /Length3 0 /Length 10111 /Filter /FlateDecode >> stream xÚuTÚ.Ý]HIwJww×0 0Ä 1tw‡H)- H‡€ ‚‚€t#---õðœsÏñÜûÖzoÍZÌìïû{ÿ†‘NK—CÚf V€Aá<œÜ¢Yuy#n77'77/#£îþŽÅhvs‡À ¢¿YȺðL0T‡A*N> ((77€—›[ä?†07Q€ÐbPç¨À `w,FY˜‹ÄÎþç??, Vˆˆûîig°„Ôp{°óCFÐ   AÀpŸ…`·‡Ã]D¹¸¼¼¼8Îîœ07; Vv€nлƒÝ<Á6€_-4€Îà¿ZãÄbèÙCÜÿ$ta¶p/ ð8A@`¨ûƒ‹ÔìxÈÐUVhº€¡«ýiÀøk8Nž¿Ãýåý+ú‡3‚9»¡>¨Àâh*¨q½áì Ôæ—!ÐÉöàôBœ€Ö”(Hk€þÕŸ;È âwçt‡8ýê‘ëW˜‡1ËCmdaÎÎ`(ÜëW}r70èaî>\]®#æõûÏɵ±ýÕ†‡ —>âêV–ûËæÂú³ÃÜ"¼B‚‚°+ì ²çú•@ÏÇüÉó ~è!ÀÏæ°}h±?|aù¹=Á¸›8Àïwâß',€ Xƒí P¬¢?À`Û?Ï÷ïñ˜r?ÈÀýëó÷/ó…ÙÀ N>ÿ˜ÿqÅ\ÆJ*ÊFFlµü7)#óøqðò8xE¹<üü!!^@À¿i!ò›³2Ôù³Þ‡Aý§fÏ¿DÀò׆°þKö ]0€å¥›q pƒþðüëý—ÿ›ÌEù*ý¿+RðprúƒgùÓàx 3ÄÉç/‹ézÀÖ@ö° Ðÿ65ÿ¹»ê`ˆ‡ó³ÊpàÃ:HCíœþ$Ä]â ¶Ñ‚ÀAö*æO\ÿ×®9A `-˜;ä×ëààáæþ/îaÁ@Ž/ˆûƒ,ÿ Àûóï”òPÌæ×¢ñ €nn@¬‡k~8 üx6Òìý‡\œPüÁðÐ^Àæ†õëNy\Ön@øÁìøþ rÛ­!v㼂ÿ&þaþåÿPÜ?¸óÓø·Ãï¡à.ã"Áèæ÷Ü"‘$ ¶s:Ù@Ü]œ€>ÿÔËû{ÿ“þÁÇåáƒþw#<Âÿ&þaùg~kDð7ü·Qñÿé·>xþ‚ÿ§‘ÿb~Ë-ð/ê·äB¿¿gÿW°ßÓó<ŒÄ hók¥~Ï.üP®»‡³óÿÎþgŒÜ¿‘Ïñ_jy¸=dƒÿñ"Ó¾âˆWBñ|}9d¢Læ2ë˜*`B좑;Ïën¢oÑHB*Êx š\¨Ž&¬²HoC^ø–¿|*Tläáéõª7¾d6òÒŽi*®Bÿ怄M®ÒPº¸oey¢žfŸz}`R+Ç[¬ÑÜ-‡Pªhý>1°@=­j%x#Ðö§ ø®ðÌ•Ÿgª‚úéëË ËoMôY[¨)ß½^yV|˜ˆº#åiؽëÝUF@ÀqV1r¤ÄtDI$™Üéà!•ËMˆ^"ï7ýdsqZ³`Ù?#÷ ]7¼Õ4Z À,%s 6~G›'ó*˜^•z ÊxˬL:¶Ÿú³ƒèµOSHmë’•‡r!¡tÚºlý š¾‘ÄÀxCΪ¦U]ÅKýÞºÄrÜ<jÀ>ñó‚˜*¬ÍÁt‚T©n¢Þ B=ÅÁZ¸xX3h&~f"³ñŠår²Zl›ÍÑÒ`ª…©XÄÚ|ù Åë0aÅWg¬}“yˆÖAZÏLmêô“²ï…RÄÛŸ'¯Ÿ¸¡â¼{<ËÉUëí0,Ì—E€~6°*æ+A¹Ù†/r¡1–íÉ1÷óp…õFO¯Pî)õeµ€¼FWªšo¥óÖÞÓçÔxmÉUL;¢#»ÏœÌ'iö^ŽÁD›šÞE}/’W ™/Ù7M’¶Hÿr{Ž=`šÁ…¿!¯3,öñXg'A,¾_¥ïm½êcIYºa 1;{ÖöIE`ó!¦Tû-íb§x¨Ô£Í£ÈbZñ9Ä脬Çþl‘¬“ZýŸ¢Hx™ÞÖÚФ»:ƒn–Ö”ñìë·{6ÎÁÊ×Ѻõ(Ô¹³8á´Ðõ­Ïþ~Å Úh[Ï~îªëî]sOÍ(ÉãÅ8¢/1C ÊÜf" ^ƒ×=ZUÈ.I'w¨-VßÛ •{(,뼟4P)}m‹_ÿ¨Ž—nzn*ù<èjè> #è«Æ“Î_%oÐüBë6󮆛 õ`m’uB¾c‘eùÜÛ±5Œš;²¼Go)‡Ww™;¥¢)xúIWùüðŽÔU“ƒ-ϯ-g{‹zÒÈÖˆC±ÃÜ&¥2~ëE¸6Smh¼*çéUë×!¯1#ªBñ«(™ÓIÉc3ºôÄ>ÖlïU²™ò'Ëœ$ÏñAÉkÉdWÂî]Iï°Z1™6­Fœ݆˜0¶ÔÜòKÑà/Lß9’X丹›ŽJle©ÑILCòªÒ¼)♟yGv)ýx‹ ÄrÇ+‰%"½­ðŠºJH(¬×,j 6ø^ÉšP‰T[!ÿú“1%ÂoÒg1Iâ†^«j†Çtá®ç0ß:åÎ]5çÛàLÿ‘™ ‚3Y¦Ëö=É]ËQ6—›Éì//c~þ|äð\N1J­WûÉx° âã²ÉðtAñû­Ëš@ô#z¹»É\’2Ø ›ðIUȪĂqN[(¥Q6[Õ—Ñï5•çãí1í]¢¶ÊÕ»öð BYˆJáhÞñ½Û§ R¶2+%ÐóuOúl¶QdºM»µDdj'r1FÇí‘f\†ÐøWž{ô˜¡ïçÕßv£H§NEjøE|dlI3O —»®³Û”PÞm­ß,ìß°k¤Ë.Õ…lÏôdÂlGìÅ:‘{ˆÂøò}Ò©õ_O™óPɺÄP÷˜_¬ÄØ–K­f½ôœùV{gr[퀭!SgVLrÄéórfÈ×s)àÿñ =±ØãiãóòD«|:ϱßM]­Ix ßÿ¡"Ü@—ݳZp¡ïçÐù‰ÿ#ɬĨø·}V½ ÙŽ­ô GúÂç|´$k°:©§:úÓì‰S‚Ñëâø»ù1¬â½åúza¢òSðy?õpAѨŒÈªWæ^[K¹gY²Òe¹iÌæÏ®¯Uù£QO©ä¥{žÕŽˆ~Rלö³ 𮽱f_¤vÎ>mŽ%OÉ0‰­1*úÐæ_mE3ôE’„,îy¬°ýÚkfÄ—µ”š6†fŠkc YÓ³V¹°KÊ'èm\¨À¼…aôqzìãÕ ¢w`¤Â!æ§BßAq„3X"'Üz@ƶ…òH»q%0w¨ûu ãx…N´¿Ž Dõ©ãQà.5^¹Ÿå8“õl®­›8ÕºRè“Ç@[ä½?ëæ°bÑ r;DXØ ´‰ï›OÝF wƒÉZ[ ¹)PoÅ‚k®së%•45ù­ ìo"Û?ÎëWÎX`p‚¼;Üö©ñhãɽñ²ø;8EV,ÄØ“¿ÿ…7Oü¶>=<0ÿ*4x8&Iy=b ÷íÊ4i|ü†9õyM;²ÂÉ…hRÁLÊ”“1®Bº’nÐ)„êãsÊØN Ñ4EãµÓÛð–Šõˆ¾û1~†&º<¦ë½˜Fô¥„ázsC¤ ?Em:Þ×Ò›ÕsC§÷«‡ª=ÕPô°ßP¥u˜®'Søp!ì,œ|7p‚úš€¾ Ðm¿Ô#ki®×hÀÄO)KœÄ6py™¼;â|rÊ±Ž¹ú)?-*áñú#ù¨wñ•"É“dµÚÜk‰4Dì\¯éSk F¬[qŠòˆlu(„s†„) â%IõÔÍÄô-»6Ô2‚úö°Ìa³vÔ¯{ÝоŒ?-ò¿ìhuÀ|e—Š"–acñ±]!>°7‘CÀA8² iNoá>¢ßßü€ãQ˜cÃþÜ]k®Ô–Õî@**IQSÕ÷, +x}³³S÷µÅQêÙx ;­Î¤mò^ã|·YVÕ}±†Þó­~Æ'1ÑCSíc¯"3TŽ6í‘W^iCæ[/â)ŠoBT” {ý )g…cЀò‹ª¿øÔ·Gëó2ß[®LvÍ:dHiÊ#ìCsÜ#ñ)ä óÃIm,ˆû¼Êºc‘f! M΀×bèg¼8äô’}̭߱,kÉÞšÈÑ…µhÍvFN½2³YC¨ÂDEò dÙ„ë MP%HDƳ­åª —ª|±ð‘â¹ÚÆ£ì²Øûé×QÞŒ‚ë(œË÷Ù¸lÖ3©c'¨é•„(%»p² BÏÓy±6°4ß9Y³( +þ\®Ýç¯áìÃëâa Ô™—Š×Ö¥XKù},’¦EäÔÆ´•ˆ‡už«öfp-nu¤öôk*U¥W‹¢PNGD6°Þ aw 6àS¯wŽZèxR»½Û‘D}÷HãrÊ`\ylÖ—§á·EŽ–ôÎÈäýr`Åæe®j-ª~ Iã}Qåpn†sçøùte”VfzîCìYûœS9G·•-y@„€ÔaDÿš [tà [ÔÖOŽÎÚµ¶4=îŠÇê#Ö£¬ßuŒyW{%ª|xmbž¡¼¡ø ŸvŒRÞß¹ùÑŒ )õTü©dÃú&ÝYR2çžOž¹–}â#©Ñò1âÏ®Á=‡›nÆÄvu5ê‰ït¾qÅá}ïÂ:µ4œYÿоëæÁ,½ìâ&fûDieŒ.á 0üa¤Ø*hs}ÑnB‚ÛqLVŽÆÍÞ ŽºÇM=;þ™­×|ùzpÿÐ2*¢ÛÁ"ŽcsŒÙZõ!Õ4)Õ\¿›ÔOL- *InçóSp®– ”$sYâfq¬ŒÊå1Ãêè¨4×µ™ã†jÕFÎ¥2qÞÎpÒé{þÄë8<Ó6R,çºY«úf9…)×CdçeØ5kDN\tÐPG¸ªfÝÆÉ×z|Z¿Ceœó6/ŸŽC©ªìêEÆ9zÔ¶ÜoÌÔñ‰ÌÃ7™LèqzžØ~nrö%À£ûÄåv£ÿiòÍ?kŸ½fSŠ:ººMï0AófJÐÝÎ.ÿÙ;.£ë˜&w` 97ýŠtùnEÃÀØíåjcŠS"²Œ~l¾[žpÎØbñV ›Hœ}\Ÿäwýln:ÝÏpZ‰1ÊV|„fBGk;ÚD‹(`"Qif~á•G÷­öŒž"gÌp2ôE}’âwÅÚ}iLa?î]ú&Šç'Ø… ã6v3Ïwš¿(ä…d¾èäÐ.’7l•“¯ópÏeàÔC“ã!Ðá_Œ­¨½~²Àæöt§Ò05(7ë5x©Jߺ#ÛÌ\¾ÔÓÝ¿GRÍVW”¨YU4qPHˆ‰õNfŽñåY½"µ ëù)ì…ŽÉ™CydLŸ]èŠaˆèé’õ¿0§VÙZGzÄ_àwè‹íy.›šù1*5$n«·’rB‘¼³ÁE A aøA‚¹,E$U§´þ!_Ë}\Ù•…4Ž®/YmXµ6.úÚ¶u¡Vä<”qÆI4`åMñƒm†8ô¯«‰(ŠÃZ훸¡:y[j™X¿puÿél÷=&×3˜kiK¢ª6€RÅç’‚ðzvrFÎLÒó,^žái–¡N[¾òŠ–¶ð.yðéÚ-²ÄÄJg’ŸÜÚ³›°Èr´ñj¨}ŒS˪Î{xŒ™÷$’{sjaÄóÚˉÓçôr44hŸúj‘º®Ê8#Ã7kŠþÓm˜Â²£ÎðËÆÉ‘ öÊWVŽ«Œq™ÊÖÀ¨ÙÎ\”¹ Å*î°(|A²©fÏønâÏë.C#'2Í$¼*ó.¿R‡d¬ÎZÛŒ´hËÿÔïÏL4³XÙÊn­v•0±Zp_eÑD ÙØc|Dê˜*77˜çy79¾—ÍûšpTŽeÄ䇋®ˆeHeiÀÝóÍÏS½D©žJØî",ã3¡‹£–8MT+‰[6œâ)”ˆU…z½æ^ZuÔoSK§×¤.„î /¨‚B>ÈÅÖjpÄÝft-Pð^¢¼ÅZ˜²[Õ'#ÅôfFŠ™í5v—ofQN å7Ç=ó áøÁ¼#§@`gý̉âãµ&Õ&¦×¯X’¸êþ# ¬Ñ@¼oLIÆJW\T4åtw±wý _öÊÖºOðë‚Li‡ûX±•¾È$q I3Y'úɸwrî .,Fõtû)å,ùð´N”T~éZàœºrIno¼G<ÿÂõ¢·;“—bÉÁ#{,Ûµ×£ ç90ÒÐ zÐ$8h@4òý“lûP€!¼|ã®$AÈùô|Ö__.véeÈ›ñ@H {ùéACVŒ0Ð|Í*°IÔñÉQNÔŸäV6x”Y(P`ÄË•õ™ÜT2S“õÜRÞNtŒ<ãônß‹…™“?ÁÓ€æÉN9û3«1o©±ºÆ1#l ·m-‚s(´?Ì¢"<"opð+ó‘çÚe \Ì#„E^«’!¥ó¬äŸ7¿Œz— W^8}ÂF0ÝsHv(‰ðVµ_¶ [ÑÞák#0æ~|U°n53úa Ï@’SW{ïø¨‘6Š¡t3µFôJÜ.ò»Êä·Jr·Ë¤±qsû‹¹Õeø²»ß̪ä_°p‰/ ‘c£¬ ÷²ž–»mf(jIˆ¿UíNý0c…‚ç©ÄÓ9Å`%£q¦~÷÷Ïɽ>>=¾Ì(Héþ´.öøûº;Keƒ–Ìl;À¦ gŒUIúЃÙCî1†pŽ·Ä)zs|š=†{Ï^Ûp§q¯–/êßà~N{úòNë{–gêÓbGs s¹kÁÍÉ ïM¾¿yƦÑjù“ÒˆÁ}gþ½Cÿ×Òêæ’T­Â0 oÓWçØ‡£o¡§A„ZÓs<Ô †è£žÅYÒÂK‚6¾/Þç¨íì´nr¼Ø9sÚ’ì> •GÄß*ˆÎv ñߊzË\H©472Í-¨âÙçÆk©«,/ZÀó¥©çš—4ø-=÷ ¾Ov&5ÃxRt, F(K_úµ47Ïù¢ï5³% ôµC™#è‡3KíRÕƒt½¬³+õ1EY„ë"@¨!¸ØyîKbÁ&<ÍÙUüë=U NécIàW¶e'= <ÒÖyâ„©Þáck‹”1n:a!½kô©¯v…äò²õ"A¾Û žzªÑΛ”Éáëï/rÝË-¥¼t¤4yìð ŠÌ íõé)WòTKcý¯‡Èö®Á¦+$f¨rT*â÷+ Ì‚²:!0f——©½µ´ÞäqQžÄ­‘Ä¥I)P¼ÚvK(ë®V¸Þc‰oo•&Vž¬§´£]Ù†D^‰w- UçíŒHN‰Ì}(º{ʺÇ9‹ÃÞüí[„² Žs"RÞÒß&ñ.¤—eÚÍ»U5n-ZCæ©F‰E¼å,TëHÈ|uÕñ`´ ‡ó ¦dDhoïy¾`ÌcϾ‚)õ÷tT sÚp  r¿o¾Ú. „–*–?M?H#Çt¼Óþ<‚„pÈ:Ò¼ú q|/š¹hÌQMýœ‘ÙË5 t/Q·šüìL+Cn±úJ?&¢âõ=‰)`:ÏûvÕ“þ„•ÇúñÌEoÿ”)EïÖsÊxÿ§Nà< ÊI^•U T×Ýàcö Pº³ån³±…×îö>Ôš,D2Æ/¤rµs¤™Ä¤_)È“%Ñ‚T9r)D!É–ëUõ‹:8¶§i&ôh‡‹,º¯$v¨‘î°´õÍïô8 [T%ܶögéÄÄÑ;8¬ƒtk/­èÍJÇÐ"m¹LŠ£«§—”âU Q† xB2`l©ò¤7¿×¸Q¥i›RH¯£Ë‹“eðºãÎ`‚.度ûF¦ —w{è+™œ: Û,/<åµíP|!/çbšË.û‘ÿ©ñ€Ù5#°Tƒ¥K¥Ä=þpiê˜i®…ée%ÕœE¡ë‰‰ã¸”‹àG Z yèÈp5pÝ/´ ã·Þ{⾜5Þq>O±ËÌ›‘’uÏ©y¸›ÑàŸýÔ¥ ùL6œ}8&á|¡èLÃqÖÔºB¥s((IñeœXæ§B„e¶+SÓ­xˬ´¬€ú6@éi±€«Þýµ´.³¤·×ñhè3ešy>úiJb9³OªL>løb[,Údtu´¨Ù‚½ËÉn? 7U| í1o(NûºÔ#¡’îg2šY|\僾âpÁÕÏwUwW®¯Éð™IÖ2xþì¾ÿð6ð­e¬³>w ü½œý€?“™,U‚‡‰;çÇžÍkƒdò3(P·§Î¼[¡D#ŸokvÕ=ªƒÜþRëRÐŽ'Ø&k-P®v°ˆuPŠDèÊŒâH²]´RÕIoýÁ’ 2{|PîíÐÅÇ2€Ç˜oÓý¹H„¼œÏ}ëû­[©äyéø‘…QqTíHEz'_Ø—•0•:*a^Ö˜ûIçFý+ƤRw‹Ùy_ÈqCO”üÑÖížA]®4%n‹L]n»WÕ«TÝ_¤3Hæ$1Üò+—KÙz‘WÖÒ“K?ÆïÒ÷À=ú(ŒCõ5C"·W(D[üctP­¯£³â—õ^÷{~OAÛ³½1N¬nä‘„^‹š„os“PŸK´ÛÛ[‘ÉÚøÛòøI ¾î'¼y¯3\ Vó‡X*%,(§v¢é ¾]:æ9úùüNdšR¡õ„?Gqm0e4>¦ŠÀ¿c±Ôûþ¾Å³7MN³38Ë€ðgÛTKJÆßãJú1pŠ&ª–Ee,:ÏÚß„=skÊPsŸŒì«FLøÊ¸$PZlá‘za¤ ~„àL§uþÕ­uàyòÓCsâ€G‡ÅF]Õèàµ_y.wbÆùáíØš³}v!Á³¯ ½åÆùbO¹7œOð±å½‰’ˆøäoçz4¡o—àÚoUƒª 9!lhˆÝó ÄÔ¨F^2«br­¹:‹œïbË&úÅt¥³®ÜQ‡¤ßœ.@ªXjޤ¶x‹+&ŸZß+(¶(ÊÍâøí;}y•>›ÞèàÒæ ±ÎÈ4Ù· ™Š Dzˆ¼'SJ›Ü]¦áäÒ•e Ôär~ËË_·™ÁF“=0¶½ò©ÎÂB×_ +½Å‰{,z¦«CaílE¼j}Aòd‰¡1îó5½çaÑ&kh´- ÏME±!ŠÒôk<¾Xñ¶Þ´©¤—YU”tÛqµ“™úl² è ¨OQ¦|ÑF_“æ÷ E"âÇõÄD‚›6þ¼Y=–š0‘iC?”aßžQ^óÊ=¹£z±c^-ÅGx$Ò?>ŽçÈåj/ÙtÁ$L %y'o^[Z!g},†ë:¢ÅnUáÃ,ø¥;;è\!ÄN¦KùK°`mË…­ ÓÁg” l8%Ü<ùÆ' )½Ï7 \ž¥¡ÊÎ^Þïá]fºRÆ '«vr?ç æšLpåݺ,!tTŰœ³žŽk™½Ö§D1!žH`fZî¸VA gÇ®l+°¹œ}ëôŒ&éyObôg”w…"¸b \Ù¹od°bGÒ7‘‚b °TtZ“Ʊ¦-m𦠳êì’lKwTÌÓ¯¸,¨9u2Ú0U×Ev(^íkÓ̵»GZ¸Ð¦:-ÎS1?'áõͱû­*‹A¯¤`yÒ~ÝÇm'3¦±’œÆkK›„j[)v(UJš„aG±/ ž¿…4 –zJޱ&;³ÐYH>”—Èìm×¥‹$¶Îߺ+Oi…â«ì#YÅÏ‚ïðç@X¸[g÷õ í_•¨¹¿Ê£˜}ùæôMäø¥7a–nØ B#Í9}+­ºqÆ THÍ×,‰÷fåâõ°íD×1ÎÔ«M)ûÆØp³u æWw$sç}ù­O>ðÑŠ§´HM¤ž£ö§½›lúu^dº¸ø§¾¤Ã-$9U]Rƒ÷Bàɼ üæ"U¤¥ðô¤•bÐ4èðþ´AÉ%6ââŒ݇èœÌ õ@°~ŠœÂ癃™ÀW’×Gl÷–xÄmoz¥±_bFj€±Íý3f0‘ï¿;ó ¤(Óš¶½caí¸½ø9vŽ}™<8ØTç5-Æ$Mngb>YH(}˜á”ç{%é;÷\Ç)|´ïcûœ¯q÷­ç sñÏ@]DäOûÁž,í]O‘a(ÁóãÝ«ñfG;18¨š‰îúŒ’ØÏ¼Ê&YºçõvD¿'"—­Ö\h?ÿ™zÞk&®=+‹@ƵI¾~ÖǹI€®ßÏ/û@Qýq*“CŽ—´¶d=4ÁŒæ³oòVŠ”/Òq͸+í&Òo‘ð[d«|ƒbÑàœÝ»\¼Šà £„¨F ™" S)r“ûcª@Õ„œîz†â˜;9<|‹ Êb7‰ÞÍ7’B?X>6¦Öa“¿)üœ-¹€RŸ7Ù*ÄB¶$¢™üúd%ÉîL$1²ª­OU~dÝšê¶þˆ52nŠ+°.…»X¦¾q…‹}͉þॶâûm!C…fÖrb%ô½ÊÄÔ&öpa+7¤EµÁ혘ÔúÌ®EϨóëtvÒktûëbüɦM$@Õ7‡Á ,¹ ã†ø?o;Œô^@Äï‡Cšmƒ‹ôæ"©üý:óõô‡¯^—Kì{?ÇK„\Kd d j®¬k½ñÏ c˜N¹Û”˜Ƈ<íƒÏd&ÖíNÉ2eÜ5°¹Ô1¦†¿:û¸%ƒ¬(P«…ß6,>æHG•êë–Û$Î|´]î\ÇÊ/Ÿ«2Mm-9É\ T”ÊœÍF]ad,Rà_£™y­^rn5ˆ¼aNŒ-ꔈ–uÙê°DP¡€Ä¨8Y[ÐQøGз­š[A·_¸’¸öJ‘‹\Ó…Ûª»þÕ £¹Z(’'˜˜z˜{?—%ü¸lï{+y8N·|ÛˆtâÍ…|Þ_Ów´‡Vu ’ôÖ‘\žìs~¼I‹D"ç[ú-%®“©æO•¾¦R1Ÿ²›èP¼`¥5ÿpqô\ÀÙxÝrH‘…왋V_Õ£rF@~D—¡~ }¤†V"LEx.w~ý†?û¶O8¼ÞÆ{h¨ÚHÁÒÀbè¶M PÈd•m×°Ÿú#5a”öÝåðNN›²‘M#”ªˆ!¹@=æÃŠ47ç{*|¾ëod¯ÌÌé“¡EHœ ë\)ûeßÒKh¹çëFÅÏ»dšI¡ö„Ò÷Ky ?‚=Cåq…è­)âôÑ®¶j7u¡mN7/}l±H¹˜8Ñ}aªäæ ²­“«8˜~¤ÙB4^Ïz¤†“¶L5&ÕjôÜó˜Ê(F„igò…jUý¤Õ]ýÞµ6Za›/{‚‰Ÿÿ²>O)ãЪ‘xWe±VjVBic øÝ kHlì×8Ýÿ6…ÕN endstream endobj 320 0 obj << /Type /FontDescriptor /FontName /YHJIXX+CMEX10 /Flags 4 /FontBBox [-24 -2960 1454 772] /Ascent 40 /CapHeight 0 /Descent -600 /ItalicAngle 0 /StemV 47 /XHeight 431 /CharSet (/braceex/braceleftbig/braceleftbigg/braceleftbt/braceleftmid/bracelefttp/bracerightbig/integraldisplay/integraltext/parenleftbig/parenleftbigg/parenleftbt/parenleftex/parenlefttp/parenrightbig/parenrightbigg/parenrightbt/parenrightex/parenrighttp/radicalbig/summationdisplay/summationtext) /FontFile 319 0 R >> endobj 321 0 obj << /Length1 2169 /Length2 16820 /Length3 0 /Length 18120 /Filter /FlateDecode >> stream xÚŒ÷TœKÓ† ã<¸ ÜÝÝÝ!Øà>Xpwwww‡`Á=@pÁÝ!8‡½_Ùy¿ÿ_ëœ5k1ÏU]]]wwU3‰’*½° ÈÈTdçLÏÌÀÄ•——ff01±201± PP¨Y:Û˜þÇŽ@¡aêèd ²ãùÃCÔÑèün:¿;ʃì2_l̬ffN&& ÷AŽ<1 ‹¥ @ž ²3uB Ù»;Zš[8¿¯óŸG•15€™››“îïéa[SGKc @èlajû¾¢1Р 2¶4uvÿŸT|ÎÎö<ŒŒ®®® @['£¹5ÀÕÒÙ bêdêèbjøK2@hkúoi 5 K§ ¨‚Ìœ]ަ€wƒ¥±©Óû”/v&¦Ž€÷ÕªÒrE{S»9ËýËðïÍ030ÿ7Ü¿gÿÈÒîïÉ@cc­=ÐÎÝÒÎ`fic P”cpvs¦íLþrÚ8Þç]€–6@£w‡¿S$„•Àw…ÿÖçdìhiïìÄàdió—Fƿ¼o³¸‰(ÈÖÖÔÎÙ á¯üÄ,Mß÷Ýñ߇kmrµóü™YÚ™˜ý%Ãä‹=£º¥ÃSi±û¼›þ±™›:Ø™¸8Y¹Ø¦S7c Æ¿Ps·7ý{ù/ó»oO{=Àì]†©·¥™éû‚§ÐÅàìøÅÔÛóÏÿ%ff€‰¥±3ÀÈÔÜÒáŸèïfS³ñûù;Zº>3½—3€é¯ÏŸôÞ+ÌdgãþûßG̨,¦¨#%AûoÉÿ¹<éYYô,ìLf&6.çûƒ÷ÿÆQZþ;?æJÛ™û+ß÷úOÎ.ÿ.ªw5àƒ)€ÞK×@õO¥ë2±3¿ÿaþÿ\ïOùÿWæEù­ôÿ›‘Ä›¿Ç©þåðÿ3´µ´qÿ·Ç{é~q~oyÐ{3Øý_WMÓõ®¼©‰åÛÿ;*í |oa;ó÷’¦gfc`bû—ÝÒIÂÒÍÔDÉÒÙØâ_eó/»ú_ gcigªr²üëŠyŸÅÄôÆÞ»ÌØúýqz¯Í Þ[Îùïƒü‹Mß›êó·3™üÕ},ì £#Ðáýð߉àÉüÞ¦&¦nW7€‘Áäü>ð®Ù`rDøë 9،™þEœFш À(öqÅÿKœ¬Féè=Šì?Ä`”û‡ÞcÊÿCï1þ¡÷˜Šÿ%.&£Ò?Äü^êÿ €Qåz_]õb0ªýC﹨ÿCïëiý—Þ[’hcoüÇò×ÈÔù÷{JÆÿ%Ö÷ Æ–ÿeö¿Fß/¤?¼"£É?øž‹‰©óŸï1LÿÀ÷ÍþÀw)æÿà_üßøï-þÀwy–àû^[ýï›mý¾«·ùß³·ý/²¼'bûå½yb÷¾§ úß½íÿÙ‡÷ÀöïM úCù_¹;üïy;þïy;ý³ö{žN–æèäx_ÎÉèô‡TæwmÎÿàû’ï·ÇŸ;ËüåOï.à»Z×?ú]žÛø¾žûø.ÏãoüŸö2þâèøÞß‹ï½÷þû?©©›©1ÂÒȘ7Ȫ!¨ã¾Nß•~w‚ú<í^‹…~¢HÎyP|ÆàW‚jvÖ²l…ÄÒ³„¾U·‚ˆÃ}ÎúÏkÏFâ&w¶;zb‰sb£¸…·;ð¹DÏߤ (­`ùš)"D<¥Žƒ`J„‘¨=ð‚&惪(^Ÿú])1Ë$8e‚;ºzêʲä°¸5N¶TœÛŒFÔvÙop>ånÙÆnG醧*dÊòu= $¸Ö¢nެ¢ öFú˸ì^‡8£‰óŽˆ±ÁÖj¬ ?ç–ºg {Ib› VnP§Ü7(\Yì\ë‘P%õpZ&™E1Ÿx<¢Ù¯bФ9æîE˜¬ä„C¶ $þvÒèO·”ê[¯Þ"´– –u_žëŸÞ|þ"›*ýyr(ˆŠN>ÿµjçÄû+Eg´‹YDû§º´qZ¬,ê#o³À‚!r›ìÕ;ªà9M–Ï\ij%«ÜAí~Zh¬¬\,ÓjÔ‘¿îÃkßyz°½\wu‰P.;ÔFÚE£Gyl6®zeå?ž33~o2N¯õpµýuçUëöKOnØTì]íÑaË~ºù-& Ä Î)?ꎊÆah'­^Ù»%ª‚ˆ3+SÈ«|¼ñÇú1êcEp)óz<öx9†È( Ø7y@W(}äÕ˜é6ç.D„X¢{»hOUô“a³fQam^h£Áñì¢-ÀjßAçFûlùewR>iGQÅ›c…*æC¦òHàaBlT‡ðæM[n$õl=þÜ)RG¿?wù~Öñ «9>Þu?2ñç.â7£7ÁÇ ¢Ç¡€1Øæ+MRâS\ˆæì̾MàÕ!HGÂI1ž:(©ˆâÜ„åªÍ5Já[õ¬”À­˜÷íÜJvü v2rÇiS=³•NM y2L7³QW[–LÐ˰Ë"ºÔÈ—º×U;ðÜø3%“UÒEƒ§û½9Fš®jKp%´¯7ºý+ý̑ق>ø´`€0ˆoÃæ¡qx}`§r½ÙMhm*TÛHáᕟ¬iÉÐÂ=N3œž)¢³áÄ:kG§e”qá1ÖD f3Ù>€F_}šxd>§^F›G9ÑüÚÀ2jÊ{ʪ ‡ìr5û)Õøø™XOMü®×*Ce$‡‘ö qg둆ºfõ㡵š`ßp“›™-E¢ñ{Õߤ™¤Ùׄ­ P­e‰‡nûÑ“ÌX6–fu—Öcò#¬VT-ºÇkv‘òì†ë ÐaȈc—9Zú±mB•2XÐtjþw<Ø‘Y[3ß…•ìsÌ,¹u«ÍÝ:…Á-¹j:÷6ý@`Þ.¶5PnÌoõ!MmR‰ÙsÊÓ./GbÙÓH­s¼Ã &dë4¯Ú3\næ˜2¬§aT+›{{´dóñ÷Ù× AŒå&µ¼ÅЙŠkÆì/„P¢LÓ¶sÆ+øðöB‚^,÷§ÓVdï ¼Pç½e­‚ÀvRN¿+ç M³Gïô½é$êº.(U•Y­dwlt¾,§&«dEýŽ_í¨=H±êÙíÁ›žsÑŒyUµå¢¶ ]¦ Š*ï|ûl“}O ,6ôX}W±’ !SåäÈ# ¥‰ö´þ¦P÷WA8{$KV^‚‘Á6aBÓ§'¢á›[$ÈiÒjYãÃ=„çïÏj iþ"ŒÖïcîE~Kdö0äéêÀ¿¿lveVœìü>mÉiOæû7c iÜ:H*GyÒûpç`?¿Àµ …ã=cKà¯;¶ë7þsÂŽéß\ÜWj-ôiz¥d—ê½toµÃ]1¾âɲÒÑ|ˆpa÷f¨(æ.Á®Ë%åv4¡!›jfxÇAr”³xË2hÔaM|‹‚]g,åèñ gº²Izµ9pMX×:âÛ’ÒŽ®‚rsAïÄðöÛ‘ 'Ï$Í4Â$¡úêa-¦¬bäÌÛ8Œ|hUÔ:m¸£€{ÇV= Ãö~³Ñ¸úf%L“ih>ª\QßOU²Ï;æ_§üA8HÔÞèà‡ï}¿(·é!¥ÄgªH„‚çà‡¸‡Á œhG°ˆÓ´Žvƒ›š`X´3E8Íõ)ˆí²Ü²/Lk¿ã£­j(kÙo‘¾Ï”=|_„÷¯§ßÓÖЩ0:aÓÊù<ÎôeÜ K@|κÁ¯Dk°G.®«ù>8^=µî.s jó¨&E0b7óêž9`ª>4ôöì, µš f%žðÒ#Ôê¥ïìá{´ù¯)ÔP&ã%IΫ3 } a`ä†àž–?š”ðH"/éòS_d”…€´ùiÆáæ°™GïŽÐàê] %ÅØHCñ¸b”lXû¬]ïr›j¶ª9Ku+lPíLƒÔuÿJm‡-Øž£q ÓŒKôCK<‚o ÎûŒå±:n–VúÓLšfí³.?„<:ë,5EÇey j¢CEM³"t·.½I.QαL?‚5£ò]ÜWBeö»B_5#9oF vkôœßüÊ®НœXìÏadø<É?é Ô °ä”ã¿b+ˆÖì©ÊßÍ[žÏXHFFšü¶‹´{ÉJóÓŠL³?[ìˆë ’üjÖë*‡¤E"bct<¢õïpY.‘×ÀÁD9EFš¼¹=¥_{„jËVÅáãw¡Ìgœ³THnº”JŽÆ-læÇÂYWâ·ãrU:hAæXÁ@8Äëá¹Á wª€m9ð¶IçoyÄçêqèg'ð=¸•¶B34XOqj˜Üq+âmÅšŠæôË) ½Q(uR‡ö{8È@)"R8]¢—>TÆ™Y¢ q+ hÏlæðkæñ@µúd ¹—vwMY/¿™ëíÔ ¯åfgØ"+“Ã` þ%ÖåµŸŽ½Ï ]__çY _\ò^ííÕ‘ä54+2ïö1´éÒÓëªX<²ç/ナÁBøT9œ™¿Ú ¬~3ÊØ‹Ëm“>Æš&4 ÎÖI¿ž30EGVuþP¬nÌ~òCô—PdhuØMNìG·pZD³ïË B á” @.ò4ËlÈmEŒ*%`Ü.¯ay!kÅr5ºbrº<ÊéCÿRGtàÖ#ƒã:\$ѵøçrzȪ—–“[äƒÀ2ΔÝXÇh”£Íòb‘ D9ƈ¸}žV¬[ÀÂúOJ?Iüœ™ æ/LzN†þ 7É^í‰TõXl¹¥T‡" /ôhÖßÚr†R¬‹Ý<}“%ª±\Z7(þ´÷³G§}¶ŽŽ\ÅÞvNì3dutO´½ÏØEÍE8"ŒÖj¢ð —­°ÇÒí~”I—/éNºÌtBY—ýFÇ]êÇV\QÉd¿D…©Üº˜ /^€,ìjðÆï¹aCÃ.+FDl0ÆX¿·Wõ šG|ÝÅëf‘½_‰Ëñ|£G»JQäöVÕ~=C‡®ýÎÁ´–eë–5E2s9-Ïs€NõâÁ± §íöl«`ïÝ>g)Ñ#ØóÑ¢tF±_»€o£ðž–¦ÛHéU|ùµø]G“/^} ž©Æu¡6÷L1…aT¥X˾¢pi´g?Z –tZ_íÉ”—¨ÀR”&rñŠ ©h[0ê ìõ"Vè*ç •]ËLr& 7k’Ñt?îÃ}ƒ úoÞÖ>rÓBû§U}Æ$ùô+-¨­k3Û,Ṍfãï…œô±ïÝ$ßâCàPŽq‡dèDžYÕnK`ª­vL} #ž⩬Ô=:™%5-êÚú[3ƒêi÷|áBÇ÷6 üzÅBÎ#éDk®û)C^´0Ž¥ 3‡æÒ ;uWšû¾¿m=©˜‚ ]~µ;š`Û žLÎÕÔf™Í‹N|„©/_hÓ„¾³™»¶†)œÎ#F¥ZÒ“ßÁý‰†Šy·§ï_==¯˜\o³69åÎOpS¦ïÁ.åëAþ0f|ºÎ4f­aÛ)|aQêè„Üf-ó#ñÕ:²£m\RÜbŽò@ðc`0 c³ß09{[ˆ;’$ ¤+$—TKÕSqF®Ž ζì±3”9ñté ãóJ±Ôw6Út75c¢ï¼‚)ÿ¾!1…+\9¢wfŽYdÄcŽ7â IN\}±~bÜõÜ€9œNeNäaÅþ‚Ü>)æ’¤@ ·Ÿèø~<Ô"É3›üh÷ÒGn¬êwŒÏNR‘ÓΔ±µ,L’Òì³#?KÆÅ‹ä›ÕôvíE˜«TÇo.zQßä¿&øppüÓ–7Ú@/±ÃÑÇÔ •XÎèüŒØ}À!ZÎ)iÓ–öðŸåA„Ÿ›üörø‡<“¦…#þöqÄÂå–$žØ´Š÷` ÙoFs¡ÌÄç·ä+“xÚ¯ x°¢u!ææâh7˺ ¤øñÖÚʤjÔû}ó"pWw½ݬU'Û³WÁ†ÅbÙæÇ;^ÏÛ[µ6¶ÔžÜ¾ØR…‚ó9ÔM˜.ëãÍ“M·^i qþáÀÒ°b½=G€ZB÷‡ö3逧ÓL–5ܲšPé¯GƒŸáëR挿¼¸·©«ø[oBƽÿ"ù:Ž_ùÿ;$È«CKi.O£sêÐc}úÈÖÓ¥3¦_Á™&wü2ÃL,½~/Ñ€×Ùzn>3ûˆ¢´´Z¢ìá<é~í´RX1—ª&Äé»Y=Õê“ý„ØŠ) %t½}¢ì¹O]¸Ñö + ÿñkåäT8ªc1>ÞF«ºÑ–Ç%éÝ'L‚æ'á&óÉÄ ªÃÆC,sÏí?ÑBÖ¶9çEcôEEò~EÔaò¯9ÆM¦\afÙ8TS±è­u§+˜âgË$15ž–ÎØ3§ü¾DÔN»BÆüˆf¨ä£úFÌ/»ö&(þ°'‹Ÿ™IÙH{^è¨KÎOþùg£Û‚=kØñ–¶z~•C ôWã‡ä¬Ü6p„í\œ0Z"^þ™P’+¾¾\¨œªŽö”! äáÖ·;?„¶á¾–¤EåýÂúR°1ÉFL½žÒnŒj·ˆÒ‘œåB¹¦ë™RGü&gº‰¨7¦vQ%’áSs! ùÝŠÛ¡#—?,–ì ò¿%¢¾Ð¦ÖÎ(rï†{ãäë"þr×G¡ãw3ˆê­T‡þÛ³‘Ï¡j%²¼Í%,´¿+ý-,žàsÌ»XÒR7¬­f‰Y‚Q$ð-ÅË•MÚp¥ºßô9uÒ3Èd«Ù“²Ž Qî¹ užbmÍ0ÂÀCô¤€ïb§ñÝ“¯oiDZh8›Ï¥& î•ùnp˜]œýÚÕÀW¬çÙSM´œS¤bêM¬5í9wÜUfø†‰~¹!òßÐg¹„A=KNbz×i·y§ÏÝÔNÒS[B\Új,lPUÉe¤lkšG–ƒ¿:Nð3Ö£tS2K¨y‹ë]v°æo”ªRPÊ·ºGj‹%Á=l·–DÓ »~”-DøÝ ¨ŽÏ‚/çØ!´Ñt åƒa{½—5ÀÓS K÷ù”æRKø$¨ìŽ`µ<•Sô+É·1Í‹¾ÎX*è¦I -÷ÌÃg "ë _î/„s®¸Z’V§g,W$ª~#¢ûˆ¿ކrÜ_³’ËÇ74Ž,mfs¨Û&¹‹øc3qÃ`g«…ÌSKIoA•Uô›Ñ. ¿—s>ñL"ú “MËy]Ó'>vW°ªa晤ßùÄ4ı¸W©ôeý+h¾ öÀ‘âÕÊF“*HTqßħQÊ~Ì€E˜¡Ò¢{_¹6A¦¦5úùíeUCQ$°NSµŒ"¬R>£bD{{熖õ™:g5ME™ 6E7r··}´Ë˜{­Vܼª1s.YILƒ3¦FÿÐG‰fàÅø˜%Ï0ŒfíTªlcG÷ó‚”ë~¹“C¨ZU—E‡ãòÑ•\"%¦vÄ@Gz<`Û¼¢è«œ‰@Tx(„,læ¡'ÖyÝ3U®üB¬OæP‡%pê‚ëÔ;s*FÓOË ¨¿´ŽÛÃ>ÔiðŠ •åÃZ®ì?IÇ~yY§—Q™â’3â¬ËTvI"¶n& ßöæ0Éß‚È,ì§Õ)®vÁéUò¨Ši&ágÊNFXØÃ,:ÎÛ½¤Ø¿ô*+þ^ 6¼,OUVn>¤z†ýÍ–ÈŽ“ܨ_¸€)¿Q #„c—¤1ü¡"!_öa³ßïu~Ü|;æÈ¾ÇlyÂò¬‹}ˆŤª¨-þTvàý³‚{«|“HO3y¿Ð'ܰQŽCÍãM„‰¸GñÍCÒmç÷tOÒj½ä¡Ñ¯î™K¡g‰àR)ö–m{oÆ9z86”+ùýktšGžÐ¦s=N7ª“v6{Ä%®(v§1#¾Û˜F=9å¦sšûfÙÓ䟴-B¦ ôË ŠÙ؃WQÜ\¨”ü!?›QÔó¡i]\Úä.ý ±âôeó ¸Wwÿ‡£¼ ÆŠ—]n"µsJ~Qy!¬Áƒ—…K¤{éG%g²OW!»]má à’âgpª2“šcÉãx „¡t¶¦ƒ¶¶I¾ƒN[±NŠHsµ^$fúéﯨó Èõµ‘Õ{YÆTʇ„¡ØßøÑÍ~ˆÚ¹N¿M!Œ7±.| zöÔU¡4!·H+ÒxW^v¦û¿ïoÙIwü‚ÍHïEDúá…Dîfæ_@Ü'Ôùu¦+¿öqÉ„ðFòxá–Ó ÑJýŽ«IEt¶[°H8Ù^‹»/úy­‹ ®ó[ ò{•õÏþôjîY¨ÓÒDˆý‰¤Û¢×_ûäÇ6Lj¥’.Ef}êŒá"À¥×C\q£LǼÝ5!]õæ7ÍmHˆƒªÚ­RLƒËħÔKÝýé£Tª¸NÅî©ØŸC’°+A9ã`è`3xÿtÐȵi÷äXwÕÍÎÍ“6»ÖÆ¡*øÂ3õ>qµé³T¦ŠÑH6?¿´5tù—’Þ¡Ë™ÇÏ â^T'NÀä†QºKƒ†tÁ+[Æ)¸ù+GDüJilpRSs¶zÆ,‚ô®Öácå+L'ñ ,!îPIHµïê+a¯ä]†;ç³þ·DÏ‘éÕŽ¶ÓCÿ¨L<\úÂE}¾½Ù,òÀ…-”$EªÁ2Ö¼V¨1xä—¦SjÑÆ8SÅI‚üøsŠžFÌi–ÆY/F’ZÑ<Á@ód¦/üh3s.~ÌLg$ýñï§Ô-£Ô©5ˆä-£Þ(zJ·«»Lw”ÔÊætmpäù̪õ&M#|«GÈ#sÔpë/º¡Ÿ?Õ\𔼅UšVÊ\ƒœk)ÚAû%û‰¼EÌìÊ O™¶¹÷ðú¡š )à l«±,A¾ÿƒÇ´‡cn7jÙœº03‹ž/1bv†j ‚ÁúWòbÞBg’oZXç´‹‰Ï[mÝ+[-ÿV”΋Ðý’º¯Ód¡ùµã’òUðxþñl8§ìýQÎïîˬ“]1§%5¦¶‘΢˜#<¦É=ï®CªBÍŽã<‚U0”^Cô¥Û®Áˆ¡¡ožàÀû[<[b,cÃ5Ê ü|AC+'[?I/ÇiuoG1x^eÁ¢¨”ã¦nål¢òÕ§3t6ef->¹lpÏZkv\`¤È-œ†ø…«?ˆ¢Uð!d1•©PUĺÖRCÅÏR[x;x3ó3Œ¢÷IDÄIb‘Öfþº]Ã<"MýRâ¥ê$ßu49P(ÂÅþ!ïX2ú)õÃÑ‚¶Õ rTm?Ñ/,È­åOû" wñëwƒ$^¶ò“ÁØØ"n ËUø1‡,,î¶Z3¨zdJ’/…‘—ý6D‹«Š{ž°¿|Ùy‹æ„ä¾¢ÃðK¦õu,7pѲÇÍ7q6qúñØwP—ë„ßÓìrçUhî§n>õé|lÜ=´(ioÀCC,ýè=´|5 'y¶ø'ÂFbzÉ:†á‡³»’ˆR6,½I×åÉŸ4Ǹ­5ÀÝG]’¿w`¦OiÑ:úNCäáOÅêÎ)(Ž…æ<«ñkt,£I hì³b/N%ÂI"Dbh²”–ÞXž¦øÌ7aä'²]2ÆKì%¡NK¹~‹¸åoù²@ÿîÏåä 7 Ñø8º·ßÄ·ˆE#ËÛ­šíÄ’y(††à9Ð쯨½ØQ_ Ipnf`¶:x·çØŠ´‚Nˆ  ™ŒƒN›@t—tî šý¥Ràê¢nLNt³_Ëðxƒt>jÍ÷Õ°çýDì2w±KP8•ÄrnŸ¡£½’ëGk$Ió£´xô‡¦Ã@P÷Óɵioßý'ÅÝ´ ‰ÂBL}ÜÙÂÒ÷_YÎè1~ÊŽáþ¢­tL¼¶¦W7‹CZ8©ò¿"Ù6b–ÕbY š°ÄVOg¤ ˜‡BLÛ-iûn¦Ðãñ|=Ðï»Hª„™ ÑÓkžòåÑÍÔRyy”å`Ý€¨Ô!ÕŽ‘2Bûd@Ã%ÕÇÕ¤®,”FU ( ÌÓç–.ÈÖIÏÑm.}žß†ÕondxÍØWù“µ´Ôئ˜Õ¾A²ºG:OZÝg,3hGÔ"ªSô¾žÎŒTl¤#Q­¡bØýø"G‘i£™€õ‰V>9kÏ#Þ»ræî5æ3£öÆv#Ê.!bãpœÏm,‹*"ÀAÅ›[4ÐLŽ´¬ü8ÙÓX%A †"€cB̹ÔYÁ©®Ã³¬õòrëëHÚS÷¬ÝF‹zXÑ9= F »”/ÀžÐÔ7‰þˆår¬ã«ƒ¹v7¹Ú–l˜j´‚˜ú9}ñi­3êŠâÖ†GØÃ’æiíþH^$è#ò8ªÂ9=Œ8B&9‘7C¯™ÇñòРfÒ"<ôK8 ÍiâúØ ˜×•œcSuFû}.¤ |ูðºßo¤–:Šùό̟61mDFïFTÛ©™ú(œc÷ØñÌ­™y¸=¤¾ÜVbˆØÙ»)bÅùPÌ2(Y=FŒÿì¹B¯aÝ;J&åk! ¼, ö—=œ™›4æ\rƧÁÌ‹so"ÙiÑŠ)w»±¬ñÎw>z«´1*1GGöSi¶Ö~XS˜ÞÐä.siÓéý¦L¹i†å¬\‰ÛêOÚ/&úŸþ³„…ˆ%U7{oÑrž}Öc Æ<Ç6¦H¬ä@dÇâ¼ò6'ñ ž§]Hë3Ìr03M$8Y }Riói {‹¼˜*?–ÑóéºÕaý±ÈSÎOÏßh—•ÃN¾zû¶P† ê^¢ËŠiëçÎn!ʬ0Š0úVè$ªàg /ŸeÆÈ$zqÞÌ6;‰%ÄÚÆÁÔ—@.Gj*Î[ߣtD„åèÒ^óéçß¹Ÿ<)f˜h~\°š$?y"åuŸ»”t8záœlKTãÆ;€ÄÃ^k, @#¾Õ¥%ú†µýKªmotÀÂýw î7“±¬«-nÅ„æ(ä\ È$—ðÍñ¨˜P{âp™[ÇÀîA£DñeɹÛqÁO_›vý/R¦b–I&-·dîsÑ!ÝüÒñ²Ò\+>ØiTî­ÝúœØŒx£Ã|Ê̈þ$ËTHo¥E~g¾»Æ þÑ1ûrÝ×DÍQò‹I—Ïy)û`ò'²4{'ØÃ)­DéÅÈ €Ì=¾Sn”dÏL“áFSㄯóÎðùíºÇŒ"ÜËÅ^1¥›ßfâå!” øB *Ä ÔÒ/[Öé»áµÀÍKt0yÓK~ÂØÑû&”UXƒ§/H·‹Mí)?úီ cî*î9!Áp–$|y΢ê˵ӧirDQ@%8EdH³ôUê™7}3Õê} lXàõEëÛrò¶NN¸,µKlˆácõ(ˆãV¤Ô%xÆwbß§ôiÐÑ"ËmÝM!ƒw¡®—¤ÛhPÂQ­m¯Å•þÂ`Ó7Š´ nßÌgÏêê_¢_Ñè+*˜ö¸ÊÅM@…ÿ°ìO(êHÁ÷êVaPl;ÂS¸f‹ó' ô"ý¨1˜•yýtÇ+7bSÉÝÃè…aèN¡¿!ÈV‚c Gpä8Í 9vêçBÕ•Ì9ÚˆaÖ”ªøtTÕìÊ$ÕŠ[DÇ­óÅ£²•¬ˆ$Y„v–äZùõi•² ‚è¼Ïž<žj¤ïнL/æ¶í‰cä0 6ÈXÖqqi†¾ŠóðJèÙrFýâ,ÈÔSÂ/‰yªÅÜP2ö½ê¿’Ý ãýr?¼¦ã ŽËb¬>Ü/¨$„kµä©ÔôñK$ΦΑpëÇiÝUb&”;r9ðQ50š—ÖñRÎ[ëâyîç[gBD‚"Š1¼9Z IU/ôþo¼ÏòÒÎfÃ2YÜ_­Í~96ä2Õëç‹þ”x¤l«ç5¼Xˆ\Ò|ps»N€ŠjSb¢Ùg•m.Û}#ì3»+½£w1øF^³MeÄŠà²dž‰½–÷Zñ+FÒ-QÿlU×ò↩YÊqtlvTŒ°c¹/(* ËËÊÚF…Q² ç*u o½”ý;ÿ0T é3¨b¡Ú>ô÷¯£Z]vC ‘ýÆëÑÛ¡”$ÿà¡Is{œ8ÎÕžç4®„‚"Ä^žâР«ÞÌ<Ö:¦6Ý.ª\™5´~]²ÕýyÙêAs ÓÚ§l=LçëUÌOºy>ÇÌÐÚ÷\BkD€1Ø.]´9»Ø*1}˜v9Ç×O Hcc-.?¾Ë5cÈ,z*)Â|¡ö#…¶q@ïÚ”v̾+v]bdAÒóšHìý×x‚³}ñÃÜ[ßħ °öH>]|é¼ï @éÌüñÑÞ˜&DÜz{ƒ}\ŒoTØé?©ÆÕ~äMIžÄQyÜâ‘úAÙù˜o{*´#î®}Uª;SDW!R-ÌxôFçUB68bGý–f|QuÛïI:]ÅO/s!;Ë BÎÈIc+£»~#'X;Üx¾ÜÁ¤¸–NeÁÒ«,ô¯Ž!,¡¨*yÑ©¼¶–&ëD«ÕZÈ÷„– Td–ô,Ù-¬€ !¦ÔVÂ/œKeFXå‘NIZ” ‘_puÒöhÜÔŽµRæ+úk\xžUáÇ”&áRßñé镨nÇGcvø­)Ïc°h£Œ”ýÜ‹@ÕS×,W]ÞÙwæ}eËÛÛa½z‡™ï#c¤RÊ“ä>›Ó#±#ÂJÒ€OˆY¥85u-¦ iMjÁœX55×¥MÅÂëÒiÜÄ€ •Áôæb Ûƒ7œwtCZÛ`ayƆ«Ü³Ö¦Ö¤¹j‡e®–©„^C›”‚£öWï_–Ïdé K|?«K5Úm^ãncBÆgù0ö;$¯6PöÍE©8|Å&©z¬é`Sût/Þû8|ËF5T¯¬b|A{½ Ï—_Š Jwf!+¤º+ÜfR£Mòx7¥ÖâÑvRz8°GoqŸÜP9àD¸Oµà§l>¨ž ú®`F>é¼ýÜPÉ5ÒŽã¨t’°æ‚ƒ¾†þ,ø¤óïmo9—‚ú¶D?~»¤à¦L¢þ¨!³~nQuA 4K:õîQ?Ð4hMΉº·>©gSµõóm´œP˜‰b–¡=xÓœÍ6LÌ·FQ¼ÿd” ßÕåO¯øbšpÓÍìSð{ý¢Á¥jíå÷Zoà£V˜àÐ10e¶šÝt†œà_×FõõîÙ>䜈5ÍBãJšDWîy‹ÏËåóp±–ÜêIyÚÛÔFý8gFè‘Ãׯ j ¹p#ŒBˆà}‘ŽË@Å‹*Ñ[D^,+ß@v«éj“ê¾OoîG"½Pu¡†Mg÷⼬ãr»96WO3ñlm—5{ ×.­~™w?¡ ':D¶íSEÈv•û\uÌ«5þÁF†[ [ärƒž Q*|m !qa­9gcÍœ Z,vˆÃYéƒå.#¸±Þ7ZR¥Y`¡Ñ錽}oËà£E*½W¿~H0û„é.ÃqŠo 㲫ÿ.%ê•~ñé§K0®àÄÅE}(„oM¢ŸŸqï•X†ÁPÁx}\ú©B/F*&›’™ð¾ãPoÖÏ ˜Û¤¡™ îù„ƒÐY­¾zΦum–ëH^Æ9ü’èM5 +Pß™P¸PiŽ(bWÉú5§<¡ŸzóÆÒBrઠWˆÌ é€uõ5zL]nó½>¬_À._!":y}oî8ò Ë 9ïD±WÊÏpõÜÈF¹¾ýàž` "áÏšßPiݯo¢8ÝÐè×6G $ZÔ“Š¸ 5.­æB#…Ð×G°‘ñBÌB¡ jꨧq.E¾Ã#·-F‘ÁÎ0ü1UГU ƒ¤<=’ªÆ-é[Ù‚óÈÔÕrˆÿáEЮ;}_Ñ|–MLͪ\Ç£Qw¸ÃS¸^]·ÎÝ®'ÜŒ¬…žç1lá÷î³_ØÎlˆÉU `(Ø9rȲTšÚý™ÖånòKŽL¦Jr~ s9þiâë!Ç+Á#bÄ;à þVÛÕs9)Ϲ8kyTkÇÑÀ¥2!Îáužž§«h¦’ŒŠÝW˜u˜"K“Æ+<èÐÍŠü•W¡7Ú_àˬUÁ'|‚Ùep0r'~–@©Èd¥°'?Ñt•&Á&h Lê+æ½Î„žØå9zH´g7$dRx`Íó Ï ŽÚ6& ÿÔE"Pœ+þÛB¾Å¾³±h¡É+o°JœÝ=~xqAçÝ6<¡†¹ûê5à8.þRW9ÖØtïÞýaCŸ’þ›ë•ÝTlç(ý0ˆÆÝº¼K—­ž”T7:ZÂ0A_'0êmRÑ ý,Ý1hç¸ p€8ú¥¯2³Î <fº·+#GIK¤1+à«÷„Ï[øò‚¥q¯ö^:hÝ`?z@ËV*p†¬ò* -†¹ìй1k@f5!VŠDEöõæÕ|}ƒÀ²Ì%4ŸS´'öôد‹© ´¹ L9FE“qå í,†›ŠØÌ&#*!-˜â„ƒl—“„j"M*,UvaC0Tãçé"•ˆŽ|N$[ÝÁ·Àmv·³•ÒÚ7 @[¤ô~H¤[hü¨]9eëÂïécËà-M½vqýb„Þ²m¬4ý Ø é¦Ê¸RžÅI üä²|µ 8I¥Ï–Ÿ8uZ|è 'X_šP"3òlŠLôacƒòoÓÇo9åÇ:‰||IÑPˆ)Eù¤'Øæ¿E¨älÁ|›k‹ÐHçM~ Ì6¯‘}c缡žZº9Æ}µÁ‰@t¼hûšÀ$jÕ[çw7áO5ª¼O/ý|‘K~ôñPj|dXYï¾ûÎ \9´T§$Yæ·ä¸“ðêV|0…Êo9ð¥ã Ö¶um=Ð÷n¬ }å Û!a¨Á´Ó\ObõsÂíp‚  ÷}¢yÏB¡¿[“§¥IRÊT!¸Ýërƒ|0\73L[˰h³Ï¾Ä¯A²L˜äŒUëÈ6'{”µn±*^hh“æàiZ$´XÕìH<~ë…­9] :£xÚ7¹ñ–èËg¶Ýeãµ5§ÑY38Ú³dRÞlçä¿,TT©_鮸½FL¿|+Só8g¸ó'Œ›qûl£».Rœ{£Ú" bã‚ulÈüÈ·ÈTJIÐ*æÉ’Q»›†¼lÇ k~T¤è0Çæ²W'lÀ©:X'ÊGGŸˆw²Ð2ƒ;n]ãIȺo9§¦©Ü²8hÐu^{–.í°P»>ez|¾"h‚ä­õªX29*:ZËö¡¹ÅŠªSÒµ8“”¿ø"hAy£+,‚éSFÛ0hðÃ9Ëb È@³ÿ„þµ¥ÔÓµètÆÝÙLÙIeKÀžMœÚ;,˜éüµí|›Ðqé§gÛ‚'Ñ6ò½#Ì­pmZJ4[u3K4Ÿ‡¯ûÆÏ~øL<?©˄콾ºR¹–æs ‚jÍI`0#ÒWœvÖð7Íì™Å ‘;âŸ#J„*û ;NR,ÖÃkU®àì¾îU ÚK˪¤ªx¯N>óK¨j¦í®P°C“ÓG†5"KX±²Œ•¡fѲ$§p¥o> ª. ÉÄ .Ì“îÌ:³«·ó­Á… m!Û×Ú¿Á¸´‘¿˜áq­`7›Aãy| cØnKj‘KY|¨Þb§9ÅœŽS{C¡Èç¯Í$ÓöI°ÆËŠÑàñÝÓ$d”‡ÀÞÁ›HæW§xÒ2TAšìq•¦ÂlwFæ§²`÷èUMdE¿ ó,JŠð |tl<-I]Ö”,Šv›¥˜2Ä[|`…ïdË?¼%J×+˜" ˜ì}kÜ>õõj^J®'v‹E§¶ž2÷(ƒ¤i ¨MqÆðØäJK¦H|ðÇsÁ…IGž¯P8Íb]‡½kpZ0ÀFíq.æ¶4%3Ž› G}Ý‹¶>%‹¢ ¼ü¬Ñ°T³UdˆÄçº$ì-êéü’+Æ@y˜ ;Ì,i¶° ¢gâEåXÝ.ŸìÒ'%´ÈYü¨ÀGuu±ÏÅQGÚ˜éß¿³vÎBˆ‡´zùÑe[?8‰}Ç"òUç,™˜ÕbW'œÇ Ó“³oôRŒÔFkD¨ähÙ#&‘vpB€ˆ½˜à¥‡¦8;~Wà²Æž÷…{’Ú§b(jDòœõ”Èo/ ê_ʇqTbp1{‹Y‹Åú!]@^~ãs,#Úïç R1†vž=NšèÓxQèR‰‰¨Ðö´üx[£»Á Ò0™éË´ë 8 ­ÐÈÄŽ¦–‹ù˜1÷U}£] [¬ hiÚÃUõå,NkfU¥Í‡›4µ\4:æáô;yL&ÉÍ¢ñmŸqÈŒ;{â%º®­91”ù®@Ú:òÊ_ëü¾šªë„…Êɵ2ȯœ֬3;YÎ&-Š¡’Ц†óÀ·äb‹4À¶bï›Z9Ù#ýë—æj™~`((š™Õe©¡Rš}M‹ ¯lšNÙ+O:•<$?H›V؉¬]½×]s±Ê ¡.ep }ÃSƳéùØŸÄ»#-O÷3{úAБQÿý ÏcÆ™8åO¦¬BN×3Úãäy n‰ ì KÜ=xFÈ'A >†Á´ïãýµÉ<¾¼¿Àžäê›BÊ{/m]rgt0sß<@—Gþʃ“D'HådG÷äñ’SfØþ…~%år_–­;LÁóýÕÑq©_ÆÇM%¶€}ÇQµôHgkå%{ƒË·c»øóˆ´õNeE&doUþ2_LÝ@’B½p‰ æÓæ¹Ø—|ˆ#0öÐZ¿u' €IÄ6‡¶k¿†°DMD"¯’_á…“ÃCƒnÁ§ÀΠ»¾Æ1ªç ‘Çú Bt¥‘·!]Ÿƒ.-6´'…ÝŸvXÏtÈénÇ‘rÅã(h¨ð›•‘°a} >:6§Ø/Ãb@$Uù8B/­ÃLަP;‰ö°¥h¶á£Ñž ”Ç¥®à¿}º–”*“;IÞôÂ<*d2ƒ„¸BÓn9šÜkÞ”¹ƒ ÞÀUˉRÕñªŽí`t®~åœÕ¾Y@;ÆŸG2m뷅ʼnÖ ò)ÜÝ®ï_JN™wÒñ”&¡\%ã,ÖÈ®ÖWÒ›)½L%/§â²7‹úz¾Yç‡]ØóæŽûû£è;¦ ¼©TR­”W0wɵcj)vË™ÝÊü¸‹¸×CºINЈذ~ôÚîölÖTÿfŠ„jîsK¶§7AtnyƒÂð]ß«óÚT;D†Ý‚K÷Є_s4«_ë´Ž,UfÙËìž{ÏAUê츱©´{K㑪øå+¤íBe¥†×ëAråóSK"Ž«l¼ó½~üÎÎ)ÇQM(¬n œñ2>ëÅk÷ÀбbµB×oš+³Â;\i´Ú6“ÏGZéÈ,ÏšA¼µ¯¼ì›ñE`ØŽ¯€+jK9.kÇ»à'×YÌžkõô¸£èÇ!h?Uß²ú¶HGl¨’ÛÇ"#M†æÕ)zL€¶m:§enhGÝ/KÔ»ž“ØÞsaeÔÁ@©8JO IÖD–L윣¾hÈáwøz#ܹý¶Ð5Z÷Ê­Üe'Úµ‹R¦…_צ.!è6?Q¡9ÿ@›^-Ùý¡I°©y¢šv;õº‡ÝcÛÈ,)Ô~2ýª±g‡ðsHªœd›T¶\N¢çΗßÿh³fL`õF5× y[›«[!K•»TsV¿*ódg/Œ„çÔõ•:Ì'<µ]”%ÏÒâ< Çoã,JMfÿß´ <ßût™ôM ÈIèc>h¦×§> ïÖW’êÖþ ãg›?]Ú¡p§ak©m—ûÓí%ç•2'Ö–£±=IR›ÑÖ㤇 n¢(øWßd1#F-Ž(æý äh¿Rÿá«9ªËáãb?  €6§µ{A—èÔ¾sø-›™zþ dbgé)*AV8FýŸÎDS«žØ×‘©˜6écpÞ¡ã &7L(™¡ëÔ® >‚I~¼Ÿ ) 4ýŒŽ'‹KîrSÃøÐ©°#Î?cydÝBaÏC8HÈ ²ÉGL‘²Ëfü>÷ð­QÖ «Æ¢èÁÉ7 ÿ—ù 6ù æ;]“*yý*KŽ“„í.x­¬F%'®´oæKrª%”)Y¤?§lT°¿[¯À1Uç¹ïwcZ¸Ú—Íh`ƒ"¯Q-Æá‚£Š9CžïgÇÀìAues½ ¹`û&=ù…Òßæº*E‘9lóÉ uÂ,#!“¯hFa•Ò·zÁK×Ò¡05µ7¸«LM­‚Zµ‡#Ò§žÊG—Æ.“øC/‚ðCqC†ýÙgÿÇó¼ã‚ƒå¯)âXF ×¢ªÈ¡¤Ôºµú–Œó”¸•üËT+í­AY:>4jùeëžòÄeÇGŠZŸÖZÉÂNÊl{µ¯#2kÀÆCÂâ$ÇY‹ÅÎUä)™ÇºG »Q;EÇ2U® 㟛6ÀM¬Ã¢¼Ìöï2 wçñ\¥l¢ñü9¤¦D·êãíÏ0´zÞO znþ\,ؘÑU°Z–g;O%þbkóľ/F†L+Jp@V"ûPcg*ˆê­ÌVšœÉ¸C_áØb†Jg5äYwÔˆïóCC6û2÷Jy -LL6µ»¹¶åtðK¹;Éç^è;©ê·ÕNRò•î}”¢W¸LÛ[´QQCžÌ«žN‹©ãYF„U‘Åý‡#çVÒ䙎¡ Þ3fWÝlÍ•V·W~T–¤Ã¸m²Œ/ßó5 N»O¸HÚÙ!âÒÄ( ›…'B…ž ‰kjó§6B=Äo•§vBè{ŸXVù[v¤»„¾«R“JÇÃOV¾5 Ita1g¥Íû<=©ÕÕåf[Ñy«hâˆÜKϰ ­ÉTíi#_­OQRU;b$¹³ §¦ ŸÊ­[|C¶ÅÏ%çÆ—ºy“\ɦÒÍO¼Øò~õÍÙtrkûyeðDþAA ûõb™Ì8F¤½w™©Ö€ÝØ.@¨±ŸÉÓ|î¿!B\ÆŸöÓkÄhNkìtÙ¨\õ7?i•gç”ðÆ5žªÒBéÐV?öx¶ÅBÆ%ƒi’>ål½qDuJ´´¸×ù5ü O©¬¬\Î:žeG>ÙYRmÑ£MxÙ¤[Á.˶ìíYþ/jñTæÕàs6i¬F; ÅÊÞãÃLoËFÏB<Î5Vð{T±Ÿ ƒé$Û•–+¬Õ<âˆJŠåP«žÂ|ÖNhe(P1 ËRæá9Î0‹œ:Åx|¡*”MУhÓ–BPÃê£{Ê©yJƒœeíÒ! {°ã致ﶚD¿{E£~;?mhÇÆ›ô©¦<«XÂ$±Ç­3¤W›qÎ _KÚ.$=§û$ÙX'-l[bLR!ÛyHìðÝb?d5ã³–.PiÏBì½\:nBã”í,ý¤OÂûÂÁ¡#²hç´IO+Lç÷cåqnÍïäÏ¿ª½FÍÊÓgŠ1~\î QÚ>ÈÝ@~ÆJpq§@*bÖàù‹I£Y®½«Y„*#躺¨ìIxÒñ©‹-a¹èÑK”î$f…ñh»ZП¢B"àJ,Ú51quOB¹&KâM”­5O#ÐùÐÃûÖ©HÍÿ)h[™ÁÍrsiI½\øiåòî .ÔfE©ÿÛå ‹á ÇÓN@JãËgÑ=‚xžÍ–ßgÊÉÁõã¥Ì_ b,’$ r}"*ÚüPåE«Sw¬Ôoüd‘g/ÕÕžÂnĈ!qmxOš­7Û™«%&÷`.%}ýæQ-íê|Îs¡†"'mîDwÞß´àvóÕsCn|Ìk$¿ÆúÈIݨ̇ŒÔì#*Ù$ö|þmB(¥•t@ŠmÜ~]á¼:g‹1ùÿ8ÇúkÂë–<ÊXp«ˆJÜy`<Œ”ÌZHsùÝÑè·Ø¹õ›WǧérÞÂÌ>¥Ø‘÷øÛ•Èã*¬<$ª_d •,¹#QÞä/$w™!—F³ O)IáºÛ†Û²ŸœåÝ‹{šÛЭÜk;pÕŠY87.˜ÿ ­oŒÑ{;å~pXT‡g¢K`B×7 Æ_ÆiBŸ~AúV‹¡þZn|}¤±yç2d¿Í‚$ã î¤ù¤W=´¶iªpn/,#^k´ Ò* ­C ¶PòèuÊ”ü€VîOôx!beÇ/˜ ¯[ìW„RÏ©v¢1¸¶ û»O¢FƲ¬Â$R -(ŸóNòU+±Ó0ÎŽ{žý zØ Å¤#ë|ªR›jø4 ÔWŸ'tošÐª!XT Æ«Æ^Kd÷¸_jÚá˜ÀýC‘pû¸x^´¢1cþ+ã’^Ö@?V © #ô‰ng»qnÐökbÙ”zyÛ Þk·åu},Q0D÷ MêÏ)Cs Fí¤n“iòÄn‡lEdI ‰03œ³ºí›9´¸@BHÏÇn£?¬M’Û+–¥‡Å«n†wˆ‡%ÿñqœ*ó¡ùÖ„>·úì|`÷ckh%~e?ÿx9Îv q ã|õœæ,]%2fåß9<ƒ5$&è¾73 ïÁ˃–îÑ-Ì]™ÚþóÖõÉd§¾ÇT‹,A¹!鈜×ÍÃ…!KêùQ(‘õÉŸœÀd÷åg/(°^¶rÒñ˜v^ãÔ¡|·Z“ˆ=ÎM¾­‚geõ³‡¨ÊH]wPËÂg aT1Ûo´Ø³±f³¥häŠÔ¿8QíLh¨ØK8J¸mƒµ/ò'f‹huSŸC©YEª8qx@HüÜ5®CÉÀÿõ«6àð:SÑž!îR=)ÜE²Ö]ly÷ЦQ›ÙKÔV÷Ñ­¦ùf¾½¤‘6½´™ø„(> ?ëÒn†JY°ÇHf”NJôúÿSEioO ômWXv=­VN‹[ :Ud8 gAåmy:Z; P àeU!èí§Éù2Çò0¢a¶ØþsRAI(: c&¹±P\ÉÑ’ ¼=X±­?¥OoòÐÇöJ\—%G#“)$h+{¡©$ê3ÞA_<;Ëcs;d2&ø8»?ŽxÅÉÛ-Ê£eñGÞ^³-‹vÆR’¬8Ljb&áZÞŸ¶kvÑ^š‘‰-ˆùsF¡‚r Šýý™¯¯£GËãq‰ÎL9W¦¢¹ìRyR]5ô“£hg(°3mÜ•R{«ë•SÚrŒöäOJúŽˆÃW‘þEði·”ÖMÎŨ5 ;I³ÿ——2f·¢/­çœ$è‘édWJ˜…„‡$zd îpw˜²60«Æ?iÁ!|NÛT){2/’ÓÒ΃b8ߊkìL4%9¨ÆSýŠV–%ëŽ:ËÇ­Šu©°ã ýH¡‡œµFú¦LζyÍ#AA˜æÎ&,¨Ò­K+„×Å•¯Ò+¦Å;mp³X³íÁ†a¥ÞofÛ11> endobj 323 0 obj << /Length1 1668 /Length2 9425 /Length3 0 /Length 10513 /Filter /FlateDecode >> stream xÚ·Pœé-Š· A¬qwww 4 ‘Æ!Ü5¸{€ ÁàÁ!ÁÝ-Áí’™9gfÎ{U÷VWuÿkûþöÚ_ýMC©ªÁ,f1KCì¡Ì@6~€„’’€ƒ…•†FÓj þKŒJ£ vr¶†ØóÿÃ@ ‚>Ë$AÐg;%ˆ=@ÞÅä¹ù<üllv66¾ÿBœø’ Wks€ @bvF¥‘€8x8Y[ZAŸÓüç@oÆòññ0ýá³;Y›ìJ ¨Øî9£È 1³C=þ‚^Ð uàgeusscÙ9³@œ,…˜nÖP+€:Øìä 6ün  ²ÿÙ * @ÓÊÚùO¹Äêrž¶Öf`{çg{s°à99@CN â¶ÿÓXñO&À_g²ÿî/ï߬íÿp™™Aì@öÖö– k[0@EZ‘êe€ìÍ‚l!Ïþ Wµ-ÈôÙàÊAi15è¹Á¿Ús6s²v€:³8[Ûþn‘õw˜çS–²7—€ØÙí¡Î¨¿ë“´v›=»럓}gq³÷ú XXÛ›[ünÂÜÅUËÞÚÑ,'ù—ɳõo™% àbãåáàe€`w3+Ößá5=À(¿ÅÏøx9@ÏM€}¬-ÀÏ?¨^Î W0êäöñú§âߘ[›A¦`Kk{Ô¿£?‹Áâçá;Y» Øž¹°ýþü÷Éè™^æ{[¿Íÿ˜/«ŒŒ„†¦Ê›?;þ¯N\âðâà0³s±=Ó•“Àóüàóï(ª 뿪`ûÛUÎÞ²ýYíó1ý§b׿@ÿ×r0þLòÌZ0€þo’²q±™=ÿŸ©þ‡ËÿÃGù¿‘ü ’v±µýCMÿ‡þÿ£ÙYÛzüeðLZèó(Až×ÀþMuÀ.­ØÜÚÅîµrPÐó"ˆÙ[>“™ÈÉÂÆù§ÜÚYÚÚl®j 5³ú“2ʵ~¯š­µ=XâlýûnyöbcûÝó~™½{¾?œŸyù§ äü¼lÐ?ÆøƒŸ×éßuHÙ›AÌï;7ääò@}ý3âxŸÔìþ³¬,öè³ à¹g€Ä õ÷˜ùx¬ ß¢?/€ÕôoÄ`5û/rXÁÏ› ±þ-dã°ZþrX­þŸ}¬ÿ¹¬6ÿ€Ï¹ßý>'·ý/d>#©ùßÕŸùÉjÿ·Åsp‡D>çvú|V;ÿmüœËÙÚÒîïhÜÏ œmAÎÿ(ø\ôoÈþœÎýø¯#7sqrzžÉ›ò<ÿà?î=0Øl†º0 1´©l½®#qcÞDÁï“4|P«rûתOФ|Ú‡ëêÐ&ÓÍ-®_DtÙëv1‘†aÉÊiT ‚í7¨ñn•Ø«ýC‹8=dä]ý·N_Cq¤H%9‘*µó0ﳋ]Ò^z™ÊàŠ˜÷–­0$]W+Ÿ[mžQ2:öd5õ *ÊÄ¿OËŠ«úg8û9Ä~Ï8Ö!b?‚@91yÇ)€³­÷^Í­óÇdäçÉUç´KîeÙÜù1©öÒôò‹°ÀÀè™Gz»aœ¤ÔšO•ùïq“ƒçBÀ‡{;åÈNß˦7lOu„6tlz…âó9OA´—/÷£L}Ù‹?ö] /ëî®Kt"a\å¹»óžt0ÔðVY-góü Xt«VCªFYšUÿH sZ ¾Xµj]¡Ìq†nw1>‰±­:”©'VÊ'gx ï›ÿKôžúr¬éýJþy -ZYwø(¥—·ïRþ¯&×B܃FX…¿;<\ÓÊVbÌf›ÖÉŽÍä⑈sÔ=YÛo…^䢸¯qï²wo h±áŽÇiÙD¿êý’«’;ï—‰P™=‹«®åÚ°Ê Ô'”N%ÚÏü9æU“ö~HˆÖŒHw#ìÚù$¥oÏ5%«¥p(°Nç²%nkðüQ]´ïRÜË_!Ê—pÜtòõí§˜ÑKÍ1T’VñôèÈ,~L‚oRG¶Äãs•51ÓŠœ¨¨FV¶š——ÈËXž©Ž×DŸï …y1 €89½‘ ­UŠ”¶HäUߥ¯ˆai=ˆV)NÏ.|3h»ãð@ÛÅ” 6ñ—q¥{‘^9úrLjd0e;)xhÅò$P­…FeV놬@qÁ†ÛÇî;õˆôôÔÏë‰I²ëP0ò•ªAj‡h}÷žEËtÙT*•ðzck\;‚He¼•„ ”À&^7Pšæø×#‹¢7±Ùž§NáK06à ŠGÄ ã«Ù¨šÐ$¦¶ˆ'†tìhoK®¤êuw T…"oy›â½” Ü$ª‡' af¤'é$sO¤(&ºƒoÆïÒ· Ä'»ž3mÃ^½’j,çé @q ?ƒ+ÑZüà§s¥ŒÀàIüfÿr†679T×S¹«9¬Óøº¤Õ/Ã/&¾¦¥æóЬÃe—)5K‡æ—  tÙtú‰ñ‹Ñ V{d¤m“úf­Å¼» 1}Ç"Ž@óQ€"Ú'•'Ž_^Ý„ªµ²&Bž?ÒöXKˆZ1F-R0­µÆjiŽp ^obiT§g"‹ï÷ÅÕ^Ä][¬Ði™CkƒH!KNr)2Øéý(|E²>*¼KjR£±Û²-áV -Ñû›9ƒU”ºWôvñ.Ñ%S1K4ŽPÈö=fX_í@ŒÚÊÏ8!ôÎ;‡áý%…`>nįõ=VCZ]$qêï9È/ì¼g'en7Y’À]ñ|Ÿ®M9£L¾¸¥(¼K|ï,T;é«·€'ÑòE¹Ä$9/™c´:Pü:#¨¸X‚#2sª¥çXã2q‹@Øž¸]'®ì æKJS5)åú-kmåÎM 3ïK“Ñ©¼Ä5þÜ]ÌÙì<¯Þ#}JIƒS´®›äíù3*pý¯Ñ¤¢ Çz' ²!ñ¨{)ö…ëkϯ(¤¶5iÞß ðB?“ïMeVZÈ"Äyò*„Ñ]³aBk}Eæge/îË§Æ¹ã¹Ø‡ÓW®à ÇC)h2Ϋ¡7ˆ”H /y/¨š÷fZA«A&^5[õ¢‹BcáfïÔ¬¼}ª,u$@Í¡²»âP œ]f«¶{¯I5=e8fn‹Þ3ŽÕõ|ã"LçÉ- X4eÍ'ØÙªt½>‚½³æ>?”൑©ãCÈŸ>%™¿Ç0wûøÆ -)8ñB™v !àk.S†/ÀL×,.¸–5»ܪ4Êz7Åpj ë霯æ\˜rKý¨ëÕVôÀñ±§Û6ÄþD¼í%¿Y »Ós‡`þ¨q!V< È¤ÀNR£Q¸-Ðìõ³a‘8hßm2¤«Md€ž½ªE:ñ>Á÷âäÅý¼Ï˜ÝNB×—cìm)xõN7Zü·TZh„zkúÕ3IÑêÈè“~{™‚#˜~]' &°y´GÎ8'µõ¾â Zž!ιCšîXè“#90M5™)¤ï´h^LTsݦmÏã ν ô³3mŠçôåðQÕuwh‹ÛÒ0˜‰>å"o…ft)ÉOeGÎÍà&k[¡*ÂFp@Çút§`M*dÍòÂÃHê2ÚáZ¤HH ªë·ÃëÉ‚nŒcÓ#,ÖMgþ~¤tÙØW(‚‹Ø¨3â§Ž#¨úל‹dDÎ1F³ŒZλkO“oæ±ýÃÉ |ý‰:õY’‡ûPâ}òGÞø±äÌè˜zã ¼ÐC¼qIž'Êë°‡OêOPb‘«ló¤ A¡³×úêDñwN)ie«ŒÌ˜¡E—ž]ÙFQ+G¥¿À=|)‚ïy³¯Š$$MÛª|ÚšAŸ§‹Ðµê¾–nÑ-ó’=±¼«\Œ›Ö2U^½)|áÅ 71äÍYá½(íî‰I­±[Bï Z†ç½a/ µæ¢i4šJ0/ƒ?TĘ4êôyF²Î¾²«ÓÀ>Ïi—¸†EîÒd—_M£1±&²£ud_¬ÚOƒž·žœdJþ>ÀÃŽ7÷ýCuˆ~Ї/ã“ÝÚ5é얫ùBÏç=réÀBlêüræeÚ:³Øüšˆ'ÓãE¯…ñQ“,=¼j] ëM4áz({ ;›w˵«0ØE†Éè$OA·k ”±üW_´•š)Q’T²áòi#Ë6U',ŠÍ.èå4µåIƒÀ’½ŸWVçtë“Þ߯ÐÏvÕ³î”^²ÞÅ^X_Ë£À§ÚvÎ8qXôpo"Ç¿iªõMCdt7”‹\$ûþJá. oncnzŽköižM8s«ÄÓ±¹±í¼Bì0ò”—¼~ÉÖ²^«G¹~Å¡wýøiŠ"Fß`A [n|Qhdì% ‚É%;©£N[שA4{ÆôžÞŠd£>Q調âÞÈŸÕeã³~@"‡Ðg¬¡À¬” -Ñáw#ãÌöÐÚ½úhJrY.C2ÂùžùâpÑ…²Á¯ØAþI?D2¾ØY|‰ãôö§(ϬIî ²»],"‰¿:­¦.]>ãD•X©~{T»[‰ÂQN5Þ 'ö&K=3év¥,Ë[:«×ª9d§]ýB•l¿Ÿã©.vjº%?±2{D+3˜&‘…º§‰çì½$‚u¥öå&LQW Çæ¥\ëÌ÷"17]LÄžÄc¯á‘·ØJ•Üè]ޏÁ`Ú›)¹ùãÆe=u1m¬™xyB©<ØôÆgRIOXð?í«W‹»ƒU>d]U©Q20Ëɲ"Øh:9>Ÿ²†Z™/ÌRER#gU< ™Îw‹“_×?¬èp1¬ñ“³}v\Ýo*cªüö{…}¢Xj-¬8Û2F‰»°d+OL= ÕOEïwl°³óÙæ$sÒ¶5Še;'bêhç•CÎ:ïÞ±²[ø®ÃÓ2Y˜zžÉ涺L=>&j–+5‰¢Û³Hý.@e«-ÿv „‡ íÓ Ži¹ïØ-0o ÿ2?T"À1×Ú]%Ó|?µw¹‘$[hÛŽr+wRûú®%!+”nèôüÝ Ç¥vQ,µÑqõˆZÚ­ÿ2ã¤)Ûknž£-ÝDþ„»ŽáHœog”¥ŸŒV«Ó’ÖC%ÞŸn8ÿRiKÕy ¿!#šþ:ޏ±cÜþ×§M|ZA÷ì°ÂŽ_ã0ºàe¤üîÉB¦Çæ~僶"@ƒÄ÷eù†ð7îMwê:Ý:DzªŠ\†» ‚ZìÐ>±=0*F!½GSçÁ¾v§š/,—ƒ‰²Ñôr›°¾·®ƒÄ¹QæC~år;2$Qb÷©-È’ýˆ4¤q-L;2ß{ûþ›xEëûŸÑE£õ„º1†º9öŽéØ›b0'gñµ‘–¼É˜ þ”%Šêm*˜ŸÁg÷Ø[ßK i!\ÖC[ñúH;ص}ø -%³1×y˜‡…ñùl¿<±ý“«£[1å<Ãä6Uzi%¦iù“ˆÓ¦¾Ãåχ¡ïCb <.­JPŒßæâؼdÂ4€®SÙ‚•€!}ãó~„þÔß…;—Ká0ÏéÑ%sÕQŽYE:ݬ\Ø"÷§‚w:B³éßK}L&01F³žÎÞ‰US§^ y¨ü}ñƒè­O%IMAáj1½8ËUjÐí$ýƒö1·¹¸ù÷åUMqôkf(§ã]JÑð†àÍâýL® Ì AkØŽî“7‹KCæÈ†E˜•ÝjÏâ­œ·jó+ySäÞýz‡/"L˜§í¬UÅñ¯Ÿ”ÇFßÕðFÚ½öÄ4j$a•V¤ÞT²ïL#Û è}™‘;qZ^‰^T1a'¤ihï¤7N+$Ó8£hL ÈN®X ål-¬‚#Þ£˜ß3f¹ÎùˆÂ¡Ýd–­.Š/^eEù”¹V,õ˜Ö;4j­‡'~?¤ÁáBܱÞG8“»Èñæñ—ü–õ¢i¡æ,-~@QâE~|°§ÎE:”ü~rñq¸×ˆ¼ðè ;¸²w4±/mŠýT‚øéÚ`&"%•d_webôÈ0ÙN|d›ýûw<±8¯8¾U‚ª¥ƒ@éfXßc}.)ŽY˪€·Fp>]3~ïüj¾2!€‡VÝœ²Qñ«¿ß‡-NÉÕ\“!ôiÑboê‡ÍsÝ¥UÃ>x‡•o•ÇëŠYÜöls%V’ºYçòXãÛ¯4Ïo1¨ä¾ÎoËu/”?ár°ämŽrÏK œÒÕ“žÄ÷50On!Ød(É¿8Ï rc²_wòS]c7Ú1XËbÉBL¯e#Žû™ˆÏšÞôºï޲µµFÖGϱ](ÁZš¼-¶™kØôܱŠÖ‹‰ëqlŠïÙ™Ù?Ë®=£–@î‰d°§LÀ)û¡ ë;‡5õ¶æŽûd÷Í÷Âí¡æŠúÃj†‰ßƒwœ¿+‹*ì–zÁj¹³2«àÆèg.Åæ7oK-zLigVû,8“Ô”µ]´°>'|¼£ebMV¡˜‰DÈ'¿à¯©0 ‘ž™Ò¯É¢"¡HØJ¶q¼êA¿­Ž7j©{ƒ?ίcêkIÉ•§dÔT}p‚0`R1NMÞ¢/pa72³ÃºY¿Ä°›dMdU¼,(ñYGD¹Q2w‡4çÀð»ÈÇ×þûÎ8×dQšKñì"Ò×+Å:Øï³.eFTosë£g¸ºW׸ØsŒ§øæÐRÌý›G©K÷ „4ûl,ßæ@W Ý|‘‚PQ}¹ƒÞh¨ý4ŠèYºÏ7<ϘÙXÆ ‡R|V:âôea²}D¶H€ubþÈÑDñOôƒîœñ Š&©_fægï¡ñR‘»´’'”]Va‰¡¢k«ý ²(ãÂúNV9ï\)0,Þ|ÕŠ§·ÜøPTó‚]\r¿U5ž#ö… œgÄçîe)|{mùÌ$!g=Åï0”¬`+<˜†6`ÒÏ5¬jHlfd mOÉz'ÒÂ;ÑØ æ0Œí˜¡¸‰¨È¹~A!%Ñ0”ß–\ˆgðwébˆ‘ôv‘%c[ª®æ¥Ü¼ظæBÀ.¤P™¶ äHa‡0¿s7õŠÐ^´ \×29í ’¾èaòaëÕÂ!6b^Î"tz+ä Uø§Ü.ýeöT˜)+:tæ{Í‘íàòç1è×àBøQ'Ä•º÷‡‚S&S€”B›~×/mÈ’õ¼‚Û”«ÑN¸Jb ØIÓ•)á*oq¶¼¹ð0°øÈ„¨e‡nkÚ-L(ðLIáu§p”ì‡þ•ðE܃œùd©“„}/—6L Æ3Ô²üqéÊ´7Nʧç —º¾ø/ðΪ¦)LXØ­Azƒ@ïÎQæÕí’÷²?è¿…‡»úU‘}ÆÆ¼p×BÕª–ZúæL3N^X#¡›LJ~Éa½&R”ƒl‰Íê E~éN ç. ²Ù­§^Ûwˆ» :»rXGNó± ´ZOn7^ºòÚŠk¿Š/÷« 8AÚ¢ÆyÙÌ„Á¸‰ö1eî]«8pR?(ÕÑ7ë†Øæ©]>¾Ý2 øQn'òãUÚzLÃîh›Ó{×VŠi@¢â-ÈéÊ ?X3Ýf\hR²›1KšèI´'¶ÚÑ/׉­?j¦%t‰(ýcyÉ‹¸ùŸY”¹’~*%7¦ò$p,·ËwùX @þŽÐ¦àK"³s銱oã¥|¹ŠXìw—U„e"Þ~¨¸1éñ] ½©‹F#uBo&„Þ‡rÓ àãYb½X ÅÕ—!©bE#‹ð¶¯XÒù¶c·^a±—í¡o&|¼_ãXý$2,ADf¶UÀýE#Ôì–òRÚew‚3K,?ò£z†ªÏO\Ü´Œw£‡Ó1ñ¡§pW©•)ê‹-©Ø>´Ò<Ï›èA²-ÒïпBptùÒkJÖBþâ¼rÍF0!t3æŽ2·eì\ñÁÞö¡kè[^<ò´úl9ýWea›ôßLŒ«Jq‰q¤bï©ÐÍ B|}·’¢¨o0ºµEû$ÂBzËln•T ¬ÉJÆ¡j¥|ÖxåŽlx\W=° Íùó‘F€ ±:¹š´Ç;…Ä@½ÐQ9IÚ:Ò÷¦áÓ7&apûU55ƒ îøÒ4å2I.¦Å¤ðÃáÉ<"4TZ!z W„‰ÉàÛ|N¡#!¶O#bánê6×½½Q&[[9?Ô1õ,Xh /ÕbV„Ö¬'dwÆ$RN„àîiÈ%¸=Èòƒ›°Jw³†Ó'pW‚.²'S2zŒòvµ •†VÙÔst»yÂâù´ d²pÕàŘ(‰ïð»Ó}¾lÖeò@¾Jµ8“írž.ÕŠÃ)e2-ÇÔ ¢E⿎Î=žŒRoÊ5s;|\M­éÉÜ™&¦¹™ŠO,í{}Ä›` ûÖW€‹a§›¨°°9”„þ0êÜ8JÚ¿}wÿÙ¤&B—MNúÅ·TÙ{ú"ÃÙþ¥ë‰¤O±IÒíÍ0™­– (´gÃÈ?Ærª{XÒaäa¼dwô·_4”ë>‘(š‚ïà˜ÎtlÖbN6ŒŒ„(ø%O[õÀ«Æ%jÊÈ äE*Û5<*ühêpÌŒðüÕáÖ49Ñ ¿9#Ä`ÒƒÞ?ÃÛf?D%ùi_6H¡§3ŒºpJlHa QQL‡F>¿r½,çtf•=Ãëì_Ex±[ÒBCñip€ÂÙBðü:èvBa.M50¦–z[UT‚¢hÁJlXA?÷AôCbÊX“ÕÄžÁÛã×/]®V õ|ÈS&rÄKíä.æÑx7¹pkºEåÐRÞeEÕݺ¼–ßkôw]£- v]äÍ– ÊêM$¤éràë~êJãäî‰>g&uÛ®è¼1åšmìß´°îjxN2ÂGðòcœom›ZôõÙøâüë§  ]á7xÂe~?çÛíï>/\ ÅV”Î>ÆÅÍì¾áMë4 ´]>V ¦Q+àÏ._êÒÜý.Rðî|üZÔ;Õ®T“谣˘¢‡Á¶Úñ×·zÃoææÚÓ- ³„¢ˆ|È-'%!óÉEŽÃ'";VÏÿBzWˆ©^dû\ÀÛ\9×.Cõv^~áeH]›[>ö¸Lvbô É;†’¿–Ïëc³çNAt¯§z”Biz¸ÿ.9Œ÷M Bƒíлò:/î9Ï×Mhñr§lø:ËÐsÖKfçF–M9Œñ±üZîaCüü~]ÁB /~¬÷‹}„ZR°o NÖ#l'0$ë}‹ EZýú+tdÖô21ÌIÑS‡‘™f:ˆÇàÌùº¸µ£¯¯7-«Ú”Àù*½Ò1§„ë(‡Ï » ±ˆÐÕMOA¿ŸŸõ`°Ê˳›‘zñéÁÛ6êd3ƒ²{?ξÆ91aYCî†3’×.vXîŸ|_7ǹ²Áëˆ[7œ “;=NSénŒ§ÚÄ6Ö ì¬&' ZAA\1%9@RÍôjxEÕú1.”ƒ4–w†{YUt’\^Æì÷–HjáÖz½÷X*Ê| ° ‚°‘‡³Ü‚sÎäóC2KI=Gê@ WtiðMg€ÂqâYxËÙ âÙðÑ^…k(eˆëÒ¤â2ÑD ÛÀòÏw|tr³ñ§C1´<¦†ë4€ý…AÛ‹éBø[ oÆã¥Óz»%"!|ûKÒ/6Ìê€l ²Ÿþ¡dYóœN¯Cà]Ç%‚–£©À…ʢЇÚ.ÈùT·BåPg-¦: +’¤t/Ï‹åƒYïÜ¢_;lYø}Zì'3p¤öëˆ|Œä‘ø°Y¨tø±Ûbê ”¸â*Ïgü8Aá×~Ä–R‚£KÂ6™ZAoö-ÄϽNÌGëK‡í,GyB1Ç<48¢@{ï’Lö&Fö¨TF{ïÇø …›õ™B~Rf¿»Å’®JÛÚk’õï›x'ØRÌìWWÏpN•NÛ†{äÊ:~à EPtÐo"3JÕqsØ!ìÕòѪ‘HyèGõEÊwÇróöQѡβw'u_’ðòô¶dž88¤õY‡Òµa0¡É¶ë›S‘qB/%眜ÂíQÀºOŒ‘o,»=Ús{FÚ…ÕÆò`¬övQÖºªjvýÒîÃ{"»I&÷>æYl,5 ­d馶 ö,5¯âÎFØ–Ÿ0¯ŒÙ–•]Cj:Ïwwõ­hœ|&t®žÙê›ÈËðK ˜Ä#³u¨_Úóšvýí=žUl2{ )©ïþ¦­Ó©7÷9Š8ôça8š×†•žWG£ âw¢ÌàU¢§FLNÆÙªx3$ûȇ‚oÇ}H°!°Æüó ¯6N¾Šô þú)Ÿqä^Õ¶\ÝÛ›ÀJëŠØƒrîRç.ëMYÀL/¤†‹RÝPËŒw>}xÂp-M7.qý° â/¸k¾ØŠ¦ñ3g›¢ÌÕv.wB³Æ[æÛñUÊCëDÝEf :eè{¿-–Lº4€–4”4鼟Z”¹ƒ×x]PSAý‰>iAÍ'¡4[ ¨Ý©=Qxì"m0Èê;u ¢ïËrò6w¿ìjùºÈ[WÜ À‘S`º)o£ÅÈs¨mR!ò0޼bfÕŸmTͺS™2Ó,±4x†>O”†0C ©]I£t=ϯ{w únâÓ´V ?‚o_­&}…K¹m²ñ=‹¸ssÕËð)ê­Þ0¿jksÆw£•ÚÖ¼bßEØ7ùþÊ‹Ph“]‰Xäª_s¿J:£ÔÌn÷ Crg°""ò±ûÝŠ ©ÍÜœög!šùÁ™^jýñ‹‚ZšÂuŒÂôí®H%™ÆXé¶Œ¨è } \õÁ´f/x.ßmð9Ò˜ÎXÂÊùÉÖî—@:Þã˜zÁ®¶;Pu…C®¶^Õmõ"dŽr½”³¼m0_ºÅf굉)êŠ*IJßÞ92Ÿ2TÊÅ@ìši^1¯¢FãyPˆê-–„¦nê%KB­ ‚Ódžêã¼_7è¨Ú`ܤÆ=äT$Fø´o¦%î$ºb:Û茶±Á0P–¾l72øºS›mÜAجAA{•Tã쪢w¯Ÿ)¸o`“ÎëÈÓX."OÞñä©KÕ[4fËÅ?§–»-ÅΠú|¡Y%|ð9ìHó¤šÚV·ÃäY¢ÍÏäÒµ³ü¤1gT‘ßæýJ_ÉŒÑ%‡5ÞEÚ§üõ=`1’ŽÂàRTÁzöln4VJ¯ÏUn'4^ì­ùŽ,Ú՟Θ›ªÝ®2çœWó~lÌ;ŒÎUë(ª)»ßdéw¦º^Kº÷û!•Šb‚`âžöò—”¬.¤lØ(˵`þ«—vm‰ƒ+‘¸ûþòŠ—Ž@MyÆ|.‰Yœ´/Yï>‰Ý;/"½¤*Q:÷î)Ð{bŸJ’_¥}ﬞÎ}EŠ}éaøã±þ(Udq'‹PZWà§Gë»Ò`•3ŠMuVcmxýèÁ Ov.{çÿ“Ù2Änkߣàb+¯¿0QXŸ4º+ûUµcm?¶YŽ|ùãðW‡T¸{1 ö8ÊÅŽ´Ñ+«d—13D¸ö jSæÓÈC ®½±<ÙÜ™6¿1åéšöl’ 9 )KïlvÈÑK̯Iªêñš¾ТȆ¹ÉˆÍél®ìû8·ó×BêMµaʃŒ‰<8Ó-·ÔÍ,¶~I°Øª-Ý@§`z*즰æÎDXy÷R·Ù: „5§ 𪑎r°Ø»qsgݶbŠ`Dn>ës¿T¼(Z¯ßEfv4"qò¡9JÆÞl×ήë—ÎUa9^9cŸ…'†Šs?šWÞfؘ†èÁk•¹*Ù*¼‰iþ(E£A¬DTj–[è÷l~.e`c¥VX*?GW¥ó’ØBøWã ô± K1Áz—Ç£¿°)©t·ø?=Hêý pbà…¾2vÿN=&eñ½Ï.úô|4a&0“Hsp=y¢ûÑ»vßè‡ØF¿Kû˜F)"L­•]ìB¬Ìmù騮7‰ÙÑcykBm„vúŠÇz)ݼQ—€¿b*ïW2Ò¤Aj©é:Õ²Äܼ‹¢‡¼K›o0œlmW”]]<”;;’/ïx½ N t>ÎN§w\ÄøxÀ²bÌ{Za4bovlhn§¸† ‚G¼n£b|¼ ¥‹™eÇÌï‹,(,ì‹/×wÃ[ ÿ¥+l‚ùËr®8É,îþ|‘~<Ócݶ_k+·ÓÙëc4§O{·‚C‚J+>oÅöá ÀÛÒÐÐU¸ã%7¢s ‹Ã*Ε:mÞ—° ¸s‡<õèÿ0§  endstream endobj 324 0 obj << /Type /FontDescriptor /FontName /GGCSTO+CMMI5 /Flags 4 /FontBBox [37 -250 1349 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 90 /XHeight 431 /CharSet (/a/b/c/epsilon1/g/h/i/j/k/l/lambda/n/pi/r/s/sigma/slash/t/x) /FontFile 323 0 R >> endobj 325 0 obj << /Length1 1976 /Length2 13123 /Length3 0 /Length 14354 /Filter /FlateDecode >> stream xÚ·Pœ[Ó-Œ Üapwwww `pww î‚»Kp'8÷܃kKÎ9ß›ó~ÿ_uoQÏê^Ý»WïîgJRuFQS;c”­3#+ @\QQ–ÀÂÂÎĆHI©v¶ýcF¤Ô9:ílùþEw_m@çWž¢-@ÎÅÀÊ`åâcåæca°±°ðþÑΑ t›™rv¶ 'DJq;{G°¹…óë1ÿó 1¡°òòr3üµ9‚M€¶E ³ÈæõD 5@ÝÎ röø¯4ÎÎö|ÌÌnnnL@'&;Gs!Z€ØÙ r9º‚L¿”€6 ¿•1!R4,ÀNÛÕíÌœÝ€Ž À«Ál²uzp±59^¨Ë*”íA¶“þ&0þé €•‰õ?éþ‰þlûW0ÐÄÄÎÆhë¶5˜­Ae)&gwgÐÖô7híd÷t‚­Æ¯„¿*¤DUÀWÿÈs2qÛ;;19­KdþæµË’¶¦âv66 [g'ÄßõI€A&¯m÷`þûf­líÜl½þf`[S³ß"L]ì™5mÁ. Y‰(¯&Ä?6s3€“…‡›‡ r€ÜM,˜§×ð°ýådým~Uàãeog0{ò›^ÿ z9]AgG׿ÿYY¦`g€1Èl‹ø'û«dö7~½|G°;à=Ëëì±X~ÿüçéÃëx™ÚÙZ{ü¡ÿu¿Ì’ÊâÊÒô+þOLÌÎàÅÈ `dãd°²r³¸_|þ;‹ üO,BemÍì¬,WûÚ¦ÿ©ØõŸ ùg9hÿLÉîujAš?C®ÏÂÉbòú‹õÿyÔÿ ùÿ›ðßYþoCþ¿ ’r±¶þËMó—ÿÿãÚ€­=þ!¼­‹óë(Ú½®íÿ¦jƒþ^ZE)ØÅæ{e¯‹ jkþ:ÌŒ¬L,ÛÁNR`w© ØÙÄâï‘ùÛ®ù{Õ¬Á¶ ;'ðïwËk Ëÿò½î—‰ÕëûÃéu.ÿv^—Íù¯küA¯ëôßuHښؙþÞ;6N.ÐÑèøzõ¯ˆàÅúº ¦ ÷¿&ÀÌdkçüxÕì0³sDü}Í\\f±ß¦¿7€Yüâ0Küq³˜eÿ WŸÒÄ `VþâyeªÿAfÿ Þ×€Ðkã?è5‹ÉçoôºõØ¿ûÅlú¾&6Y;ÿ›À `ýœ¯Èþõ]bgËú/Îkuæ4²½¢ß/ñ×1øCyÍlñ/øšü/øÚ2ËÁWEVÿ‚¯’¬ÿÙ^ ²Ú›þ»ÈWa6¯ظüñ¾î ³í¿àk»ÁW¶ýŸ½žeÿºXvšÂþnoñ¯j_?´˜þ_¥ýKéï9ý©åUŠØü_-çz=ÞÉèô¯n°¾Êwþ|ùWùl¯ç»ÿÿkLM\_çø¯·Ëë ÿþë³r™ .ÍÛ™ð[Ö·ßÕˆ¸1îLÀž¦Ýé°1NÀ;HNn$¨gg-Ë—I-õ³JXv)‰9Ü}ú¾péµ]OÒàÁqÃH"µoNb7ÿr9›èuKH6Ú ‘«"FÌWì8¡Bõ®AØÔ|@Õ›º®o1Ñ ³DŠ[.¤]©³»¦$K›WëxS͹ÅxHc‡ó —:gÓ&6h+Z?"U)ƒL^ ó1Á­úÝÁ‘¡U´~¢ž¨9×À3ŠPg4Iþ!B ¸j­Õ<”Çœb×£ t/ci 1Ú÷Ó´‰%q;™ÚG0~aÕ#6»w]òù{ý-ʳDׂˆ¸Pí³ŒTǾîü¬¯½ X•»"yÁ…xÓ[Å~&ò‰ø¸àB¦…°Úº¿ ¹I(¨þ`ËÊw•°@â©ÉCZ±0R¸3ÖB4YxŒÆµzJu¢Cjšô¾Ì7ªÏSiÐKö„ @ë=öÈO5}$Ýè*ÙÕ(úZLoäu «X”ª•]Es°ŸiE™~zP㺗D³“'2?ù»IÒµ’Y‡RÞE;MA`þ(/ü.ô#­±¶'™Ó£Þ%oõwÕ­*\>Ôóî¤+áÝ#³a"”×/Böeÿғѵ/¡hLÔ}F v1S2þüD¸ñK¥¾%“jô¦©½5ëýxâ/h…â;èÝñánÒ.T¦NÉ ažø§!G“KY²erN{ëP ”öíž0ríÇ>ì°£§«…ª<-: ü,F=‹q÷OáŠ}¦“T5nfvAÛzõ†îéMÊy3wÒvZ‰”àO£O˜ƒ¡í¡ê?pϼh,'™äÕt£¯»±È]B&·ôn%¥ÚªMÌÍ'…÷+€šÜºæöržáƒsßi“t°)õ¾]m¶Á~xmé²9ŽÙK©wW›#AÝæÍÒ W—ps„ð³µúPœâàö¢!B‹c9`cÌAÌÁj5¸2®¬§Úë,¾|ŒyùvfÆ54gÕ ƒ:#YûQ{cùª¸•uÂýøÊöÞ6ýZg0ß2M¸ÆDl¥bãsÚuë)4[ nû·3£{’²¼7~¯œL*åx:“åmˆ ¦ìé,WÈÚü'Õó’[MÑixȬw(§¸6m^tj`aÀÃEøøWº«Ïf›X¸ Ô@ÉôØ¥Cå¹ï–@e¥û8‡Ñˆ¨]ßD®uuW²Ú¢Ò›…l¼ýÆ>™'zìJÆ¢ÄÐÔ¶­ìiG”¨Ò\m:SÛR笹Ê]|\ ËÖDЙGŽÏ¸+%‚¶Èµ•é¶ß˜ÐJ[Û!á“«)bäÔÓKã”,ò6«‘¿š. f@¥Þ éˆ3D0S`Ä’œYáv MòJqNôSˆîtÿüÖåÇ]Ü:ücöK­=ÊŽHîFy˜óË[ú٘☈rß®K”-ä6œ´ ²`ò4[ÒÆŽëÂQ ÙNq ºZî'Ç;’Ñü/Ø\¸!Z"Í>Š6,GD‡ÊyÐu1¸Ò'ê_Žˆ]E9Eù“»Vö×Cmc‡zN÷5(Mì%'!QÌue&(ã¦æ1RSE¬¾yùè\Òµù{ý¼wŒ7¼GØ™üD!¥ƒªˆ¨n-á ”–ÕfÐÓ6Îø i ü„gb*‚#EÒc³¢,ßÑ"ØeõÒ51 çî„¥WMq\¡—iº gÃüë >bDòÞ5ƒiÃÉŸÄV¢÷nÏ^Ò—Û8íò•íC±dhjâ@w †2µ$Dz¯ˆ´Úb‡@rÚÖÇö;Ë×u¿Æ!º³ÀLÊL‡ SÉCØbŒ~yª)]ŽÙnÇ $êý"xÒoC¢´¤^ Ç׬ +Ð7ˉÊg÷Àú†'r^1íó/0µØ5{—s[nÔŒÑ/VtÂêÆ‚ÍP Øy›…ûh…mÏV ´Á¡}sIŨmˆZ—Õ{­l{*î÷¼+hªv²?ŸµR`bÙ>ûcï=4$•þOÞµfKÌ›R±Že÷ðI¨jZ®ñW—0gU7cÞý¥ŒIö‹îÒ'O§Ð娳áü„©áö¢Ì»<±­ëJÃîÎ>ïLÔ“7e´ˆ6‰KU¦§èÚ| 1x{,Í„Q´è4ßw*D`FúpqAíóôŒø;é§ÜÖƒ9Uì˜iñØö*m§%ì-侚MªˆºY 4©q¹“NÐè%êþG*Æ:…ÖçI+Jœ:„þUì“Wkòj®óÌ·QõÐF—ìÏ0=³4»Û¬åó+$¾½ž³j–¢nw.U@rg¥‘‡ÜSØ)”âÀŠwß“ƒ0ãÕ•³¾)cåŠÄWvE5¶l{ y±žH ”Á¥ôÑFHÉøûÈ1Ý}!áðD]_fíLÚ’`§€²Âc`9+ÂêÉl”ÎóÀä–ãEÞWƇګ¬©:6Š÷‚+Ò‡­>8ˆù’Pa†W=}JÒÿ¢¢¡­ïCÝʉòõð`pY<Ç3;$pJÓ²†Õ Kèd•W°ow×ÀK|·(Œé<•º)Ù˜Ôø®ò}dßf§›f9!ªdbç¸ê& ‘WxÄ#>~œ;6š)í³ò~¬Š´V_ÏáiUnà)™­Ñ¼`›ÓžM:~áø%nh Zt¯[ÔBž´ºH ëj_'j o¬µ\ý‚a¨¬¨Y:NÓS‘bOk\uÃí¬x©FÙoê1«8ÙuyÇý>pí±ÒIâ@¥@ç‡éX#ů š¾1btÒÞjˆ7:€ÑŸŽ¢þú|0zÒAº)Õ07•nVË#Ö?`‚Uø¤i``-ƒ–eèä|€dFj˳†9Î(íÒW„YEðG^Šë<$tuj wÛ”ŒåÏUhjóßçý 'óT<TǬvÖaÞÌ*Òj9ó: ö°o‘ëô­åcs>BU:s“Ø>Ê+CwWJÕ’P±tSm­‰EÓX♞…gLÀ#—‰áJη„ìšTÁªÅ¼ËdsUBÿj-õ=S“„ºyÛÃ{wD"ÿc‰à‘¨VWÊî³Qï{'ÄHäˆdÊö«áÏ äN.Ȱ‚™Šá´ãIzPÝú^u­GŒöÊÃ1S­!!k>éßä _†T©4‘ ¶‡†°ß0#µÌñ{$ç?õOð=¥Ò<(“®ö¢NïÍ«”–³Û q~ÙÂâbÁuÈãÞv–ß_Ívña„£HÔÒÂnª£¡ó µè‘—6ˆZÐÖ àWéÏãDáíêçS%,§¨»¶Þ;g&Ƶ“½cvfV H¬œGuk[¾¾G qÓ›Âj“øæ]ÓpM† /™NXæ= ~XéК³dÌ ¤y44(‹&á3ò.zëÒü·G•Û ùfgõêföa‰W¦ßA“íâžñ‚5դȿÝôL¢émžøN·Ú§«ü®äXë;éCóÞ}KC-¿C2j1*ü®sÜ£2%·¶gâeꉥom辶¹®C{ðÎÉ^lŒzaJÃú™ö8¦€ÙÜX¹}ìD¨PG>Fá”l@ˆ·š""›ˆoí¬’ËïM:À(Î Q’Yª¦’WÌÒ:Í["`áA Ì¥¡S~™àï˜L𒇇ž‰ç©­Õ`éˆãÛ-ŽQÞn’¸g‚ïTÄæüÈÙ»Šö^h/Ša ÍVß_%éà9&òñÐÓÁ‰&*A|›8„IºÛؽ³è)ÁñÞ’ò tñllƒ¼MKä_»?¤6ÍëΛ½tGî­Aó®Ìnëö¡^×gGF“m>m™iì$R=u}ì4³0 &—‰²dåÂ9ù‚À3‘ÕÐÓ¯#’„>™U"TéÔè(fM*{–—ÑzeÑãú3ýO.U¦ÆÈ`Ézr’åZ<’÷¾2(¦!Þ­T_ÍŠÄ~§Ôã;´E™Yy8+T;éԢ沄È`ÑÇÇá"¥—|A¤ÄRˆúîý@ì`íV˜úÂ}áÂÈ@9þ-Ûš€LÕŽ6€¡á¦›´¢¢ðg>DÖ Ò“LFÌhË¥*_þð'"L¤}–ùŸ_$¾³nnÊó ÀÑ >Ò\-†ëܾC.o¨eßZdÔs’YÕô £ÁÔžŠ½™Â'ð÷Vú,NŠèÞD¶nQK£³’ÂÂw<^±™tk!}‘:ÈuÙE˜©I»ø¬ ër½¥áÊj —¿¶W°¡}ã» DÁ½àCéü 0*8xc ©Å¾•Û¤ksNîBÞ©`´úE²X´Lè ćH4.jõ¢4ÂsÒTª4Ž}†Ûje¢ìpMÈCPLE+»|˜ ’Pñ9ºцF°ä=‡Ã?=b—‘Cæø¥â#áe2—Ä–“¦Ž~‘è@õÄÜânNdJ™1RÌ‹©ø†`Ÿ’Ž’³3ŸigÏ/ªdT+ÁÎì&Ä„‰¿ çÛÏæÈ·„À{æ¨j{Ê¡=?ë’Ï/+t.d¸Šc÷\i ÛE˜\ß U…,Í®ÔЊ¯ñ5z~*ì /£4`ÌzÁ;¡ @[ÆBÐôì––'â4±Qœ² 2áÅÙÕ{)ÂÐÞàÎ\Ì1šö±cŨ7qŒIƒiR‚ÃHE†èxK ©ˆ¨ŒœpÕ^ÁžŽÝÉ{†¸Á4TCþn㬰梫?+‡WxÚ µ¸+°G@t‡äWç·*gö•ÆŒ2‰†Ñî£ Ϙ<ág ä™úÒUc‹¬œˆa;«‚äŒ({U}´lKÒý°ÍÈú¶¬Aù·ã†+žøá&_œ6cÃ’3žiɲ§Šjùù±vn0½ÙŸËT‚™,ývoY½~>Ê~ ÝÄØ“&¢šUV”atRÐ ìë@UoöÄܧD<8& ÈéèÚUtÙÊ6³Ó«†ü'n<6Í5„ʯî(îÞW¦ ë$zI°8c ËW¹>jG½žóZ§-¿g¥?`…‘ sPz‰yA]š”©à¶€çùÑ5rÉ  ˜d”4¥ÒÃÎ'ÃûûÓWY”Òè™­[зTG+:u0ëN3Ý®¦Æ ´ÜúÏÊT%>àföùŠðøÒ$‘=ëM?ifcqödÈ“ANsJh<_"‚SÓ\ðIC­¥,ϪýtpUÍÜÅ·Ú“uøÞ^fQÎXû'·9Œ6/=OÛæ¾KD$8ìlî^˜võL;PÀá¡¶6[཈IKãNö†€ÀnŽ¡ÔÍÛ_òß(<ò@ºT~ô×€š¸4ž.g=Y‚þÀë“ÿ+ öÜïm(Û ölyœ†(Fe~aûÄÈ=qŒ­§°B œªP(’^Px·ºâÁfðçÝ=Ïá™Uº¹¸Âl,âÌâ/²’ÉÄϱē֘äY‡yp¼Ø‰bþŠ–:Ý~‡ìÓ•Ë5C7G¶’x­~FGN%ï›0Æ—s¾Â×)U¯Ï¥‚,7™$öGÑ]Б߲)«Oñr®,MÔÓLÉKîíÞ8!ë9;òIh 苇å; 9¥;ÁÆlô`A>êòù™vtòæ¹TâÃkdûÖTI¾EunÂAMª*BŒÿâLèc®F‹í»^³ ¸ˆû|›zÐûš>”V?&jóp‘³Ï{û%Vª2ÓJZíǪ]Ñ@cÈÅæJ9{"{¿ÁwmGôô„…8àõí.uËÞùtý5sÌKî•T¹ð‡S¡yœ !¨P=ä_£@‰¸´ÓÅÚÆÙÏE˜L‡Y¶o‹÷µÑ)]³©¼^Z·V=lFŒ7#MQœHÚâ¤k'ó ëlÈœEb1XnjåÏ8=T¿ªª)9)ÉöE~ÊMÔÆÙ k§{%óÜ÷ÐfVSh cxž-X,è´#{ÍÔCÄPa<±jiÍFû”õIýçIÀ¤=™H'»Ì¸·êJÈ-ªª.95OaÆoÕ œ>~cn¡Ü)—’ü°ê¢jùIn0çÊmÜp\¾Ø¶éºÏ.ħƒ30Ç»*Uv “`f’,èco>ë:½·WöGk+>u„~9‚!æøÁX¨“÷cB«n‘ˬ]ЬDn”—ÕNÒL½Ho/E0¶¾´ãì‡q{ÏÏ Ûvš‹žn5õ'Má,‰LˆÙ&RÞý/þ|1¼˜"/¤”ƒµ™¢¨*A —{µ—h¬Ûûo¾ÔfôÅÈ8yr_ûŠÖ£­Lƨe3a‰Ã]ò[<Ñ;j¹cL'84W3dEÛdÖ¡–¸}•¥¼ ‰¸‘£±CzU½KÐDô`Æê/3tæpE¶æë‹ÕZQ<›D§>¹£²ÀÓš„¼$ÿ&ö‘öp¦Ð-¹r:Ú¿Ynò§U;Sgï&3)ß`bhÆAU ø-n‰?ì¶>Á—ŠOTC2“û>bß42MYÆOš¼ÌÐÏÏXx{«)Ö8†%xæ9ÎÃïÏVÞæãÂÞm•ÛÕå;UE~ªmŸê€–REàÿøúNeØÂÝ•/,ù xÂþRWG2,þY¥ŠÂ r5ÏT»ã__BX`›X~³Ëâ¹²>æèMGu²£÷Öµ,´RØV´P ûÆ›’çQ¼†µaDæêpûQÛ–N„Þö³¸Z„6Â\¼žC<ľ¸$7Ú—¸H•9ígLÿññ²X”•ìí›è¿XÈ¿N@ºŠ_Ú+ÒÙžÙ,AWuX£/É|ËžÆkñõò…¤CVKO]-„-Ç.òIwš^ÔO¨úƒŠÜ8Gé®5xí!ŸÜñ¬mfÆ»¦Fо3dêÓj¬Lë”:zÞ¹Êlõ5è¾…œü ÇW“ç³CmžÏ:ôÖ²æs‡ñ[Ÿ•ô­j}É¥H¿m¾„yô #LBÕ;e€K¯j(«˜BxÿÖŽ.7~EJ2š3!ìŒ!T7tS‚ã~j»n¥^!„Liƒ·cysÿêcofÏ Î¥Sà~N‹F+pû~³ß^Bqgö~–X´`ò{mGÿñå—ÕÆë»´Ê¢!s§0)þ¯ã5ݳ{ Œ~Õt,'†‹ö|0­¶0e8úu?ŒQ!ʶÏî ç&TlóN*£—Iü´nØ¿•ºošØ¥É^²ÜPì§å€›Ö§Ã\‚¹Ã¢Z_éÓ Ëhý·ñ;›ò„rÍ÷§rc?_WMÀã…©8Ε‹[$'P~üs;«oˆ¯/iÕ–Ô~bR“ŸK`ÑNc®Bn#¡F–½úÎ/ɔǩ¶ÉbãÕv _,/µV / ¶%üÐÛã«4Ó{„½I [Í!¸ŒÃ¿Oüù“4”é *f9¼o›"«B'8ÏLÛ@ÌÔ”/$ò RÌá’K<}ªͺ›–r†Ï<*´ó~yLjÏB´yÅ—ßÞÒx†^DŸºÇ­P} ,$T$ŽÒV“øvô˜Á0jcØ‘é,˜ÄûvWe˜Ç«þ5r¾Ý…¬Ñ‡¹öviBÆ“N,xAß§#)lÎ$²hìíî0¯!ìM®ÉÂõR¼ÖyÄt5Ä-ˆúRßMWùy„jMËŸÔyÿHpžÃÁ÷Yʰhò^ãê­ÄÖÛ‡5“Š~ %ùÄögÈ΢èå6mÉ7‰¨"sÙXôµ×ÂÞƒÈû7í¦…×^§_‘•7ÛS­YløqÙø‡ådwÔú305×/Ë%«ØßϤ¦“L}GõR¼9œ¢|Cx5°åÔh׿»÷™­ÓêMR†¸.ùãt^öb@ðiãÇ’Õ7ý梱¶p~\œœÎ²AhK—ô^É\¬ü`vyOü@¥ù=íËó¡X"µßPSz'/ÉÛ6¯ÃÂ+ùègÛ‰ã¢Ì÷ø,ÎÓ@¨½Ñ—BI¡ëÆé¦#üwLë àÈúLÒì¯ò·>¥¼¼—ºèÙÐßW²2Ÿ!t}Íã1žŸŠÓ îÏ£4igƒ±æ”y†cCÞáxz…Y&„]£=u‘ïc³¤”š¾ÐœØDŸÅ§J–(±ŒUþĉÃýˆ ¤'—bÕÇŠÉÂñ•ÇÀ~cãÝV|!Y.ò–I¢szX²ÉêKמ éõÔ'¢eúëNˉm[C5«îÆ ÖÄÄ2DÏÂ"ü=Ÿ«/*4Ü¢°M†^ {5á[ Ú×åòëÓzOaî‡5˜:Y¬ú¼< Ìj䓊Ký´~¡x[ì(¯!=›ûQ¢<¡¢¶ Ù)a5n u›~MIègêPQÓFÙ'åãרÌäŸ?î­ ±/áÇöBËZ©p'†×œ¡1!ÚŽËc5`ƒöœ–lÞìhX—?ô"y L¶°á÷šŽ¹xÞmý ó*]×vòò¡œÏV¶Žù0{V6»Ì®ÇÇž¦KÃ(K©ëwÇÝ ¥r lÆåCM¯ºÊŒe¯Í(—nµÐ7÷Sp¹L` µL¼´ÄhÚL@îÎ] ¥ÛÌÑEÐÎäºÄUã¶iÕ2H~ùë¨ÔPåM…saýh=!Íî>.LSé÷cÄ‚c Œa–Ê¥uÃoÒÛPÒ%ª‡?ýé¹…þ »*1Á²ÙA×(rI*Õ@øÄy,”ÔZ3–C»!«Á WãäÒ€ƒýlÌi}Öe/‡¬*´ÁƒiY+¿ï—Â÷•†ûºœ¬eœöœù©tAÇ"v"ªRQgÚÏÁÞ:#5› ÚEtJÂÄ9¤…Ûü;Ë¥õÚÞ®ÇCâ’¼/(KçÆe0e<„,<ÐTKÃ4bYdV7$œàØÌ¯Iccd!¿˜aýÌ¥ž_°‘·ó1Û2Ú·ÁX¡ž’%g›Ê…Á)ùÞú&¦Á»ÔóÇ»”¼àÅF¨œ=FT†óT&ÚºŸU);JÃ0k5Æ RêˆI„i„%¹¥árÆ×æUQUßá4Ã& ’jj±¥‚6eÎyx¤Ý¼˜Ù [Ž7©vlÝ. îÕxX0üvs³¿I—ðL‰Ù#”•f£š!Û HR}nGÿ¬güî(3rŒðÀ5•')ÅÜ_|`Q|_à™¾— !#‹ º´<ÇÔIS…øï6DŠ=Z!†š%º¾…ÛY S³6]¾#Þ<þîáü€êÙ9Ÿà†  à0xpˆk"gvzŒ< Ö÷=J‹tãÊÓ’zXÒÄs“)B¿8É1zlº§´µlÖ ]ìa2ócoÒð!³*û¡ F¢ðõ%Ѱ“1]Ö¶pé÷23½%q ›TxÃö¾ ‡†÷¬ôÖ@Ò'•.Jö Qf ýȬ%‹Þ§ÜZ’wèÌômØJ¼5žz§#¦öß̨¦á@OKÖçpa¬Œ,µWçczyN˜((àm•ò¿ûÚÈòZÁ dºÓ±´Ë@DäÏ*—/š¦ø|\b §r™àEElvB¾ûqn†Ô¤°5Çy±€:ºÕv~¾#žq{Rîùã}æ°”µFÝ“íá¨N%ÞCÞZ3þ”‰è‹jÞ_µr¹í2äÈTé͇J ±=^AGÒ¡,³î[›ÍøQ3&b5ýKƒ®¨’Ïi-óÛ"®ƒòüŠÃ,¶È?yšÄ¸¾i¾ @Ï>i)ÒüypÇ}Ô¾¶a_¾Ð-š€Ì~W´å iò벂g¢jn ªg–±W´×ö,Ãô+Ú³/í>ʤ‚K“ “L¹&ÌœÏô°Ã³ù‹‚!µh,ó«BŸ£ÃÕÖ„0Á­mN6¿(Ü]5¦x{'6Ü ƒ\vìWÅp縌DÝyK‘O4#Èüç¼ñßnR¼kgh4Ôhµ²ïšµæRÉE$º&D÷6 Õ×øigEÖ +g»JÂXëIRFس‡ÞÕ…Sÿ@`Gls¥à—a÷@Ýõ=ñj`nÑ}™©YÂÃËìŒöø'±2 wvÄw÷ŒÆZ0ÑqñÝßj0©›@¹Ëqtêŧèðá…ŽKÔ“6¹j!ëØ[eéòéæhYb ó»U³ƒ´”tHÀ±u(ÇWW:¬cLàR85[ µdË âOØwx6S›¾ÂgJˆõŽö©óY ñüpÆ\ÍFÂ*_æ³Ü‰t‹4S›¨!IÖ}x“ P&…[ò¦ HT©ïÔeU<y1YC¼ä¥&z?› xÎÙQ•ú QØ?í*¤°F³tæ=·!r´‘]ÓbDÙ ÏdÃ#ú$—ü4ðéb.ÉÓK%ªÇˆ¨…=e/‚OâTÐâML=h–p&õ:í´~îv²‚.&nÊñ‡¨Ù­cy[>ÖÆSÆïTõ=#ïø÷×+¨R÷¦i¨é!Ê Â#Hå3+ý8 àfy-nswê¼Cúìd´šYYؽӈŽIˆ_KP¡:Ðãwlc­}‚¨}Ž}‹Œ‹õšÉ¢J,hV‰®£6‚@ÍAËañ»¥2o/|šÆèÁžʱY”(Ú"½^:]XIQרÔù°˜3Ski/}L“l¡¿#c3PÁ¶8•/_ÒÝ0Âb7ÄgÌåi#DTCÂ/CzXÏM¤ªÓ©ç¥d©+Æüá]ÀÔ=ò&=!òÔôã@>FŧÏ?Ti˜ÉVÌTüË|íÂmÏÈÐ p¹ÔÆåS‘üw •>vÎ-·$ÍŒpJYqÔæïª…†@[Ø1på„ÐÉÆtÓkòí„Zn\¦{滆èÿdN•aðÂjÄï¶‚YѰ5§Œ5a€@NèmQŠLMé “’ç´·Ÿãû+‚K, o—¥6Ýwª™#•á jckzø7‘Øà +fn›d!²øyN#{ò¸«×r~Žkèø vQéu¶nE­Ö#SÓ^6¤Ár†g¨û»Ô '¯L¤J<:–Ø®&Ô¡7÷b‡&5Mèùœ¬…%7–;Ï5×ø‘±€,@„) õ¶Wõ–cˆ©¦S}]æt×xòWƒÎ 6–é\®Â_ׯÂÒk’™?Î=3–D†°!?Ó¶=xQÞï7HVo—É=³4l§ÐÏ8|X)%Œ2gŒGæYy b 8©³zNV³²§xïêî1EÌy©ôGWG¸  ƒu˜³4—–týR¢µƒT,ð:Xa8ÀvKãš‹‘ûSáëFdIÒ¥åΖÂ;ìÛ)Œ·d_%|ZwC¡#ƒ°\ÕŠÅKÕ]ŸER¢vcPýL/É,º%Å”ˆJ›jS“ïIO ÀG¢Ë¿¨¢{æ$Ô#x¬Ñʺ«UÞTý`Y*™…5®Ù¯ AJÇ×õÚ{skì‹#¢£íÛ¦Ÿ”x«ÙxAŸ±ë®“©0.Äœ>6½+LÚ5?ê´Í’d/a4úÎ6ø„" %Á…×€êkEŒMüÆ^§48˜ÞSתYi-Ëó€T¦Öu*Qh¯É+àü¾,î‡ã×ïdýXOÚ@,µ\}1&äð¤¶õÉÝ|Å© ž¬»!fd'¸E@{γ¢ú5ë*fÉh‡¢ÐwÑ8œÐëF„ï‘Ol½IÌ0 KÛË- ¾³˜!ƒo\àØØ>kò1!5¤¦!ü1é›öë–ämF”LÁ O΢š{HÒk0yefqÀ »ïÕÆT"ÖWTì\kK$÷!…n9|¥ ºä©sÂã Òv;j–,oòI²µr|ÚXé:U Sªéç‚é*w«ŠZ ‡oE õø` ñ¦€kd ²ç»Y¨‰øµpÐZ)Ô-œ$ìvôÚ8,{¼B·=k4i†¼)ÛjÝ_¾"U{°zkùÁ"ßßZøÃ^ÚäÁÛã¡ë zø¨«U…‹}ÊõË&G,»yÒŒ.¨,©Æ!®ÅÛù.WRªÑúü„^œY™vjÊðÞb†Ž±9ÄÍÕ±2;Õ~½ eú]‰´ºò&w&bJ7mëäÜYE›"äÇ *ˆ`$بªäÿ…´ð< endstream endobj 326 0 obj << /Type /FontDescriptor /FontName /EDOCOG+CMMI7 /Flags 4 /FontBBox [-1 -250 1171 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 81 /XHeight 431 /CharSet (/B/C/D/I/N/O/S/T/a/b/c/comma/d/delta/e/epsilon1/g/greater/h/i/j/k/l/lambda/m/mu/n/o/p/period/phi/q/r/s/sigma/slash/t/u/x) /FontFile 325 0 R >> endobj 327 0 obj << /Length1 1791 /Length2 12400 /Length3 0 /Length 13562 /Filter /FlateDecode >> stream xÚ·Pœm-Œkp'Èàî.ÁÝà:Àlp×àÁÝÝ‚;w ž àvùd÷ÛÝÿ¯º·¦jæíÓÝçéîçô[54jš,â–æ@0„…ƒ•] ©¬ÁÁ`gçbegçD¡¡ÑAì€Ã(4:@gXð?$fWLÊ ò§ì(¸Ú8¸¼‚|‚ììNvv:8 ¤ÌÜ@–eV€‚è‚B#éàèé ²¶¼ó¯G½€C@€ùÏt€¸=Ðda(›Al€ö¯'Z˜Ù4,@@ˆçQÐ Û@ Ž‚llîîî¬fö.¬ÎÖ" ÌwÄ t:»-4 P1³þÕ+ @Ëäò®é`q7s^;ìòšá ¶:^hÊ+Tà¿‚•þ `ü=+Ç¿éþÎþƒþ3ÙÌÂÂÁÞÑ ì [¬@v@€ªŒ+Ä 0[þhfçâðšoæf²33 ø³r3€Œ¸:ÀìµÁ¿Ûs±p9B\X]@v´ÈöÍ딥Á–’öö@0Äåú¤@Î@‹×±{²ýu³Àî`ï¿ +ØÒê&,]Ù´Á 'W ¼Ôß!¯Ê?˜5àaggçà@ ¶?èµ<:9þ€_;ðõvtpX½6ôY_P¼]ÌÜ€ˆ³+Ð×û?ÿm¡pp,A€9ÐFù‡ýZýe¿^¾3È`Àþª=ûŸ?½ÊËÒlçùOøŸ÷˦§«¤¦¦ÄôWÇÿöIH8x¼Y¸Ù,œ<ìŽ?DÆ÷úàûß4jf ¿Ëø\y°•@à¯j_Çô¯ŠÝþýßËÁøo.‡WÕôÿˆÜ‡Ýâõ‹ãÿYê¦üÿ)ü–ÿ›Èÿ· W;»?Ýôúÿ?n3{ç߯¢u…¼.€²Ãë€ÿ7Tø×Ò*-A®öÿ땇˜½.‚8ØÚîßc¹È€<€–j ˆ…Í_jù ×þcËì@` šƒ è× €åõjþÇ÷ºZ^_.¯’üÓ|Ýœÿ>Rlá`ùÇŠqòð̜Ϳb}+ÏUº¶æ°íܱ‚_‚yU^Ì¿~9?/ ²á’6Í£ÏM—î‰È݈£Sª6Η±oUâ³J•z’+}ÚæYú5D]È-/Û··X5iäi{'ÏzªS©ÝÏ“¯N±{Å2qØ8,Ú/pmy¸}]^.aŒ÷ÃAçî¼Ò=\b$ö»_HnD—F@v·‹jª¬xLÑÍÎ|²9Õ‰–„…}s†®Ö»û‰î¢Gwæ2y)ºÂeåÅÂ}––¤ ûˆjÄð#®š8ë:Uoé¡Þd`®ÇÒdì¯ÂR™tŽ4ëüz&–x«©u›GåµÕ·83±C16½CímWiXÌÝßâ‰N…µK ¥XÜ H»Ü|GùlÙ²¡í.Þ°BR›>7Ü<‡“ BìäbÇ™<–”Òel(2á¾,$fÙn{eŠÝ“ǵ¼«r1¬ÛÀ½-gØ­M½)%®ýyjÿ‘7){ÆC6Wo>„xÞZª@©¾©î£ù¹ù·‰—Ql¥£è2‹Öî”2<ŸãÜi†SûT¿:¨ OL~AE6õkÎ$ã`/õAJ}nÿaÖÐ|·”±1bs¾‘²Yù#©±±¦&]t„ÈTô’/ùÕd<Þ ©ë’ßCM˜›cžôòäÛ­Ô šojk‹¯³¢+Ç®‡4mI(xP~ƒ¤²nzÖ÷Ú“láÙÏ‚ŒÆpÓé,À°­mŸ[•Û ÝäF¾-¯æ¬¾úopß"Š˜}“´üBYáN9[½b<ÎÍ›w“ðó‚ámÆ9Ûi$’‹èÝ ìçL­=EÖ5EŸ# =̲£ŠÞfá’ú²Y(d¤ž«ô葊ta}œªì³:_ªxåÕ¨©í~ÜW´°$ltÍ'F¢n‡ˆ‘ˆÇi9i¬?›W{}¼Q'JevuðS®àì'ôÚpý”šóqŽ—1­±m ­|úEàëdɦh¾âg| ±o7ß Ï­³!•´¢¥;±ßú?€´ŽÜ;÷;¨s,U %[Ò &WT¯¾‰êrzò;Q(YÎTí¼u8òÛåÐa‹–x'Vûûþ„‚ýS^®ƒ×õÉÝÔÍPMå×é<÷ïß9Êú6U&O¢ò6c®‡¹ö§2‚èHKÉ–H¥Ãž¼7AÝ+R´’B%0æ…;m)ËÑlMu–¬×m‰ÀOÂwÃtŸvéÇŸ:ämTî¼wU±è)°Jnóöxð Æ¢nÚaJåãŸöýbͺóa•„•ökæ4ìË)ðŒ÷¦iGˆý¹‰›‰lVW}™v4jÒœ¹‚d:â šJlûÂeø§<8e’Yâù›7™vBUÞcݨôTmKïáÁ2Ÿ(‘¢ R Bø½5–>aõôkÐïšèžÃ˜‹?û+ú8(£šà,Ì~ÑÅÚ|&IèDóÜU>|á (Ï©5î¼1ƒd‘#‰©rå²eBÉü"ÿÜÄåIF•ºc¡¬¼8%; ÿ´nk_ñÒæõ-ZÆۮ쮜²WA¤ ·¤#§+Aâ{ Ã·¦9¼ "bÎ= Ü(>ÓÀÆoÁ/ìl—‰‚-ëTËd=ìT‚›ð¸…+"41˜|¯ŽE0tù[=§MKíåÊ-8ç8ÊüÉñy…8ØÙß&ñ¾%ÑÿW|H´)“71Ò Pýf!ÞDÌŠ€—‹XnSÍÌmÚ‹H{Ϥ&{wP¿œƒŒ±lw(»:N™iÈÜ1 LÈ{½l9°R ÿPGGh)·c"| »J•U5k ÄÜÁÏ_¾@|ÜjýÎðÝ–¥ÌÖ½¢Ì­V®ùCJB—N`¬½uUOæŠùLeÌ:EËaÙ|òü˜á÷§;3nu‚šq?@¹À¶“NaKñx!à“‹ñ‡“<ËØt0ºWBbeþAà‰R–‘Q,Öy™3jda^Y°›ŠTW”²,Ÿµ¼è™6Q|Éúíw°¯'ôGä8ÕÆ aEä½#µ‰ÕXqqÂQ·°Dÿ»<ÚƒÆ[½½ÅºåI(Ý•©½`Úî<ö@EÀ3^´<ãŠlžEÜ+‰Â?Ôï%.W8ŸÍâÉzaãѺ½áw­,Ë|ã(þÕ€;_s‰ÓÜý3“RZpª$&´!‘¯[G L¥ óÛ-bâs4,p÷ ÂÖÛ–E1^ç‘®šX;LÄÃ&É6YkM–m¼ù~þ#€žLü]3Îô)‡é¿+ë¥+ÓéÎ2åý¥ˆÐ9³¿×HÃ4 ŠC{õfŽì0{ŠKÖÂ0¶.‡ŒÇ·Ó¹Ã/›ëgû„˜FϫƬéLJ#*/?Â/ÅŽn=h™¤a ©×K%¬ÎÔxà=ÉJIŽû~H™¥ÕM ?ÔÔ•sQŠ5Ð9³BùÝ?çíeîéP—¢U.#‹ …¶¾Z>Wô>œ@ªÄ|Üdìˆ,ÊMÚÀ Á)ƒué.n”C“”6 Õù‘g³Õ9ÒOƒ§ž8)Sè ÖÙ¿=ìO]ßI9ÍÅÕq£&°(p¬ã"ðšÎt§’ íØyE÷NPåsáñ°ËìÕÐçfr1«à7Ƥºë¡´œÜîØ¥v^¨ûÔsœºg8uî롃Ǫæ/ù{”ªEÙ8£º}Œ2ØFëlE¦žeÑêµÈá#Ÿ Õ“zßÊ0–­´ðÅ«®-Mò•Mƒ Â4i´êUÚù⪑˜4RŽ œ Ó‡õ®pNôœ€¾µK$o £n–ô>ªÝÿF™”Ö–Î;¾|Ž>ŸU îžÇ‹¦«kÖW›Ä_Þ‚Ðäï¾$gt”0ðõÓv=æØL‚3ßÔýУ›[5ëmÒêûE÷ÞÙn3• lN‚UPÊÅGE¢OC©;È›JC©lT!õV”iÜ\=7þn¾Ñ þé‡bªTo„´jV  Ý:àýŽí¶}¦´¹Ö¶ŸÇø›#…ÚÇÙ^üåÔ% ·wðò¬¿ ˘Úþ®ôfÔåêÜ!×\Ì;Ás‰BR’<Ê›À‰U×_¿éøŒlŸŒºeîjí¢–bIÍ2mx]=9—N«$ìø»ÃçO«_zÿá=ëHr“Õä—g‰[0ùw“: ¯ªÑÙa¿9EÝæ:`~^v\-~ì{m–OÁO4_`’¼ú‘ÐÚ}™é–oOYOÌSÓÈïWh6LjåƒÄŠDdòäL7 ö»ÃæH™ÏAoÖ7ïOK¥7Í Âƒ¬nÕ<¸äBsð|~"ê>6­Ê’-àbêáPrIüæY¾|Ü¿ý.gH9[n€pË‘<™zbÁ£r+Pæ(ÂɧÐ.ñtÙèÂ{ÙdMÿ»ÔO"bPµÍ?‘(ë2Ð(H®A-`Ä‹K~oïYÅj$ŠtùaÛ{­[¥Ô¯!aLª!af÷õÈ£Þ$gQ/S°ŽG¹¸nsÿt÷,'¶½£ñ­É›mAèÖÀr.…ï†éçÓ#)Z]’€á²Ýõ÷­Ôr›Åãù‚ÊdÿáyÖe=’_bK`¼rçdL“ßÇàµÀ^$´.ÕLj¸ <‹89ê‹(¼É¾±Ièª5î§F¿,üÁ8¡S²š©“E‰ç¼Àþ¦ž5òê„‘χv_ÕˆËóügºÃš2ï /Øb„5‰èÞ·^ îBàjmÅ~âz”×Kӳˎ M¶á­ª;ÁÄ–}þ E×zž…)”%ïô¼´ë±S’äH|ßà™ þ‚â”°Øï4S(º5åÅ!©ÉÔM’¯ÆÑçGÑäœ@å*WHV^ I²£ÿ5ÛHDÖQßc³wTáQäƒÖ}Fú0ô­.m˜EÊ%Wné·ÎVs»Æhû~è?èû]‚€« ˜¦KÖK:þ uG1-4§·W2›M¤HshQ(]ÝrLöþNby\Þèm€&Ç €êr¶ Ë}Ü@=LɦLe/ÈOÓùÙÓŒ ¬¦'[:?%D&CbW:M …*Æði}sšžå6#A5³/¸yDJÎöcæŽ ž3^ÇZ2Ê>k¯ÈÊÔBuuî·_ªVìú…h“«©„VÒj.€ñ VÓ»2^é¦ÍCÍ¢y;òPbšr´ÉÂ/ðŸNá€n`(~œÀL™ ÃÚ2®K³Jq OÏŽÁ_³L¸YùçðÉAæß”Ÿ"¾³Yùrm&§ íPÊ–&cUÐY)»L#Α¿×Õ~ò}¼nlnÑëoŒ1F ˜[¤±¢ë:‹R•{A™ˆ%7¹kŠ:üX7y៰­Ðâ–‹^h´F…B½ŒX†±J'i#È“*¢IøDÚ~2VÓóK,±’09ͬ¢!€7UÜß"2쇃.tƒ2ýE‚3Ts1ÕªéâXÏÛvÕ”ËÇÆ´Ê´NÞ.çÉ«–b¯á1÷jV­wôØûs‚tuÊÙ»IG³CcÔÀ%›#Õ°¦™Í§é;Ž·÷o*ù]=ר/’×/“\Q¬|-œú˜xz<ý(žÖæ3ïßÞv£k3WBwAröA‚r9]ª¡ý«ôU&@ÕÀ¤2:]ÏNSø"®‡[ý,²‚áßõ{g…¦ËéÒÄiŸ¸-uC‘¡MyínIÄxÒ¨hm·4q½#¬z´%Úa«ðéŸe–+䆴³('¶hõ-øéC‹ëQúÕ“]À=+6Ý„æN¯Tûø²ç#9!_"~Þ½«ÉúÊûÆMÕ²®<&²éˆ·ËE¶è9Ôç­˜ñís”-îˆZŽJp¸Éƒ”ˆ¯#Ó¾U™µ€ 5é}É´‘Ø™òé’ñL«¬âµO9BûÐQ;Ü®¼³Ó™x —•xЦȵ" w}·ï¢súìx[Ïó©ÔÕµ`\ÌŠ%¢F!ì: Q‚õ戥,ž—a»Í¬¬`¤Ífû›€Á\±ë ’æ¡€â'¢¬~-ÅR³÷Ô»îÖ#‰MªÁÛ0Qo†‚ó=áäé“_:l1y”ŠËä»-}}lȺ©¼¤¶q´¿õÆ»·ëÅ0u>Uè Nžô+ÈàøzÑhç¿ ì~;mêz+CìWqLŽ·°~Ø6h¼Âûö”-ËsúÁÔì<»h-Ò z2Ót¦k\:+¿×¸þØŒìí›\¯}Ð…’Y¶¯íhÍÁˆØC~äžï€¿Æþ™n_ÚÚÞcøNK:G j ‹¢Z>Á¤äú¬æ+I9Û¡x=K5™ •ÓŒ.ssox@ütc<—KJ ‹*”ŠÜíóS eØ„&ç:Çû¢>ð4•B—©Î5l.äAÕKÎuI®9.XfkŽu²JÓQH@dÍU}9Í uÖÙì%ò0ªiEèaØ>Ëîi4 °Ë¼ƒåqèÂ48È’ÂdV¡-¡Ã•FÖª¨÷È_ÈÍMüž"ïÕ<[’9#8PyAEÔ|ß³Î^+\ÁÐn³¥»€ØÉmÕ*#Õl·ÊºT¯Ã`¬ ?ÍB v÷}bF ×Wi‘Æ›’„þ]}ƒª‡£lôê»>çê˜1DiZ‚œêSaöËî÷ú^.>¡A¾ùýJó š8‘…‚VeóöŽâ\gq 皨œýïˆ ê-›—2 ×êñÉ*I.ð-ŽWï0|Æ ]¶ÓƒéâÎÏ‘xUÝÓUÏDã n½ÌŠä>ÐÈ ¡ß’t6âã3PRÓÕC Ö6„µ{Þ ’À­¬ŠZ0]ÓlÕ"Ÿ¨´¯Ihò„Ý÷ÔCÇ”eQö-ôgÔ[jýèXß56/Õ@BX¥¯c¤D»#TÜ2àEF'î„ãªP8Wöéy †Ñ8·”—|kÊè‹Âb €æõ2³»ÀŠÌPä&fœTd!Z\×-ÔÜS‹š¨/“¥ îÇï_»'¨Ÿš—>ã\š’Sãë!¨&;ÑÛÕa©“Á–VNX4J–ˆØÎ¦Æ†2úÅI#¬Þº¿í·kcülçÇøqþÕÊ·e‘£ût)èô“ÜIÀ9qBÛì5æË«itùNÍdç?0¢Q С®å¨^¨¢aPy£êPð¤«Ê[Æj9ø½’XŒâ`ñË¡¸1qÁ"jÕšd³ dm|!´ ~_“©EwÐÜ€¸^âCx•½î*›¾Z½ÿ¦.³ù»â‡P:¥–¦MµÝÙ¾Œ?A» üAJFû ÜË(á¯Ðšõ® ìf’3>]¬²ŠVÓ™öo呟¶ªQ²²`±”·ö-rœü‹œÛu† ›öeE‘q¼XóF÷a‹øó£d@ÅÑ“cÑ„ú\û¸yù±D¿Ù5‘Kœð£öl5f“,bt¸%ögô;D}’µŠ g¹OˆËäKæn±åÂò|Ÿ¿b«±Â=j ¨XLÁ_À*ÙB’}­=‘Û=}µù™ …Ûèt½Ëû¢“Š Ú¥CI莒‹®ÖŸóVÐ)ƒ_ÿ-7F^G?!sˆêJ×0)6a`úè v¤zDˆÝÙÞTÌàã`{É+P·.—Í?r9‹/_y9Óè/Œâ‡Y(þ^~ˆ»¦wÐå­âÉ޹Aª€ ¼?Bi‹,ÔÎc¸$5u-ËygTÚybñ#½©mMûd²:v@õ1Èw:°µeÌwP¯´˜V¾MCHâˆD*“0óƒK ·RGTÇš(Ç×j ²8Ïîû`Ë7O¶×X&£y ôAÈ—cf;,9‹aÏÅ;ûü„u^îÍì…¸*™è7a aòÇNWÃÓY¸}'Ï ·©¡Ã^)}ѲÄ`ó7³-Næñ§léë‚¥£e'²¨*̦ñÌef7~*ßtFZ’z'»ëÇŸ¹œ>ˆöiŽùíw!œ ½ñÙÙµ¾Ž¡UÇ«`/¡j.^,u¹8³ŽîG³½£Ê¯…bi'°¼2õš›` 3 kgþ]_mDøƒ£4M"Žªæ®5ùSÎpÃz¸5aA³×Õb&63|?=dq_r‡—'ÆŠ“YkfÕ,ø#Eô²JÜZIçÏ•Y>%ê^ªÎÅÉ–¦´‡œ¦µ7èÕ›«“Ñ6{ÀÍ u4{Üü?LÕ·çç œ=¦1¡¡!Rwí,÷3ç­V?YT†˜‰ÍƒÈX³B¦Ù Ž®® 'Yy‚?tv›§g}9:NRlé®±¬>s—ì¨&‚h±`ƒâa¤$Òͽ~é¹Gê -Öë©Gð³×k1"7¥˜¢kÕ¦–@µ—.:Q2…Ç­yÓæWtñéÓ:à>_|øi¿”ñÉÐiò хǹ¿Wry=¡à­€ýÑéY#wLMƒSÑ\äiÀ¬ç·S¬Ý_ß‹˜ºž:¶`iMS…jßQÉÔD´Œ !lÈãpã±éo7pŒ:±žÂ'|Ö4iùcîuggÉ'ÊÔíÇÐ3釼K¡ŒkZh ÛÃÄ/ ŒÅùP÷f[eìwÀ(8_TdèÒ)þÖ´0VÝl媄Á}WîÁ~äØÉ€Ý…QžpÐ#âˆEhëƒ~ËïùÑQÕ5yjÛ&è£nuO–t߈‚½/bf —§ç \û\h§;ZñçSبX/^UŠ”xj L½©k¤CYb#DéðvâÊ‘$tÖ_ =Tz’ª²ö7cËœm>0J ?ßSÇå!ñ:B t¦ö3(Ñöy\3  0fV`óFaM r“•›3ºšlÉð^VêP:¿yãñMæe¾n_¦}±©)±Þ¾Oõ…O¾ýWÃå·:ûõýLŽ6mFäzü»"4ò÷ÊÈì˜] ÚÌãNä1:Â/*±mâ-;gúðmÇøîýó9“yÙrHvñQ C´G‚{£RD· wz)Þ)™•ÂIšlLú°S±}f&rdÖÁÄ¡ÙføµÖDx/ÞT 9ÇØTN«4ï$­öxÒ@6)Æb’1)«3rëweÞ½{Ä«‡st–C&áG¶w\Á]/Um$EÀU¹Eô4;Ê!Aô ¯‚'¢ûÁRíQuÍ©_»TC’íK(öbÒרF*Rß“[¾};[L •*"ȽÚиª¾Yêã0¹«Ýª¹:šŠîãÛ@ØP)‘kªƒ¹‘$ßG­-´s× …mS¬Nµ% »G `mK'ª~†Õ¤ì—’Å'Q+t傊w¨—ùCŸÈeÛ­ ¼\­v@Nkïtoqƒ:Þ}xâ‹ð •È÷,0ÄCþ2žå…2‹R4‡ ,›Oo—á'ÎKƒõé×WßÔRz,b¦`=’}ä ,Í›ˆhk½ ì…nçKßœ~êGÿ²+m1¦<™ Ç“zÆÝLùe­hê IÐþö„!½Ä:;/ì|r®TÊ™^rˆ,ƒ³¹ól=J¸aqœÐ< ‚4­æ¹^¸Ã%°TíÂÖ#•åÜ P#/trEy´RŸ’ÅBê¥ÇVÄýØcÚ¾}î!<¿W:‹dhKu®*ûP(”ψDÊŽð;‚‡M´•MĽÑp;ùÖNÕ8 Ìù$7;´Éäy9÷¢‡Ñ|ˆìgÚ½eoÉ÷–_»}曤£V (ôÔDz£”A’zðþª ‘y….*´¬»6ü­÷Z7tõeTn‚ƒS‘ ÷ìQQý§8vêË&s*2Õá„À6èi­Kúure:a0#'T(© #Z£¸VOkï‡-.œpj¨Ûiyì¨Â|£egãç1¨æ×i#^ºIXF¼OZ²‡oã®dafî¦Ë ¦^{Ò)7h‰ÝyÃ}5Ó²¥›Jç—âÓ"”n‚ü±…6½Ü ¦Š_"ƒI?Nb0`EÂÏ+—Eüϵb1J;3:È9ÎF¯B1½ç {BÌaBn1°{.™¨zžO#ÓÙíxÜΕîØï#å0 5Ü8ˆé•™Ëð)õîι8=âîÙ–Õ;Vº&+p÷:½_Jľ•¥½´vÓzx)ØÉ³· [Þj”0¶mê¾(Æ—‹íå@…•“ìOd *‘[ÌÎõhIܹ_Ó ÖR4®ê|‹`Û:CTçÁ6åÿyXSÅw– ?¨ráCõg‚«±t hùnÑ_gøË!Øy­3Ÿ<w.tìg³áÍÑ…?º”¼'Árý†TßT³p@²c#ïŽ}ŒÔàóý‡ g©¤Êpq»OŽ“£x¯`RË1ZÖG-³m®¬~s<éC ¾–·ý[-ÉrÝTôì!Ô¡ O‚ËìÕònÊÚºuIÅoÛüVž¾*›_Aez…>nÍ!»ôs«6¤ÄÞÝ©ۗ|¡,®¼aømt'’šü!g¾|\H|ù·¤Ús[À¡¾ ÌKãTé’qº^ Ÿm‹õo!6 @=GÑOŠF@âŸO8Çè{Lù4É@Qè9øó²iŸbÝ/Ÿ¹‰ÒüySÈ„x+2òz¦¸\4퀶©P«Ž6ŽÌÁUl\ë÷¾>£û±y4Åy„Bo`yô­v8RÇÅ‹#> µcˆŒhvIªàKRÍˆŠ² ð·®P¿ Ygô²EÐdyÃ¥Ñ0±Zjqøƒ›¥K÷»ÔÆLªmú‘—!ÿE–öÞ%$¼Œ•´ò$;fšzñ2ͺ®ø±²¸£í¤¬D§»Eüfv|/ÎÜJÂñêaQK;&니·?©…Ø¢3ÆyçÇ#.ãpõþ, Ü``? Þ’»„|Hn2"×uJ~^¾^µÊ¥óå¹ÀB(Á3šõ¦ÒݾPqZÂ;uë—ü§ã´Ð[7´qq–Ï×òjÊpÞãõ˜å›¤ 0’TæÈj({£“òRëà–‚Ó°ÖNŸöÓ¶À¡ÊV¥PçÉF‰íåoà_Ø­<÷¥|°ÎyóAø×R9 -øüQûgý%={­jºÐä…Œd÷Ãâ;ŠPfd¿ÚI ¸ êäíómùdÝÉEÁfÆäúyRÄÈ4â\wRÓR~e¿¥ÂŒçâNß»åKP+š:çf=`ûÉSi~Òý!fê&§?!Kí»?Nì0˜còûÐÊ¢×,ÝMì•@ïö(yœ,êå:I…D9¾x‘1ä>çár•»™9yçÈý4¾{¹ÚŒô÷.´É ƒßÞÛ(b¡=Ÿ¹·8µWi=oDZ#/Y’I\ ÒãO¡vbnF’’MëúÔì6Ó …ö%Ê–q3|¬1®>Gn—â\‡ùÕY‡|kÞá”îúânÔôú0fõ`Ãc¯BÇâs;–õ zêA‘—¼Ê°N…g•þ‡Øøç(‹Êtµ-[…ádMÞë­Ü  §A*‚£Á"ϧÚÉ;½Û¸éîND}ž\kSÕaÙH¿ù -5œß¶š'jc~ ˜;½ö½ßK–—ŠjÛJ"`OIbÐFk`~Ö;­ÒI o§*×~îòÏãícKE«êáO‡IŒƒ›JþÉ0`’7Þ‹]h¿¢žvàïÍhfƒÂþÃH¼=N(‚SAŒÊsHç€ï;Èšª¤ÔšºZ|Ï‹+ÓéØ ò€’Ñòÿ€ºë¯·`?Øz*ž¤Ñ½×O?ͳU2•Žîg.»,Ãwôæk Š6>“N~ªt æg˜íÐZv_\ÀÑ-IrŠû,re ?^xOþ´þזד=YÄþy[gÝCGgìWŒ”+K¸Ìò¾y•—Û+}ÒŒ§«è+ãî4þG–Ò†ZÛ¶9¢drÒÅJ¾Dš¬Òš*„á(7$gý/”éÊXŒÑÌd¦Þš/E²FnÞ,ˆ»G¼7ç*žDFS«Ür8JÜ›jéÑrQI¸6>}dÅVåk 3—T7Zòps¥a÷]aVéK.Á³*‹‡žºÕÙ(mŽÖ­?‰}|=‹·qÎVË4ËF:¿oK'Á}¼«$Ù\°éà°˼Á£FØKkUø|78¶ck½#3µûmHùÄó¾\qÔKC¼£kÞ™Ê:C{,XBnGÏ\`iüpþº„½a‘f ¥ú=e 3vL7L"Wì¸|œ÷Ä „ò˜-P~£­7#Ÿ™ÈUnjè•uI^{|ÛY¼C,»ê´ÃPѶŒ¢Îˆ1Ö0l#LTºµ×[dOMß4½Ìö>o[Þ¿‰Äj.ä±E_ê7î^ÔÀÅ„“–ÀH8¦ì1Í Ð ®X0Ñ~7à(l#$Ë×öE\ÍÏ<STUW!!"º˜+͇…`¬’¹–ƒ:2(/y ^{ŸÌ ú—¦8™Žj)µ˜!¡AcCb@ŠØA ©k™cJ»¬¦ ?ò‡Š>O'0Fµ¿¸ðÄ.€øç‚PB—rjU´fgïô¼¤;‹²í›ÈùU0½iá6ÍÑ[nf)Û=úˆàß Rßä%Šf[ðó…qàpöø>²d«“Rí2€Âô[U°^|mîáU ä¿dWBž¤˜Jg‹K—„X{Üv¦¹ù\F’Ûîa輚îêÉ`U¿ÿL.{Ÿ÷ý&´¹Oi®¾¹2‹ÁI†Ÿú@ù¡Ø?ØðŽ)Ô ËQ›[íŠÙv·É©ÄÙ¯KŸØòé'KΨkßþw®¿’”‰+nÊÌðÎÈ/¬£±ðäw¼u|—9ߨÁÓs<¾Ãû .ÖqØ…íÃ'àâ³ÌFߵ”Â’í’‘ôRª$3R$8Ý\| R>Ó 3mª!!FÎlºpåÏpÜ&ûAjªêV¨žD|Ù=­oª”jÂÌ3XŸ;& F<Šk{ƒ;ŠH‘mßpeX ÁÏ`Ûø¤<1šS~[¶“}Ó;{¢dKE9„ëÅú–ZMqg”æa:#7çÀr¡H¥3(™q\ã(¡/•I¢uÚ;ÍöuLØG_eY›wM»¬4¿ýå^éîËA ÑŽ^phãœÉÆwOÕƒðØÈæ}øÉnè>Ôʤ8 ‘ƒ|Vztõ—ƒ±ªÎåVƒòÄuØ•­­/ÁrúYn¶ Áà°#<­½•a¤ìx%4AF ëÊÑN˜JqZ]K>hÉbŒ_v×\}>ô¹áî©RçØì½Ua÷з0Èåç§,ïQ’.?^&vWh:5GF«c_"¤èa ±ý«„Ç#­  Ç«C·•ÿæðÂØÃýü̇*o l¥]¬‹*.Òå´ÛjÞÅjÎ6DZÑ/GßdÆ^BoÄù™Ì§¦¿Ï˜ÀKÀTë @Q[«f§ ©Ç<() ±ƒÓEùú^)¯ œïàŒfežjHÿ+Hu.R+v,Fý’½ç?òºÀ`,°‘™mvq8„ à?Fñ‡[pЄm½Wó{"e¦@ìMgë BâéâŽÕr%­™MÖ»)fcþÍé®Å¢¾$2?™ÄöŸôDi³ýûŠ3'ÆÒ+ºÆŸ>Xe|Zæõ?åâ.Ù”?ƒ‹RhñbƒµÖhÅ»¨êð¡²z6Ž$H¯éÌZüSª Ã’ÝQ­s$AêØ¼"Q¸|`¹˜S,R‘Œw´€ïl5,8^—ô"¸‘`>û³ŒDQhùQ®íJ¥j«È´~ °½çW²©ÕBÓ¢Àæ1”¶R ¡sV+dÇ-›5]ßÄ“ Ï>³Yþ“¼‘û¥äshJj)Ñï’[yWÑ63æt¤f´ÆŸ!Û,éÍ’Ë’®_¬Ó½Lb³é,¦v’g~3Q<4]DBRUd ýrffÅ}ècmB?o³£¿)Œ-ïzƒ†¸Bƒ×¡t–L8žëÍÝ?ÑÔÅ…Í®Ìiw=žMâú0óIÈÖµ2j½½®"Fóç7óë†e"öe~dôv(¤>…4XuºúJÃaÂË{­“ ÀoŽTÊER20>õ¯¦M ¼2ZÔ^S<°ŸxËÏ9ùÂr—M6<œˆmmÜPzJä·ßoÈ>:+º‘ ùXíÈ—/­Ú¸FÃÓúꓲa“çŪvüªfˆ½¾ú:ÊQÛÔ#P¥±?ñç‡T9Åj£bΔr¢É¸|Éh,ôP—ðèw[;&m†3hç×Nƒz7棵ɗ3+,ÚE±mý÷e”79+- }ÞNþŒF~îË{RÙ8cª\ˆ2m`lmEÑýà;ž»/çg -O(Å1½Ô »SÛ(W{Xzãÿ&¾H"]•«™¢sªÃÔœ[¼9yt9ê­ùáëøXüf¯ð³8s{Gùú÷£"²òØdC k~áZl™u¼Î‰“:œak†Œ¤M5¾M¶¡î(v^™f”Í„±]C¶Ì÷œ·¦l\¦›ºÎP°ÑÇÛu÷…Ãç-Ù*……Z¶îÍœãøÆ×úqZiÌ'k%AWoÏ'¦BQ‹(°œË#Ul·E@?…6ð‡tÒûèwýƒªûè GcÌÃÚuÀ„‘XÐÿKž¦ endstream endobj 328 0 obj << /Type /FontDescriptor /FontName /YWLPPL+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/E/a/circumflex/e/eight/equal/exclam/five/g/i/l/m/macron/nine/o/one/p/parenleft/parenright/plus/seven/six/three/two/x/zero) /FontFile 327 0 R >> endobj 329 0 obj << /Length1 1505 /Length2 7001 /Length3 0 /Length 8021 /Filter /FlateDecode >> stream xÚvTj×.Ý Ò1ÒH‹4HH‡tH0À3ÌÐ ©„t RÒ ’Ò Ý! Ý!*!J õz¾sþóݻֽkÖšyßgÇ»ãÙ{ Ç]]~{˜-HEð Iië‹„„D„„îpp‚® ?(‡1ȆA¥þ—ü‘ˆ@aJ@JMhxº„EÂbRÂâRBB€ûBB’ÿQ„yH”€^`{€¶@Á 8ÁÜ|=ÀŽNÔ+ÿ9¸íxÂ’’â|¿Í ØhN êE; +Àf!|ÿå‚[Æ p“ôööBà0LJ<|o0  ‚ƒ<¼@ö€_é! ß‰ p Àð?°Ìá ôP€+Ø…£ <¡ö êm€º@Ç ý£¬õGðWi»ûËú—#0ô·1ÐÎqB}ÁPG€ØÐQÑ@ø ø@¨ý/E +†²zÁ®@[”ÂïÀ=•ß_ÙÁí<Àn¸ìú+CÁ_nPEV†Ú?‚A (Nð+>%°ÈUu_Áßmu¼¡þÎ`¨½Ã¯ì=Ý `wOºÒ_(ˆàÌ„ˆ ‰KH@î“à/熾n ßBá_0*þ@7˜À•(ìBýøÃ^ ÂÃèÿ¿ÿ¾ ìÁv€-È %øÇ; 9ü¹£:ïö˜ ¡ˆ' úõùûd‰â–= êêûúïæ ™)›¨ñþNøo‘¢"ÌàÏ/,à¿/*„âªÐ€8êøo/º@ð_Qýc«u€$ÿ‹ªÒöú«ûÜ àß¾ÃPŒ¸ÿ!¸…¨êKøÿ›æ¿MþoìþååÿAðÿŽGÅÓÕõ·”û—øÿ!`Wß¿ä(¾z"PÜ׆¡&úߪ& ?㪠²{Bþ[ªŽ¢f@êèúwÁp°È^Œ°súC•?¸Ñ¯sCAº08ø×B $ô_2ÔTÙ¹ –ÅÇß"jhþý¤2Ôfÿkºî‹Š€@_T‹Q7Q€¿0j íA>¿ €Â(*½@€̃àW?…‚ª@ø ý ˆ A6üy Dm®î(7Ô¾€º‚ÿ Â¡Úý7,‚‚]=á("œ<@ÿøC¥&ˆð†ýc"ôyüþ•¬§êÄo2¢*ñŸûï½ù€ìfavÒáεámçÕ ÞüÛã²9¶M^òðû/x´{"IpSyª²B×<~*¤u“-o)sŸÊ/²\ûï5¿ÃhIÖk½ ¸²NÔŸÜn%˜Ÿ îÿP¸§P×Ç„ÏÈo(ÿ9àÚ=À8ij½Cƒ#ÏÝS‚D7ŸòÜ»WÕ§®¯|iôùì¶Þç*1M«ò)þX£‹’iŽ×¶Ù3´¬8~&¼{?|H§O~¤ÈýpË¢‘ÈK¸+Räo¶~?îbÆo¥Âð>¼“ŽÎŒ– ó”bt’Ó_ñkšÍœiÑrÿ¼O³LK.1_ú2?™À×û¯ªÀú/ =5^£ ï…?她ú)?%×”5RY{°êÜ©jµ~A‰¨q1}}ï ¸Hm¡?{W é4§hïÍÐ{JL‚ý¾„Á¸Àï Áç¹ù Kà¸r‘™%ÚÝ€ÊH‘O¶_¦Q¤þì;ÚDÐâ¢Þ ÇùU ‹=à+öÇ-¯úŠ8] •Óó^d)~Y!ÖæÇããËq/¿#Üã0$•uÉÖ÷ɰ‹Rz‡ŽªyƒBLuæO¦gäNt 6*{aù›bt:+‰sLbb"ô½ˆÈÚr·œqÕ–ÇsÆý_èÅ%H¢ÙS:žŒ9ê>ìØ£I½BÇY 㺃4¥r«b‘ÓjŽ+F2& ÝNFb?ÈÊa¬†3v/)û¨½pÊ|íÌg"þâ©°£™wFñkdR ‚<`Y:çÔ/Q êÉzHPÒc€äÜÝY?_kÜãäl!?.¶§Ÿ&ÃizÈÁ±ï¹\õQŸaGô”Þˆì•9y™öõõ»’Ö¤0Í3¼\:‰xì„§¶eEúGÄDH2ÇÓÙ”)$æ)U•^KN±>Ý› „ž&¸ÛÔRwº.ʾiVУÿyò$aDÉ4öÞúù$²v~«˜Ü2¬RèS¿’ØéÅ™h‘:I;[&#LêâÉÕeϽ‘E~‹»·WÏæÿùãÈ<&_…³§ƒªhöõY˜cÛÖ;¡ SãÉY¥½4K©‘g¬iÁûIV3¸K*'ÖºYÁ×.µ²'Ê_~ØzV,©ŸÔ?òâ _g0õÖ×Ëž¡í–ã?Ð?:l/Ÿ‘‰- óvùPòYE^h]›g¤5®ÖÊF„£Ÿ:4ÅÖæ1þ:axG§¸3¥jÈùŒž¶ýeƒè˜Óõé#þýfüC2Lñ§YƉsuIƒÇƦ°ÒÃe«oӎ夾¹ŽU˜é¸¢1Ä[lÖ…‰LF“jò®ãÎóraŽ´«?(fyÅ_|_ÞÑÖ-Ká]ÐÛîüÙ¿ÚNWPz{ð9Pº{nm•bUýaÕšÄÑ×5Ó®lây«@öFKÉ/üN]£ ^Ÿ‹†¿QŽÌÆìútì’¶ûðd!)lgH-}v-  ¥®ŸEtë•’w–˜nS7JŸ„,¹xމrX¿! hœ¾ãD[ÚŒ1¸Z,ªüœ•ûß<«r\R\Ö !Nå;´ÏžQè?8t†ª+,'¶³ÚXºÁ/bªÍ!ª›Ë#éäS[’q¿(nP}-éÛ#Ö<±!â¯u±;+7?²2!íØ…¸†RC{CéÊb+¥0:©÷-¸mPßÖÈ0·¥úž&ó‡;Údö…ï#]Jx^¼—ßê¨=t0¨Š}õ8êDü`[zg‰_÷l&Vx¬¢Ý\ý}Z­ÏS­ko Cê;‹ø’«8†lç4ÁtŒ7$|öÀ4ô†,?(ûz—óuÙE™'žè‹º#G§‚ÔmÕŽ³4²£»Ct\¤î?£c¸ãvH*áCA5ÝM·Dú.ný ½c û¦ÆŠXñë’;¨?^iŽ…]6j/ñ²jÛqw7Ì[NÊÝž÷¾& ûÜž{­Äw‘\ûXæpìÓ²ie[°=·Žuy@h3÷ 7%sNÍ"ó²báwŠýp>¶³T¹¨‰æBô¢¸ î<ÒÃv¿€¨AÍ-ià<\̬¯M¸?]?·°l¡Lw7'–XÉ}YïmËîÆ0îêÙª'¥Ñ'r;£ç$Íýж‚^5$纅óÁÖýa ¬•=·æÆPnà uP,&ö… ŒÿHëü0VEÎä ŒÁ§å$ë´Bó‘Ç+“üûAØÏíU›=6ÇBßÇ [«»}bq^›|•3¥¤Q«3à ÎÆ©’.ÔPïã­~¨x?·Ñ‚K{¥H¢v+H¿LåO*ðÔ¢/åøJO¨Îö¼¡ í¼¢¸ÓÑQZÒ%xÐ×n2¿„ǶÔ5ùi?¿S÷ì”F¬ˆó¤,Ç3\6,æX<•¯É‹¢ÄÍÉ;š&YóS¸þò;g™®Rft,{ýÔ– ÎU[*T†+{º‰FlšÚH‰›+Rµû'ÈÇÞ‰OÉa$oä,¡5Æ™4‹Æ•™ß-eö@@.ˆ4îÖEŽÅ,žÆÌŠgë²î¼ìšòù¶™„Ì.ˈâÉãE\'çN J“ð1tª6R©‰µ ÜŒ½›ZmµÅôŽºÑmrŠå h͇Ù#ÌN“^J4T7cNÏŠEo9±úˆ¦dysmi’÷\ó|óÔÓt'xza=Äzr®ÅOνZ¥ÐÔ«}¥ ;ºr=¡WØ0é´|DäoétqVW>ÿüìÆmËìcÄ̆ç$æQVè%Cë tÆËdú6%>ìuúÆÊÝ4§ˆÄü¶K:†òa²5‘W|$Ò‚‹ßVÑH?°y/ì_PY”“ì® <èO¦âÒÛ† |'vó 'ÎâIédª²:µ*|Ó¸3PE@qUѬA²^ ¯¨Ø±ÃÕs*;h“EËìLr~èg~׻ЖÃ:#%º½7¼‚si™ç¯XÇ=Z¥s%ƒÖƒ<º‰ä¥Ð¸·ßË£u<ŸÎ\YÜ”&mCÎE)Ò{gfKQ*üAÀHw:}2êæÃî¢Ñ¬ Q åñb5ïaž$#gÒ¸ëô3Y(å`öKêÜÎ@Jß·¾¯’[Œ¯ÓÇ惡Áyù0’7µCïv¿°’wTùßâûeš$Ék1éwy9Ub=uŠ–VþP}‡.͈,ªcQ•.y O¼esmµŸDáÁ1·Ú,7Óvc­ËUL*>¡ã’Û„(Q ãå‚Sš•Z_¿ÙkòFÛŒ æ"ä¹3zާ‹£×¼—Jä÷ë&‰tÑ|ßtñ1q¡Óžî;·´nÚIyÙ'F91v‚SßĆ~¸hÞÄ»ï_ÍO¨÷Ÿ2T¯ÐA^ð¿”9ûº/iʾt‰5­f;úò aˆ¶˜í¼Ö=&Š-Ø·þ|#²ôé>ÙWÔÅ$ÒÎuÀëûmýÒÔ M¹r7ñiòtô3t6cçàJöï1êéEA …ÆÉyÎ¥_Q}w¯—b‚Pº- 8<^?|k'ÛVôpøafº9¯Ø½}†–=íg{ÏfJÕ÷æø®æ“FºVeYö®Â£»¼—v_å|: ¥ž„G}–)ÐG.U WäCÊÊ’¥FkÆ)”ïSu[ Íx÷ö,UoÑ-›´¸Úû|q5ì³üì]e“Jõm¾mçú=7dYÅw»zИÿ*6Mé’•è>ž‡´+öRfÌ}×˲ݥÄîI™®æBeVa— ¶D圿ÑH»Éè"ñár‰9HÕ´K%žä9CŽáå§ãq_±M/bªÈ'yÞpò1ÀÙ”¹@fÊsY¸® µ“>dW ók ­&{3ýYÀ¤¦Bä^i©âLàÇÜL|å¥ß6­ oÕPõ‹ÒÛ`AœîbCwŽ‹OPžbWý™xÌÊk«Z¥ÐËJªª©ŽáÁ%û19MDtò»RQÜ}÷îg%Œ¥Âö.Ì~©ï¤=Dº`«º%lßš.«Úa‹ïX¾ÎÃp’‚¶"GâŽ#æ©›U»ÞM½»vqã‹m8ÜTÅ óŸn›ÛïÈÊeðlù¥.ú2ö1R5[:'i˜"ø×pw™á¢Çw“kÞ'› |ígGÜÔº$,ötpf…&ie´Îg‘ô“Z˜Cþ^Ž¿! Ì*Um‹¦eÆT§ÀF¾ø)¤IäeÀGÏΜËèf„Ûi‹ÙCÿëÉíP!*#ì^r¼ÞÍÌws$ËZg‹»ù²VÖ-ÛS vìÛ†€4^¤y1.qo w4ÁC½ïËlPcIlÚwù*gnÚ½¬O –Ű=ð7YÖ 鶯c®Ý€-«ÝuQF3}Î\%r6—èKšwƒõùŠùˆ>¾á<{‘LÑâ”à’rè'¶Á“G„‚ÕÆ"cÐø0oqˆÅ𸤅…É1ž)ùå­7Èîà«·–ŽÏk&K-sI¹X¾nƒ¾bEŒ}³ÙJAknL™½}:¼(“©Ý¨Â—ê&”‡!>ŸT¬IeråGÙ0 ‡gö÷ ­ÃgîàZ&ÒÙ)&L“;ðà F‘û…q;Ç0ø´§È“‘Xt:õj”’ˆŽÊE+}˜Ø©›O©¦ãC³oh¨Kñ˜æÈQM(Þ…G÷vI=wÚ`¤júZ×­î,Z”gS— }bb¶™½.Ç?ì©—xk8¥?Oh9f'õž#Àv0T(YiÓ’¤Ø£»Y,››Z* ÓeÓMá]·,º2p›û ¨ê­Ðeq‘îžâÁ\Ÿ75í’¨¤ÓpÙö!ji¥ˆ"–°úžùà/DEP¢-„”%j¥>ȘH ªwø¹=Oɰ]ùüNÂ=½¿`æ µû…œà{¨%Ÿ×@þ­Þ')´¯õîgC±Ä¢bm¼ÊpÓ|ƒÆ¢æ3qþN—VH6‘æ-=ŸHÐÓN;]¹3פáe¥×D}¦\„oÏ¿’Ìææû¯U9DŠë¥4ϸBëÉl;?[ר’!:·]Ñûí=pzh›ÎýZÈ@ù9êü”ŒTjwèÕ²ÚváN¾4zÓg¶é_óâ÷+U¼{òA—¦_: L‘ I#»‹{o|cIŸ%(<íø9Ovx$öxp…š²,V_çF°áfŸM¥M™Èüí¼”¶m2Fö-)n»zJs=ôûS’òµ…©A݇Éõ|:t—k Ôê\nÇy4%]Viò Ï‘±Œ©Ü0"ÐI;+ýMÿ³z7>ûPÌe•Wß6™½Ì§rÛ "¹®R3m­.3ªÕËø«Û¤ù‰~žÙ­qE(jüì¸Ç!Q3½°°eÐ38Û=ÍãŒ=§ÇxÒâ¤tuešV™CX˜[N’ïW»»Ÿ·²,ª*(Lj`nukM —ò?¥¯1ßE~$ZéΡk…~@ÒºÐÉK°>uŸOsâä|müã…¸ ¨Xñ¨°ÓúŒî­&Ïuwlÿö£bSPz;ƒ ›šã”ãüeyÑ»ë öIÖͪv¼¦1Å3&–¦o#k‰¦éRÈnÈ~ðl\S쨗‘¡öø¶?&žÃÄÁžZ ¦BîÏúôî¦ NÉòoñá ¯¢¥ípzè¾…cώȼjþTrÔ´=Ð#H¼— 0ðǂϘ±—Ïc¸¦ KϰÉIô‹´.£¿Uwåâò˜YŒºÁ«÷®ñÎÙjq {Hœ)ºŸ&Ú1™ÄJDöL¤‚ßÓ…+/=¬-ÕDr}Ü¥,T8W Å 5íÁ^ÿTš”¾~£þ£*,9³ÈD÷r*D=»8¡›Ä3„Aööž )¢h~zH¼]ûMIK;o£ÿ®;xÑï­=ïzPGåëË0Ö÷Zß.öìIY Xî†Ñ$Šœ¼ñ w\¾¹/V¨5>C3õï–ÜŸï’Æù¾˜¥G1šJ3>|ò^Uö^­â²)¼—ó^´\¨EêFÔÛo©µ_ü‡ž\¶`áeÈZ?ÿŠ;]+R[³•ߊí½,tÂ4h]¤›~‚PØ~!$A§å•¬TQ/}÷•dÓöí‚Ùý\¿{)g›7FkÇñ…”k]»ôl] ²ªñÀ£Ùôð:º¤´¦ü.}üYÙ9m3=¹ºIhc@Ÿý•GOØ)0©­#CC gŽ¿û5a?§¶kk~Í­4š5{b.˜ÙõYMByø K€]•êB);±¾%ÍW.G|Õœ¬›vÂÀTÑÖ/ù£e‹¤½Go:ã?­ µîðÒ)S/ç‡ì¿=ä(JjZ”EWî¬ÂPádÆ­–6)Dô742µ*’ ™³ö|ÝQÖ» ¹Î(:[Ë)6Ø=€ø¢jþø¤íxÓmdû>‡,ö‹ ççûÈô%ö©M´Á{¦¬4|åÏ=gT{²AÉϽ^‘D8*¼QÏÌ´§ºw»Å"¤¿}¦‰‹ïôÉað¹$÷0Úáµ³ºL ~¿6ž´l¢ ੺ûÒ«-€–ÛÁh³qÓçØ(žÏÚýó¡÷»ÇãíÅns¤Åuõre‹Ü Ä¥Ü]œK×<«N.ØMÁ|²ÉÚK)}™è0}e¥/˜È¥¡}r'ªZ±ßåæ!Æ?ø$¿èƒ {Ál¬ê½Ê´¾ánÎx¯$à° Î;Æ'£³æýKÃ÷zuï'ÓÉ8ñK¢ƒ+GÛ7ÜøÞžFîðÊe8-üÄes bkùü ѸIÿ%Ì×pD[×&,ãGÅ@r| '³’“¿Œ^¦&nAvƒxW†ƒ6ë\©ºq¡“|qâY囨PÈø˜;Þ‡ŠMJ{¤ º÷ ¦ÏáñÁE–ËF&ëÏ<ªòHjn¿‡ ±Á;bã©î¯'5û,±9_|e8~]õQÂô匾I5{îÖŒ( TÞMéÁîgyÊ^íË÷ËÙþ‘×qªƒ“C.DvÐÌN‚»{/g½xƒ3Ø*ÄY3¯ì=âl{öÊl•¹óœ¼ÙZïÁÙKFÿ{ƒ% v©˜üÝÓB_ä"·÷ä0æFs ÚŸìaÔ= ýñp}×Ó'1ˆÌ «J=qpæ±kEyÞì%ÂI°¡÷ÄÛò¤J>¯z"⸅å¨p=îeŸuªë¨Y)ÏÅÝå©&e’Éô¦ÎϺ-«ªŽ‡…í86¸yºÂþ!”ôTм¨¸™•E[ÃöÑ6œç›ßò>+©z¹ šf.Áå?»Ü™vÙ¼9©4ðthr@ɽîR|,¿Kµ¥_»™êÙ©2YMÈ(@MOŸ‰y"Ü/4u f}`·B•)hÅêòœN:Ó` ý¦øs}FW\ŠúrÂSyM¯hm,¸lv׋f(Z½z– —¶b§à©Þ}´Í îñöhòÔÈõ÷Ϙ2<^úõégS"«*ÆŸF»x"—ËÐÌrà)¢ásopò§hÞ;?Iq*3Ò´)Rì¬DR²..Rªï÷VU˜{3Q}«»»óÓhY.ŒÝë¹= Ó–ße±ãG¾Ïw9-á˜F‰(~Xö“;e½ª*cï0a:µ—Ãû9ÖX'¹^£ˆÁ“çqÁp!gÕØ¢#ÝQ?¡ó¾Å:x¶=„cõp…Ü+~ùc°SW—ÁÐÞóM*ÙGˆÛ(²üw,:/dh"ƒ!‘ùN‘˜rWŒaËbÉëLà§ý¬Ú½E{q4…õ¥ ¬@ßRìS?cÅŸ aˆ¥hâÆ†—Ì1¹Œ«hïrf“³-®Fø˜Rb·q”-RT]\ ábÒè`Vd*ó¦#ØÀ\ÆžšñVãZ`I‹ÛùH¬H g Q’W‹þ2T±žÎþÎцi"×zœÄ >I`UdØæáàEÚ‹õlÉ%ö³q"W7iyÞQÍVê¹Tðê N¾î‹Èïu2ÒP¦É¹Æ\ÜPÝé¼6yòfA?ŒÂDº+Â?“M\ÉçDÃwòJò´LhmE•²Û(£6 p&ö9–GTvµYá:W}üÛõC•‘N‘™ yÔå¹_ž›)rØÀ{ŠðîÞÓy*ÈO<§uà6ôÙXù¨Ð/dç>ïev8©4Ô3ê'õ‰—£ÔKÛ.)ïæîÚîš- ›b_|eõ.À?¿1‹O{VU<ú2ót.ÜBÍ‚ÄäÇ¥t‡I“î»àŽëh?µgô˜'¼Í‹; OÞ_ʹLM¾¼s;ÖXgÛ÷¦Ø'-yélº*f˜=$c†‘.üòQE ½¾ìYB÷¥‹4½ÀÁ!rÚþµIÿr›[`[?𬭴kà“ã×OI~è?¡ßs/o¸z_%(¶Ä%˜Ò'˜ìQ…Iùqט1®J¬‘!çz_”Rëž}0[˜¡´ð’õ”Ü1:÷£ÿ…jzÇ<3 g¯ÄgR>Uùéë|5b¢Ç.qX‘,ÔÉKÜgCi3Åv½»æl˜aß Øy#ôpIÎxÁ‘Þ&_¹É$— éÔø¯L·¾É³Çøð¤^Ñ:ÌãÙ÷`Na¾{nYŽåRh.búS…¶{DU@g’GÉì2µ¶*<ᮥVC‹¼uÏ’LØeX²jĉTDÒQµ0•®Î?¬Ë|Œ»jòlŒ8—^m±†±©ß¨„Í0~¶B.œÝt¸Â’5Gàc³˜koÛ*´ªrœ&€ÃºاµÒ1Ÿg¾oòÀÔ_‡ŒÐ ÙW ©9ȶ³ózyäG,o?;Öë«´„´Íÿ¹UÜqs ƒ#E†°ž:V¤tÙÇcã†]mÝ¿øÌý~,;Zn¡5ˆ6ºæÕôîëskÀÒÓBMr„÷fËQbÏC£à…'ô náCuæ¢]§lC¢ìeây<~áï<#¿+nÉÁ®òU!hÈ7¸ç“îÈ~‰«Ì£wØÑt/îàfÍÍM­ÚÊ?gŠ& \"ࡪÿ\U9‰1=I˜ôðKOÿÁ¨]î¸qÖ=<Ömï ;2žÜŠ–¬újøÿHª|¾_/ü1Ó±ZŒp1Ó6-dœp–p´Í]ÄKßÍ[®ݯlY¢8 êð «I×X]åФhŽÈK€Ä ùÖñ*Ã~cŒÙv1Òç†$¾>°+-Ñi“4´¥ 4ùÙt¶8h}Ƨ;~õ~²…ôzëm„ýŽSÀZÛEÔ‚åad4ñIÃGxñ¼˜å¤Íô‚Jmð”@Í“Z· ÃŠÁÇ‚79ÛÂy€¡ ^ã2*¾y'¼ºúá*Ì{q„É£ÆJYÏ:Ö%R&+ד Ÿ®Pª™áõR‚IЬ›²c²·*ù¼œâ{Åþ‘ ¶0 endstream endobj 330 0 obj << /Type /FontDescriptor /FontName /UZEWHU+CMR5 /Flags 4 /FontBBox [-10 -250 1304 750] /Ascent 694 /CapHeight 680 /Descent -194 /ItalicAngle 0 /StemV 89 /XHeight 431 /CharSet (/Gamma/equal/one/parenleft/parenright/plus/three/two/zero) /FontFile 329 0 R >> endobj 331 0 obj << /Length1 1721 /Length2 9528 /Length3 0 /Length 10652 /Filter /FlateDecode >> stream xÚ·T”k6L(1t7Œ„4ÌРtw§Ô0 0ÀÌÐÝ*%)%!J#‚Ò-(!Ý))%Í7žsÞsÞóþÿZß·f­™g_×Î{ï}¯g8îéòËÛ£ì`*(¤?X$TÔ6‚@ €ƒÃîå ûp˜À<<á(¤ÔñŠ0ˆS‚x¡Õ´QH †·+, ‹IÅ¥@  $ùE”‡P â·j 5PH˜'€CåæïwtòBGùÏ# Ê KJŠóýa”GÀ<àP¨ ñr‚!СW ! ‡yùÿË×C'//7)AA___ÂSåá(ÃÍô…{9 `ž0˜=ðw¹@öGa ‘ÜóOØåàå ñ€Ñ€+ Cz¢ ¼‘ö0 :6ÐP] ¨ëCþ©¬õ§ð¯£‚À»ûËú·#8òcŠB¸Aþp¤#Ðî êªh xùyñ!HûߊWOÚâ»BìÐ $ªÈë!èúþªÎêwóòð„»þ®Pð·ô!+#íQ éå øŸÜEŸº¿àmuA¢|‘>;À‘ö¿K°÷v4FÂݽaêJi !À?˜#Ì ( Ä%A@˜;æuüíÜÈß ö þ £ótC¹Ð%À‚á0ô ÐâzyxÂÿ›ø·ƒöp¨ÐæGþñކaÊèÎ{Àý€@èÁA¿??Y¡gË…tõÿGýæ êé)›òþQðß”‚ÊÈ/$äÁ`!! 8ú!øß^ô ð¿²ýc«Žt@%ÿL}JÿIØç¯îsýµÜÀûÒA¡'äúgÀ-A¢ (ú üÿ<æ˜üÿM÷o/ÿ—ÿß|T¼]]ÿ`¹~Óÿ‚€»úÿÅ£çÕÛ =ûÚ(ô ÿWÕöçºjÃìáÞˆÿeÕ½ èG:ºþ}ˆpO¸Ì^îuúsTþÄ/˜+ ÓCyÂ_(@~0ô?z« .èKÃ=P0ôÒü;¤2вÿ½]B¢b@ˆ‡Ä€n1Z‚Ñkhóûc‚‚H”Úˆ./è€òüî'(¨ A ¿Ñ? ô9Áÿ%Á@A;Ô†¾¼þÆÁèI„ý-¢c þy2ÿAÄ~óîÞèvþF#~PWâ34ä÷ù/?Bhåíñ_qÐ*Žÿ%¢óûÇ%½G‚¨¿EI´„„ývçö.Ö }Ñ!ÿU‰ø/Ôã_ù‹ ãº¹z{þ“šPнËh;/'Ø%öïåûO:`!4ð:õ˜ÇŸü¿šõö@Ç÷úcÉÐþüÇ} ƒùÁ €© ôÁçš'ŸÎªä|ù׆¤G9ÖL_póNy4{_ã¦q¿Ë‰Xð8•Oëï ]Qæ:‘›f¹Üþø7ª1E¿é2èÊ&ÙàëZ`r„ºgøÍ¶|m7>#¿‘Üzе{I¸ öGÌV ŽÕèÊéô7ë×|å¡•nX¢ëW “W}¡¤{Leäõ5¬­WoÄÏÞgR-‹Å„i°Ý£—–>áLe9ðx6íÃ"3Í¢zL—^y/RˆEŸH…Xû}H·ƒ ‚™'þŒ+—õ¼´ý@3L”B†°ûõ¾} Ÿ†uyÝSº;|ÃVÖ€€ úo< ø‡u¼Ñ.N¥£Xκ¾›Í³î;Xø.÷ùRÖmdÃ2oú£¡Ì¬)HÙÓ¢¡qÓèîÜ”ôñg,môCLØEøñ.éë±i¶»ño?¤v '’¤ó|‘M«Ã …ᮦ®™v;¢Z’÷’¯Çé?WÖØµÃ%œ`žg-Uú$ð‹'ý"Ü*ùÉç> ŸO³ÂôMöÖJ¨'“ÚÜà.É ¶Îûã«¶mÙuíÊåÆÜ(¼½u¦Î :ÏÚgÚëõÅMâ4}ƒØ°ïo‘¾%ê÷V²§ŒœNÐÇ;ÍP ³0tð÷!ÜÌ-ñëX,j\ZøªsþðæUx’áÛr¾Ù’Kš8ͨzöG†«ÍàÑPÀ$çÌšQæ-wi»:ÇЭûâs=u¶Z~mò”áM?—!â¿î¹ùOc39 bNaûo—§¥ä§«†q¤H[Ù’Pv>ó” X‹å5Ë1Iþ.fG~7(¥óî TïB@`7}†ôÂY½=8öÇœjg`'ø{›œýRˆ¿™GKšR¥®ER‰r¿ÀpÒ¬ôv ‡uI³ I[ wC ýËߺ{W¹vûtt¸wÉ „@´¶ó1Œ´Ç‚˜§«ú ZÏ?3FhNj3!ªY¾Væ\MâóZo5LøÈ×~ ”nTýXÊ|wvÍ>¨ûÉcõ™¾õ·ïb\ÆoZ±£¬u[ôëÇ©Çû÷|óG­·RÏ)'» '}R¹°¿Šðñ¿Ž€uüü4ÚôOVÐ fe'C6A©ÖæÞžÞAö2¾œ¯–??¯ÏOywÈ~2û"ž:©€Gõi©òE„ù/(WGàâº.¬[f8:šS:/üC¯ºÆ%c'ÀÁj0J‘ÕÓ Q•'ƾV¾šv®ÜÆ9³Ðù,Àxw¢ÂãÞ({ƒyLýfs-ý}^äÉ2úÇ€÷wäïrgéùˆGÏZ×!¼Tör&{….bóS+ªüBb8M¬5]±Y†LýU¾aU.” Q%=Ë_ï^íúÐÕ¢íÜL¼ñ)¶Óð…m’¥5 ýmÖ%o¡U.;¤ÛŒSOÑ9uZWÆ 4g§³»,«ÿ>4’öbŸ˜äÕ÷mFµuÇïW$¼Òedþû·á^kƒ9V)Â[7™ÆÁ#¨Ë|¹8ü£GĪsV~¯ûD%k²êƒánÅcÜ˼³ÖÏ­Ài ûn|2«Ü¯°´À£4›è‡!Fz›¡ƒä"±ûmfüôû+1ÕCig2«å$,"÷ñT»e= -ƒÄ²Kˆ3û´¸a¾E´É³/x=Æ’ 3¹yÂOÛ}Ù‹÷ÞWH½é´Ì#ò̸3ÎÁîÂ¦Ö ¥œ/縮)hÍ 1úœ  Ó.ƒÍDÃ%Y oòsŒé.Âk¬ ‹n–ªú´èDx2òýÊøg驿†é¼ÞÜÛ)užï¤7–ái­Þd®ÖªN:},“8r—Û‹\ŒIžD~wš.ĨR¦«ïØ]hG…s’óüÀ«çÄ.+ê[“]]ÛF¶Êç} ÌÉ­ÊdákÊGf+ŸFïLø!tDè]Ö¹(1|)²?º ƒ´ÏI˰[_ͬ/Y*cÄÒÕzn7±Þ/àež¸]ï~ñÚõŸÃ§_@í’Èœ0‹o 6ï>ž¶µ—)e– ¤ïy}U'{A«<Ú¼‡9@cïÐ}±aò£r<¥|ÞYÜbéo;:aådÛÝ¥Y/fà¿ œJm0ÚéfÌ<úÉM¶§ööÖ´òvSj×mñ/cÇW]êÜ‹1´è:kÊ×'>ó8WŒ6’9O¨Çq²ßm‘›–BD ºgp”¹¹Âˆ,¶Ö¼5 ÌÍÄš¯Ö²œRã}ü¬X©¢„»<¬{géZãXJì‹z‡ì­=’báUU “:®QáeÕ!ŒŒÒ‡nGY¼@ÐeÈ{É휿BÌðJW•™tQ¨á˜æé, ]bå¹!2A¬M…-Æöâõß[èú™˜åî§ y5¿SùÜì1^ïÿÑ<$ïõ{Z‡éºæ‘qª¾Çg,'OUµõCƤôö•†]1VµÈŒÜzÍ{Ü4VN é¢m óú/¥ö0œS¶VJ¤Æ/€Cå¹y1¤›–¢R’fÆ_αXÙ ŽlVûX¦îu9û %É+MaYíÈÑÑ}&jªàoEg*36* ›æ¾~§¸8Ô½êñë8Ö\àÓõþþYöbÏuÜùÝ“×8wAUær%ç}%¢¥›¤Õ›&±d(ýïnDÔ FßÏíS¶ ¼ädOÿlCФÿ /à±AW Ñ0-\ ¥ðSý\cyå‹UDC£·€ñÙëá •æJ]Gï—%>ŸwâÏH”í0"º×-D)¥éOd:³Ï3p3º'r(Ï^³Q59’È×îÈuÍã<ÆÓ—u%auŸç"ùªôC72êÄÛå[Ä&˜e¦7—­”£ÐV§5ú¤SŽAÚd£¸V1¥ðpYºÜq[S—,xi¾·{/j,…ËVcàíw:I¨^ƒ×%þ`\gÜ¢Ÿ®È ­Ú_¶çÃÔae´o'B¾”y7ÅjT;û* Ó‚%ú4­Mŵn1¹ê¾µº¨mJxt‡Òì( ÆQ÷âØà=-ßúºr‚°ùI$رÓÑøá›ÝÏ»õÞéøõ—Ë&ö(£6åÊì‘Å‘À¯äZŠÛáv?ˆI‡“h¹‹Ù¼o`¯7çq7y"pºƒpn™ƒcž= µxÿL\q|–f%^Ÿ±‚Ü|z¶ÞJ,M*sº af³}{¥mÛ ¾¸ú\U1–Ú½¨oÐÁå@†ùžL"»œ¶%Ëk®‰Ë hAù”£,Õ“’ÛíÛð¯y¿ƒÓ[5]%ƒïNO´.±bâ¢fÈ–KKe*|?Nåf>$eõvºò/søSÔ™.zoôhaµeä¥G‹Cò¾ˆÖ¾ÒõÝÄØI/£Î¾&P7”@ãsb 7€u=s÷úL T¯&…aE¹úbÎÏq½I÷bîÕ%y…®™kñ±)ÿ¸ñy<0qÝ !F"7òp‹ì![ºßù$k¹£áz´Õ|/ƒ¦M|ÜÚÕûSÛ¶eÊŒoªÿ…P”…O8£cYr3{‰C¬hxPàf710ÚÚwkÙ7}ÞM+Ä^xmt_Ã`_Ñû>þµ R<[¬e(%hà2˜YãòÉÖò(?ê%mv€î¹Qº¢Õ:|¬Wð¢çÇ%P“κ®(JÒ§È ÏŒÃy€¹ô¦”÷‰mqÔî€\­©âÜÀ/—!sµEÒÔ$Uöm©®“±” Ý:MÞp"F^•™#ÍÙÝ‚Ûï¦Ó$ÄÓ[ó¦w Ó¼¡Œú¤—ã ”EIFoÀ¹uo€s2û›O³Ówc㨌0«Nÿä¼na’ªé.}mOµCm5Œ Rÿtbõ¥äµŸ»à-/êªÑ^¤Ãnç–öÍíÃCc»[r©šÊöÁy-gï,¦9M⻾¾âü×]ÔŸ#:ŒŠ8%šúÝÒÞø=ÓŠ1Â%»¤qä¯ïHâqN(ÚYâJÝÄ ï³»t—ƒ)æ=¿Æo¤D.ùqO2“¹QÖCÆïYî¶±Œ8µ`~<þ’aèA‰=G…"ÂÇ÷¶˜Ñn¹ã£XcSp#h‰¡æ7|r›¾TZ/ÝÝ>á{*0çÙÝa°ÄŸÎín©šŸsx8À-âSl_Â’4ßÚ®‚7•±sðh÷ Åv °(<îÓv÷àq`úmkæ6|ì×t~û ­š‹ãÒ‹Ÿ3Ò‚KJD(»@ öûžÖ<6 盵‚Ïœf,ç¨÷Ùi÷-œtÂqàÖÖ³½—WS­géî$¿…Yߣ¼_„}uÌcSº3œA<%ߌٮVÔ¾gJr$íR©µ=ŒhL«tN»Q3ÇK~ð⃔BgŠýq'Ÿ§WL;û®®˜È.§¾ˆ® z- ¾Lï¸lx—@½(c;ù»D= …ùÒ‡ªU¡“ëc ¨O^Ôt‘×¢ò_1hy«x— ÊT„})à>ìÅÓ}YEù»:*|?3N0lPl¹0lTR_k#ÿ®+DOÅV)Á*78—jÙâWr wE¢„[DÑ£(bß­†/<\å¬Mî—{Hõó`¿ôÈòÞãÿ‚+ý¢¤ŽÕCQéé8Îpúä ç‹ãèÙ0²¦´L9`ú¡]ÍP9„àÈ?`*j™—¼ýŽs0ürlFPE$%is/Rú£Xªº¤‚æðüÍ8q%“ÃØ›”$óív™Z)‡H¯öŒ¶—ï.-p$®ýÙ8Wð¹kØQ×ô'HˆÂëkk?h²02·$ð…ÝðQ¨³$«™¨N^u.Z±¤&%ÇvúˆoüÕ¿P s «41U]+Bâ*>߉{3Tgh¨d†z¥LS†TçUd³BÄc«[Œ'%ú‰ F{'7k%89èlÍB§É¸÷WÂö=¶"ýoÍ$ŠUé¹ê­€!ë(†_À Ü;±Ëìš` doŸdNcôî¸ä›%ÜÃ@ˆ^RÝ]MA2ÄWZ>P¢ì•ƒ¤[ B"‰_,€Ôx¨Öëé Uû‚Mâga,ôòT"øgFBJ\G'(l„vSMëœËšìµu;[YV1b× g°R†ÖÎæ‚aéf™dJ,ôÈ¡ß.èi”ìáZZ=ÀœIG®í1–UöÉ{:=!§BÁï¦ÛÜf?}fZSÌýW؇S¼m)š9 ’ Záíq•<”å¶üñ`Â0ÞjìöÃŒì}ÚJçî‘ÁµÃ#S/˸_{=#‡ªm\évÖZ¶å3Žd ¢JФì¥b—]“Z®ÓêyDöóy(^0®°k/2”Ý –íÙqkSJØÉAqw`ë®âÈìUe4Þ¯p´åV¦¥YîŠ|_kv¨H¶í Õ»Ýô ŸÈ•ÇÓBàVîD‚Ü맯ì›Å4º(® .b€'5Dí³×ia9ªÕ1ôÝ#*Ó?†±,aøD1,´-äêôoÉY6s`÷àFÂmvd:)ØÍN$  ‡ œ„…¯¯ô™k,tz<ð j‘¯Š‚ š“Àó¸ Dë[™46#9qß³6:6øIFñ”_Ÿ¸8¯oÏ".¬Ï¾‹;Ÿ Å…T¬Ø=KÒ#èT=xeËKÅúWe–=î¨,•#2 #\½¬a[õ#WSãUâˆó±1Õ—5ÁîÆÖ!Py:ž#9‚‰›xÄJÈÚT稀åDgl¿œ»Öb¡OÜpÌyÙ[›ñiÛàŽ­¾¦D5‹åÙÁÞtZ˜Èé$¯ö°òV‚2ÿ)‘ÿãÉ€dô€å'½…ó¥ÈÖo{ÁZóàÁ'–OÙ1H«[Tìö\µõ1âX–óÔgÞaTI48ø–óO -bqLçê†*™<¿C£V:cNÃÛæ¦lXè¯A¸µhÐ G–ô›?½†xνê¸SÇc¨o®Õ¨ gó(BÍôŽy—¾£Ã:Ðö …1„¬$aç‘ßà v¢à,·@²Oœ A&;€Îï3ùdïš÷È€›uW‹\&›·ïÈC‘;R¾»žà2··Ou’›Žó”âåtò‰ó˜líY»ë“Ó–Tx,¯‘MÒ{z4ŠˆÒÅòwSö“ÒØøea-ÞÚª°/¬µ&a$>4ž/1.ô„…ò°Œ ª5;¿ÎñCÆÈwÇG¿Ój× o&¨|èÅŠÉñw}gósbjÈ8÷´\Óæp^SÜtEj}È6Ñßp‘ö¬=Î>ô“Fu{Dþ@Ð…`Ïìüµ3…^¡³R-–U ×úÃF|äV¡Ì•´"¦Fäè£ç±e4#Þ{«g9l5% X´Ç¥;“úË‘JJŒ0'µ9fám;^Š8èCÃ;bO˜“Un…Üxv¦ƒ«çB‹4Á–{8OÀce¢6GKå7ÑéWW˜-w¸·q¦÷Τ5ãÝ“‹}ºKŸ fQqën„okCÔÖˆÈpŽO˜é½’ž´Ù RÔSÁ‹A”¼DvkÄE¶ŸšUíÒ3ì ½Ö òÍ«÷B"¾Jd\‚)X*H®°‹71,ëô˜¸‚¸Úºü ¢l0q®=Xƒ¿–'ŽO5¼t{›ÙýõU;T6ÞÖ:©âÛÖ÷{}Ôáï…סØJ Zé1’š«çŒ¡~ê9WjÍù¦“Ý™oËkϵ­ÚBÔAv=½bú€@”2{ER iÀÈÉ]yµö©QÔ|ðÔ¹C¯ñ¬\¥Ä¼uQ&Ç<¶Û~äBD$Ž\W¿,úåVq|ø ‘¢jé³ÂTç>·ïTpàYÓa÷­Õ“7÷z ³d7˜õó°‰?ˆ"II6áŸ×¼ÌN»`ÆüµõcûYqIÁ4…&à‹n«ìÃéÚms=|-Ѧ^¢Èsíä™i¬4ŒB—ÏQ‚üFK󘎧d?- ðží`D%ii´±Œ-«°«2ó“Kˆ• ó §wcÍÂŽj 4Çu-í׬»zÖk¦–¯QvkµÒÀÙcKâÃt„óKº}û&ºŒw¹tG‚·òäï6¿lëÐýòîÐ)¼-”ÉXíñzN+ƒ2Õ„wno: I̶'ÏX|¯ë…É•´I²-깬mTUCo>}&»QGð\EKáöÓYk?ކ_÷?)P=>§‘©é‘Ú‰ÕŠaY<ˆN–1ݯu%>Ì/Ÿße½²Ï(ð´ê¥“9~KRS¼U!,õã#é„Y€èþWlŸÐî—MÒ>c¼úôݪ縉Éul?Ï7Ò®kÕ3ÑÿÖ™_ÓÙ-»rH¤0F2o=èB}mE˜_è ­E¶¡Ï=¬^³pXKF¡_.îf¬ô8 h»)?aÝdºLuŽI’d€ãBÛƒ”Äž«n³­…ìØÜÙ,jRk,ó¡Ö£¿óœJŒ\&ò JB÷ÁV?åQMO–¨G~<êÙtÁC&Ò¬‘wåà wíý¬L´.u;PTˆK“DÖLCÝóîÕ'óU;Ê >†çN ¹vyô噿Ø4CŽúå*!:µ4Ç–?Y—a%µ±YÒrm¡6 ’‚T¦ÎÑ‹o›)/Hßý´™¸_5˜/ßÇ[ß7e3…ˆAŽh$\Ãí**¶g[Íôh\XÍ ¤ž ø‘¯p€¢®¿cK²\毮 Å÷HÚRË=ÉôPu=¸ ŠNòiH©l¦„2íŠ6˵0(~°Þ´h®¯êDUAÙo/bõºAýP?œE³@wTë$|^]©LÝóñ>²n÷¸îõ»_&C™ÈtìÕ-µ“†nÜz}¯ß”$ˆ>d*ØNjì—YhëÒ¹'Àü»¦ÒRÑ_›.ëÌ !Œ>ÀV@¦R=0å+|N¢FS¢q:?ÏU0È¡ãr¿ÌM‡màýìÇ÷{þ%ò¢ÜÏœ‡’g»ÇdÇ)SÓÓ¯5œ›²By º7=¯í¨Ÿˆ` IÇõŒY…Ý©Õk ú´S0}P7w댠 ⺒$i¤SÞN»1ý;¼AA)ÔÞwµwÏþ*Œé¹®°A®:2Œ.Ö$)æ“P‡Ç7\ªÁÛÓ BøÁÞÅ‚!O/Ö¾Ìå®8Å”º%d­¢΋û:”¸ê–Õ¢Ô¬Œ$¿Ù9Ÿ8 d}f]¹±$4—?¦Ý€-ab%.â}f ,º%Ãݯ„´/»|Ÿ"aõ³ñÃ}§,Ã(å'ÀךLnóå¼ ¡]“ÓêM%ÜZñõb»ø‘¾ÇÌ!<½p“²4ß³G±öήˆÎêu~­“fJÌæŽógÝä|sºðгC‡G˜sŽHÑÞ–©˜©ÚCoðœkˆÕÇ€ïR«S>YI? &”öëͺÓÌÎ+$ÙÅ|JN³ŠÂE*eŠÎ¬©r‹±8±Aóºê„ÞŽûí šßí¿Ì+Ù„ŠdÚ@³dè%[›2,nµf†5Œž‹ÄKlõ‰jKÈc™‘hžóMÐßÀý\¤M\cãÖãKžõ¸×È¥ˆ€NzöiY([ü;“<AÒ²}ëÒeûཛÖŠd=¾Ñýx÷‰0Ïá|¶Hóz»8æ,,ìúa®ÒãùŸõF îšùiTÉ#$¹åUnÚaÝlŒ=e¥nbr^=CRÌfs)òþF@ ,óŠO·M ‰§OvÕð÷êZT¤UŸ‰v WV-¶Ø …×½”&”Ø#K[òx¾\ôíÎÏ%¼PU9ÍM܇ùª“a¬Øqüo ¾âS‹ñ &$¼ñ_íÕ*ÉhxX?¯ZÜz9z³ª¼·M6\/F• )etËLòŒÓŒÚ‡3{—ˆrWÁ¿Gl<çU]’H¸°ôO#™à6<¼JïL0çÂ~¾ÞÊþíÞ¾P®'âJ€Åä öÌüHË ã[Œ¡6eüÑ1¨<¬‰5rÂÔ_l1¾»'r†ˆ—#ñTÚÏ¿¦Wè[Ž#´‚Åbú¸—'ÈpH<ɧÊf.íee95X›$¦†OñþQŸ*2!‡Ä‹g/yH}jž»|vJÿ‰ Ö‰SÍè¥ ¯1 ýÏšNéý‰&x©'+ó¯®âüTºÔU3?ï»ç*KçL—p«Ñ˜zl ‡Œó›@kƒTêä³Êµb¡)¿zr®¾Öãþ­Ïó^‚Ât>4`ãžnImÜ­·—g%ž¥ö×¼§X£Ê{öøõÔ øpÓï©dîvugå•Ë0M½™lÔ"ÂKçÇ”K€ÚW ²7Õ²ó»~ßø©%çnžÜK$Q\rºw[kjöü¡_É'ȳùû±n¦œ$–È'KŸI³å>ô¾?mytfÔ¼ôâÞH¾,/MéEtÔ9ªé=žc¥QxÑYhFÉŽý1ÏìmY´à¼èó`ó’íú…î`»ˆ=G‘ ÿ' ÄÏ<£9˜Ü°)ÛÝg[âVÎéØÊ”Vt†) à £ºRüjOÓŸƒI<±›:*JF0zôc•CR~ø3Ÿt4Ù¬ºìômYñùEyÍ3E):‚9ßö ̪>UìðÁ ø•ýU5Vb8¦ dû 79,Ï·íDճ®èÞˆ-?ºYç-‚c.ê}1ˆ{‰ú¹?ïÏ¥ñ"î ¢©‡PAź6jæãAö<ÛŒïEõè.¹^õ¦Í—Yf„?ÓTVœNˆùvuí'. ès®c±ª(s*ØžmïHv† ›¾¯ _€äL²Õ}Œ¤¼v€s¦ß7Q ºù0HÜ•óhÓ—Òy¿Çl7áûÌõk«ÙjãgtÕ&™§U¶šàs·Vb̸"fµý/oʈöž•p)€•úìÄ‹sæªd„²hoèÆR¹ ˆ8YÿžËI9G …Æ/ Hm}»[i"<~<Œx‹–=×J&%õS× ½)Ùó#oÃb ·šg»;Lwµ0ý>¾Þa<TÈx\j†IñökðÎèœPØû/åT²ë[ˆ/v.ª1‰è±×v?¹ö &à]ži]”ýÄÕDŠôÌìT†HÉäéžÆ‡ŸEá_Û&H0•å>§g+ûÊ~ÜLRy¢>õ·ì{Pç35[¢™ªmo¢yà±NF¡ß¢ñ\0ˆ“×x8íh˜„9<7³Ž/?´eúRžú>oN¶ZPv¡¦yo%&åN\ÕÛ;ÝÊÃ=‡«n“æN¯O ¶Ôj´ˆ>ˆ¦³Tà†²Kt‡ƒ§/ÏîJ\ŠEP5«å­/?xôÆ¬ÔØ cjK<°èvéì0Ï{Šü&ñ„)æKßÅ+³¸aÔà‚ó*]ý»Æt¦vãyZ¢*@¾hf²õ;ŸÛ³äÑõ‰æ»°jÄÙVYº„Ÿ<ÇùGÒ•©ÖS8û…›D°-¶P $òÜÆñ 5çÊ5Òµ§°,[/VJz– ²²hÁhõõêV×*…Aeõ±ÎþĈF³5e‹#^çJglÄ'@þ=Ä»f[!êì›Î¥»šÂ5ç#Ã*±*"ïq9`ßlá‘ÄÛ³‚ÉJ¯Ü‘ Çêç}_Ƀ\q7 ?wõê(³þ¦®i¢4a`ÐÁ~ÕÓÆMؘ_)"ìXÛìÈqÝíƒý/}Oå»ÅfL§à¨/¸8¦5P6x7o‰·7.dÆÏˆ5(=$âdåÌ/ÆÛɬKûééKÃ3´P¹L=¨Ôóòĺ‘¿UÚÌb­ÿ\7‚ëFõŠ¢õBã–/q˜A>T±&׬¿ÁÁÄóé^Ù[qVì @üÖ½KR‘M þK'"Á÷IO„ŸâèÊÅfµ”hp1Q}ŸÁ‚‚_¿y‰o¨Ö*ë(ÍJ èVÿ ëö>»gY"qfUxòwèuv» Ê¸„²ªØ94Ò%Ti•êlQôšò†z_q Ätßd$Vú¿|c<€ôéQa°uˆ‘ÿáÊxŠü[ÃJÀ«ïu¯zm.ZŠõÜ#:£].ϵ>†f.ªjºß}®|ª?C5­½aÁh²"(Q"¿_’€äê®Ç¡Ø•Û݈@Ý|r¬[O}Œ¸^m«´ ~l,{­Yâ“’uøÎ} $’¿'âíÒ‰|.t®®Q—U¦yö½ÓC¼‚ŽAŠ·uü8‰xÄ”÷^,ÊGä˜é}î‚“•Î":[ö’dõ´ëëD<ú¹CÂéè˜t˱äð][i«µ9ö¿ÁmU¾jýcN ÆìL'3‚ÕÒ¶ýð§õ] 5•|fõž±5{¥Eåeð;îy+Ž{ákÇ.‚Mwô_áöýüµ#zÞh|kŽpÁ6Z²ý[Ž” endstream endobj 332 0 obj << /Type /FontDescriptor /FontName /PPERUW+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet (/Gamma/Phi/bracketleft/e/eight/equal/exclam/five/four/g/l/o/one/p/parenleft/parenright/plus/six/three/two/x/zero) /FontFile 331 0 R >> endobj 333 0 obj << /Length1 1523 /Length2 7046 /Length3 0 /Length 8075 /Filter /FlateDecode >> stream xÚx4ÜÝÖ¾èDoÑ3DÌ-zÞkDc†äè5¢-„èD‰]¢Fï‚Q¢AA¾IÞ¼÷Þ÷þÿk}ßšµf~çÙÏÞgﳟ}fÖps )9 ì¡ê($F$ ¼ PÑ5¶@ ˜0(JÊÍmÇ  ã¤ÜfPw4…¼û w(ƒÅTÁ,Q…hy 1Hâ.Hò.¥ÿ&¢ÜïTÁžp€®0@ …„¢I¹UPn>îpG' vŸ¿|~HZZòöow€’+Ô#º`ŒÔ»#Œ£ p(Æç!ød0·»""^^^Â`W´0ÊÝQžÿ6À ŽqAÑPwO¨àWÉ=°+ôOi¤Ü'8ú/ƒ1 †ñ»CX‡@‘h¬‹ÒêÀî0ÖÔè»A‘‘uþ"Üü9Hô¯p¼‚#;ƒ!”«éG:`p ¯®#ŒñÆÜ€‘¿ˆ`…õ{‚á°=–ð;u0@]ÉÆVø§>4Äî†A £áˆ_5Šü ƒ=f5¤ƒ ÊÕŠÄ Iå§ w‡B°çî#ò§¹.H”Òïï Žt€ý*ÃÁÃMÄ èÕTýÃÁB¤ÿÆ¡€8PZBB€>@½!N"¿60ñqƒþ6þ†±5ø¹¡Ü0lÐ8 Šý õCƒ=¡Œ»4Àï? ÿ\‘‚@8°‡:‘¤ÿŽŽ…¡°¿ÖØþ»Ã½V@¬ü@à¯×¿ž¬± s@!>ÿ¦ÿn±ˆ©º®‰¥–àŸ’ÿeTVFyü„D¥BÒ@’HJŠþÇ ÿ“Çøj"a(€ô_ébÏéï”=ÿh€ïÏ€ðþK…U.À÷o¡?Š!Ø7ÐÿYî¿]þ*ÿåúg¤î@ü¶óýEøì`W8Âç«\ v tQØY@þ7Õú×èêBà®ÿmÕÄ€±Ó „tÄ*ZtGxç/ŽV‡{C àˆÓ_ªù 7ý5o8j€BÃÝ0X/ ð¿lØ!ƒ¸`o4Vš¿MPì ýs_5$åðkØDÅ%`ww°)¶×Ø•8À„J¨÷o1D„‘( Ö€­1C¹“þj¬$ ¢þ ú½%"ö`÷ÿD±€;E@a˜ÿ€ÅþÀuùoÌŽô@ÿ Àz»z 0p7lºcâw"H¨ãïk£þÍÆZÐplCþdðJ!îîØ±ÿ-Iì1ü½þ}Ç@¡ÞPéÜ "æü*¬õ¬Z‰ÅKèó0áÒr{t‚eO”8†çýs?'¢Ì{•í^2>5˜-ŸñgØ?ñ~ð6;x1M#ƒ£Ö³ª| ”×ÿýè­#”ÝÅì8*ù4z•úK¢!¥¾o²ùÌE¸d§ØFåzÁe;zã¾ôÀPtBőƂy¢”Ó¾ƒûØ’ƒk3`ù€*ŽÆÝ*ÝÃDÓtô÷1<îT¹5–é»ÏªU\ÆÀ»ìÞž§b‡ùÚ]U/#h™è|µ8r“ú˜è³µ^£qx”ÅOTJS8™ ]#xñì$Læ÷¶$ö‰yÔ;ê©_×4ÔàQ‹Ÿ‘Ëé\;€°¶ýÃOÝITqÉ©¥î|C,Ñ£P1›õ1Æ3»'™‰ QëT9„Tß§Êv·A˜ùü…l*€–™›Ö@OÃyÙcðÖmáo/zàå7“‘Ç›ïZ:#P\ûlôÁ m™;ÝÛ‰¯5ÅO¦¨ÍÔ$05ÚïQ¶üñ9ñ“F¹9ø-í÷dî+JÏŽqÆ›‰Qæ™P¿7ÑÙÀI×#±¼®4IEAë²_ÊV9_!1ô\.¤Q.U*øèÃØÁ5UÃÝxªšÕë†ß lìÝDD‰m´sÛï;Ùëñjaî$Àv.6•-'‚$gs•¯LmiK=È…=ù÷mã¸þK®…RmÔ}DtJÇDàªí‹!¶¶û½q¬éoÆv»ÚxS7¼5êÏOðhíîÝíã +D”7Ä‹7«,ôÒG›Zõ‚uZ‰Ý;‡` ÇßÉ@V§2wÖ‚Ýl6ëõ¾¸ý({¨¬  ¡ä —[}©Ä#í‡Oe¨JþMІÈ©X¨÷ö˜þà]ãSÍZ˜ŸöHé0š9œlزª5oOd×ómü¨U^ÓYöFný<ŠЈdÙEÞ8­ƒ=§o÷rÕq:™ë*×î(,'» Ì„IzR¼¿!÷Á„X½G™¬X —$ns –mò¹V Ö`ö1,Š mÒç«#¯JN®OpS„“„Ý#+8O2ò}A{tÛò‹³¡Vuúx,»–ï—‘±¢œ:¸=pþ¦w.- ãU9òY\©¶í«œ¬T´†°K%× ™%ò†2­_ÓŽº¸ã¢/wcïª\qÆTòq{Á¥öxñƺ îT†…$ñC<«yÂÝÓó×#³›“P-!6ï¹^óÄ~>:´¦–B¤Æ¯½F7ñ„…½IXY±áÏä0ùÜ&?Â]®ØŸ«]fn3æÌ“‰ßL½ð°Á1Ž&U?ÌP–£þï‰üa²Jü2#¾f´•3|ü´”ÖZ„pX(0À/j¼·_1w2Mð1k&œâÚe)<â†ìÿ°Z7ùiÚ¯Œ\¯4ç‹7ú{ÙÖA§éý²^CÈÚç ³ùµ‘¾Ðpi¦õñ¦Âôm2ܽC{L"9݉J"ñ§~”g§m1¡ÑÖP­t‚1ÀÏ`ÃÐí”ämËi“»Äië[™ÂÚûi›½kž³ìÒ.d>Ôq õI>n2̪ýïWÉÎL{ ì±»FaÖ Yö¾÷T8¹Cü¡ …^›5iÃO 6¹Ö_7ÝýÙ6Åßß§vkv³Ð·¢ës‹PSÙ;Q–÷׸€È¹–ØÙ7È\ëî_0wçëPH¾9ž{<ªEÑÍáVÄdéhN5k<>jÈáOÿFô0Gðýˆ¥OjÏpKanÖ5RZ[Ý¡ØK;!ÅZ" á% ïqöhÍØI)Ƹ¤¿€ÒAa¡Æ‚Ÿ–/Ô24¼ûÔEϼÞòÍžú¬ì¦r@mÚ–Kí‡.¢%£=¾ùéQÑYn* ®ÒÅå®kX NìåÂß55ùn·ô“áçfú—ay>Ïhý“ãç=oÒ||”PËÞ¢V‰›z5‡—¤Û»ó^äå Ãf6ïBš1g R·å©·¿ÁyO"€¬h—|Ÿ(7Ǻ”§t#áMlŠ ÿF5ßZ“Ùô×¥˜{%Ém‹9ï¢{®ížÜ{œ~¼ew#,tE|Œ]©5_˜|E>Ö6ÌùNètÝóoŠV½ÆÞ{Gˆòû2PmÏ­!†ù¾ñyã‘RßrdqTí»e¦ÙF¥µ”¦·mD{͈ÆežŽI°7zD7Ÿ-Ü Z î9Z_+jÇñr™dd?ÓñK—ÄÃ9ŸŒu} á²Í^וw™)À;hh¢}6¤z{ü; å~:û˜d> îª7sí[ºÌô°xÈQe€)ñ(ñËì›æÌkÒ¾-ŸM¢TEº1š{Ò#ŠQl{O¥c{ÝG§5硜«L÷´Oh½óš…InŸ Úƒªg^}%ëÒÌB¨ê|1¼'|Ú` „D·¶ñÊŽY¶-B…vA"g±¹’Á±jâ·ž:D~-@Å¥ùY«”És]á©“ø:rŒE ¼@5ãL8ÇL éýÞ.~‰:”ŠïÑö2t\xâ–-²¡¥ž‰‰z6Ò¹SC¦cýèøÝÏ‹3Wr:x„Üš›nW˜³È.¡¥Ô¶Òð5œ5yÍíÍIOû: WÜGØ"4ub¸’ÿë:k¾IÞNщH;7ߥ¼|(Æy!°<Ÿ˜ ô½Qv¯’mùæÃè×ñ;àRsÃ-nß°IF­WM³ÌùbM`wû aüÉ[Ñ=VÉ· ØBUo©M…$¹¹U© ”—|«YL÷üâ®?é0‚”D^/ žÀƒI‡ T±ìZÜýÖ¾!ßךyW`xQ‡ †;ü„¾K:‰œä,#ÈæGߌ$á›WJrìªÖضÐîÄý`ÖÀë;wÿhH‰mžŸ¹2z½vÚ¤5…º+#áƒÎÈ…ÖΗÃ-UxÉ¥UÑÁ]´ì³¢_éM#Ïý³pÒn~7 Û›Æl?48½˜ð—û›‰ý=Ó)®ïoÐE¸‰Î”þZ̰ö9Y€”MÐÑM)èvõí·rþÎå¢âÔ*ý!’Yߦɒ¾¤UÕ?e¥ ÞQ/aaéoæ§aŒ²—›cp…9Y½ dNÌLAÏ¡k3®n‡ûZ‘¨:Åêš•´àŸ¶ÛJbÅ+†ô[ÊìfǸ¤Õò›œåH[+Ê7ŸùyTÙRŠ‹ªï;NvÔÞy¦œ±¹–µ«TRN³ÜöðÕèÁ åÍ¥7‹ãwê‰bØ# ÆöA•0Æ)’Š£Û3Æ=¹Ç«­¬ÏÝ Š­ÞzÚ}"k­¯ùñäÆqG ÷é=®Ÿ¹,a…Û£ÂyM#ׇR^—Üø8Ú®>œ‘©®ÉL ‘c|ùÆqãÚMÁ¶2aB‘ /Âîh#©f>Ź¹Ç™¾äÆ6Å.=M×§9 /ä-8Þ¹¦B¿(Ž (ÌrN˜©hlž=“šr¹1H ës–­çAN!Ú.,ië.êý‚‹Ñ«+ìŽBˆ¾¢jtQÒ´Žä¿¡{FØ`œ¿þÓ2mYÏò„0#~š§DÀ&Ž­/‘÷¢ˆC¹ÂxÁóºß_vi¤§àéi;û8ó^5ÍÏí¹2ÁÅË Ù¼G>¼®»hÙ Ó­`i7ÛvÜbÃÖùok¼EzY÷ê¾,¤ËSàö” ¿q¶®£A‰YÈkåù*Ì©îÉé…_k³G’³=ñ{xÃÞ’OžsNJ`óq{ÿ°K‰Øj%æ ç# è(Zcµ“<^Õk¥é̺ ˆ¬%~ÇṟZý@a×c¯à9¦å ja.z³å 'fLö‰¯ —‹ —õ*zü¬1*ªEß.…o{5­DÔÜ¡5œ"ú™ïªçÇã+#;Ý‘Cìz¸j—e¨ÛÉ~ñ•W€áò¡EÉ5ä!F–e:ÖåP„X¡TÔ•‰?gpvÜTµ—º¼’æs‹oµÊŽ{Þ¯Œ…ª˜£Õ=[ȃ^òn:†m(— VL»?þ¢¶ôÅ 3>隷ÍúÄð×9×+9:æO!ï³¶Å üTÖbeÌiÛÓ¬Ó8ܺ¬]Ì[…92*/–Ó úÝÝÚ˜ªAtΗ¹êÔÌTQp4&uïïéŠÊƒ´f7~ü—ü'„WÙ¶73©óùk¦ùšÎ³ ë¯ëê6“Ö׆‘?ìõäi¨8UYú,¦‡Ó s]ëebàá—È€nm­>3Èy,(ôìeižéã§5êßLÏ 8[´G""Ë[',Û¡’´ Àr¾Ôb¸ K¦NŒ£ ‘ô[>KM¡„X„]å·}»iúu¥1b»u•Ï—-5ØìAÉõ+-}~^¡}F6–ã™L·IŸs©—L¥i¨Îš1+¸ùŒ?m¢3XäV—k éìëUŽ$<™;É»§=kàTûH¯Îª_sÀv;*H…øÀ„ÁwqF²A";™–{|Íîö[Y 4£ÅÛz¹¼Àe`DBHB4ø $ˆzEOÔ–>ByhIŠ= ¤Ú®;ô\Þî8Ôþ`î—­;¹(¦ð>þI©î¡õ÷»æL2tÔž7Â©Ò ,Vd”o&‘D[ÐÆ ,kÊ(är˜D„¯¿F3ìâ˜Z¯U†&É[Ä\]¿L¯{䤋‘÷‘«ŠX ¶WÁkdCÞ†éaQr¯ÉCð6œõ¥^]{p|:›ÛϪŒ»šgÌ#‰ÁPâžxÜó•Ñv¼34þ„]æµ?çV­ÌùGãÔ´N϶Áƒ‹o*j:´B[D’Ô9%L…«ò„¸Ç‚µ 'ÀLœ“åãr;Á_Ñ[‹{¡Þ(-ëå÷eC^ú Âs‚0;ƒâÔùf+ƒ¥µ‚Ô…¯+^¾¹`“Œ©5E‡dVΔöúl|èN&2ÉU¿¸çî¸bJØM%>Äù4–Ç¿:¾¾#†øQê½²µY©œ§ÛäyU„ºžŸ—øœo`ŠCW—ä_Gó‘_÷²¬G¬{ q‡ÌÃõg™£\)„c_Ľ< 1²j¿1–ŽÒ“u¾µN|ŲÑÝ zI;KñF&à&åAøÝÀg¾»³Ðø…“ðˆUÚûwص£#ñK{6 :K7(ic³M*RÓ¼àNî^m;Cí€OùïV=T#²“£)Žx‚.»¥¤…/gŠ[6ì™=•!‚j‚ dýâEQ<éc‹&ù1¤ã1‰¦úÆ]…NLÊl¡±©þ¤—ÂYTÅÕªðS¹¾¤|°‹ù¹Ka~iî Eoè«}¶"†lJúNYÓâWïõ>Hé œ? ßSˆQEÊ“eÜbaþš6ŽáµHu —T“¬9Ð[#$Îpˆ•òë±>Œumz&Ét½÷+UNËû8úBfO¦Ç–¸„–i'W7½Pn´Ç[jÝÏ$ÕPŒ£ÝΔÒ+‡/9³Þ:&+Ç<‹é™3Ø;–Q¶1Œ×/MûÞ! |]¬6ÔÙ‚ÇõzI³—bûg®­>!ôÊnŠôf:×›%»!izC‘îÂϺµÐ …Ù·}ýÛÕõר©vÖð¬cŠì:H.·Z¶Ëm·EeÇφÓzñ©v1¬eÕV£Ù5QLZyW¥úŠܺ‰š!‹[䘢úYOÂЈéÌM"ö«ã]‡ºfêô@ñŸ#‚.šŸEÍ¥åai¥¯TcgÝ Çb˜È†òŸÍyÎeE]þœÅuëÇû 3¤¹}ýVô“:1N¹¸q–4ôµü³(qIú¥«ä[ÜDIpnWxø£«ÐÞ{…9²êÚÔ«k‘³Ã{NÅ×›îKŒ1†ã¸Þ^w22¿OO7¢ÅÈûºút@®dí£—Þçgµ`DÙÝh®3}ñ%ƒµ0¯.Û±h5` ‡ö¢XôØ §Íçñ¤50µ^>7N¹«ä½p–Ë=ôÞ´ÊàNðj ‰þ÷¯;v4ÄÅnIé~K%š7TÒ´/UðD¼ªŸ¹Ò•0žâª4üÁ>®¢sœ”ØÈàîEò©½ˆ-\½q1‹€‡ügØšZ²üp„ƒŒ>e™çî³›óU&V{Bë/!PÜÎ{OM™Ÿ,•†ùÄ`<½§ïz8&2xÜ÷±¥{eâÀ™\öÂ^pã­~„õ,¢Êû¯„×᪄Å+ªUmv}"¦·‘°,>GE/kX‘YÆ`§Õvà£Xú÷-vJ%1Ï ’¾ý,ω*ÖÑkžd¤¾çŸMÏs tö·N²®YeùúŒ&MsáCA\¦ÅŸ:)íÚñõ„+ú%Èø˜ËwD­ÉŸ'Vmø(®÷ül2]>'þý—B—†LÄ/í@ÖGÙ^²ÁÁãß|@ X9õ%•XÈ!ÿC›ÇÚöœÎaÜuÎôÀS^ýzùb?€uOntµ¾°™®LaäŸÎò{­ßT­?s.JeTÒYGéýns‡øf”añ±—²ãXâJë¥ñeKNçû2D–ýÁ‰¯LSMº¦Ïôµ÷o·£ÝÜK\tÉ^+*vByÞ<KMGt DcŒO×»¹Ù‚÷ø7EÜŒúÎçÞ”q2ŠÖ{¦«A“ÄÏ»çªÑÅ÷y™‰éjšŠ¿¥Ú°2|Å||PmŒ Éuî9$01ûy2áP-­<â¦Õö} G—¶q±zÊ ¶Mt{j&:A-§{EËO'¬é3ûTpw‚ÙtNt¼Q¾õþ]2'e‡¡yóóPýËoã‰wô}4 Cœ!)å–<KggGiãw·åv$iR,3êNÎÞlßVGh.©Ç¤Šd+\ Åd,“[ƒÑÂuzü³JÃfªž Wù®nƒ‘Žp§^éj:& ó  ¨.†Gø}Ù…Jsjd50`àÌHµ¡>¿p¥áÎ7R?}Žc\ç—½½•îS‚뿲ªRl2gšÚ2Í™¨»,¹¾u0øDÜ”_ÚûÌMÉ¡Ë%ç™J7ÉPãŽ1£¤4²^ˆ'%³É-ü!mG¿É¡¡üçojö8üÓç#Šm§Â`˜8Êw‘ÇIûõjcñ:ËÐ #Nsát¦ó,u¢z²§@éñš”HoÀó7â»§9L©°>±ÜRUoÀ2KË' æø©èï–e%;U… ’Yð-+Öùd™Ììï_ XžuE wì#Ô¦î,HÛ­—êkeæ“3âÚ­»ºM7Ä¢Öm*ŒSÞ휧o*™uxv]Ai¸•äN d™Ïñ_æ½ZÓg/x…Æ´wB뵨·ÔU: .~(¸ûè„1š:gšéC7/R>¶~¢šïoœoÝä"Äi÷<Ö*?9Šðòˆ¦Ê wJÉ¢Äy¸|ð"ÉqïнÈäýò•ŒÀ˜{îúŠº~ÐÍyf|O?E²_ÎwmðcöëÛÄJ”EQ‘Ëd´'28¾8ÀÒ‹cÎú^¦‚ —…`Á9K.†U~‘µ…QŠòȾcþŽRÄíêÌd"‹|Þágå‚src︜óM… ¬ž¥™Š³¢Î&RYàÓƒÂ5ŒÃšJˆÿ<±B²LöéKÉó«ñkü¯œž^µ%xqSm§zà-Æîµ×•|!¯ú0à®È7–õºÕŸµw•CCê¿8‡k³û„Ü-xu”88_¡zÕÇúÞKJCn‘³ð…‚^†¡7û„‡±] “ÁéT°èV]I}-ƒgbðÄê–µ3äM=aŒ¾Nжù’f^k«ù»¨ >í@¹~4ÇyAºž?_Ü»ÐU"YÌiæÑ`8î„keÆ—’ÂK±ªM ¤9¿ÜÓÔ$~r°×Z$ <ÉÖšˆ\o*±Wøº¢!â×"nY'º¶ Y _bÛº±%µ¸X§¬+ççdäh”×É, -1£­äi²ýà¹Wõñ~o‡lÕ$IØk©kkäN]?žC³+Ø*knÑú2Ð ÑʾƒË?D^ñïÜ^¥£á}Öò rµ›c<ý¤À­Í!‘¶Ÿ^Â)åø /²¨U¼iŸ§ž´lÐ}rª°¿½¹±QAÍ —Ó¹Dð8"ðýe/Kj¡-ÎM9šCX¥.ýðgaãd—3ÞkµJO 2Ü­WÆ; ô&?ÛTÑÖá'¸7æäÀÉuG6}¥­ÍG:5×Ò5¾ŠªöÌ[÷pBO?f ‰-弡0´¦°c›Ö(0çO–·¨$p<< E7CžSáOáGÌyè¾Èæ»È’"W¿Ý ÄŠ‘àWL;ZSò¹Þñã³Êûa¨ù·³ïÞÙ·ö œÃ lóàÉÿ/ P endstream endobj 334 0 obj << /Type /FontDescriptor /FontName /UFMTYJ+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet (/F/bar/braceleft/braceright/minus/multiply/negationslash/similar) /FontFile 333 0 R >> endobj 335 0 obj << /Length1 1391 /Length2 6232 /Length3 0 /Length 7193 /Filter /FlateDecode >> stream xÚvT“ݶ-H&M>¤BèEzéEz‹$@( %¡W¥ID@ÞA^¥H•. MzQŠÒQn,çœûŸ÷ÆxodŒ${®¹Ö^kï9¿„“MGŸO†zWA!Ñ|`ˆ$ ¨©o"@ B`D„“Óv‚ÿ…I8 ánîRòÝàP4S‚¢±ÔŠp‚>Ä~wTäu(vÀ¿ã¹Û¸!\Ðî`w„Ó¯ù•Áž²2¦ˆrv†#Ñî$¿úSB¸Ám°ÇîÍÿçf‘(O¤ïß…- ³ý5 ãÂÿ‰pÅÀÕ”þR°É0;8HˆŠ ‹pWîecÏÿ«¼· üwPàŒÀß×åØb‡€û#láØ_w¨@»aàþ¾ÿ;ðω€CØ ‡p;’ä?Õ±0ÜöÏ{ùn/À ‚Õžùõú÷7 ¬¼`(¤“÷è¿ï—ßXSMEUùΟ‰ÿSP@y¾‚Ÿ„°0 ,,ˆIþÿ¬¢EüíòŸT5¤- øÓ,ö”þÕ°Çßûçþë àŸµ´PXÑÂîÿhÜ"±Á¾ ü+ýwÊÿM࿪ü¿4þß ©`œœ~‡¹Çÿ0Ôáäý—€Õ,Õ¿& ëäSà<« ‡!0ÎÿUCC±>GÚaµÌ' †ÿÁî*/8L¶±ÿ£˜?øƒ_NsB á:(wįG 6 ù¯Ö^6ŽØÇ‡;V–¿Cp¬{þ¹¯2Òûe3AQêæõ&`Õ$("ø `ýƒ{ý2ÀF¢ÐØ;£?`‹r#ùu­Â?‰µ{îØÈoð;#÷ßÀ?¶³Á¸¹a]÷[Ø^þµþmq8Ü nC2=‰²¹êPÚtR!ÏäÉ·:xua©%"Τ+\Í5•åk¯A˜¦:êª` +½Ñÿ\çcáã‘I?&Þ¯'C^æíéÁóÉ÷2Ñ8Ê]Ë {|¯ÞŸ~k·ƒß„¡í†ÅžG,SíÆë²PX›á›ÝN4š¼ëZ/[{ý£Å}ÝTbpòŽ(Ù’™ÐOå3Z¶¯D™°q,¡ûLÌ)c®»™¥` Ô ÿ¸…ˆ9VhŠf8õ^6‹Ií››ëMïîz.t­ÞY.Zú˜šÆç>[FBm|úý·î8\ "GŠ…Iq·rsÍãY‹ÍŸew7Æ÷ajì´ƒIµj1o ®ë}‰*b £CµëW#x)Ú¸B¸qϣĬˆ›¾Ç¹*Rî q2ˆ*fÕ¹¼)E´.Bä‹rqzÊ)”‹LN³K)w£ÁÅ>Ù©öaó7F$FÕã(<9 3mîLßnîÆè;(NV#£[]èAôžo¸ìRÙHp>wž;',^¬^»QGòLšæ¢ä°cÖîVëʳâsŒ«s ÔIk¡¹í¬Læ6ȱÌÖpª®ÜÍ’À{7RÑcõ9fW6ùB¸Ï>¾/WŽÑ’sØæÙÅDÃ4ƒÉGpuŠÀ7çÌùy=õ³é§äJƒ»\ÀÖÚŸKÉì_n›ÿ<>° Êõj¹GØt9Ã…ÆËZ(Ë];.ŽËr'ü¸ïGí·»“õÔÈÖ$-“úà¶õïÂêó«LŸÛìëº//ÔÝqœ˜ù¡?eZ®[eÁk9G©fdT™¼3Sê§Ç)í²üâz£˜ ñì5›«[ø¦GO³¿'Íßëâ¸t´Ç# 7½‘ØÀ£ÄD´Û¦íO)Åz^ gP—&TÅÖ3Óy‚pwÎk@U{IY¥y<…¦…§C÷–ÂÜÆx‰C úÇÏbÆDX˜·¶™Ly§ÌÈÏÄ©®•¯ªÔ‰Òɰu»û`ÖHW/føuXŒ%ËOlìé×½o뜽útöGàÎ ÒÚ o±ðþuHJfÈG!¡z}%×™÷OU®¯Õö:u.‘–Y:ÀƒÚOétî¢Rï±ø§ˆDFûÖðNß-Ê3 tœg½yâ‹þ1‰Hµz ¿”†‹`)_Y£“ÂßWÓâZi­òEÊ¢Àö·Æn2QÀð„¤gÝ1–†dÅuL.»_ôFÅë*îwf£©n¢a‰§¦ š Ôí¥Ô'öYê#ùoÅ»Jyýu¼ìåÊöç× L#Ð]miulÒ.ú›ì~^QYQmzˆšnÁðï…4Þ$††x‘s-Ëfµª<§÷äßF<ݧ]æ}šPv·þžº†LÿÚÌóW}Y Z"÷pã ׆Îû´L¶½:B4v¿Ãc`¦UªÜàk¥)¯Ë­7â ½ð1ƯüPÈéMÉ—¬þ†Rаo—öZjìQà'‚ª îe5c%;z"¡ókϘ[ìÖж| ÷#+‰­º*½Ì@“æñà[•¦÷Ê•GÝí¹¯Jáà,Öe–|7†L+-µÔ*~ô䄱u[Ë©©u˜ý¾Ú’ ;†ºYÙÙ^ô©С©Á¤òƒª9.€‡ª(«8|tµéC¸^€Þ0ƒKºÔƒ &OòƉÊ^Zu6Fõ®‘$âœÙ&´ÚicOÄü¼úñÈw’9‡Ã¬çO£å¬%È4Ê ˆUTKœzo$¼É³ÈxFqùž_÷²~øs û¬×øŒ,õ ¦ÄE%è3°üø;ÃÀŠà¨•ASè ýKœšDA^ë\‚Ó<‰óQ¡Ü±dX(jDZV"Vås…‡gI/DC²xh¦¢•j[bšÚxã$êcRP)äß'Ь"‘é ‹Â‰ceßru*VŒ„dÒûå<ÿ,Án?}ç£z·7ÝT8HP“ 4ERåâ˜{…è{ßã¾Ì"Kûw¸T„$OhçïŠæ\ ™ZW©¤›+ÉÆ™JI"ê Y³Ut ±ÿ_ïý4\]‘p¼Ò×{Pp¦µ¬—ÑAﵺuD3ÐU°1œ _ ÍF1GP²= ¦ù¸Øzx™S{d+ɲÉò²L®Ê•´û½èÒ ùt…ã¸N¢!®o9³i¾& ”G<«Mê(ËÔÛÎT;øF½ôU¦³Lá€zê˜õŽZâÑèÉsœgs òF+­Êm”Åz‡ÓW  ‚fº¼kkD,»­päýfCö×óùÌwóš$³„`H©5AièµQ6å=kZ`K¶óæœäL–Ž Öl=d§0Ü–Ây`õó~¶o_ؽ˶J0î¡Â{Æù¯^!hn5¦ÈšN½«d©ºDAIl§—l²âY R±¬Hœ„ñaÞîñï8:Z?[ DÂÓÍù³&Ñ' öÏ ¨Iæªp¾‰Ö:j/3ôBb«BEf¢ƒeõ¾Z«Eú„ž%§£³7øCa}é.™¶æ_î[ÆQNê3KÎÌNç"ZåÞ±‘WÓM¿Å™k’.Ó'‚&e#£É#£ñªõçø¹V¥“¨–L ‚-§=ö†3E[Úº§—Ÿ–¬¢F¿2‘&ö°Jô ¯v[_£ë ô¨rl_ËJ0o0hõ”ÙNR×'zXy „‚ÚÖìŒK¥ÔnÔmI¢$ŒR¾^²[‡tH ´nžR“³¬nC@,‚–þ¥Ö„¯*‹³+HYÛð²ä{ª¿hææ¯6ðÈŇV­‡ïTÞŸ÷¯Òêx_ÝLæzJÙÓ–Ì8y~g^¥¯#FKGÓ`¿aqÁ‘C·.ZÌ­}ÐùåÛ3.sÚ…³ñÞ‰ÄÞƒC†«·/†¸î¾]*_,_ÆçÕ³U3§é¬K{Š[›ð&ØêÆ)ÃÌ K>åè–·³³ÈãG;—ÂaáÔ/罟ƒð÷—)†–xüO Mu€w&åë †íŸRß~P  j$:þÜ>Ïl¶ˆÊzP§¢@_@¼±@ “‘úˆ`XîçT íŠÏÌít²GÅY³;Ó'8‹jqŽ‘¼¢ŸeÕEA›”íáîbˆXnŠý85&²Í#$;ª¯â½ñßôQ«ç’·ìÒÕ™3ëc_æ4¯¤Ë™‚&ÓZ‰¼B´ÙðÈ¥òà]ù™öÚ<ΖਖüÚÛ½‰îzr+uHÃ'¯,.)Þ¢¼¶Ù§œ6õ™¬7 I´Yt¸g ¹H=7Ò |®ÌX4Zm r~Ѻ®Ö1wç2ÄäC¶0yÖ¡k›K·®½8SÈØnEÂìBz0žŠ­Di„Q8¾ ‚(¸ѶžfqôQÙ’®šòe ÄJ@_n¡ì}O«m« úë͉úh™‘Ò­2MSCWéwÕBîUj@òCÜ?ð:•‹ì³¹×a¨¥™Âzqt¿lü¢¤d^$Ýè­ôC3äŽ>Îa0Gk³cÛÄ…hÓžD"Õüó¡ºÇ×r‡Û½A9j2a2~ïv|m­k¼XGV¬ŸåUZ“òY ˜h9ÝAí©],·bi ˜¿ÇÆ8d3ݳ™3âÁ©Þ‰‡ï,©¯‚´G&"qM¥0…Psñ!¤˜fEèø)ú7F¥¯”õÎlODD‘*ÑsÍžÓ–Ô£q/ÞA Ïà¡Ì„ Õ‹@‹#0¯àÆ32#żR¸_0¿bsD*l(¿Y¢‘—+¦ª¥Mâ»QƘ”JQÒzp£‰ˆ$x2Î3èuoï3³vkÞí}ÒUåA9üR`O¹U+ DR’Ã_t|X z¨ë.µžŠÀ¯2( š²T!·HƒÖµ +=š9«‡mú{ ·ý.𩈯O*ø]ÑfOQ<Ì’YÝ’Ó¶aÕw|¡²'òS[ƒ]f½ì†Ê…æÍòdwÔÖ £Õp²Ö"|A…ú¥‘·/ƪ‘Æn~ãÕC«®C€[ú ã\èà:Ø„U¡(ÎõæLÌO>³D¡È‚|*ᇷR¸ “ï/§Ä7Mä<Ì|2ËAÔE÷ òãRüí.UjŒ«ÁV¹3Žè 4®/É(õÈžÞAq=îÄî0â±&(žQ ÏÕ²t˜Vä–‡õ°$uÖ¬¤ÃÈgM§LC?í÷²<¼ÝÛp?A˜—ÛÍ‘ÎÃä 6­Ñæf“ µ^yÄA9 ð |E.’ o¼kœM¯ï•ˆ¡H)4úmôi‹T«zFåjƺ¹i?àÍ©¿ù¾ì8C§T,éFï«4¿qÇkeD«QÞ¤vÚkJ»J¶Ô×@w'@ð"YãÄXaª†Ë‘o“¥™«ùͯ"ÕHˆß°ôM?ƒ ;XÊ9‘Û¤ð²è|æ º®µ¢Ž—ÔøZ‡çpDµëëÓ¤ÇÄøœë(]o³¹¶–´5y–æpÅjŒK¥wž%¾Õtò®uqˆ!í¿ÍÚš_æµ).xì·ãÞø‰©`³ƒmP TÏ[X‡iú_Ô„âð†‚ʨKN‰fê¸ ¿ç«™ W“VÃŻߊޕJ©ö7Yæh5IÎerÈõ Bûø‚›Õ>R›³÷y‡¤ë0‡‘8ô°Rr•㋽eØßkÌC-;Dt ëyÜx]ýðX]Qz²uä)©ìhK“¹ÐÖ jÑ5õÛ 6­’ò¥ç9«¾V Ù½²Má ^W¥¯÷|eÍ Þ\©Z9ìS1­6^þ)ð ?<@‰€çµÎðêàN³oÄì°Kc$s¥>fšŠ)rúmûþf˜øþZ΂µâ‰"9cO…9äþëEýyÏÃR‡Þ²ûû#B[jq#ãG>ɘûaÑká´5 ž1á¯ÐÙ$õË™‹!3Jä÷çÕ äáZ¾<ÕõÛÅNì8·Oè 'vr}üQ¸?£ÄN£$ZÊÊþ@V‚¾ÃMPµÔxù¹F¶h~v¥R®‡göæÙ#ØÎ9ân #y½LØê²x)¤nÓ‹r»~«ÜæÎ±Úu¯œÏôxFLRÁLs kú¦{µ˜\JÛ*?b%s¢ïÏ2¹-§¸¹ý¼ü÷à÷¯9]’õŠíIñŽ‚úîß5t¶Öé-î^œÊZ®lâí6ÆLd~‚Þ@¿oÇÎD—ͽ-î9„ݪ@ÑÉÐ.Üv%V;[í¾b¡ç¶XÅŸõ@~óvUåDÒnLçfÑ«Ï^;wbx·Y×_'PyaVãÚ›-À­˜Å²–GU„ß:"ñÐvÁ¸Oµªxb´A·KŽeóeZ÷hLKuð «2èôÅtEvÞj¾§vÛCìŠuZ©·¼QsX_4X>Â.©}{H‚ɪ®nÛhZL,¯P<Çe«Øw6p/…©9„¶ÒÓ\COkøsóITeF†€Ó’¶—57Óç¶žæ¾YMLòiå’{õzrRAú€æ ¿&âÖžNï—Ák® <ÏØàyër~|š91¯÷Öó>ÞbeÛ)uòxMÖùvÜô{¯˜~²Te„¡†ù éQõéº}Œ€‰¤AÉ)Òì;ù]¯f³ Ó©ôX´ö-ÍÜ ŸþÎxÁÄé$žºÓ­^«Õ{rΫÓ$øí_mwïI7(BDŠ“ÝîµÛzû4_ÑWL.·UE™“*JÍøê<ŽNŠ'7}*¯D {Ê?]«]rŸ˜t ‚{Êݲâ³àâšÿ,Ý ÷ô®aCS ÿŽ‘Pi‚K{#>á±ba—7æ3A´ŽÞ ÅV fb'¸ïŠ~vÑ4ëÍŽ« :Å÷ôŽìù{ –˜©z”|Úà÷{6÷¶X.wíM´¹‰ùßøI³]Ò^Ê"&{©9˜¤Ö5CMP$ ðŒÊ‰cV¨Æ޽”¥y?ÇñÐð!r~§º¡@[fˆOúC(XðüAc~jI‡ñå“N§-PžP@ÿ»bͽX™óÕuð× »8k¸J³ÜÚWq2<ÎËØÇ$ðs«½åZk‡Úº#Rže4'Wª©õ@óÅ‚02zø &GèL«½PóøEÄFÒ–õI2‘ÿEþjqCx+ë^hÿ)Ôjëc<·Ú÷¡ÚØÜëÉo5Ù‹É÷ ²äDß0ïgÉÝBiå;$TìrDô_ÝrOÊhY¦ðyé?ý1x‹€»jûYZ±ùˆQÛæ—qY‘×…˜[¶ðLòËíTTù q˜\þí[½)O6Å—›;[O+üB…œ’KiŸ}lþ†2ãr endstream endobj 336 0 obj << /Type /FontDescriptor /FontName /XMIFGE+CMSY5 /Flags 4 /FontBBox [21 -944 1448 791] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 56 /XHeight 431 /CharSet (/infinity/minus) /FontFile 335 0 R >> endobj 337 0 obj << /Length1 1548 /Length2 7305 /Length3 0 /Length 8357 /Filter /FlateDecode >> stream xÚtT”k×6]‚ÒƒÂ04HH·¤H ÃCÌCw7Ò)R¢€t‚t7‚twK |£žóžï¼ÿ¿Öÿ¯Yë™ç¹öµ÷½ãÚ7+³¦·´9 ª€€#¹A<¼bYua//?//+«. i ý &`Õƒ::Áp±ÿEu„‚‘(LŒDñÔp€Š³-Ä ‰„Åxy|¼¼¢Žb9° Ì ÎPAÀ¡N¬²{wG˜¥uÌ߯v$**üè·;@Úꃀáu0Ò j‡:¶è 0(Òý_!ØÅ­H{1 ÐÕÕ•lçăp´”äxp…!­ÚP'¨£ Ôð«`ÀS°ôOe<¬]+˜Ó\at;B(ÀÂPÎps¨#u8@GY  a…ÿ!«ý!<üÕˆôŸpyÿ ƒÿvC ;{0Ü·XÀl¡ 5¤ò 7ÿEÛ:!Pþ`0Ìl†"üÎ PÖ€QþUžÄftâq‚Ùþ*ø+ ªËòpsY„Žt"ø•ŸÌ AµÝøg²6p„+Üó¯ ÜÜâWæÎöÀgp˜ƒ3TYî/ "ø³„"‚¼¢BB"¨ê±þ ¯ënýmý‚Qx{Ú#ì¨" Þ0 (êÀÓ ì ¡ÞžÿÛðï/`ƒ fPKœàŸè(jñç5|G˜Àˆ¥=€÷×ï?o/Pò2GÀmÝÿ¡ÿž/PKÙ@GKëOÅÿ±ÉÈ ÜžÜ A·¨ âC=„EøÞÿ£ †ý•ï?¾Êp @ôO¶¨6ý±Ë_`ÿk98ÿŽõR-ÀþÈyy!¨èÿ[ê¿]þo ÿåÿ%òÿNHÁÙÖö·™ý·ýÿ0ƒí`¶îP¢uF¢@ZøSŸCÿ,­:Ôæl÷ßVe$µÒpK”˜¹A<¼p˜“Ì j® CB¬þHæþìתÙÂàPM„ì×Ý‚òâåý/j¿ 6¨ûà ¥Ëß&(j}þ}®<‚0ÿµg|‚B°£#Ø€%'>AA€'µæP·ßJyà$Ê€ªÑ`p$ø5V~~å…pý3,”íŒBP­€9Ù †cõ•j ýµzÿÁD@µf0ÔèþùPD[TâPgÔ`ÿFQ  îìô 8Û"aö¶ÿ¸ €p¨åï ×ÉìôÏé Šï6ÿ-–_à¿ZqvtDåõ[±¨>ýýýûþBÝ ‚oÈã 늠Æó2i:WîÕœùŦðXƒŽ0A$ÛäO+5Ü4ÅQ™—æ%Ô}ÉšSE!#^tœ{çƒnÆ-þsIJÙH4ùŽe™‹ãK(£9‚ÖrH89|™d?N‹áÞK#,£‡¯ŸOü nå_/]Ë»nrZ7ÝØ ~3'Ñ!£¥³š¶1" ˜Y‘½ÆÄ1¤ŽF)κÊφ®1"a1g2Q4îËF1©½³³ÝÉüGoUÛ> •„Ñ{¨0gõÅwÑPÄe¨Ô:¡±Éþ-JŒ½O“oÂ6‡iW1¢§g‰i§áµÒ[÷IÃÂÐã5î© U54Žôó±u‹3ÿôpÇyÃ*1p·ÑQ7QŒî†•°C6Ý {ãšÖšÃ«Vç']ý¶Á,™:]Ô}»­ì²Ùsú‘JwŸj\F,¬·¤ÆÚ7HÀ_0i• ÊNę̈Uzi ÍB£ò¾Z¯ËÒ¼"%¥–½o{¨¿6™¦x¸½Žî?!ã IÀ¥ß~žŽýñ!šüºÑ¢ºé¥’úQX_›P„lÑlÚ>kÞЬF~˜¤Ù7{¿Ïñ]`¥js°÷ a”b™Îïwãà÷ãá#:Ú·j> nÈc>:È'É0ažµ]³&í(ŒrϹÕ÷~òèwtÈÛyªD©°|I{gѸ®uGtaŠ#â´j6³€Fc©S …ÖŸ=FQ*ã$æ×ôLçRzl}t[¼ÁG7Ká¾zªôŠ”ê5eï>)¸PŠD–3?’xÖíçÄ;FÕD⣛‡[eÎ)Gé·R…ìÛ¹î¤dqu•óc@ûàL§ŽïŽCaL:²¶:бÎ2Ã>ÆÎœˆ•Æe:½üÓ{J=•ç§àDº©/˜­'ñ™bb ¬ë0*Þ–0‹„§’´Ö>d÷p”äEúІ>Á½Îª*i”,ëEb8(íÓw‘˜hÈìGr¦@ðjÛI»–qªšnÞZ=š/ Nrëd½göö¢Þuñ|Ø âÇçK <Ì]]q°{ !¦b3ŸÚ95ô­™>aPjÔtÉÅã>Ð3b§Ù wÍ Z@“ÔÆ£gÊøLÝ,×!!&ïÔ¾zÍ™â Ë@v>ûƒræÛÚ]ÄPt|Å/exNS‰ø™©j6ÍXô2Jk|{)íF‡Åç1ÖgKØò]èÍ÷ 7ï§ßË»²¶§û“ .Fë&!‡Á m—€î%?­¥¹‚jã÷a!8¯sS*•Ú§6¸ÈÑžeß’íaj€|†Ô“œsÛâ4í;ª‚²ƒT öl¢®ÍgŸì°cë¿rÞÆsP¶¿~|ç+‹„=Ž›âyÌ.m'vÑ®¼ °Ú‚õRšÙè¯e˜”ÅÈ&ks hlå|Þàá\%SÔøÒÝÁj¹^DçpîÕ­»-¿V„ï ®[­¾…0|zA1`ˆiÀž|À1šÑ#®ùa—9ÿ…gÎÈ[ülYøšhº!Z‡SmNØG/Ï);»APþ¦¬':ꣷß\oÕ)¹{á=»Ù?Ö±‘gt·+þ]ï·gð‚7Û›ûw˜'ôE…äŠo2&nµÚá±qìŨ4è¸R 0óVíì/|¢ÿ°U9ˆÕ?T’¬W¿¥’´êð(0æY‰a[ЬQºÊ×ÏZª4øQYœjÉ"—‚+ÇrižðF—%uS\ÝLÏXâzu—)”¿Ô]\µÙO${•Ä—’9šÞ0ÝzPò ‚©Ÿ1³gÓͬãe ÿü=Yp„gÖøeç øÌåJ[lÃ’ÙMZÃÅ–À}(›°x…¥)¿ët/“ OòÁZšz¿¾P‰|?3IœÒ‰ Þ&› „ëœ‡Þ ´Ïþ)ž¶Å””;Q;7§êsN{*Œ%æÃÚõÊKàFOøu^Žƒ}Cùkò÷•a¼O&«F*¾ HUl$Æ—®?ÝžTþðÔnÎçyÅrÀ[ã@jGíû Ò9¥7k/ˆ(‹Âgø $ÌlGݤaÛ5á¬ÃÆ0¹†k¿ãÈþéžcŽ,kÑG÷Jf"3ýäú&6hU ’áÒy˜Rx¯¸ÝÙp«¢±”„@ŸXpè=ÞF^=Älê¹P—Q IZ<(¯ðéf }¦¿Í"²iô‹[‘c:šz›&Aé(’Bö´nMòžšªá„ßÈDç$æºaÐ •ÖÚÛâ¥ãÃôšIŠi {_óB™R1`æÃú×H¹ Nü„S,íùð\VŒª§‚=K¡B;c¦;M‰˜Å¡ŽF4ö:J ïÛ\ƒý#øzN?øµç}9+Ù Ôv¸CíÇøƆßc£y kN„œlp (Ð=A‚aÓñ„¦qöhUÙGøuTV[‡ôïÚŸ–d½&[!j³—M™e,V¹¥/ß¼C¸¡fI¿ðt@ãZ}˘¯²1“É’±K<Þ»]jÙÚ«ïñR††ý—*“«ŽÎ¥/‘©ùqüS ,B)" >–R¦"?.=ON­¦ÜXGâ–¼üšqef×BOp¥a-Öuc¬Z"F—·5„5–Ûºž£‚Qö>¯lŠä3®ãadG|øñhò7,¨ãõiª«ÕOçç¯pâä5òЋýHbÞUÞ ‹ÒœÁ~ý! R ÝìñCA†¯§?‘íŽ ¶J«ß^­œ®ñ[>z¯þ‹Ñ¯ñ¾é5q…òHE¾†}Z¾à—ð;¢™mÖÎ)ÑwW¹/¶ ™ç(¦¦\®}ßd‘`•ù«F ÐhÚášb S²Îtxâp0à;U%/9Ô+%”œbFæ<´Np¡îñÜ;Û™÷œÙàµáRÒ ÞÇ.›¿~>Ppq¤Ñ/¦ÈG¹ï%YêPÌŽ=;w J+€ƒ=ÊÀnÓ„-s|aR‹Ðý±;×oô)§—õå›%¬8ÚÀÜeµÁW¯ \ðŒ©±œB£¦*þê».øêZE/uÁÐx–þMë®âñŠSÒ—®w…™-ÐÁ{¢ƒ§ÀIº#«}ë€m[+××´ºê5Kµ­& ™©½&]ÇGvP ¥7_R06ÐÁÁSOlŸÝb6œê¶i ’䦔 Ã}£ÜC¦²Æ­-Í©ù¤–Ù¹9ü f—£w¦mÂëôunõõ5‹Ç•ipJsléãç?ó‹3nB+ÅÏ)úä ñ;ÄÔ$œ)÷äð×”çOy›ËýnÊ2uf¬xLw5o|˜:òšnãuYÖ¦5zY_Åõólºƒ#š«AÌëòUœÞ? ‰WAçã>„ *ôq&ðÒÉÊ 7èÆƒ½Üüæá¨Ðæi­(oò\)ò½°?{ž¥w¬úè·qJ=çæäƒåF[m&CDa“aÄ+hÀoîTTíqD3uãËaeâïà@“iº—5ôrAEÛ\Ý­ûÊn¡—S˯ãÛ¢Ø5öçY0c¤CôUt× Òßßgã¡d0ðüáàbýùãˆìôG¶fÚ¥»…ÁŸÔÛÊÅtrê'@uWcî:ô¹S˜‚G¬jË‚  99½p@ªiFE?&Ñãm¥–Jˆñ3œ±©ïÃ1ãÍAá“ðÀwÂÑM‘?yÎî0r Qz˜¦S_µH¾û\)öÓ=^¶U®¦U¸u³×:M|TSúîpýò&ü¨Îòyå2™j¼8ã ñáç··[ÏÚK46V¹#¸Ï÷ß" ² ¬¯üŸcjK kj‘6® \§VkcGâ«_ä}þÆ8îLX9n‚Å.Õ²Tý”FFæ²ÿócÌ(°Zgít~Å;ïh’ø])Á‰ÏZÜéÃlr¯…Úħ‚÷Éö}»|4ñÕGJþ!œß.r–cVñ€„>À[³N‰V`­5HÒ‡GÎr„½/œº¯ß$ÿ%ôÀʼn‘’y(!?šùötöì14hfœ§Óø'w/Z¹âÀ!¡ÍfNLAâã,<òOߚɞæåivV¨Úü4qÅüÁÎ.ÊìÕ2_^|£˜ƒd 2&ÓldE…Ô[K†«‚[@~¥4<­­—‘/Oe/³oZÕm,´DiˆëÍ¼ÕØ$ó°½£öýÝMÐ+ýÍÊÀ1=S˜#©¼;zJb‘µ&QÖ*9-„ÍÂ6#®qI!zÛär…LDèg­Ê}ï½:ƒÚ‰k{&ƒdÚ½.C?]u ç'¿&j;)ø˜ ÝRù¾^ÏE•¹M#`k˜£>zœ?]),-ТûZ3þ,#K}°è™ö—²¤v\?‹0Ü®†Ä¸¦(Ðjbsgƒëà‡€>÷»®“° +C8 ½uá)¥Y,júË]š¾èM¯1³D˜yí^ sGÀ09¨ ¡:|QˆÂôzÛ·éÎF^wy±¬›¾‹—Ä_e†‰U`£¥î˜§:MyWyf¢uë® æh!fùšv›¶3¥4 ×í aÃAY3<Ü}CÅ«/l+:›{ŽJDrnÒÐ(ÈoÄU0¶¹ GÚŸxà56öœšø! YO–$†GUUUßá÷Ý7[6,¡ßs[‹ÍÆXz8 Iù²Šóµ>‹Ìd2jÓF®îwË™Ëê¦T)tl)y ‘çí-à ä.ã†úžZ„•³jªh‘ÏÒ¿~ÅÜe8ƒ~ADËKÛáñ]Ú”ö„ïzŒv¯‡–à9‰ôƒóñõrãÉ<ˆX[cœÎÉ8^±6ûæÍ!ÖîfÔ)K ÒûPœ‘@ ûV0ˆã^k iÁ“tÐEX¤Ýµ\Lþ‰Éºßû=q¬f页KUErÓ=ÞJfÿ ĉGÁóÀŸœ/ÜZvÚ߯£·Tâoã·;ü,ôö à¸aS?²îìò^ÒVí¹k>½æS‡ÌUŹhg¾ü›„½[ûdz±í„Ê•Vùy;Ê_T*ï0ÌkÿÌø’±¦MÅUCG‰–YÊM¢Ð>¡ :ñ(&ÀÁ•ëàZ²¬ˆ<ò,38òæ¸%•¼ÜÚŸ]'¼Ó©š| euj‹ÏãN ÆÝB™ÂñîŠÒ¨½±÷Q¡ê‹…„"Œ%ƒ_]»\57·+Ö±KÖ'/'¬/Ÿ·Æ´Ù¼Y._,l^(2îa<¡ów›·Þ œÙM<·¡N”°Ä º9œ§·dBLÃfJÄ]ׇwèYúҘ紥‰lÁ;Ý9#*'{f ýCêj;»àË­—Ú±ýhhж‚ÇÜíE¾\r`#Çñ)¿SÇ]r¨Ï„ÉOÎ éUÓˆ دêZà. ŒXÎù©QëH³˜ªïÑ5ŠŠÈZjýªxX‹™G|]Š©†e_ú¹&Iž•oÀ¨¾}(DmÃjïV¸cð…Åà¶ÉÂÜN:UHW‡*"f5Ijò³ÛÂÝ»¬YÍB†ØàGîF#ŸŒ¥Ã=áÞ®¾nŒ÷[ó¤²n~ûî‰ÎóQ_ ¾¡e«xÕZ>šh&¬}‚‡rIˆJå×É<áÀ¸GXbç¯Ê®b$†XÝUmB«c"Fé¦5Y£.™ 6|7[íñ—é.2wµÈ(îµ`-¾Þ íl´ b°©MU>¶ÍkjT Lš˜Nj4Ü!.¡a3+l|åç§F¬=¼}®jFY$äžý!‡~é.v|õ&øî§ÆçÎD÷Dºlü‡-_¦Smº“òc>ª ¯ò%œìtýéíµøZ@„@³daqîpÛæžrø¡àN ÆàBññY׊zízo±7“>æ12ª©²ï!éåψS¤Ÿ§È{ºå‚45¦q(ɪpE¾Òv¬÷%6Z4äÃ3^u¥kÔÔέKµ<Áu¹&!q××ÓÕþ”ÑM·6ý2´ÆÄÕÛ9)Ç÷3Ê£Ó]U’âmåˆ náŠÿ9yèÒ3÷w…?ÔÏ“VcTò5á:Ï:¸k(Ë€ÛýÓð^è®VYå<œ÷:iËgã±1 »³î±£§àùÉ{™ê:öýi´#ºï¡Ì£~ßFŽkxìhðÖ²~–$v<Êá ?C€´I1î3ÒïïLŸ¹iÜwå¯YšÕÁNÃTŠG˜ßÎh˜“ïú*]’  ‹h´ê¯ˆ–_Sú~ôdqM¹±ò ±N;›B]ô^²µ5ãæ‰¯%J™ú|8ÍÁõhMåê^›YFÅK÷…Ìön¾1ô†hZU½c_àÆÅ ºîOz¯EÒù}³}]yþx²0còò$eÞ5Ç%÷‚Ýä4ÝÌB£ªäÚüj£ú»‘ßµѪ!òß_Rhn¶ÑpyÖ•)Wýµ¹Ÿ“²™I†¶÷ൌ¡¤øtD2þ= ]÷ãƒÁÚìޛݶSô{”@Aäpçªû6—~J12—2&š°šÏ9ïkUÇB›¥fa¨BoÙÜÎÒ »®W¦Â'Ka—ò ‚þ×|^÷í®e8ư,0ÖÊZQ¼˜Âðð}ë™ÂÞŸ¨‹ã¤rÌâЂ¿Ú»þ#¯{Û‰üFÄDíía· [ün®Í Ù@ r'nqSšZZ‚ŠãIxBÚæ|Œ”Ú™óÿ¬b«ýBšoò?;6c endstream endobj 338 0 obj << /Type /FontDescriptor /FontName /QIYSQL+CMSY7 /Flags 4 /FontBBox [-15 -951 1251 782] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 49 /XHeight 431 /CharSet (/arrowright/asteriskmath/element/infinity/lessequal/minus/multiply/negationslash/radical) /FontFile 337 0 R >> endobj 339 0 obj << /Length1 1606 /Length2 5348 /Length3 0 /Length 6140 /Filter /FlateDecode >> stream xÚ­VgT“[Ö¦K*J MzïMzïÒi! IHB“ÞAQzïHG@š€‚ôŽ"ˆéÒ¥ˆðEïÌÜY÷»¿fæGÖzw9Ï~ö~ö9+\lƦ‚*`„#DÇŠ ‰È ¡îŽžh\_P°NIR..5ˆ"àê@ D` Ô! €˜@TVV–”  †@ú¢ Î.ù=K^~~?=¿R޾ÿŒ`O¢¡ÎpÀ쇆@ºCà,Ä|Ð`\ '( P32¶Ò1Ôðhš´ p {:  €>£!¼' ûÀp0ôWkh!,–  ‘{ â‚ …HÊŠFc¿P4À„c°3À P8æ þEëwBü&„D!°îØÌÆ A((ÀV5V×üƒ'ƈùU ņ'l&òüÕÒïÅ¡p4ñÁüªå€¡h$ è‹­C¢ ¿ix¢¡pç?Pg ƒ ÑX,ö¯éüÙ'àߺ"‘0ßß§¿³þÅŠAC`NB¤¢bØš ¶¶3N*ükQtàN€¨È~°'òŸ1/ê÷€x~í /–Œ€Ã|`ˆ©°!ƒ- àùÏTú߉ü?ø"ðÿDÞÿNÜ¿jôo—ø¿½Ï…Öô„Á îØøã`_@ðëù¹@w(Ì÷o²ÿšh ùƒáßè`€Ø1¨À±Rˆ‰üá„¢5¡>°1r8aØýö›ÃÁ ‡`µü=F€ ¨ˆÈ_bf.Pü×Ð%ÿAàà¿2ÇÊó›·°–…¶™©.ÿ__ÓßYÆXÕ1f¾H,±ôa€ÿËø…¡ªŠðø JˆŤeR2¢iÑ€¿©öFôOÛˆAA}°-‹ˆþnü¿?-Û¿ÀhÀAð¯-1Åá`ìbýËñ+ òD¡°zþ¾ë؆ÿiÿ^qÄ"ù€É‡»¦ge`^0äõ«?xÛ!Šß,­7+* ®F¼ J^”­t¸¨‰j•»lñÚDþ\Ñå[íï ‡q¿I…|+` ààí,¼1§Uš5TØ®ôzÆ–e¬ßî¤þgk)‹Õ/Ã&÷ìJ.ˆ˜G[ÅQÄ»'¼Á^…Á´œß‘ ´º8º×T 8Ô/žmnÝIZ?ùÎÝ=Ð×ÛófŸ°så6n —ÜGÁ˽hãB®ÿQ/±ï‘ßuI¦h3‘–o½£›X²îæšñìbeHDܧψqÞù™éirÃéH‡_žðöCq‚•nœ\þ®½¹oiý2·û\Ü•‚gä £¶˜Öúê,\·AØž:!ìQÕÉ~%OoC·åøMUŸ&Cþi5•³þóy7f½ßŽæ…R@^É{„G¤ŸmXLÄ+zPEÄ›Ihµú5È3Ê™^^ƒÝ)çbÖG{·”¶v/ÎËc J5‰3˨Ä<™ÖrG–ûÇÁx”ª•©Ê·¼‰^A¢â ©l‰äÔ{àlmÚZª5£c}SÛü,KTòvô‚½ï8­¯66‡•ìž„rZ¶Æ ³˜BuP÷gØíÏŲÚ&e…‡‡žç–Üç¦)x0ÑqÆ:%°PzîÛTiÀ+õíEùr'h¸ÿ£Le[Íýì,µÏšŸ^9<‹dS!–s®àîKŸ´vö¼ eH8ü÷Ô&͸{` ¢…=V¥qP×½è¾ÒëÀH“¶È˜h(ÛXÓ°s+¨Ù)ÚÞŒ&p#XCâ^ ^ÿ\/ØÈ\¸t&TCùµ•ˆ”’5ÃrV«HûZãÇʰ“ÜI±:¿ƒfœÐ.9ØgxàK¿Òàg%–Ïo˜ÎìFÁË›‡GeN®žµ½YxšSx¸žyŸâÏ¥¨­Šã8–o|6Ñ~œq𛦠È¡è¸ýóç«¥å•ÁZÃ{ çÊ _1+Ëß›qxâO‡ƒ5ƒœh‚©ýg(ðåæ^)]Ÿ=}D¨®­–¿'ÜPïÃteÇLgüŒfR²a<[9ON’|tPD³µ˜~¡×™{óHÜwËè§Rͤþä…DW1‹ÎDzÀjÉÌãçò#mô«hè*a_vG9emÐþ€–»¤²„‘š_¤\ß×á‰÷¨ž`¶Ûâå9=_\6Æõ§åªÍEÍ^s OP­Òkiªx´Š¨Ny HcÓÞ'ZÚéÀã¿wQrŽ#/ÎFýx§ÁQ"y¾Ì*ûóÇ-ãÔÔÅ—Ô”¢uÈç2¨+\98rŽz!}½j©à´äGÍ¢bAüo2Êèöcº"+o÷ÕN׊”¥â‡9)5nS;íœop¶_öt!8Å]†ÜU9p4Ö*”Â炌!D;‹U_›Ó¼npp¸C“îäÎ Ú‡ª¹·‘”ƽÜèÖù¢eû'5ïe}g*鿹¤¶÷b‹É,J³#6Èè9yzC-wAÏèçäð$t^˜È•ã U6OäÂÖŽ%ßtÈðç#¾ú¨¼LkQNFTû&ê=(È_™ˆ–a,ù“Û™»¹ý±¼a4dP&23°IÜ;ߺw¢ã`’¿þåÞ@Þ-¤…jÅî¡®¨ùäMÆç] ñ̸­ŒÆåöOÿjñg.½NôO4šßûYYØÅ¶7?J¶:ÎzO½XÐØa{.0ºµÃõAW]W[Š…–a+k"ùÔ¦ÛŽÏh ò$Z’îÿâr.—)K˜DÜ-¼½o¢k‘u†WÒ 9Ï çÅúƒÜ^¿“EÜïÝ&a?ÐnÑøÒ»”`±¨I rôÝÉ*´ºûbSź;;´ùû”í©Tg¯°?I~eHÿú¤ÖÔU`þ¨PŠe~¢†ePÆÃF<Î`.A‹©–Ça76ÌAÌ/µÉ—†«÷Å’å¾™ÿÄ;¢þ)"ɯùò‡;Yšß¡Qý¦€r•ïœ7³5!î»cñ7ÆN)2롥ݺpj;¾Ç©nÖÆ€œr:]‹‚ó|‘Å—f³ûC{óõ³¡¬w×tæI¥/i õé¶og]€IÒ7,tP¼qê˜2J©-®$}0”ÛŽ w0™«6—â°â¶üøb‹röîRíÆ±mÒ}Þ^2\÷} hšåvÐtö…ÔäšT¶t³Ê{/9Öðí¦Å+EÏýÝ7„I òz^–¦íB;}Ëk²´}8ò$»k£GÖ>¼Ÿ\_ÀC¿2ÿØ•}k»½%ƧÐF˶ŸipÐÆîgPÕ=ý¾?î=I›0ã³;Ê\m¢×Oô FVé¼…dî»6v¯I¶.oŒËbé‘àîKiZö‘qÇf ™Ó%7ø‚:š¯}‘Sü³ÿ™5Îúšg«¨Ì \ÍMñÀ0 ·JšÆOGÌÇc3øÈ#)m¿ºKh`½*#gŠvIâÏěޤ’¹,rË·^Ýy*FL(:CäY”’¦¢˜²Iªíæ±L Ù\öÒŠ Ùc!o l“î5Ö#´*%\}Kbµ€qµw™ç$êšÀp¦ðGTT?ŠÜZLJЦbé\;í95£Ó¥ØÊÏÐÊÀ¯ìANÒà ëëÕq–¢•Ok²WWÅŸ‘¥5IÖ–³ö1’¼ô% cÇ"ž>¦©Yãà¨/Ìç#;Œ^ÏÒcn0w꜖ Që/Ô×Õ"kKO´úˆùiKðV ¦ù`“Ô¡¡B•¬%ݾÂtN3H´9óŠæ’®)d7´ÔéÓÊ÷)û}ÚûˆcD¨'<0Ð5€ÙÀ³=üÆzËÅÊÍÌ«(ZdÍ,”áK_rHHª”‹„hG¥cç‹ù2NÞ“Ąbñ;Ë=9ôÍn4œ(È$û<Õo'':'^î±¹§c¦|mþLä4‰‰üÒÂ@IýŽpÌë›ùà´]Ó#ú‹Ò2ót\+uûÀù˜Q>ú¬WOn×8Û“ ÓèÀTæ³ßÑ_Ë‚ óM „75MNÛG8â·´ØØ“Cœ¥’KP¯]/Jœ´õ¯ôŠiÍ<„?…P”wq5ŽÂNÏ’2R)o7¨ßÚ¥bN‰q‹ã¶Mæø´Œ&o%”·Â#Cùˆè—zÌıgˆ¼kÉ'qcÆ(,dF.ñ{`„`ý¹Ô·gYq{þÛî·kUHmµÞšD<êYÁy ©pÔèÒ™B5WF¦öyžiŒ±¦®SÈ›óLŽçÞ¶ó#þ›O ä€ò¿ug÷ÂU]™²ùjLêPññ¤h4ed=å¤ÿ]ÈQ°ÂÒÀ™Ê[Ìš™Ì®Ömn Ý»~ZRDeÜí‚J ëJËW£—Ì9N׫ã›ÌSBÒžI2Hº2*¦&8_÷žÄC¡d ‚¶ƒµ™Ç\ÆQjZ\¯Ó=SÄéÃBt‚I£6=êRÎxd&úŽiö'¼sëÐÏþ³á¯(vaÛ]$tªvkHÓ±[†å¡¹Syp¤¼¸¤‹eîgâ×=Æ6IkñiôþÎüNW´n—ÿIDPJ¶s}Nª2¯Õ1¯ì¥¥ã5ú M ·}ã²£ ?µGƒ„Éqþ½“Šjd¡—É«ºªGÐÙÙª¶$CÆ í<Œ»Á áqÙ Ê{[:1ûãÌPõçÎ,‹h[)å+j­÷\i‹“ž‡‹SÑp.Dûݲ¹OWN)'²Äe=»ÀBª7 õg=òÊ‚xq>G B…¶øHäÀåò®Òä i2Ó! ®Fm Æ× ¯XêcZ–•‡¥ ß¡fì(–»|VKl7ŒŸ×-ÒØ]…ð³ýX˜xo*äž*„)ÊÆ·ªÖ÷¹ Eu<¦Ö\\½ƒEhvN/‰1 J®O×t2~".ôλFÞ×4Ñ ¹° gÔákë˜eèãò¶ò雿¹ƒùÆæ7-½JCDKi?g]+“ÄÜ'P‘/É¥Ü;Vµ!vÛ†G=‡w©ŸnÚ‹–ÛxVHÒÑØ¤Â€ñi·~6{Ä4ÚEúKáǹ/b(† 7ÌÅøïþødåñ¦—*×™aÕVÒC}}siš¶èË©ìk:ÑKŸ– ëº#\‘/dP,n7vQ…yGžÎåâÒz`{Î’õó(Tw®¨áK¤yZ¦íµ¸ó"V0¯‚4Ï8)»F–^FeóÁ¬ÇˆbnìŽÕ¹ˆé¿ëq¡ %Ñ#;×3æ aÞÜÍšh/fQ¶° °Ê”ÞÎ}|‘™añó"A¯€6JÝ!V7'Ïñ ‘ìGÄW†@È2 »Û{¤¡‡\–(cÁ³&µ”Óª‡¨»„EÄŒ}äÛöjs‰õYêa–_‚üʪASÑuqS,æ×’Œ6FtGoµdn&~‘édí½Ž«Š¢ø3;{}¸`»¯ó­(ǵy2Å”’¹cÿùÖ+vÊYïþ¬2Jß§²³iøUP&7‰ªsÚÌh ß5œë§ô˘°+C¢ºvN Åå£wâÛÝ;¾>êtE«ïi#ùŽª>_Êߦžgã|•TçI~Uâ}v‚?ØG®p/Ø¿£³I榹? 0NåÌuDK”TìIÏÝäß}ž¹$äm­R9عv˜)G¾Þð \T=}Üm›£re²k‹$Þq]Þ{|d¯E§.ýþSn’ÇR¸;TI‰·ÙYF˜bZ¡ 0yÎð©é7‡jÍ7ea,å×ìÉžCp^<ª×™øìA=¿:J×b(.1÷1­gØ[%CÓ¡Ó®±®ÆÚØ|„“T&å¸áÞTæ°ÌJµ7Öô|¦¹‹awa"-§‰ÚfMûÕ8¿ÿ o1-—ðà¬Ów¾ùW¨Ò_áЂÀè[·xÜfÉ ›u°çáÈ<oÍž¥Ï·˜K­tñy#ù,§¥©^á¢Ë\žªåͰUìŸJÉÐÝ[Ÿ÷|® }JU(¿Ï,ÓÌZù¤¦¤äx÷£P;—ÁMºžþ¥GuyÊu!¦òeîñ6w‚Õm­‡_$ùðU2ÎÜŽí"!;áÏ`g7“Ÿ9'Þ½`^êÞL _šüòíæ ‡²YÚ‡ “«xŽÝ—äi8Ã{ÃHI)ïÕ©/OÒLÁ^ €3 .vÑ$³Ånõ)ÊA‰‡d§˜àöªJ‚°\éO^Ž*€z|pƒˆûøìGãýý‡#ÖxÀDâ¥EfÛÝSu"_*UL`û®ª¥$äL­Þ1ߦÈ2I.©¥-MØ1ÁômêÙ“5EúÆ%Y2»ž’©šú §³¾Þ›ÄW«?„;hÛØAa­Û’oË Ê9Q6ßfä"‡`ÖMc¤?ÀXé+,€N˜!ƒ¡¯ÓùŒj ý¥Â?n½[¸ÉåwO~<Ú=ÝÛ$'ÑÃø®nnÉóPO¤¹Ï‘£#%œF/ ®šSvÄëØ$wò@ïX Tk8Ïæ_EÍj±GOë2±j7´uk4½Ð»ÉžT8nWà¾3ׯ…‚KZšMx¤{m²=…k[¶›Ë+¼«½øáÙ|1É~ɺ™uÑOáHjxoÂÛ¤\¼­‘ׂõ†]D¼ ^&yõÿx‚I endstream endobj 340 0 obj << /Type /FontDescriptor /FontName /GVHTSJ+NimbusMonL-Bold /Flags 4 /FontBBox [-43 -278 681 871] /Ascent 623 /CapHeight 552 /Descent -126 /ItalicAngle 0 /StemV 101 /XHeight 439 /CharSet (/i/m/o/p/s/t) /FontFile 339 0 R >> endobj 341 0 obj << /Length1 1612 /Length2 17471 /Length3 0 /Length 18308 /Filter /FlateDecode >> stream xÚ¬µctæßÖ%ÛvžØ¶+N*©Ø¶mÛ¶mÛ¶m;©øÖÿœî~{œÛ÷Kß÷Ã3Æo/Ì5ךkHN‘NÐÈÖÀXÌÖÆ‰Ž‰ž‘ cnmàìøËÖFšNÁØÔð×ÈCF&ì`¬ïdnk#¢ïdÌ P56ˆ˜™L\\\0da[;wsS3'¥²‚* íYþ ¸ÿOÏßLGsSùßc+[;kc§¿ÿ׉ЯÆ'3c€‰¹•1@XVN]RF@).£ 7¶1vзÈ9X™¤Í m©&¶«†¶6Fæÿ´æHÿKРp´364ÿ›fìfhl÷‹`gì`mîèø÷`î0uзqú;'[€¹¡•³Ñ?þÚMlÿEÈÎÁöo„õ_ß_09[G'GCs;'Àߪr"bÿæéd¦ïôOmGó¿n€­ÉßH#[CçZú—ï/Ì_¯“¾¹#ÀÉØÍéŸZÆ#sG;+}÷¿µÿ‚Ù9˜ÿ‹†³£¹é1 8›ê;Y;:þ…ù‹ýÏtþ«OÀÿÖ½¾•û¿²mÿõ¿8˜;9[™ÐÃ01ÿ­ièô·¶©¹ Ã?‹"icb `bü·ÝÈÙîú\Œþ5 Êv†ê/ }#[+w€‘± ƒŒ­Óß’Êÿ;•éÿûDþoø¿Eàÿyÿÿ‰ûŸýo—øÿï}þOh1g++}ë¿ ðïð÷…±Hþyc¬ôþ_áúÖæVîÿ‡„ÿ T5þ7ÉÿI'ý¿Ã´1ý+#=ã¿æŽbænÆFræN†f}«¿“ú—]ÙÆÈØÁÊÜÆø¯¢ÿ&€Ž‰‘ñ?|Jf憖6ÿŒžíß.c£ÿ$ÿW¤Qgø%§ôK^–æ?ßÔEÉýÕÞIÉÝî/±ÿÑÊ/[£ÿuøCHÈÖ àI÷÷Ò1³pØÿädbòþ?Tû Óé;9˜»4ÿ¶ÌÈô¯ÆÿÇï¿NÚÿ#jchkôÏ®(:éÛý]¯ÿeøÇmèìàðWÕÝø¿ ÿÏó¿ÝØØÍØfmÙÖ'È"-3Ý©3wxRD³¿— t8Ø®´Q©¨À¯Æ¶Ç7-l—«Rï£6˜¾išû«Í}éÜîóð'õÑh/†EOŠñu>ž7 U_òyÍQƒN)|ú…j”çÍ¢ô˜;£ÊÑÞ¤¼‚NÉþt‹ÔÍ •‰K鳂ajC,z'RJ]áùyâéË3ÅàØÈðPÏxß!.MN,4>¦Oò9Q’“»žÃc£áø› ‡ë| R(ýEÒï(ïQ'Âõ!ÁfO0Áá°Ž‚ ,²ô9yßœA§rÅ\ æ±â|?Âe±fªéþ&Æ»)€îÍt4Õnk£šöŽ8mT«)ûæQ ¿[Ù¡[$ëM³pïrû~ Éࣻvb CîKçöh«ßÞuàZ(W± ?袇rfÁûi‡ ýà^cΦç²Iñú毞œ8ªE†j©¸?x›4ÒO´Ð!²Æ^^lö~Z°FcôC‡áZmÐ!4v Ù-áô´dË´”ïÎŽVß¾S]¡À84)*vŸyÒó]ù ~Öì9,!šõH‹}Ì<@·CšÀò mBø•2”“•´ËŽìíHƒog~Ò°œi2XïG-œo’™á•øT0çÕ¢`Ïu⦠žÞÚÍñó*N þÞ Ø…Nɨò¡H*Ó_þÀE'ï»±bïKìiä¹ÍZQe³Ãùy¼®O®5¼+|_š€óïÊÝ^ ñ8M¦Ýײ0¤¥ISŸRoX\J3œæãÆ*döHIu™lP_Ù¢AŸ]Cù qœÇ¾‹j~yAm»#ŸºÕ_H-!Râ&ò–xfQ»ÄàêÚ‰‡PÐ4Úy F‰µX>ßv]–§_´°òßYú™š&¥'µ‡/a”¿©‹i¬ á¥½Ðø˜‹£yM«CI@½ÐÖü^–£R™,‹~ž¤éå‚cIºÛâ ]ñ ~p† Ð\ªÀQÝDH>o5®{Ž1v÷À¤ódû`?±ÊÂ7Ä&›åS³XOÝñ?ðáW’ÎìQÝîHb¥éªÈ–PØ™2/é”rÐÚ7k—fW`@CÛò£Œ¶oóP$¥\dÍë¶Mù¦){쮵S²M°ØÖû•ä×¶1t‡ê„wÖb>‰ü$ï)"Ç2F!_Ü@öC¦FÜÅT(¬d ÙkäZzÍGAC`3ÛWó¥¾7 Rõà¦íúRT¦¢¿±£êáñ -XÈÒr”.”³5ýü1Þ éVÿ(RY¿Ñ˜=i>.'ldÙ,h.Òüƒ«¢ yЂ›=¯#,SgàÍÜ—:h䘦õí£X¾côåÈJz­÷.›¢×”Ì•ýÈù(þŠ`?õF'%œB˜<¬‘ŸCo,“Ї!Ô@Õñbpíoâ›nÖµþfUüPgöm÷ž6pèJ©ð˜)ƒ€¯õÕ7:m3ÜñÞ–Á²ÔV‘-]xu›býÓWN¡Íai•½„ÝÍ´š!óC ¾rÖ΋ ÕK\;Ø-“bã9)䏯Éc.RM€ÅüJ–ãµf¶PÓ¿ Cb{å„ù^€üaMî¤í8ý¥%³þÇcÈb±pËï8§$Nïÿ.z „'q>G÷P=a‚ ǧ§»›ºÜyi)°NûíG¬Ù bîùfº¯ÞæØsƒßÏëàN´HTE;|MÉ„Çø]¬ñx&ÈvÚ·Û.îŒ‡ÂÆ LYD¬M†Ä/vÑ4ûã J0ͳiàž ßý\Ù¹¦¥Eœx x…îËþWH}Ês 4êå’Gm¤vÉâö—à YÁL(il…û>bOýí(ƒ ¾m«çNN4.Ó©¤bµR|ÇÈ£¦ÛK@r!’¿~²¹W>€àf)@謅D–_ wfmÁAæÕ Ìbå¶”Žœß9 &ƒ~üÒ ^‹“ÌÁ)…ÓcÀînû‰Ø4… -‚ö°ÞL\0±ˆ¡ ›“DŽbÀC§<”×ö£ÓPrKM?cÚ&pzý ¿ó_èc¡£ËŸoq*åqY§ñcGyÄeÆ÷?]L‘ûÆWѾJøf,`6“%ˆS¢›a˜k½Æî-ÞèŸ@•¾Ôøl×Ï)âüjÍ%{.k”í `‰jiLù»p ¦éœãׇQY¥ ªÛú[>­P¥û̘VòoǺ¶E¤Õ·6X0—ýbŸç>PqªºÈTüI­ž/PNbtÖænLïcÒN²ðÃ>ý ùCIÅ\«é<ɰÔiV ‰òÒb²}lß:tåzÉ÷`ž<¾ág[l œ s¦&®ä4Àý ÍÆOÔÿL’^ûò¿ò5¿T¯ùÊ-a%Ÿ:©‰Jˆé—æ ᄉ^„ÂiÁZ5*…u4ÀMà‘ %X»ý1¥9HTFJ Š€ª”¨n„w%«uvát+þU†ë9µÙ ÄL× ÊnÄKï^¢ÂÉ ø7ݾ-ûDfúûUÎÍ'>ÿïjL'ŒŒÅÀ TUˆRDìòòF˜Iû+p‘Ñ–„ßë#â1Û“Ÿ™N<#ZÄ3oqÙE˜E=˜q褹­<>‰M³Û`:}‘×`H^ç%&Þñf“ãïC øíÜþ¬w §¿•êdŽP ²øQ€¶ÎÖVæ¨Á¨q©­ÅÝxÝGÝ’\ó¢iç,2-[sei–Â×14ÒÞÀ‘á’p±Çr÷¨“Äéï$íÇ--ˆNh¡°ÿ,~<¬›‡È$:×b5ª#Õq˜ÿX(—½ Ý«ËÃZ2%3<„®Æ÷Ÿ-}Vþgt™€6*¡tRn56ºÒÄÂâÄ÷ÌBV9 ¦œ·ÈË 5(óqä:…3µà')4íÊ‹e„,ND½)6K"‚Ä–ý(­cÉW ‰á‰e?¯±%Zw]êÍozôymóÏŒÍÏçóö݉¿ŽüæqÊ<¯¨¤µO çµl›VÖ¤•´eágŒãЫœV‹žf½²Ä`þB|×^Çà±~w/性/óã ý¥>MJ+0£=˜‹¤I>å…ï?ƒƒh“<\Š×éJ¹&äø˜“Ùnò€1ª…„xd(æÉÑÀG˜0îý¶Ù™?iÓžÓ}Ï^w㯡 ¸[Õ& ìÇ`ÕøKA÷è.Š¢t«Ù­[Ou("²§þ ¸•éÑüû½í+Y3HÎSÔf¿â ùD^ $£/Ä×  ¸ÒÆ\Nðк¡À_Ü€„3JÅ£äÿh”Ìn Þ¸¸ªsh¦TÆÕNŠ÷¹l=Ý8@È„OŸzEŒDÉig›„ 1VƒEèq芛у4U_o¯æù`”;Èärv=³ÝŽðJNþ"4÷Ögñ`¿†PÃáÄ ÕK\$XûÁßÈÈçéÆç7˜¥`®– Ú‘Ì#\³yàpQ P[T8aâøŒ=Ú»rçBWëÿÂÌdc¿M§Œ@S˜©lÕÐmtÜR©‚R_Áz=H¾ðtDœ:¨ft;Y{?fA 뇢Я“èð°ÁG ¹{•`åÚ€æ¨ÎÀ|,0k(l€®†nTcþÊbÿ†ã0EÿH!,+¾È®YS ±k~èW$!b%BÑš=QB(Û®ªHK­îŸ|fåÊåièÀÑ_ÏW±Õ¸àØ _æ#©ËÏ/++öÌq¨‚muQdÎãü±h=X™ÁëÍÀ÷=¯QèÄ¿ÒÂÑÃÿZý5@ZCŒÏ‹#@¤sFÓ½œRê[ ùòá¢!C8 l)Ñ£x5d Zd'¯AÃCÿsñùHu†þpeHyšèøÒ,ûF}ý÷.r£鲄¯ÔÕ¤¹ 49–€ àœ(mº÷…iKŠë žFÖ?°~hV Ñ7!\o šk¤ ÛÔ#•¥·<ìûì¹6ªv‚Jô°ýÎÍ{â†Ý-œ5û¤Ã·6ãjtˆ[[`½ö.X™£ô­Ü¾aâ]„qò2ööh/Ì#ÞüDÖb·æ ËBÜ\<ÕýØ#ÔG0\™ò`ÙcRwªÇë-5l r³F8E§ƒîÃÈí£l~¿í#ÈžÉd¾äx#ÆUÿ ‘ÐÊÖ:G®½s¢^î3×TÇt£Ê-qzѼkb\Añîàþ¢—æ,ËlìÛ8T©U˜PÈa«†ª9S¼ ‘©Y÷ݪ雾ß|¯ãjBò‘7³G¼Øhÿ%þtõ=%~CbNè1ÀíŸä[.»¯ÁËhVÆ-Ϧ2«¨^˜Ø2œY(8¸3¢¤\€ïôÓM¿t÷•LÍDñŽ Iƒz˜Áú¤t¼ E1E‰Žƒ‘ðëÏ9˜å‰Pî7asTÄÒgö„´¨B/ «ULºy6$¶™PTµlH%x“å¶î'þì2ÚUµ¦fH¾p4¨KÏв›!¨µÐÅ^@ùÎÓÔbŸ ÉÄnôbÂbÖ@«òØ@Ze’ßzJZS“ }EÎjÝ€±7ù¬ßYö±¹Ä¹:/)iuÒì\URk¯ #vÌtí÷º&qgv­'û´`Õ“~UóR0Ÿk¹¤ÇEGÅýœçx¿«ð¾Ð•CDBÆ"–ær Ý‚9 Ê Í«¸'Ò%ÅΆõPOúLì‹ÞýN‘c|å›ÛÃ’^6ª+°J{ŸÓö#D/D(LR.ã‚Ä<ÓòæÖ§òî.ÀM,Bö±Z­âPÊ(gŽèÙàÅš¹ñj Í]›¯<Âj·µòË/DZoíÑë‹/ÂÉm];6¹ :‘Âòæ9±>çW>e¥·™"/j^Ifx|Áª`A(Ò8È+µb†ßä‚£–ñ¢‚&ßP ‹ˆ¹6zWÊH¿Á´üt!û BÒÏô…nÕ—C×h¡¼¯4B"ÏÂUí«‰]Þf{oˆ41…N`A6ÆzµãèiWVôÑF“òù$üBŽâ§h¾Ã*@å=’èÀØòñ,Q&V¼&Þ&xψڱF1‰H{q€… Ñx‹TdLu£ÀN® *O!¬Ét¥ßlÁ©d¢Ò J*³ðÁ—v©…;8p€Œ"BÊŽ±D™™O šÊŠ %¢·»•ÿµdgQfn½âèÀ(LQI4¼Ô£/´å³~FœÂùN%˜d]¦:!ÊéÛ˜ŸÔÛù|N 5¹7å`ä\Ç(Uƒ+PÎ5“/æ’ÑëæÛ!ž&«ÊÉâ}cØ`tWt¤)Ü™$Áz Õäx öÖš;ÅV¥ûI3ÂéI×R¿—@ú˜ÍŸ Ǭ×zÌÁæX¼*ûÔ:…@§Ê¡“\HîÅ$ÙÜ Â¬ßÅYOw"»Î”[S±gù¨[¯r¼ãUDXéÅ òhxëfù-bÿ[›2u§,šN¶jLM1iNÈÚã;hèjt¢b)uù3Êf¤´»ªyKzÒ‚:]ýÂ\€ÿ×Õ)Å›K³Œ†Ú—™ß‘[65ä0 B&%)ÛE%J–39¸‘P¿kµ3{TÉʤ'¸çpóvôá¦<¡“ñ­v;^:oFŒYMßÇÚ†~éºcºÍ+ÂÇ ¸íËù^?„&¾nÞ+ÅÙ$ä…¬bxc€\i”€ØÓMvw-(ÌV“Äê…®°U°¡ºV–º‡Š: z£í"•êg`ÁÛ…Û×.—6Œý+s-T"û«r¼FÌàœÑËB~ʱb5[íj“àš¿eœwéóýÇR¢™ƒú…×7¸ —w¶ª~P<¡ˆt”y`Á ‡Ùa•ãrH‚3ºA`U«“}exzçÀÚìËö+ŸâÇÈ¥“ùíÙµ7vI{v#(2Ðu:z½W®º¢† bKO÷Ù6ËF Ÿmu¶|ÚòË•ag<5ˆ °q®mŽ%„^fÜùk\©™øÏyhkÅ'ÆOìf­Ü,}î_O^ Òåvñ4ˆjvÈ<<'öt¼½%1 ½èa. Ø(íO0fÕµîúNáiãO×<÷'çO›Äü_Ï¿ÐMKU¥€3¿‡iTÑ= »¿ ï»q@ Ä“†ØÓ5MùI‚+*Þë#›¸*_I9uAC^Ôm’£f Ð¥<ç#Òƒ‰¹¼Ãur «Rv•í˲À2† T¼R„zbƒ}ÅOõ {x|¶ „~–¢PE‘%ª”gÒûn¬0¾$ñOu«¬<)b»­>‰¿¶~ššp«ù2IšIº;7êœ4ý@ÏÈ-v¥Y÷µXóÐAóŸÜ2W»Á2ö?±l”É¡÷Än’¯ø”÷¸LL Œ øÆ&耣 !*†Àf³ëˆ _ǧ¥—Åà’ŽíÐÍ ¤`~Å9{bÀ}iáäÑfÿ²rWb­ßÅEdú óp;N¥Ím»KC!C{âÎó‚ÇœÎa„„;’B|?M¼Z¿Ä¶—¿yŸ¨âMTAgXtDt'ÕKèòX²¯UýáTÒ©—ÔÜJfß@WO*ÀB£ÄÊ °NÜÏUuõå¤n°W2A[*¥][ Çùg7/ ÊÔT6Ù8ÍkÅÑ_Þý•u¾‘鎢l3ç¶¼ÕÍÊ mÈߨNËûÀ­íNmŽh,z |3Óù´Ä‘ƒçÚeUõ÷ùÒ-¾ë*Êg“©‰Ï)µª¸©8~1þßêë#(?—*öÍÀšþq™;Ø‚Æcç!’¼ò2ÿ¨±ò¸®‘ÌØfR\.ÑX¥À °rËOñ®çzõKûë…®›„­¥@ªDsİLP(+è0o„7ùŒÚÈc×çÉ+Sg±Ûa«½ïMõ«»ó­üä¯kæ»ðúgqæêHä÷Õ±8П…°½P 6…îãËÝ»-]¬ÖŠ¢K’èYТ_UTÚh ¯ ]×. ^õ'M?'´wéÇaŽ Ðƒÿާ§;ñ^7a€MTUÒÉG…àáµl1ôÈ©{kIîïˆnö¯qÓ‚x£*%wÂh{(RO¸è)½âНI32­W(F £øƒ‰éÔ[5ºuf“ ¨¶ÖÕb +–= 5îlûL oÉæ"ãBLüñ<*~$5Ð1Äω GuhÏtœ Û\:ø£(¼Ä ŽÆ„I—̘ôðíž»oí&FcÃP)n*+Ö¡¤Ã¬¡K.4@L†Š'«Nk¾Ò‹š1"ô~ó¶[¿Bšñr‹¨ïÐO~æÉ-SÕ{QWœù–køã¤Dj}ÂaxSGÀ¯§È”özÇBð¥ün+j€ˆ—þEä<2M=.†³… BMÖ È›í%™ÿA>_€˜åIÀ_Ògj Î­É oeøìa™d]FÃ!ÐxV'ûÞ4+ {­6¼¹¤2Ja8ÚæpGù%¶0ˆMÏ“FméÚJT¦?ÿ1/uAâ˨DOV·jx4}’®9ÃXê'8q”ÅFõBãæÏìWda2OßãßÔügIL7J»êŽí9¥6†" ½Çzl™ž+¿Á ðGVeE·“w˜2 ‘R‘Wšß"ŸÕZP Sµ'Œ¥PWk†1WL·žû»“úCLîHn¶™Ê 7«hR^'^>VÄEGñ»{ÛíÜšß¶kËv<[ðß“ð÷,{Â`&ÞÝ¡¹¬Î8FXYm"ðÙaÃzZw)Zj,ÁRi…„‚qÕ8a>H®0Moã‚ÂAhâ?CíN½Ö¬Èb56¦ p®Å`#ýºüyÄO‚” Wµ>ð‹æÜ€7`‘I^X—ª ¡/êÖúJé6ŒË>üÌçž‹$Û€{)HÝm@+øã¼ð›Ç÷Së62ÑàsXFø"6³&`šRÅYÓ¡if£iÄW‚ÉA¥BÈÌý~’ˆkì=Ò1«—°è”ÁçñzÖ7ŸÑ[e7k*Ú}Î,xŒœGáÀH¬9 ÎÁš,X­®àOãÁ"DOÒ:ìg`²\¤ç‘úöŒÏ!ñ³Á|rªÿ]7Ûž¦y—ZÎl‹pÀm³z–[¼7‡ƒó×é¢ç!2Ó~o>6»eØ€f Wƒó“u^õlµÕÞ-?Ÿñ~&/´d ’=ƒ´äFÚðâB``Ë€F6þ –[³¸rW-ÁÛ£ÁìÛ| >ºZòÈ:ç´ÁÿÇvÍ#èæ²Áô‚óy»·åp„p2šCôì&CT=ü%¼1¼öðÑÓ*ªâöY.RJÝ㼊Azfmƒ¡&Pyeváåá­ÊO"zÂÖ˜ë ÌÆIßÙí}7¡å%¹ëÒ+þ¤z9D•bP,·šUYKÑ%ó1Ĺ,–2Óuó¸\ÉÓ»¦Ìƒæ´CíNL.ŽÃå;!ªolµà äžØ>ÉE-,!æ³Í­ÚG&X)…M€d­°j`3³l«YmFÄCÓËanK•EtH›:)w<¸ÜW¹ž'ºÎÌ)º ôM úP>œGºÇ×–m>“O§Z¶ :»‡‹•£óô¾'p!`U¼p™ŒÄ0ë›4ª(ã¬~¡Ê­3å°0ÌÆaæpóÔÛÀgç(æza×£Âñ¼thÔ¸Ʋ‘˜~TO±,öƸÜ÷2(J3³iÊïôYx4Ô&dGÌÆÎÇ.LüpÚÿ£ažác ©©W³…ÏÃÚÜkl³!ç†{_ÙA a&¥èu£ ¨c`º9jaªœYjìŠûúÇ K<ýàÊ:&p¿Oð/ÅßÚ0â5ljéwaŸ´ÍÝiÓ,ÅO7æšÃQyÄV³î/·ý°ÈŸu÷Sr‚ÖNËxjzä!8KìøSdËIu "äàç<á}1ù[$)â7s#ž¯—ÇåÈý•7£ƒ{MƒˆÃàßaŽŒs+»Û5 _´€Jû'j8דQfsë²õ=EŸçÜ›*ä‰zP›J.A&V‹ÈÂé£ðİo–Õ=üHÝ¥7HŒ:Þn¢pø!£:öú‰< ü0iïˆÈ?Ï{a+ŒËÎÌœÎÌ(Tê¸mŽ¿r[Ó¨U|Êd¢jrÛýn÷)w_fRÆÖïØ¼äˆ 2ÚþìªáVg0˜îÕõ‰îD|,9ùÔ_Ç8rkÍ^*XYöÜ×oø–¾Ù¦¬QaObxõS–Mn‘±›#9—yWÞ¢©÷^£µÃ$íL“„¤¸L~h.‘_÷L›±eñËÙº/ÍFŒ$—ù¾£1N´‚"þ~2 ¢Ž»8’+~+h!´j(A}‹•~/µW¹ü¸mÎm¸ûü¢-ìœ õÉÈ›1—^Îàj“•‡U´XÎ /[T¤îÙµR)˜I=³!»LÎ<¥¼|mzÿXpÌ{R5 W‰¿*M»)Ky6-Q©aÊŒòœà‡þ½/ô8IÒ/µÂ¼Êά¯®@4yª—Ãÿëcé&ÏÇ·ÿÈ:TÄ øñõ§¯ìùŽüÉ7„„ ”/s˜º9B|$¡0ä-ý’6A#ð¼Q*©hT©Ä—{ªsýfËŸªÍ¶;ßR,kRÐ÷%ƒù Kìd­?ù(¥úJ AÛ*¤ùÃ0 €|÷-ž¦þ&yvü‘gk¡µ %åLJªøÔÛŸwG'Ô:ö¬˜¥Á°J&xì:`uïÏ̯ ¡Ä„2µrHªåßž|8öÕØr·JÜlùòE ›CYÊ6 lÊÞyÊùVÌ•g'‘I<îE5L„úÄ k×#[onyQŠF¥yþt’0xlhéG L¶2<Ö˜L°h¦k4èFûio¥Ëè ¢F(Ö@Á”íº¯™8ç•#[ÄSèŽ?èE9œ"‘JÄï¦Ë´Õ=$Y´á9 ®°úkÀ¦”ã¦ø„ ñË'Õ4n7RayDÚS 5:Ñá›LÝŠÞfùû`òMŠØ¯ã-fNÐ ‘áèWm«ûÁó ,'Þ+ÕzŽCÌËÕ¤²Î ÔYά§^ø“wüs‹±°yXbé$ÃQ^‚¢¢@µÓÄhå,ªH„ýcp '¼ œš5¸$° ɉSe!4}rý¶£a9 ìZJÞ’JFÁ«„K“®~!R 1 pÇó$;a°˜<«Î„›Î ‰OÈEdP`¢ëiäìãýaw ›ÇÏ"›<ÌÐÁ¶ÆÁz©&æ[Õ¤ø¯9¶–ˆç .8[ߪ̲Çå‚0+X€†2„ :ܧ ·u³ ƒôÝl<”ûÚrCVþPKÌo%p"º~³QÉ dí j2öæ!`@tË…É&çé ‰ “±ý¡æ<³ó¸û³|o)`!)ôwK|Ù›SO£E¸ ZVϺ4õ›¦Âv­yÿ!;Ñø‡¾’px;ØSmS=yÄXÓ´è¯ß!VK‰à(†]ü-UüÑäÉ"Û[ůEJD3Q6I¢(^N‘`äÏNb_¤X‡Ñ¹ÐªË4Û·™ÍÌûkQqÕÓÔÏãÆDÞ•eä’¹w3sª=#r÷.EhÇÒ…._6CÑLÕFÂµŽ¡‚©cf\ˆW³lõަ1à^‰ ‡èŸmûlMÎ{T,Þ‰¾:"kç _®†ºg ®óÐͤ…EB#GðOIr|Qñ.¨Þ‘ô>`ÌŒ…0Z31™[©,,´Åƒp+¸zB#Eô19eÍ ÞLßoä3ŽºIÒUCŸT6ÎqjË8 Y"À\”ÛRÎHÇéQ+&TÕ¥ ¢&m|ñVý8u""qNbŠãσrBÔÐÃÔf²EæŸlÑzÞ™™£ìÌO¶1 (þ-ý½^…/|-™g´£8ÇóBïtó)T¤ux­ïg,=:ö• ã4## ‡´”&Ý[c‚^ƒÆ÷þ¯äôIÌGô‚>fžkD!œÒ±œWqØ}#¶¾Cå[—uS-q4Ë”Ïg4Q·¿;ŽaŠBv' ÷¤ØÔVŸšVŠw"¦±´èï¯ò!iÚ=·VY$½µ›‡;T3mAAG4s¥…3NöÃ@³ºGäñÊ?ÄÇ®ö¥÷—æÆŸ(K“UQÑgàJhâó^9*D©b”ePbbªK˜3¨Q”‡Õ‰|¹¼ˆÈšMæV©òK×ÙzzvÕªP¯‰ñÞÞf!sg™=÷g’gvw“{V<ûôìê;9áhÎ’‹‡Ö¨Þ–o0€¼ ¿U€ErË€ÎDåcôYÀº¾‚«[µU6¶ MY¦W ÇŽ2§@"ùù‘¶@\ôÿI^ðõp>mûú¦k^T?áþåp‰T𯉩¹ÆÅlªØ{eIs¥RýÙfǹNMÜ^6³×•Ò€ÿààýˆS÷«ãžåÇQxSÊu†# jÈ:ˆQ0q`b¶zÙe„8u ÑùÏ<ý™…è,)[ƒAkªòŽÒ-Ü*ìCû6¥µí2lßùa!\kV‚?›]n(‹ÏY£KŠ3«v}µíŒIÚá?ŒDOQÎÔK5O•Òo¾ê;À:õøCQnÕžòßðÕ e»Eø] fiL[,\˃€ñ;È{†ÈËš+ÐBé®^ÛBn!ö$ŒþžÒÆ¿¥5è ñ‰½1£¡Ñ« ¢”rF¼ßà8~8€ýXÖmÈ„ZÚVcDDЕ:Y)pɵ²Ã¹…Û ^ˆ…4²£®ÑÈzÚ¹c—Ì3¢š8‹1oÄU}éwÔ—²‹å¿œJc$ZþU`|A~tuÏõ+ã”ԄϹikl·ý¹|…9Yoܬ€„¥×DžˆÏzN4jïiãÅ2 tEåš8ÏÁøL@Þåë¼-¨¤DãcŠ­§ø.Ù–IF;pŒ @<¥€þž‰3$ìlTŸŠqÆÆyzNަº´±ØTˆÖ·Öåìk²òýkoRŒºVàf$pÒ6¥¥)É>ƒ²‘´:SØ(’Mù'ØK´¹@`È$f£°à¶+ÄSȵv8¯Ø'®$‡¸|çÁµlŸÌØ ¤Ú:Ú·Ú*-wM»G]47³z¾@â$x8N!)ÐýàR {Ræ™\=ÆÜ`3ºE£ŠÄÿŠ÷$UÌF­±`WÂÊq¾9àcsÂ'–*ÐdK²ä&7qÐa¶ÌÒDÚwhé¡Â Ý~¢¢+‘®3=áu°vãÐÙ>ÁÇ–LLŸÿ\a€3û"Lpâr·¶\óNcãö½á›í€kå[\‹w8\ s?qpÕƒè—6”ÀU{Ü~©0{×v ç1±‰‚ŠkOVë·˜NGlÛcy±%Æf‘L‡:ÇsmmjʰóS)ÅAN€*éÎQó¨3|½Ò75Yæ&§¼Ïo“gþ®sÏQcz~‚ȃÒ×;ôhÉ¢FƒÙ3‹Aqõâ‰&®üñêO4Êî­#l†¯ÏïWØoíÚß•R­ˆMgP .~ÝŸýUŒ<óÇ:IL«¾U? ž^ÚÌšÅÈ‘…n…ü¼0çªÝd¨MÓ Ëµ² ¨º‰ÝZ£(®#RV³÷¨èv’˜qÎ@v ­:û³àx¦;¿v$_|ÚÏöE›–²R—ÑÚOÛ’›KÉÉßã¼" Λ —<~INãžVÞ˶á?ê³Zå8†î%n¿P…ö”ü”¾õr…B%ݧOƒbƪÑT#¯ÛP*é»id¾žGSÜ·‚›ÌŸ&= ˜ƒfÕi˜ûÚØÕ§%@+_òÍ|M ÔF0ÅScßg?÷S5:žq@Lý ;¼äÍ×]¶™$d¼inVSŽ–ÁlG—á6`äOœ_ŽÞ}a¯nX¸¸—s¥çÇÁ­«ƒw25}¢X¤ÎtqB ™d³ØF—£Lm›´:_P2`¯p³Ã?¢~PõÈäˆ`ðJë;¢òzQiöÀ¨V+4X·œˆÑçíOôç`¤Ün2÷õ‘ëi¼Þ .‘¶£›ƒ Tïу¹‡?V:¶†€S;ûÛ$IÛÈ­*ÒçkyQa0çóûoÛ6ÄØ ÞùÁ8J´ºá\bldçÌ=w{Ùó5OÁåuüwöcØð0òÚ;°/¸×ÍAržZ>h /Dî÷ xg©/»zwÚµ+vß´)_5ÙíK:iѼµ_h¡Ëûî)d¯(£i8;i¤à6î€EìsÂQêê‘ÅüÔ<kôŽ5iø0If¡ŽN›PÞь#a˜us%d´Gy†/ú¯°0×qÆ*›Œ·‹™º; ±„¨¦´~Çk ¡eÂR“ÐKö¤ÛkŒÁs-“1…„]©…ë0¬É½8Gf`&wœ¡Ù CÁß þúïæxö’ÎÂàƒˆ¨m:Z„K­îì,ÈtûŽUˆçkjŠ<ûÛ@†ŽM^iåÚY,Ö ´ÁÄ—)Û³äàJp–´j‰8›ôrÙ*0z*’¾ ay®Ê7½f)R¦ŽñóÕö„@kyœÃ㵜Ð9óž–£FÛßUX/°Î·C‚‘wNÅʪÏêx–VYUUÌ©’¾íªŽ!È®#j³`Z‰™fðr'B ‡±ínz­@½ÝÚP/Œ=§¢xZœê͆îzÑ÷'cÉ;¤¦ågö°hJУ%xïzR¾p¡‹£XÉÂŽ•&“B°,„º×Û*çúéóÁÙ¥8i‘‰ôK9xNâ‡õX/ M°„­-«Æë‰(ÝUÎM§-…9óô‘Sæp§x•~© œ¾¾mÅû + >ÆáÌêÑ–Þ¹?Ë ¼†ï¿^¯H1Õyå߃•ßýEPlϦÛdø8ÒÝ Ô-öеXº24éO¡|x¾ð' ‚ݱz!!Xç'hâ8ñé5&B.;¨É‹7®Šd~ êJöéÕCPö‰ñäHgsÓ³‹VŽG™@ž²>g–ËØÐ¨™%ébÕÊÑ3xœå†â¢£uX4ø¹ü¦'ÿ0~.Ì…V¡¦øÏc,zÀR0A)šB˜‰÷«( •É6Vçæ 1ºÉá½s,¸ê$%’ï³=M!Ÿ_Bú%Å€ÓÃÕ1Œ:[Mjž\Žç%øŒJ9]Ù¢~ã77ÍEÄ.4"Ñ*?µRW›yÈ2nsªvŸ¬ á"Ù/g° w¨,Æ>­_ÿYë*2ZšVnŸr/ ƒ·9¯b MìãžOV}•¸íHr«®Ï{  ýYÜç=‹",vžÑQüˆ%õEtq(ÉHCÚá'wÖÄO•×SV¬Ä(‘º?ÝQˆ.Xñ¸·±5ý·Ê Ô|´jôÒYÒ+Ž’@4‹` ˆ½dºK|°ù»y%ªªåfÖ‰>š}0W·J£¸Q…º“æÎÁ%';4¥Îrêr"ZOø2ÿÒׇ0÷µeÖx{ß“À±¥ ”@]&ÒY~Ìc}‘‘Àx­ÄRŒóô.ëÛOrÕÏxkâTø‚Ùh$‹íèmnöE@—ˆô%0œè.(õImø¢ M<.½šf¢Ôõn§£D*/g4IIµ+o@ÚÏÐ5¼ƒzí–G©½Œo—°ÎYë³9šÅ ÖºH€$îÛºF"oŸÚ ŠÏ[Û&ƒ~²—œ?aéµéèdYî¸å™=rFºn¨Îõ_’3UѤ9Ó1u0v󨵘9eèÕ¤7bÍÝÆù¤~qÆ¢`¢2¸$I¹Œ¥';5Íwç#ø~ÀEk orO {剸MwÌ0ãÅÒA+×6ÈvC®ÜwŸŽ¤cj¿”#ªžÀ—B\o8à ža Xy’ʦ–ûb_{± aMwýÇQÌŽî}¦ñ²°S SÀ ¾vÒ-î3°‹Û1i›` ÎÙkå1²ŠX,ŠŽO­Çµ–ÔYÈŸš ê…ê$sRçþVÜ’á8MÿôÑŒìñªn¬­/ ü˜$4™…D.«TýºÒÁ€]CB™Ã<€g/¦™‚¨¥‹f BxºÅ11ç4¿Êè£Í_Ÿ”ZØuqV}û6"Ç“dtO ðÉ?žv%6×ü² “^+<….ÎÔ#p+ÒpH$b‚õô=æ€ÆïtÙ çÝh·£'£@šº7òç{Fëc>QíE•|+Ô|bª~1y×3Òõ[î  m“D ‰¹*]pz*ªópÍVU±¨*âD4¬ÚbjÒœ¡1ø³'ÅMø]Û+A5# 1$¾À ¤}[§Ô¸LÝ͹ä6ÛM¯Ô³[{§é[|J16ÖÂ_ƒ‚È>è“o&»%óy(zÚÑzáLn1ÒË-'#urü²Ï#UŽSÏoõjÌn”¦8¼õ£;ˆ ã=dÜcs´ÖÓÛ¦xw²%D'~hÐhf½ˆ]øøqé9šèÛbVex‡E: [!VLøp$MÇÿîÁ Zz½ãg^V° ÏQ_aÙØq£Ô°.ô$vA~8ê Z ¹ÃÐyѶ¶ üÌOCd¿@óhpÿ8Jø‡Óùç3üTŒô7)öÛ va['Èñ w’íBÑﻌàèD¯‡}ÁPÚÀ±“ï\&µ¢ÎxÞÇÞ¨ÙKᙸ1Å,Ÿg£JðoÃ8\{eUIÜúÙâ£B·Ë2ßü8 1KKâ3.Åáˆm¥üäo#ùÏ+œ­þ-¦ÇGJ PNNh n|55Ùê[‹€gf¥¶“™‰ÐWßÊ2rzžŒ³^>\Ñ /äâcï.袞ܓÇÌ•ævZ¾ø™«°x@-} ƒ>èïôÀ&2ýeß;œ’Ú¯Õ ºôM,^›-¥Åf{AÝðŒÅ?v½”Ë}2yM°ÅV¹Abj1YŒœ©í¾ÚÃ33ámvì,Š”Â,Î|݈fk [* Ï &Âén–á!KB”’ƒ´_Ò¼׺®žÖ õÝv¤-Ò®BÞ _ü}\[¿nÓC*Å€4nf±¶¾nœú†ÎÒ@yªÎTV#0¾¥ÔNºjžˆ½$%Qw ×ùpÊg{‡å£^в7o z{Ÿ-Úe1ÙæW^‹hÖO»´)P:¶ ñ•¤\Â[lBA•7Êbܲ à| B톢>bu3A½·:¶½oßÑ«9,âü¢YR˜¹Â*è$½Våy6T)7 îÌ9‡cL`K¨¡ªŽ9p3Â]r,/ЂÒ²,Ø WuÛk’íùœî“G3ÌU‚9áI×—#|¢¨íJ`H e'ÿ»vsÌ,ƒ Í1É#-³Fú1ŒìÏañê…¾vqMœi:€Ÿj;û¸!Êȼ¶Ü¢«²EøÜsÑzW/9u?YjE¬˜g窓ZL¤²ét‚ ™ãéVß–Ö×gbz3…®õ¡ VÃMb·<×ýtnAÊÂux÷ò\˜14þ\ôíîÔþ !²Óp^ÂzöÕŒ3Ö¦0† $%˜½·zŸoöeš‰ÿÄM©×u!—0-ðc²òÍ—c»Ë? àåb9йR$—p#s0€Ç`åÇÅðž¨Xqt‘8«*º Geˆäl ûu¦!ðEŒÎ?CDS¨I1;™Ô»YîÜ?æo^¬Îþ°…Ñ÷ÄïDÂëÜí‹|ØZ2"ˆ´Š€m á"'Lª*Ÿ¬¥±âûU,2Òšitûƒóg>n<;ð^QïU­[µÉéÏL’;¢2šýÁ‡¦‰ÁKÑ„ of»½åE*&¢µþÛë)Y8·™§°…w1pRgèKs–”¨Ï­®|öîTHÒ˜ƒ*}–=œ‰„ÜÀÔn¼ x™ß–;(EŽuçLýgc!Ÿ²cs ‚¿v—¢) Ú¦®ôÞ²"u±–}Í7­?a+°>*®Iæu®-¨Z!‹qÌ=êoƦªøÕê"€y“Šÿ10ÕsT,\"›>£[_ ²±ŒçƒÓøßäcShrhTÐ#Ô4âxmdoD‡ŸìP§õŒ†}Ž£519Ò¹ßùµÓ' ë*<ÈIyëä÷¢b€ç¬î#Ó-$˜8mÚ6µS$_Õq7ß ¤~z¼ù±§«ï%ÀsiˆeÍw½Oó7¡(0"l·™&§æAùßC»E—ôÿNË&zØ?_³ÛZ§³Ëm{c…å¶÷–ÎwDê±úÍokλn™ƒ´]ß0Îõ¢û$…:þ̪ëœÔg4ÞnW‰Ìö öeRuLÍŒùÔ"»0vëM9ùõ6!z’…#°È¹‚|ZØúúŠ?ýS¶ï¸%L«½Ê¥»cg¦ÏH[i!9þ¨‚ZåJ|v.k¼­ö²­æ6+œqÄ•˜ý®FU…/œÍÚ­÷_˳s½·1Iиb_]ò=ÃEô§ŽúEvF^9OoŠŽyã’>Ç ÑH¤(`ÍyŠ"&HRKù{ŽAÅM1VÈ?ÜÌ……aÇîIô™¶ N¤ÄP,DFûÀÙŒ2NL‡S¡‹O U4{,ªuÕü]yrj&ÜžcÆéÒo3¤5¦ÔÍ9 !´–d;©TOrñð ‚›>–˜ï0ª–F·¼ÈlÆÀfV>­®X¨™ BŠwŒwu:k¡¬iDgGjvN-Q­£MèÙˆèÜcò‰„?0óäÄ< èƒ5Ђ ¼Ñ¾Aè÷ƒ]3Õb%ð–¾€v_hp“ú3Õ•·‹;Ïlˆ Èüe¿u4±V6ë#„å|ÞöüYÎTBWüÿ‰vùUQ4wÿаhÄ‚ÂÉ®¶ˆÒmEíR+‡pæ÷ê²ÃòïÁÛ§Ì’ñ‰ "¿ºFÓÒܾµ<{(4ñÕ^ÞÍš}žÚÓûœœÉ‡Y_Pxn/!Ý™¿Û/¬ éí /ZÔ—™ø”0<„l™c±¯ö5ÅõÖe” EU7Ÿp3\ÂáÖ’+AÅ-òÌßÜ­-Auy.áä*ÌÌiò3j£­ ¹ëÄåtxK`…í.õâx®”8ùÅ•´O íO¶tôk=Óöj0®LòK6~zŸqÚö$—˜xš‡9œÎøódDDž%,ësÐ{]ÕL£ ƒï€!&‰,ÏáÕ™¤wKªá>ÇßìŠW‘üñDBo Ð$KÝ8ÛWëþ„Ë.9œRRìÜž; #ôåЖ3ÿjß´êÈSˆ¯‡Å{¬ä pҕņ[B—§sY½oA³€Y•;¿ë /Š 6Ò¤A’NäXÆ¿XÜq&À¡ZX0Û⯽Õ27Åf–»“3þ©(ó<ù,ƒ÷4OÀEÈùƒeü=`Km´Xg¶4tØP«Lá¬#/h‡¬=×.©¥9¢I½ ¤\@sáÑë*Œ¹uxª¹ŽÔ®Y]…c&¬LJ¶ü_99s¬¸@îa,’°AáûÅKùºÈièY±Ç’X yPlÒ÷ÿF­)_lxìMïÍ&‚'ªÍœüþ§NqèPÎ[RˆS¼¡5·\¼…0_ (Eò4Íïc/m '¦  ³l Žp,™Ê!†õÊòr—Æ"hqZÙ_nw)*<ðÄ·È¢HÚ 5]Ň”ûÁHÚ,Å^Vá=˜™äÙÈ­m†ýSêçEÌT˜ÎµÒug;«>¾ÒÕØé ©Åä{ª‡¯jPz¤xÏõYø»ê¯ ù`¿pÏUœp‹ 4Œ¹áHSŒ$CÔ 2¨QÝc,WÎaÔŽãéÂó5Þö¥^ÁÒóvwz­2šp=ë¹ɉ§TÉê(Ÿg¢ *Õ–2´ÏTÉ-iO‚íðî’nô ¡’¡“¹Yû ɬµÏ^È$š‘al#±ç¾Ó…º Íð¢¹ÆŠÞÒ%áIÄù¯lG°t6C ‡ÕôêTžR9ò¨`~/îô”×&3ÇÉà‘.[zÏ©|V¡Ëž—Œ©6œ?Æ’S4e”ðÓý9ºÇ£«;VsüX©dëþ¾)=tÁ¬ †“å{íµ*A78/çegW$Ácì€ÛdÇË‹¥ƒo"‹jfqXíÞÿDݳQVÙ†&<Íã(fÎTn ›—Ÿ(MÖ2%íPÓ_ª¼ßRð›ñé—¹ c^£¹MjPŠÊT©K¿?ÊF³0ו0ã -ísÕwª íºŠR¦! ´‡Ö%qg…;Æv;N4˜×šâ×¢~š ¹Š”úhW#T˜”V"ï!"ƒBÈ1-çÞùôX™´rž¡'V+Æš%d+oîÓÕƒbAð¡a)—&Bf}¶å8‘*]uafú¿g›JÃ\CÞ ZOùÿê½+£Ž{ÉÏÜfšï3?×FÌr«ÑëxOÈNÉ!X[C'Öp¹¹·ß à ¸J–ä†ðcCþ1Xw €ãÿ ŒüA!<ÑË„wg‰ü®æß} 4Î ¨,1t úz?PNäÔ¢Ò 7?[DU¸í’7qš‚—AeÝ«=>¦ß ºAD7–{v7[SZåÙ"Ì}Ö¥ñ@âœzÑ Ý=êüÚÓopµµ¥÷D|7ýzÇpJÜ´³•~Š…6—Y@AÜÂNC!•®\ùwnߤC£Òú•Ê G+8‘ºF9JJPg®ãî<®Ù®÷o’ýŸaûœG¥à§vT+ò%«ù4¸¨>d=Ô·ÓtŸ5 U–‚¸Ì’Ÿ{RÕOÚXtó ì†\„õò"¤ endstream endobj 342 0 obj << /Type /FontDescriptor /FontName /MPTMQO+NimbusMonL-Regu /Flags 4 /FontBBox [-12 -237 650 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle 0 /StemV 41 /XHeight 426 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/a/asciitilde/asterisk/at/b/bar/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/f/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedbl/quotedblleft/quotedblright/quoteright/r/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 341 0 R >> endobj 343 0 obj << /Length1 1630 /Length2 16141 /Length3 0 /Length 16998 /Filter /FlateDecode >> stream xÚ¬·ct¥]·&Vl{ǶmT*¶½cï8©Ø¶íTl»b«bUP±Í¯ž÷ísNóõ¯îócïq¯‰kâškޱ(I•TEÍL€Rö.Œ¬L,|+;W¼ƒ½£ ÐÂUÑÄÖ ðWÁ OI)î 4v±r°—0vò4f  )€ ÀÊËË O wpôt¶²°tШ«hÒÒÓ3ü—䀉çhþz‚¬,ìT?Ü€¶Žv@{—¿ÿ׎ª@ ÀÅ0·²Ä•´¿*Hh¤ÔÒ@{ ³±-@Éõo)¦9+S =H 0wpØþû0u°7³ú§4Ó_,QÀršZýuz˜ÿQ1ÎvV Ðßo€`állïò·.+{S[W³ø+7wøWBŽÎ-ìþêþ‚)9€\@¦ÎVŽ.€¿Q•$¤þ§‹¥±Ë?±AVÕó¿–f¦®ÿ”ô/Ý_˜¿Zc+{ÀèáòO, ÀÌ ähkìù7ö_0Gg«¥á ²²·ø¯ Î@ cg3[ ôæ/ö?Ýù¯:ÿ[õÆŽŽ¶žÿòvø—Õæ`åÚš3Á³²ýiêò7¶…•=<ó?ÃòÕÞÜÀÊòo¹™«ãèÜ€ÎÿjÍ?3Cû7 c3{[O€ÐžYÁÁåoHÍÿËLÿs$ÿPü?Bðÿ½ÿoäþwŽþ·KüÿzŸÿ;´”«­­‚±Ýßø÷’üÝ29À?{ÆÖØðÏ®qrþÿÜŒí¬l=ÿŽÿÝPøïdÿÞWu1þÛQ{‹¿Ä0²²1±ü[l’²òš)Y¹˜ZÌmÿöì_ru{3 ³­•=ð/·ÿjë_'–ÿ¦S³´2µ±ÿ‡Î«€öfÿ=ý¿tý+yfuY­ob*ôÿ§ û/K¥¿“à¢æéü¯0šòfÿyøGLÌÁàÍÈÅ `dcçpssxXY¿ÿ"þ †õ¿ÎòÆ.ÎV]&VÀßÿÿøý×Iÿ¿ÁHÚ›:˜ý39ª.Æöf‡í?ÿ¨M]ÿrü¯ûÿ·èÿ8ÿkì@ )üê/Sþ`ëô¬ —:œ¼áI Ý>VÈáDzFµâBÿ‡^¿ôðÞJ£·Ú¦¦i¾vÏ¥Ç÷}YºƒÑ>l[êÞTàEáwrÚþB´MªNnúƒ@fƒ2¤ŒSÍhïËE¹m(.ƒÝIeƒÒ·/DÓìΰ—´þän…þ˜ŽÈ¾¦i qX]¨M`èuE'§TIGÔ?ÇF†‡z¯¡û÷ èsãà(ùq|SNH“]<œïM? _ܸÝwù•ƒP« ™N“Û¢¿º\j‰6{C‰‡r¶XãRfÌ)ûåþt©PÍÃf+)ð'ù%ÕL;=ÐÄr=E6ðdÑÊMrE]’é[ÞJ"Eð 4»*–+…0ÊI.:GÚ5h>¡I}ð»*ïÃÖ?±ÒgÄôE8]tçý§ çÚÅGÜlÿ[ƒÊ×.ÜM@q3Ì- €n^ý·ÛÙ+„üN7΢²«¥@#30zàE{°¡ýBË•§§–éEK<¼.bñõÛ"[ÎßÓ ãóWl„`úÍ/»}ƒÃ‡“ËÍ£óJ`Š<6ó„‹í~:[ÄP­}ñ›å|Ö )õQ$j)P4½:RÍN–@ÉAíÝ®~jm<*aµ–4²7•>Bc—Û€f7b{Ôò3ÉPi%\$®Ñ0ÝBƒ„SÓ -û ¼GM¬õSût÷D§Ž ¼‰ç߈>w-7–ùÓtkØÝ§;h2­Ä‰4Ít)ÁX’ªüèÙÊn+·ÌG@®와XE—  ŒLõÊ¿ÆÔ @:‹ uVU},Žô1ÚU~›&I3É£ 1]rÁÒ7Z&‹#RÉ™4±‘ÍZú0R|U>ù5ø­ª8¹aõw’¦e½¿,›O òçNïO°)дôFÒÄTÒ·šù „s Ã[ÊFÖ]²º>˜¿Ð¨HÚ’ ¢i³1Ùl—³øj;²¦rGn¸~žTsO½"!aRR{ÍgýxæI¯wz³ïÚN[Œ’JÉDä¼ ¤…/Î1­3Qï‰SŽ˜ÐÂ;eÁ0Œâµk (á/ôöxÁk5GÖãÕ󔟹ܦœ4&%=B =£kh*æ6ßIzaF]LZ\á+|Ãë×Á>:?®”ýÓ¨b§O4ÑUSDÄdHkøF<ê+ºÑÑÒQW]U"\~ö½ñô–f\ãKSGg9íò†çuï^ cà_P³øfí$¿1†Í#v/V©'Ñ‹ùe؆ªFJf"(OŸÉºÓF¨† ÍaŒË¦gé±±õ™÷oݥ⠒ƒ?ÃkY®tÆveÍžQ<•€e[œ^³½ Í LëIÒ%'êÒf‹BIÜôa:˜Í”û}éd,Ë—´˜¡Á{L&Ã:èM½ ÌT„ÁÔ&…¼@&ßSVs@DžƒÎ)û±à3‡YJÐR0«Ed³û{1y©§‘4­W¥=bWÿ¥ãçÆF ºQ“%«àføD§±"LÝ©TYÜœ&z1uÄûýÇŠ %+½h=¥Ìñ^8‹hþHFVs™ ÍÒñjä ò3j¥Z.™Ýø“sËîœ÷gµ‘yû}Щ¯ý Çèîâg'Æý z×ÿúÔdõņ”÷®õ»Ë€]¥Ïo.ᇽ±¼\w¬ÕW0L¡‚6¹ßœ}Ét¿dü4“Ê“Å<¤‡Îàú°ÉXTƒgª—·µq4¦Vt5˜{«òx*½^Ñ0On+$û¥Þ·Äɾ7_é~ñ}Ô€m(ó¿E—a_-úÉä uý®ã‰æäÖE|Ë Nù>ù?'ÒÖéHR;³~ìc|3¡Vi“%Qç$,i M£nù–Õs„xm v '”hLâÀúön*ÌÊÑ}Î Î!r–ª*a^pÿ@n÷>¯A^ÿ"¯«‚ÛÎ($s^Ád×Ó»»ì·1z¹'ÀÌxøsÈPÃ…Ç@ô:hTïšo˜È%¦ryôƒ•kò°¥Þ7\žl|¾†d¤ÊzId«¿ÓªJ/Tª—G©X½¸7t½»y¹äkU/ ¯L@4uI^õKžF¢Q¨CÕÝ$»:VÕ´i²¾b­ÝÀs‰1‚Ô§ëX7#>u9UÝîr‰Ÿ-Dqž«ubÀÅ9“Îýœ7—¯Neq­.䂲 éÞßj±f>|û*qhÜqg+ «ò¦®Žå®lå§Àòä,à†5:ÏVf,Zídä=gJ‘ºA7™±£ÿãb£ú*›7º ?ãâÓŠNçíTÞD Á¼Ä¼´væ[ÜWÕäð5D60Ö̧Ϲ Õwñ§‘ÍÎ511óA5»0ërz¬‹ƒù Zþ ½Ua3Y8úu®úâ›id빬Ÿg’gžIïe»Ôvj Bä™O𥣾߰)À’B:O¨ã%Ò` ÇEe*’ä¤DhkC–²%Œo[É“ßJÓ¸‚W‹¼Þõâá=­à9§-DŠáoÌÃ<[óaDÅ×ø¥‚ìA¿eb®ûïîýù‘Ь®ÅàÆ4Å=?Ñî>ƒ£gÃ"¸rá¹@ÝÁ9% wŽb ®Ç{•]Ÿ™=…ø?ÌEvK~’Xp8nßÜ`–X‹3–C‰Æ7[´äÀÙP?épaÏ] rKQ=0ÒCJqªõ( ê‡q®6 Šözr»rßPœ’ôÏu/"v?·c]©^ £IgˆÛKÝ,c…Œi‘CÍ…™Ò‰—¸Ðº¥ÆÓ+ű´Ò«Bt^”#P‡Üj)éâ±ö¾›?CÊÒ¶³'ôxCEÝÒðÒσ N[ó½ Ü?[oÏj½ãç{$NM[¼®„¥A;wHT$Æ_ߜ܇ÎWçžQPKðÝJtbVòlô0ÇZ%ºÓ·[g¨§‡bmeSv!œ—F¨ÆØø×p¹¡AÞ:rC1Î¥‚ò¤²Ïbá;™Ò#é?ÜM“]®­Hödv´kÅöúª»k‘&T<Ý:³×PÁ2Hç½BŸ3haä;4ŸÝí Ó'¡×ù"üM#xè™9Š!T‹³Ð!@Œ6›·©Š—2ƒ(W®ñ0UtÁS§Å“£Þf®ÒÔ‘xcs;0)Õ*_€.ó%Eb16 Sw< ®y®Iå:ÆÄà@b¬¥>³«C¿–ªý‘|·ß§ Úñ¼«ÜŒKFJaD­I™øÑ‘£Ö¨ª:ã÷ÇÙ¼•G(í–\kZ…Þ •{2î Gïõ /ãÚ‰”òVZ²åŸ¢5t0(ŒN $ÕH—§¯l®~æIxÃÃM-´/‘`˜Ù¥Ú&-Yõ$R\™Y.|…È(ÿáRi‡0kFzš$;Àš1ÐÍßÒãi„ÆÔžG˜Äíï'Hˆ Ô+iëÐ6ü‘ѹxð $N'Kž*?ŒÈj'B~ oý&NÓÕ&©âãÇŠgÀ¯5çC|0ç®ü(éáSlƒ+ÎÂ3IhÄöèÞ D] D•Vp¤&íà‘ijPÈ€ “O™/jó¾3˜Ñøcçz©=¨É'½B?›]~»jÞ@ÇŽ.7¢hÏÂ!qäÔŇÀž¬ïJ2)mM{÷võ,‘C¸I<|+{"}‹uöÌm‚ÉŒ<^^oNBɵi¶“Õ¡ðs¶ù8¡[Ë,Ç«U³MÈÐ’›!=·0žâNH Ρj„ÐŒ|ÅÕ~|?f½5FuÎC‹Óªà“ƒtߊ ‰ óZ»áO'[lÊ׌7eØy5öýðÊ FM*!lÇ o*汸!Ô¾ É„ØDQ?ÛÁÌÀðò t^$bv eHQc­$BãHèM "~S`ò{”é»3ö‰`NöH9Ë’„å”Ýx#ŒÁ&À‡³ g-–R/{LÆá;®iΛÝ×ÅÆföCºª*H î-‡\€‘ˆeC°Ü:²¬?¹}ã|ÃMœQ cÒ^eØð‘‰®ÛúG*XÚz~ƒb(Ö²¬z¤OØ=æüûÈ}Š&hîVXBbqN´çaîCÿÛ¯Û ½½ï‘#hÊñê)¼j'¹Å^¨jѸÝÏEñ¤ñsЯA)ÑxÒ5M æ’8y“UÙ™6ª%Ó kä6yü 0šV÷"箽xË\[ÓbH…hBLø7SlMÿ*í…êl¶ªUˆ;=ÁR+Q¤C0ûË]Á/ ’£¹uÝ:ÍüBŸV~À×Yú‰y;Ê*Ùê2rá j)H×$æQÎÖìÃÛXuò“ˆÇéB›Ž 0„×ÍÙ#ÎmN{tôDówþ5i’eQÌy÷´¿ú)Å“X̲ãæÙùI¸ˆtÁOöº©é'TÂ}ç2̲¥ ™J¨ ä+÷òåðŠþ`ö%sÏCDyË7[½ˆ`>öŸh,5á›i¦Åµž¹õ”GVÙoÌøpŃdŽÏF0µ¥:w÷ZuI(ÉuÝ£ÏØ›­ƒ÷Ò´«X+qjå©À=Ú%I&ˆDw^eºèœïxF£V}ʺIô«ªy—Îΰ"…ˆ«—¦Ý§ÏßOèžÍ¶¾=·¨D¯UN›ò9q2…RNõuÇ~`WÎ&ïøìxc®wÚÓjÂÕë§Ì‡!ær!ùð^ã®vŽÝ ,gÁ3ëˆàkS£—‹ñ™„ßµu‡sRRJ|j·—ýÁóò)1ß%ÃÚÆ¸õ)û.V˜(ˆ¤pW±‹GÀ/ðŽõF?Ëüh(¡ñýÂð¥¤=ß¿‡pEä“·A(ƒÉYíÛf“!DšË»Ýjñ†H–n Øzs–xÞ SdnÀ™àÞEÝ 3fÐò¾¼Ú²%b'µLd"’ú~«íÞß~ƒÒ¥iö½HúBüyͯMÉaaû2lW¥¢„1­}{Ãc²Ö¤›¯ü+÷:*5-Qq’þr<ö)ȶ3" bÊÉÃW!%}"[xÄ &‡m°"æ$„•8®Fa%¥Ü¶Ó6L ŠcbM†2D‹×ÂܹhòAÈGÓY¤U½§zŠ+,kþvuj(dCÊ¥øiT°ÁêË£VŽô6}–{ç“N‰`k;íÖßuœìËØ^U†­÷'­ˆÚReÌ匧 Zù3;ÒrÚQÙÐÙð%°tdËÝÞ±bBá;F˜¯ŠŠ³üMz½gŠu"žB¥‡$—feœ$a§GÎÍ(XRø-oˆy({÷»lœeMÄñމËóU6g—5™‘þîí”%¯{þ‹IHÀ÷Rê“È“ž*ø3+:ÐÒ vpýÊIzN^³1Æ`§¯/>Î÷'f$ñ»| ofÍh>†óЧ‘Ò¶EN­ 7XÇ‚\í'É·GÜÅk_£…éÄ1ÏjQ”V¼ /Iýèq6̯ ;CþÄÛû£¿e(r17G÷ö$ù—ƒÓ£K% ì"%mRÏ]ƃ ‚I­ŠÖ`Ð#râžµí Í"«+ó§qbÄZx•‡i9d>“` Žà óaZiRæ&!й@`"¶à*Âç4Aã*‘m-Ê\u{¡ÿY.Ͷühk¢½¹dP¹ÈWãíû™PÑ rQ*!’Tƒß¹½8C|hòxd-eoK·éír&6Œ¸ãël ÏÉ陯Ö*Xª™CïvJ::’ÇäƒË·§Xð eÍ`Ôd×þƒjvuD=€U3H Xè~Oµ[DYœ@Ž9/j=Þ®pÔýP6¥Ì‡ïxSâÑ€X=CºmŒ  êö~UÔ¶±G3qYV;´úý¼;“¨D8ïhPÖïˆGè[†ßá3g˜ZžE¼<€'.w§l·-S üü¢G[d™ãZUóó¿{è÷–.aøË¶Êèº)Í€ÛãÀ¡f¨®ð.·vó1cÝ{/¥Ÿ°bG-ô)£2üò˜Ø·”Ú·g>òÎô‡;›ãC0­<Õ7n”Õñ¸f4½Ôó¥7§·£s-ÇWÁ;˜ªb–Án¤ôÊÙ«Ë }ý;n:kp6œ‹X¯óLù$ª:3{RÕ׈üÜèõra3‹£žèñèí•ü›HòˆÌ>h–ØïgãúÀŽ è^¿t ä¶^þì÷ Ý”™™\ÇäœñC)õäP$÷½ïC\ ·zú¨Ñ ™«PfÚ“HC®Bø¡Ó}‚ðÁRÚ¾’5þžß9ÊVàBæï;[ò9UÙ³šÛ‘Nä4°ûïÆ$y™#]; ÍÅvt;jáNÙÖ±ÖžfŒÐšÖÈ ~¬_†ÕµDÕñp¶„·æh8àH'<çZb‚x,Z”­šwøìôX<Ò)—Ššª^ÏeFU¸;eDSÈS­5G„dõ” .¿¢xl#c!øÈ‡{½À™vX_² ×áJI÷ìÛy_L1F—Ô³óÔ( §HþŠ3¨6TV;_:I*+&=î%Sê@Fx`¬xÕªLgIUÑ_£²·—ÕkJdƨKn½7Ö`g2Ãv«^|ÕŒÉÇqy÷û Wžß-ô0òw²Q\Ú'Þ{ÌýA­0ÖÆ z¹Y „‹‘HEðáŽZÊi¯ÕÒ?_…Ž î=ÝWi7²û QúÙïÏ5’Hîƒî6I¢Ê¢’íwOƒ_^-‚c"?&÷»ûåkJ ~*ÓK›w_.­R”¥¤ÁÐûÉâð"n¼çZÑð‹“dMŇÓ‰-.Àz½¬D?ZB!Tš¡*Åj˜°×øë]ȵ–ØkN2am—šÅüèG陟Ø}Š §ïÒÀ0€ž7J¹l1ÿDÁŠFd“³u£mZ²Š «(ÈC³Œ”¸¥¨Âraæ¹¥çFë݃“‹È2'$0Èèéë)mb+5ÓepÊ×rCÈK}_ÿÁÚÈWˆƒ5@}hyeKVÑ«”ÍR˜#Sýþ ¥D r$}. øD*¤×WbÏ-brƒàf t2ì.§4 †œ©žˆç‰v4[ªŸèA6ÈDÑçžf¸˜ýþ,Ýw]éƒ*#dê;æbc„ï*´ÔÖ?q‰¸Ý£f¸¾¹©¦Ïb´ƒó•ÇÍõU~Â’ ¯©Û1u©µ Ýèø9%¢\Èó<™µ*¬™;hèÇ3VþH¦“÷ýf)®o5½ÃAmza5ížm–§÷wnëÄ´Üèqó™‘JëFÙ>ouvSo]ÞmѬ‰qûn8"Sÿîù^¯„Àà5i}á”Ѫ;–…é!k…žëîB, ½T[ãø4ü÷67Svq¾ËÛΨZ‘. 2šÚRü«)â˜âíbeLÿv¯ðЀá)ă–unIok~Èòw³Sµú^ŽÛzGÓø ‘!ŒØi»I::h*ae 6{jpBá.ð½y¿´söïóÎQzq+5SoÞÊ6ÝÿA¿pÅ;@}°ÆvꊳUb³·¬žïZ:9Dȃ‡Êg¨§L…rZ‰œ2‰Ôû&/¼¯xÙ©q!ÞuÚ‡00Ìém´Í¡°W«½Í=Tä¾ÎøÑïWÖ¿r~ŒØ]Þ9À›Ï“÷܆u°‘l; 3½\»¹×3"$ûY~©úMáñ;ªPG3‘’ý‘OzøÀ©æòã›;A²€tiÚûªþe£¦ÐCoëÏ{\™Þ½‰öÞÒ›%ƒ­€©ÌïÈD—Åx¤PöŠ;0ÚSz‰÷‚™>;vÒd³’Ç_¢ÞL½¿<ªÌëû_SAe-qÍBöW•m:l²PÈ¢äÂ-AíÅ3»©à@Ÿ­(ïgf“Ù’½”·+óׄUÚI7"F‰…O¥OnÑøœS­NÀ‚£g+?;hW¨PF2XÓ+ö6>¦~¦п'â/¹ÂNM}'t(#iQµ59Jpšrß#ïk`ðä•fzUŠ?Ì™ 'þ0•¼ÜÔ‚O‚®ø „~Bª{‘¢Š3Œ:•¸q)_<,Ð@3E©ÓÉ|éþŠûæ¨Öªu¶AS Ï´ög4ÙO¤n ¶=Œî^ªÒÃJÀ4K§R\à°ñ½§ËíH8ÇA$-<µí1¿Éyîùs8ίkÜÇbœN;ä[>ogƒ±çMeFß„žð€Î­!GCÈÔ³4˜Ö&YÅg ï–ºSø ŠVJ{þB’ K„\ÖÍœÍà¼ÑSU’Ù\uC!üfÆ>éTñÞ¯Èyi˜ÝÖ5Xh††È`ÍŸU*“죨Ë%Ñ)œ´ülá8‘Qÿ&è¦ÐDæ×\e>5d¼^שvb’û{} lEÆYôyhã<Õë ª:"2?Bg{ŽLÇ.þá·ÔåH®nV$|\¹W)âb©óK+ÜŽê•°JÌ1sŸô!1§è¡Cè©<Ð=_ð8«5¾#ç^T†âϬØ;~L¸ËŒv·ÛüF[Mýû´¢•:éj-uÕ{ÆÉ"GWÃüå!S2¹}jhÙ”¹ì)Ř5 C¸Š~ÌîyAž®w¯üÀ¨Æ›0-À=AÇŒ\œ¦s4Ýs¿Ÿv#7t·{ðZ¸Ö l ¸ÉºoX§«ºÛÞ=âÖÛãÒ9²™¸*ºiTü‡[C B/Ÿ1Σe.k”+‹ÎÆ¿’+W ÉljÃÖ¡ˆúÍ}*…}ró3¦ª‹»RcÉE=æÖS½;ˆ Ý;ËÌd4½¨8Ý$=Œ1~Æl¯Wô=ÞCǵ~Ù²^]¢ªLÐx/ pPÖª÷øœœüzoHMh)N˜ÙÎ-s»}tpƒ@gVw‡zÑ£'¬BðjíŽ Ò»Oï‰ùFþVµÃë3¨½Úå‰ÙÄN+i½™ó˜¯»ð†k‘ÿ#¬HdùJ¥Î­`VåöWøN[…†¸‰Q‘ŠîEéÚj.6âŒqîoçí–"C÷Å{íOõ¡ÒöåÞBýK%¨uÅóÆ\¨ùÐmwAž˜†hÐVôcðçQ»c[À½1É×hW’¹Òj¸}t¬–|é]Xq„J£`pŸü.ŔǴnä $6úþõhc÷öùóÂņU›Pøµ£ÃáZê¤kPÇçcŽô˜Å\8÷Ó˜r”&©®¬½)š%&X/ fMÚKàoJáSo’ c‘Þȃˆˆmo{à+›@‰ªg'EpìaI7ê[ÿw£1R·‹10†ÃÃQŒBYüÝY¥+‰(ñ-nGõr#Çt9ØàHä‡ý®Á-Ö`¼gwØ¿s¸0ÉV©?PKuì¢$n²D×6"$…á»ÄeÜ™ˆ³&§G~dšH\ˆ{¦ßFuá˜áR;iíòÃV<*ûÛàæsÂŽlðüäÚs•qº) }˜\Äô hÐ$š@‰^xï5.5KÃI¬çx\fUÕœߺ}©«`ø¾ƒ£^È^’ÒÕl²%Æ>º¦ó/–]6ÄoxžÍ»‹‰—îóoZy†ú7y4óBP9We|–>8Fß‚J¾Þô‡`i\ üêV#ov#€åzyRv÷­ð–[¯¢nG]=9¸©4$îKƒ xž$¨7>V å¼­1Õ4öÉ{¸¬’Òo(¹ ³MÌꌜÒþ‹ÄXG ̤„¨ØÞuL´WÞº19KÛ‡Ô>Ò>ÿ|Ðâ'•”eœÃQñÚÅC‡ÀGz=Ägp‘ø/)=)jO½…–ø)¥oÂÌg(T Gî¿ö´L½æ„gÔz©ÔÈøÝ7“öøÉÈÀa—ŠÌð ‘}î!3Î8M' $u†<èÚÐÌÒ…g•ëJi¥A\Ò™è PËÕ€ÚãßHÒÕ,Z«FDq_ìÔŠÕX241~›yŸ+yìîÌ[ !n²Z~à˜ù3e£²}ÃçyvW¾Œ)ÌÍå¿^íTÛ|&zkrhø#©•%o “È9Œœë¨ð¤!7GsËÓOÔÅtÌËÎùàXµAiðVEAç-5mFxgš9f² µó‹¯3:Z‰Á{} uŽ+å:¤¡®3pkÎYe‰ÉJL@þ×oIN]Å®„¤%²>‰#*ÛUÿ÷ÒyEåzœEëpð^áÏF–x¾d¦­ãó6–¬oßkªD‡}Íù «†òû™¾{Xº×_•0b£Ë¸•$#Ípã\â8àÖÎÏôÉÓd½\*CIÃC]†øÇ¦³=1^rh@ú˜tn¼I ^Vä<ÈHu»£Ñ6QVð/ÉCÞ(÷y‹I|„¦Í$fÛHWŠÊ/nû[ ˜ 5Ma]pû|”'7fpUÎSÚ/*dCa)kå0µºXgD‹ÎNÄ ŠÍ³S亂î` ]îù¾¶Ô oF¿ÿÈQ/"ˆ$Ìi ¸',v\6­äëÑ*ÍëÈçŒAi¿*døÔkHØ&iBkªŽŒO“•þ‰Gá@®@—x¦U!†mþpiî˜ò[?›Ç¯ìOƒ°òrPÈJ‰.+ý%ÐT¹ö>ñŸÆaŠu4^ÖHÖäY½þ9¹ôÍšŒÌT¾õ2AØ]«÷l‹š^ìª.¾.ánbu+àú‚¤á§)kà¡`¹ˆÔ†2ìUWïµ,|çZ±aQšçó‘E° E°ñ(ÈeuZžÀ‹áà>©[%–E(eûL‚q³h"RQ- ‰ÿãÏsÂÚÃTÈN¦nXY˜™¾rlü TžFÁÕ­?É whsÕº?V\(øŒiÊ 1Ì«À·0szH˜ã®5€˜.ãZ¦Ú3Ø›¶GÜ4«BŽÍ…JÔzQ³Âw¿š?bÒ?ƒÆŽ¦±Á»6> E#O?\=_´À«Îv‡«—Îy~nÎ(íÎÿ,°;¯-"¥m&3*DæìI;Twé»ðé}ø’œ``ÖücŽCK sË~ñhõ….²ëCT %dŸe=Z¤ˆpñ ¯nHœHÁïgÑ!uη»b)–Ž˜¢PeæW½¾Ô?¾ØzIU8"u†Ðű ÃT'Úû\ùDxu®†fÒ?~—šPyWYÉ„ÜÀ]k ñYâͦs‰y3ð“™—f÷`ƒA ¤Œ°ðºï<ä}r21j"á¸@e"0` ¿‘ÑÌ]äPéN±6ogºÊ £YÆ’”yAÛÉ“ŒÜ¥_é§\EEF¯•~L§~x•ÒGs]v×mð.ñ"Ñz“n«¬[œË*SKÒT¦>>ý8«øâò,2°Rš™A@°~ÑžTù*h"sO Ǩ+ðj´ÍãE¸ö%Eè!›Ÿ¹œBñ:·txmÒ2]õÚoKÒ‡«Å„áF¾›¼Ò suŠ2i±o«ˆÈ«Œ¯$"ÇRÊŒòZ¨ö¡si  R\½~[>ЖE­Ž§¯LîÎáZŠñù–Ÿv¼Ép ûq¬»Šf:ÚcïÔ‡¾7hÕ+JSöå{e‘àïSRmÏâÂæ«c·hÛ{‰_5…݆McXjX-æÇ¼óœDCáݳÕsK¼‚È$—¥wŠê.è>u,g(µZÐE*¦ý8”ÅCó¶³Üºö¦ßh®t'6 ’¬a#Û’EÐrhšíœH€Þñ? ;â½û% ¦”ʵj¶žÆ«i8§³]Û/ëqøcfS³ž‹g09I÷C=†¢äWI\¾Ö —Ø¿ ¼x£|q²U Ws•b·Ÿ‚tƒ*0_ÎhI;^W,ý‘)ÆndήqJ=¦Y~%‘h÷n;`u\¹lǘ5†HµóÈ‘|ùý~4¬Ì£0!ü‘efw2ÞŠ~Çü¾¡=tlDQ¤öº1«—M!­ÿš¥äRÕÁá²U%»î÷ÐZ„2ðŠ€¨¤òÄ~éÀ#,¤µ•®>íntA\¦N¿‘žù*µUÓ©#MK­üw£k«ß4´Uf$~ÁûO*7ÓT9¶•,“ˆó…áÒ&c¿k²™„ §à+–G6à$& „sÞxïÝÿd†‘ãêG»»ÊÝ/ã.×µ”‹ñ?Î×òº‡›W¿µ?,äƒÎp‡}U´‚_†ìïk2.ß­xá°€¯5„ñJÔW1áڲũzÛ¾ÂÙ'*à‰$ÕçèÕ禵vú(·ä³.÷Ü#‘ ñû|”ë¥˜Çæjl |^ ¦6€6e<’ SË6ØÉ–܃ÅHmŠíæ,XWrFäg-S Á›I‡T®4PX—t{×¢\|§|ð(úÁíçŒr-ÌH?2‘gE0b¦±¿$ß%…0)œ@ ×".¿KÍÏ»š{ ª¹ŸÍÃÓP<ª@—`DÈØBׂ[ìïå¹IŽNÛ3Ñ wËÜóŽÐ®ç’¾‰J}†p˜­ÉÀ7Ý ]ޱ%ýRéðÇØ“xxWw¥Ñ Éã!œ£7è,ö8X,ðu°u Zí妱à2ùfcã ".íj|FMsp H‘F¶ ¢ðø2] qÔ8Y–°6$â|XÍbÉy†Vu…cNPó>g ËÈfvîg˜K{x5#Ð7$cE³Ÿ€Ý£…¼¹Ûh4¢rro°¸Bßò¸¡|¢¨ Kªy©=lõ–ôÿ} ”rÎO5•_É?¨¡¹ ’¼¬KlXŽí|Ñ翚À¤@â<²¢WãûnPr(('*'$ú¡Wn*Zðþ cá⨗±†¾K%.îœdÙ;çź£Ü`T^–Uàù GÅÐOl뜑kF4#w³ÐP •ñF„mI—}Ž].²C[>ål=o~Eî ðœ&ËZ!¬¦y"ÒüÄ&×31ݪ´ ãû%&Ám1dt‘w‚I«C\[k£©!ÎdI³nÝ%Ìé!?½nªË^ˆúT­z‡J0Ê>c³ÉµZ=·j\K‚”/Þ÷Š2U“‹¢øç¤á›§ëX¹yºûØðñ†q¦(~£íµñÚuü'ƒ­`'CÉÛ×çIFÞài™Y9ÝÚý-X}¼¤À{r¡q'Q+>­€Áo:ÜóƒgXáTüè %>ís:9þØÌ6Ùº€ŸhGd0°•ØÏ8ƒ†›¹5õÎãß¼UË6‹!lJ™BjV|K©œp!ŠäZ\DzûBºÔÍsjìÒ”w«žW ütG¶xß%·¨sÅ)ÚЭW ÊÛH~ 9aN{,x€Â8Êä#F!E¯íd£kœ3g8OÁüA.7¨‹ïÏ>Ò¿Dêo}xÀïhTóJ }¯^%˜¼‚Vů5ï=C·C4©p;[+×o]ÈKÝ4ùöÏJÞ×~¡‘`¬öj]*Æà¬ØáF¯ªCèèX¢ý…9yC‚©µŒEQáÓ%€ò57sdk©iÑÛâ‚qÍöP:tp“ wvNéfîÄœGªj_Wù¥9Ò >Δ°ü妔M. iZ£@ ÓT*ßþåÙ2…NÝå®:‰ù%Rý iMÆ+Êóe >(wûîræçykVú'Bâ¸Nñkù•ÈB\¨Ñ™AÀħusmfLº%™2U•Szë'ìJ0Éß2AI&ŽÆC™]àçVØ­eˆ¿»Ÿ±]h@zB†ÔÖ"n5¤bXTBöæl‘1÷´õ™×‘§ˆ]]ƒ~hJ°èäý5_ððMtU´‹¶EzdÑ“kK¼obY4Txè—Ak¤BËÊ™žµÁ‘ëpÓÐæîA·µªÂÜ ô–2/½Å£Hÿ¾¾¼ÝÌí¡´ä‘Ó6¥UšJ­bâå¯Ä³›î,­ð¦ ë´)…¹'VÖ^'”IìÞŠêÀÌIi¶RìdOå®K³ËbMNOqM–àkŸ÷LªÕžá2÷øn&Œß¤Ê\ÒÈ2Pp¼âPÁçxÕ^ m² ³q6F¤+´'û$ ” [XŒ0Æš§¯&(7wPŸ‹[ƒZ®~‚õ–qá­ºˆZaˆÖùÖ@†4èPeT»^öÌE÷º»/mÑœ: -Ö ”¨Çj  2öfÎÁ;Øó|‹_™P^˜¤þjÞ5æÓNÛÔM ùe}ƒVýWb!Çý1,Þ>ÅRâ·{¿fÏ@õMŸŒTY1kwRâŽfË%«è¼ˆƒ›Iíé©0C[@eBŠ¡ËÖ–¦“xV„É/†÷‰ zîø›RíÑb¸ÄNp[îepeGÔñ"|"Õä³Åª5C7"[š:´àÜç£5]tž*î£ÝèÚõøÐLz`Í}hC d!Íè}ÒÉx6¼'”|Q`zíú03¿ûÏ=»†Ü$k:ˆ?6‚Ý ~OÑA„ìÕê±ÁjsjOÀüPÂôeùpf/¢ײÊç AEŒ»É„¨®Ñb\JÈŸ¨â½¹c7úÒš®,Á P{îõЬzù(°”õ¬V­ÉP³e7_Ú€¾¾õ«žNµ…Œi#†šÂ'¿¾ÁM°ŒU­ðL5+l¹Ÿ¡ÑZëòBÑ^“9à++ƒUûÄì8Yž¿}›ÊôÕÒªÑË’•?r˜Ú¬‡xü^4œ×ÌÚ¹÷ò{Èú$þs¸„º¶ÀöëÍ4{sù.âú „]ò.¿ –R‹6MFYÏl†56 Ð1™4x«=ΰþ°«ÒYÆ~äg_ªùŠÖLh1—ë}Œâ”ñÃ. vÛF,AÖ÷5ë[Š¡½fºü ˜y)¼Êû~Ë™nj®vÿôðÎ_ãb»Âiÿ"kõý æûëçëSíÌ“Eårý‘©ß“@¦RÁºÁ¯V0¯Š´dmÆu½jÔc+Hd'& DJÌ­nÏEõ>xÂQYÊXüŽ­Æ ˆ;¯ÚÌÚ”?¿T¦ºÞ:¥ÁU'_÷?àHOjˆËFÔvc(d&iªz^ì¸ßð9/yñìŠÁJ/Ù#°Û^™}ëÞQÆÎî_T~€[¥²´ìòA~‹R1½0%øØ—›‹´5gH¨Qó»'¿ü×Êu‹‹ÊÇJ4•àDõ`DcFä•Igß߯}Dê]é'¸*ÀSÖõìt •ͤ-qÍ‹ R†w¥|ŒAK*å¥åëvL*: Á f̘³Ï3§uJv°†’{© Eêˆak^þä4óRꨙ*,þ6ÌëµB]»Þr—~‚bõ‚[Ö—·¤Eôº®ÀÓ`œeŒlFÃZ—ÜÅQÑgÆf×þÎv¿ÖíCÌMûj=3wã£ó‰bÑ“ßÈù‰½nïùyE¨oŽÝLõ¾]KÐ õ Û¾Âdø„o¬¯}|Ô‡Ú>´&o Ÿê©ÃŒVÅ5e[!C*ü±â»5x¢)ÎÒ˜}À葯úXg|güeiTb¡Ù‹’KÃ|ÝwçÓUæŽõR9ܰ·#òji-ô£QdݬAiªL-¦_{‹=å—O¬{cé„À0ѯtfž?ߘüÒ7:k?ìCTíÅÃêÌ”Cü^¨ãuF—pwMw凯 k¤Åš!`¾C"ëßÜPAÖXcþ}J”«›RoÜùm¡çIé±múžb¼$ê×7à¹lïø£Xru¨¿­Q¯ái¸r·_¶c×Ph²¢²déÔ¯ËkÕ¹×GÔþا‚mZYw}ˆ4Ì$Ùï¡¿.앸ô˜ÿ䀀Gæ~Û)Înæð«é‚~ð´Yh'šÎU½l2ŠÊÚë}…’¢Ò …j¸ÀŒÄxé g„ŒŠêÆPò{R2DàšLpBÜr…Ør§âaOÀÒ/uvr‘Á6ÆYÁªp…ktï³æd¸D´ˆð™qákW&¹7æÐ#|óó¢Á–Æo¸o[ª[¶]¸Ý,È¿uñ*JŽàLU‰÷X$“8g2$ÏË_&Ž2doõaî––×µtĉ¼ (ÎI«çI\¹v:ËSÞôxtøòˆxä ß®/ôÕuÍ@@j·Ï:¯æÎ-É{8ÄGqûÁ»kA­§ l–1–ÈÇm¨SjiHi¾%λµÒ‘ѽÒ>®D®NóŽ[7Œ2!äôݘۆ2$†(°¾JÑ0%‘1¢›WWaœ–b”Uö»‡†\VëƒùLÍ»> endobj 345 0 obj << /Length1 1144 /Length2 2936 /Length3 0 /Length 3679 /Filter /FlateDecode >> stream xÚuSy<”[·di,¹$;O–Æfl1–ì‘ml!ë˜yŒÑ˜³Ð"K²&Qn¤’5[i![¸)KdM!ÉÍ’p#kxG½÷öÞî}?ÏÏ9ßïï|Ëù¹ƒHGe# Ñ4'¨Êp°ÅúÒ(Ž(‚µ²ˆ¥ P‘“sÂQñà?haBQT‘`Š¢2x'`ƒ"j0CÀ´špƦþg ‘Œd\ 1@‚TŒÇ”)M  TG‰„ÇB¤‘Ñ ø1*ûgVÀ„H¢“qX* ïìࢠ¤tø×ÑÑ|é2€)HÁa À!Æ"ÄI»™Ç@HfÙEú¡Ì08ên»€¼?•JB¨ª’üP S¡ø©@ªª£P3Æ„¸+@ìÎÌGÑŒ¦èª?ÏíBûì‡#`¾µ„¡‘T ¸ hiúß`ùaA*  SƒéÀÔ0O£ýUwS:ÑIà7¾ £˜ð0‘ø¡ð0ç2~0 *¨dö¿Äßw8ÀàÐTÀÄ2®á‡:ý¾ïmPT2î4àSÁàl÷ûkåɸP ‘€§ÿ·E‚€ª¹Û [¤ÒϽÿelLdH*ÃhÊjÚš §0u4ÕVD¢pÿ­öã°%Áè|/œ1±?‹É† ùo†Uþ®dK¤âÐ ÿÃ$0MÃŒü_Íó7þ_-ôssÿ­ùïŒÎ)€5°Û;EþG8*‡§ÿËŸ]Àï>ÿ?:–T‡6"`ñ G1Ç1HíÿÝßqgæÛ‹‘D n÷ÍÊpMøOœ“?}ŠR( ÷}£@æ§”f4ƒ#`G*Ã(2æ/`—FÓÈdÆx¾]ãìŸ{?£@< ¢!ÃD´nLÀݘºµJ#±åß_¨·h9¯ìФ4 Éxæ÷*,Ͷ§ŠÅ4n|ѾœcŠìð7(wgµaeŽK3K>rJǸ^…ƒ_ –ŸÅ"AtNåžž-‚{‘S¾çX‹èÅ$á¬ë3&ô§ KWÜä Lºø㈂‘k'§¦ƒìØÅ$Ko•íµ›TÐ9°=og°G°÷?o0…DÇgqo|ðrzü$׃¹U²z~ŸÁVcÍÈþ¸cêÝE_1·â#ˆ†®Fµ ÿz+Ãæ¦Ã·/äA§–T;¹¶ÇŸ+ös³ _º(1ÊÍ+,Ü¥i¨;ŒæË¸ÙZÿRþ9·ö+e#‚ÏGߊé c¡Å¹y2Â4kŽcãoÖuªu Õ¿"ú-a=“bÚö×=j]Ï>1(4ÚëÙñ!ؤ¹ÁêÝûN¦*I&{ñHbÅ¥è`}âƒÙ3–ŽÞOn]Õ:–Z« c”¯·Pí#€‹l(OËI甚͕˜êv\ðúìuˆí0²t¥5lHôý×2-¢u~ݘü‹cC¶„Áê;Ö¸„×MÆÊR6‰’ô¼og. >帾P¯ º»Û !¬¸‹ËÒZŠÍò —è¹?_w(Š9„Q’èã4Ö—Ü©ƒÅ:ìËÆKB]0 Éù¬oò,ŽÍ L$®m&8Ž¿éT80ŠÎæ%gå¾ µeʯ¸$¬1µ]nЩ…/uÉK=ßÊuþ'ńĶ£UÙ‚V_‚ù+Õ}Ž/‡ù^Ñ·í´e=­JßzÛ@»·hO:<ÊÝêE0,TÄ®pÞ}Â!á_¢…?zhEغûz_/ûhwfìÕýk„|Îbõy/ }ä¦ZÎË›ÂA?éÅWo$—P]Ô³u¦©’RÀ4¢WvÐÞ'®pb&½?;]™ ú´”<t¦ƒ=·g±òM‰†œø…ŒÒ^öÇåjðO·C'Gd”H4K £R' + Àùô=šOX=bÃî{÷*GL¢zï&öÖf›Œ>¾ŸªW[œë–¨\N'FÕiåá{+v,ÙQO8²]ÕÑCðJ ®Zr¡Ñža§íÆôÛBgd-áÇ=½jŠ<[œ™xv+¢ÙîuÀ.júµEµWW_ûúF»IïÞ©#¢&÷øXµæ‡#Üçz­8Nžø¸,\mŠÕ§$‰¨­ÖÎïÓê ø<+‘EV½“òG”ÈÝ}l*ø!ºu¥í¶çKº[»;ìÎN×D8BµãÒu]°–éöª´êú%Qy‘t³u¾ÎáꯚæY —Mïü:ÖVÆ Q»¢®ïx¥H”9Û£mÑp;s¾°ƒD h9e²µîj·%akü’z 3ÞãÝ'”DÎR/¼:›ŸyÉ Ü´ÿv£¢µ‰×/͕ß¿É´Š†šËŸÐx7ÝžË[_Ö´rÿ¼ñÉŠi‰xø÷eÌÅù8§Ë=÷ùí»„²ðôDמò߇ì%„¾Y¥âù%¬•#ñ“·®B?ô«¿÷¬¾Zb<‹.ê:QñT)à|½”f¢öJVrz&ßG]÷£qB×îRá»V;åè`¤¤§†évѰé±5ýá•}PšÇ þ¤Úi­øåçËBZ‹EÆsϲy¾Tº½ Ø‘12×I›¯³“í¤©/½Òx7q´ý—Gõh¦<×øÁsž˜,ÃIÁüg™è2Å̈?$JdNogìT´ÇØWJDË‘ÕE XJìËÍ}ÂÖ/³¶&@ï—'{èðèáCmæÃófœ {»Þi*rˆdß>?Ò5oÓ|6åð!)•ÙÇlælZäåK?Ù ÛNKœ‡§z`‡É~„sÛ8Ø«xj†+:šŸšçŒ*O-j²‚÷¡÷ǵâ`ís:/ž¯¿5mtsûÂdâÚtí½â³’4}èKjÔæ1Ž¡øÇ޶7ÌZËFߌp¼CW“‚ö˜º$ì»àÚ$V wAéJDTÙ< °;¢Êt¸¬7…ýº4ì¯_L|ùCƵsØÃÛṁ*ýJ!(×§/÷¤<¤+b ~«I“Ðè5ët›.`#=”ƒÚ †.×5PÐì]9³=_è|¾9atTM2þ½OçЗ±WÇ[lU¼|FÞkV¾•uÐÜ0ºUüáq ù+q°ð×[ÓŠ'¸¦XÙ¨†AÉ…4ºí¾Üºì˜±àln×Qáɳ*¥Žü”ìʦ³®î µo.Ý™vU÷ê¹þ+^ÈGd_€sÌÒqµžã¦oª;$žðåF¬4ûg¡Aà¯oðÌL*>Ê6?+ï’\t·™¿Éµ¤ •÷KÛ^-à˜_"+@„@ˆáƒ(_¥&“#6ª"õ-³%ˆf«PD‚{Âŧiçà±ESjY‹K#ôǾÑ5Šîð¦¥E@“m«ÅëfÚ©Ì0Q‘?z° ïªt|ftZI¬€§âé;GÛÎ&Ùÿ!øFæ†ÍV;\ø›¿öÚY›¼Ž(T”ž6!\¿ˆ´ºY]á¾pÆkf}öÝ–7Þ·„ÔéÖU&ñTuB#Y6™.€µ|òéS –™úz_l+g†å…ÈS<Ùoܦ$•WQ§ä]Ár¶³¶ûb FìAÃÁÜd‚,ªAý¨`ÑÌæÍ^œ?p1L"w{5}ç÷H±(÷Lö™2qåž0öÏL̨ü#|O»‚u«Lú^mÜìéW˜^-ëÕ¦¹ãßzvÚ²g¨*™‰ìN,m‹L½¬œå…s:úOótx] YËóÖMitÓ8<¢/9y4-Jév ÑÞâú†!zž)/õª¤0ê¾÷Ép=Ñ¡Ä-;ÚÍ=2üÅ¿„ÉŸÈ}e½³ÌS!¥2ŸQ6¸nö¦9qÔ.øMFÑëšÜçÏÇò6¥%ïï-o•FŽ”$£šÕèªféê©ã³É´ê£PÍMXq„üï†Ç+³·ËeX¤[¿¥QѶF¨é“j—­ñdX 'û‡ð¤ÊÁËöÕó£9©´ÅO¶¥OVë/t×ë[¾´IÓçp´UþÚ×j€çŸî!rÀx*g¹¬òùÒæ†]N<2u,6Ø""Oîx#™°,9Æ^uÌ3è0 võ'šúç‚Õ§®ØÞU¿ÐÄÅtl{ø©¡H—!ç?=¾x vj«=kïx%"8ÁË­Ù/üáî€ý‚ùn_x`[|ùU)>ëÝ–IÿêŠçqU»ô]‹w endstream endobj 346 0 obj << /Type /FontDescriptor /FontName /FYVMNP+NimbusSanL-Regu /Flags 4 /FontBBox [-174 -285 1001 953] /Ascent 712 /CapHeight 712 /Descent -213 /ItalicAngle 0 /StemV 85 /XHeight 523 /CharSet (/P/a/c/e/g/k/m/s) /FontFile 345 0 R >> endobj 347 0 obj << /Length1 1626 /Length2 14332 /Length3 0 /Length 15171 /Filter /FlateDecode >> stream xÚ­weT]k“&îîww'¸»'8‡ƒ»»Kpwwww·w Á}rïîoÖ7=zúÇ^k¿¥OÕSo­½)H”T¾˜€Œ€ ['Ff^€‚…‘³£ ÈFÄ#Ç 4±ü‘sÀQPˆ: ,@¶b†N@^€&Ð 4°²Xxxxà(¢ ;w 3s'µºŠ& ý¿$™ŒÜÿCóÇÓÑÂÌ@ùçÅh ²³Ú:ý ñßvTNæ@€©…5 ª¨¤-­  –TPHm†Ö%g#k c€œ…1ÐÖH09¬ÿ9ŒA¶&•æÈø'ÖG€!ÀÑhlñÇ èf ´ûKE°:ØX8:þyX8Ì mþôÀ °°5¶v6ù À¹)èo@v ?6t‚),윲*‰IüƒÓÉÜÐé¯ÜŽÔéK±ó_%ý­ûæÖÉÐÂÖàtsú+—`báhgmèþ'÷Ÿ`vÃpv´°5ûz€ÐÌÐÁÄèèø'ÌŸØuç_uþê íì¬ÝÿöýmõŸ,œÖ¦Œp,¬r;ýÉmfa Çô׬HÛš‚,ÌÿÈMœíþCçtø»AÔÍ Í†& [kw€ ÐŽIäô'%€ú¿Ç2ãÿÉÿÿü?Bïÿ¹ÿÎÑÿq‰ÿï󿇖p¶¶V0´ù3ÿìÀŸ%ch ø³gr€¿³ÍÿåbhcaíþÿrúwkMà?hE@Ö&ÿ®“v2üÓ’/¶fhafdþGhá(aá4Q²p26˜Zÿé×ßru[ ƒµ…-ð¯·ÀÀÂÌüo:5s c+Û¿àøG´5ùwø¨ú<“–¢ªŽŠÝ±\ÿ6Tú3Njîv°ýïRäA&ÿyø+ŒˆÈ àÉÀÂÉ ``cgùs÷þâádöþ/Rþˆå_gyC' 7À×?u3³ü]ýÿ~þuÒý·0â¶Æ “¿ÆFÕÉÐÖäϤý§à/µ±³ƒÃ‚ÿ¾üªþóß3ºáVAÆ|A–©iNµØ9Ób_û{Y †ƒíJÔ óýªA=¾©aÛ<¯5ÁŒÓ¼ïmî?OìÞöehF{±¬©z’yÞd4}ù¨”\tLz%ˆi§šQž—?ä¶ u8™5v&•UôŠ_?Nw°9À\>Ðø‘¹äûaßÛ!ù§ÔÇbv¢4‚¡ÕœœR&üz¸§깆êÛǧˎ…¥à3ÄöI:!Itr7p¸m0~‡zvá²Ss¶Ó‘YeŒ7ijO—7­Ú õÍ` «ÒbÜùYS}c#Ÿ¤ %bs_,¦ì\ók¾NÒ²epð'!XC\:IÔ³z\ïCt“dèØá=Ü,3S-” [em+u¸Y/zø11d©¬{ܘ‡+GÒL¡‘‡Â« QúA$°ë¶ïœW$„çR;ÝcùÊÙèój‘V9?Ì5q´xcÇ’3Εohj6¯\.ϪõÕæ¨ÑH*D.Úgá[¾øï4cZ1UÛF¼Ø£E÷¤¯›9¼ Õ³¿V-aÝá°§-V1Ò6“µnÍ*6>ð?–q'žÀ ~ÍÉÑ¿K ‹+Xôï˜_ÄËAˆÊv´ó†¶8H°#(ÀR¶£ß.kÿ¿¼¢Ý¹ñ£1ΊßÜUÄŽ/ª•£¬Jãö÷}Tç÷å%NÒˆWÄÌÈ2“öº¨Zùq˜¥A¢¯y%—àѸ«X˜÷!î»_Ý-ÓØy²2u)•ísh1ü´,®{ïñó® `¨­O¥ø•Q?HCÊûfÚlå„@v]ZïnFýñ"tsSQº@(2f,c+®âΗ÷.]66c ä›÷«ï±ç¸‘ûkn¨¨npl½®3Ú Á#êàg×ÎÒä\™cïápÎ×/˜®î3UPªñOÀ¨” ºðÚ*¦Ì!Kµ(ޏ¦~»Wy\çØ+ec°æÍE†;Úç=Ë¢¦øêŒ5(Ý÷;ë2†ÅpÁæ^úèóÉ›‹[È&þʼ+‰_šåœ¦º— ‹Æ0°L…ûPïך‰u6¼Ð„‰ƒùÅý«üœÁÙ½¬êLøHæ~÷»øsoþtZÄ8Gо¸q@áÍYÄÎ,í"íú®öÁ˜r„+kx|Eç2S±|J®kgÐç*² £Ó±¥_.ÁXH ¯ÁÀá"“‹ÒZy rkÃáƒ$ ¨aiò–ɰòÚ)tX ÒåǬñ¯8ŸZ¨cßJPQ§…¾b/ŠŸwÂsñ=y­z(Ãx˜Zî¸3~Ïô®i§Ç©*΀-=¸.ɧè¡Ü­Î½QiSjôØ"áÊo‹e[V»+!ˆ4^î'Ø ‚!7ð`ú«*ÖO¦É¹´ìõÔð.A¤˜¢‚¦QºO($áÄ`pÍs"¢Nš ¿¿—¼x«RFtÀÕx UÇ&œ'U‹dyNV¡ MŽ'…¼8˜VÄÚDœÌ­³‡áæI ›#!a¨¿ÔMéÙ5Á/_¨6 P+³£O†©Ž«[hÛäµßóúsñ z_ûakËôb‰ðˆtæ&Hïu'4w9 Uahí1Awe‡¹§i´ Ð1iv õNª³Îåd¸“rƒ M˜ßgHä~ŸÅ!g®/XujÏÏ>³Ë÷t²­]pR¿A±•üĵΠƒ?jãSÁ}†¥jæðÑFñTÏ%~a»„k½V‹•h½eJ5X0Œž¥u¼˜uî°@E±aÅœÖsê“ÔSï48OÊû]=HÖSM·¿¶R†‚§q†Ø6UëHX‚–&j&d¥_I¾”¶²ûd@9ç2Ð3.„³±8†¢¿ÎVÖ84A¼ BŠ/izÞÿE„É”FºBή`¦ë´•nhñEÆ¥µãø0÷b¢¹k¢šË牴m׿ù*ª¢Ù499jƒgÌ›ýœqš€'jË ­#4ÛÍÑÝà˜ œS*±µ]Ix¯˜¤ÅT‰E¯O¿,Z™QïɶJGºzÑ2Fùøn’¾Ÿv ëøéw¶<ÔœGÙvZ l®QTpv¿‡sçõg š¢JjN«¥OS÷yá$hi c»}…‚û´Þ¹ðb3=“Þ&hˆy^¿%SXV+¼:D̈øÞÀø¬YŒLýEµþ÷é;À«q vÚç!ú°Q]´Ó(dkÿÅEéySyß.Ö‚àÜ¡· ¤WÔ„öà‹ùßá„I²Wy¿O@s´²¿!P»~nÚ?+¥°kÂÐÅ1Ο…Rì èŠIV—1 Ó 5tk6ú~Ñ!-ÍÙ2»b­åZ1WÍJ ËAKé u¯‹5ù¾Ðqpètæ×ÃÚ>˜ I ^ª&ËEƒ4¼BG!6{ÍÛ(ϊƹdM†eZÌ}±üç –¶1Á½µ”s­ÚƒÈ&P1U˜q±Î°EH¥ôRøªÑ¬ BÞjéO•Ý nú#¸CÔ~ÌG¬Žeû­æãZBbV²Ü ™ö´«d¾<2Mêšx‰9ÑvJR÷žÃÈ~c`ýrž«IB úK;ò­ô3!xàä5£T„)ÿÝ|숨lå´SPÛ£YJ vUUêˆF¬ÓŸ2:õŒìsá ‰‰ÅvkéB1ÄhÐVÎ×;[ÜE×Ï4‰BúSû½5#6ÛM‰*ΟÇÒÃLúbí?É'¼PO‰Tx®)xåi\ŒR54À(ГÌùÛsëm˜¼wYI·ÆÔžá”a×':–;¨’¤µo67^éø» §-ÚeqBd¥¬º½j® ž®_iP ÉvˆÐÚ~ 8ž"s©“L€Àˆ…J ²K½ºz‘<þs³CIƒ:#Xé†G2lÛϸÕ'n×HoÐá¦ãa¿ÐZ¿Ú®jWl“["ZTMœ´é ¼sņ¤£„Dú§ÒÝ•$íé#ð¦JǪaÖâ(‡ËfuÖK ã&®°pòƒ–0xh‚â½û>U < H%©,­ö·ÖìÛLº›öl­Ÿ²aŽ¨ÔˆDzN‡¶ö"ªÄjs¶Y­¨ îÙ†Ôµyă-v-¼ o›Ñ±5¯ÍÞlýŠŽÞË¡…óø>ig‘g[¨¯Äïf”ÕÞ‡ä`Ö‡Qûr½h«àñKуÚ—ìƒÖt+ÇI";˜²½¬N,š[Çe?׋㸄SžI×ÔL¯É )"Mï¡í>‘RL`æ—ȃnœ“(Na<·<™À÷µªsB䢗ÖÅ_t½¹ 3 t¯Y­$˜†§ ÔðaÈ%DÛ›fl@žÕ¾e‘7fT=ÔSPç¢âöïøŸ3 Ï¹Vú·hê™Â´Ã>CÅ,±“<-q¯-uc6/ø—@:;ú‡©­Ä¯k‡¤r„™²µzÖž´O˜Ä¶hÔÆòf_Ðé™\oðßÓ‘%ñES»¦]iÓ„4.q£ø›¿×¥?וÁï•oH  ÊåKBÖ°Tžœ㌠;ê>H¤‰~)põþÚK¨LÓ™Ân²3aª|‹Ÿý©µ_%Ýt÷Îgb^^1zù–ÂìLü"Ñв2.N®:JÑÆh`$y{%Pt7¤Àf¶)ß‚Ž6Ѫ³Aò³T';v¤ä\ ­Ó…Âe!,äô-¨1½aÔ£‚¾£µÔ –‡‹D ªpY<í›äy¿.Lqp¢O÷èÈÄŒHG_PDGÒƒÂòd‹ÄWOøûÜ,ïSÕ .U½4ÌÃÇ1%Øl{UE_`7Ñùƒ+uñЇÜ&QãfÂášpã´×h·od²1à±ã鵯ÏÂÜ9d8WÚØ>èB‚&¹º˜TÝjåÈgokð—  ²Kf+S~CÄE/iNr¾˜ QÐÛêAn¦Î¾^6æ ôäËR\ÁQ#¤IŸó‰Û#œõGßYú’ÕÅœÖßîºlÞ:‰Œ>C¢G*î2Рã´=k _É£çg.–¸É߇Î+-¥Mþl#]E¹|J*æw¯R[²QlOÊlu¾rªÛî:FnÓcõ¯Z–¨OÓ3 ÷&kÛÁº‰Ž¾“w´!7ì´ ñ_äç¯c¹*mÁr¢éIcÄ‘äÉÛ&×U™zÆÉè™ûgòú´Ó‰¬÷%«pÂh’òq9‚;äVžÂ¾)WBU Zv¸ýfç(›ˆe Ôå uØZ3ßÚ]ecà°D\‡-åñ…-×.¸E¿ ª@ÓÙœ{ò…É’íBf²#ç¬,Wâ…ûýv¡t?D.>2ƶú]£Ì?” ÐM¼*€Búqæ*½œ÷/&4ç6G!/ :ðÃß°!ýxôäsq9zÖ®"îÒÈÇU‹a+O•$^»_ۮʔFªWúòËòš`·¯s„¢$›"Ò-2Ç8Gtg··áåÝWÉF±ŽÛYB^n#‚û 5ðürÿLhÔ=\W^€g‡ÎòG¹Xm|^Ò'ë¤`°×Ò”ù`–e[ª©c®¨1¬wÃã,Ú’=ž½?Û3ùÁ ãÙ¤ÍTõ¾­¼>¤šF¡ówû§fé²m¡Ø\ú¬|™Ž,¬¦ËÌQŧH×T¶º[GuF©xíÊq&Q·—ùükg‡ÂÊ6*;èX!jäpœÉöRpâŸîþû7HÄ èëZåŒ5Æ'-™Ž2÷¶B^O¼ W׿rÌöY‚ÇÂ%±éáxCý +7ØP?£². X¦ÏÒm^ÐSuÕ¯˜®Ö¿ªš0¡,Âp–Í^|#ŸDk&‡ª.€…&öçRI EáÀÇJþçõO±.¹ßÍ"H ÆSnG—eÄç«OjݾSæösgÒEJõÒ|…†ßÖßÁ‘çô„±«­ÎÆr|‹ñxÒÝÌ— Žsئ¢S ]fb!½O°"Š‘¼DÈ­ø`}#¤á›¡ †ûT°¹†Eäë¨W}æŽéÃI0åßP”§` Òà­I•Kâ­£¹,~k$Õ! #Šóü’”‡ ~n¾n¨I)º­¼‰6¢Ýe±ÐA£ÁU6•?IXI3Îûy\•G—X¤ò§Fn…2k`Ào§ë HÔD·j›Ö\kÖå|"Ä*¯eS©T~çPÚþòt[—D+ŽÕŸ»òÂC_cYuUçf’¡v}ã£#œ“ºÃô¤dMJ;`â#áÊ¥'4å$zø†Ükµ`ùÞØË6làøšqú—.iß-©%¹o* ‹¹ÎSㄌÉÄÂÙº?)Öt«­O ã&߯òÛ`Ámÿ 5ŠÉ$hqÄ5_1tÅfª-èÎÁ‡{ÏðñÃùdzx{Âàã (nÉt%µ‰]ŽÖØ>d*e‰¸-ÑâOúx„Q3 ÃóŒK“wöV‡hbáoGh‰fƒX¢–Su^p¦‡D|¥Èñ8…P _gHA¶Üi½Dc;ÖzF|Ó¿/n=¸›_ ˆÒS7xW:—/Jò`BL[Ìt%Õj‚g÷Ý‚“…W‹%Ÿ1Æ¦É Äöyk;Ɔ0£ž| ,é +¸‹ 8t@>Ó©.1µM@7ϤêI›Ðî”üxmܹŒ×[â”É1¶È7¿”Z/‚y13±Üˆl°jΰ¡¸€ª>§D •õ¹bdÓÇ'$›Öòçf/ÊYKŽÜ…ÄK<6õeœw”z~L#à ÔZ¯fÿÈ:»*‚­4ßϘw?ð…W§aPØúMðÏ<ÏÔ7\e}rØ)wzì¾ÓÊ,J÷ðp?±¦ÒÚÞÜ㈺¤ó7 DQ§g>ø]¨eqÆ´õ-¶@.š=0~¤l·v` yŽÈ•A§¨ ænŠIÈ&r·…JJHÖ‰æÝ”¿á'1§ m°>^ØQÊ+8§¢…4Ä6.­ÂÐÙÇÑEǾ8ø>½µFŽ5Ô [²€®Þº4øÓ<õTÚÇâoV`ÄJåeòQyígxed³Yýú¥ý¿>"™·¾CÓ[AêGóHÅÌ`ÒYHó»¨q»â»Z|›dTËWªC3Ì˧±y ßd¼¾€‘r¥~Ƅϰöí>àÀ¬\f¢“Á¬™ozu›m®wS”ÙߺŒt&%£uü¸ÐøiÉòÛ¤‘f‰ƒZŽ5ãÎèz"=<Hq ͵Èìœè)†…“‹(sÙ†€} O·¬’Évþ³Ó ý cÂq5GéB¬Ü6ŒåLµåöL¤˜áA/Y×È¡ò÷–=:ñ‡ä¾j¥¯Ñ›·€(ÝVÊ]‡E°£^ #Ø MØ‘´Jh"¢£ÑÒ(f÷qù@“•ƒé“Îq®­côÏp›æÄ}²Msû¢ð«µïÅNÞîžíê¾ëðêÞ¹êyÖ¬ywÈô–%ü1fLAené«X(=}úaa‘ Ÿ7Œ½4;ÃÅd |£b×ácId¼ÎãÆ¸Ä“°ÌàºõeEç¹É#€š³ØË'œE=¡üÓuÍØ$ŠÜÄÎqµ;°üë‚_Ü…QØÿc‡“Ì`øÇ˜¾¡ŠŒÎÃ飳FÐ~W­L¢úà_¼|²7mIRû@¶¬·~hº=½ì§æ³ àðì铤­¢9 Yõ§e-¸¸ £à|©4#÷÷J§]u˜†€Ý°?7J{›m ?øA”ÚOOÅ_%¨$ËîW&ß«øˆ & ’U³›[PeçÛÂÖyýÙ޳ßÙl›,œ0q„0‚,Þþ7Û¼ÒÑx£l Øà~«Ÿ¶êê¢*²l³Qä8­u™í»”D>vÇ0Í\¾`N¨bí0TÁŒZ\J2ZÊÈw}òndWsrÆŽ6¸ñì+å9…àòÜ+F8½ù",tÆNg,r›´¾8ûҥªA™ÀYxÝ©§5ØÈë¼ëjlZ‰VÓÛm+n³‰ƒfá,iˆv£eÃ"ÓY43tô/«K¦]Ó'5DTW­lg»­šÉ?r%ûäÔÓ«t à³ú SÄÀJû÷ bëOzŸ!—üb'”· /-ˆHJnš¨HgÒv³^+Ýý™{6ŸÆ6šô¿'Š@Ò_8%= r逽ńätmäÆ1ÎI+‚¡–sY½â‡ÄòJútõWÄ?/5¼g´wNÃ×ëŸN|)ñ}j ª¶Ó À ¼³—æ-2ȯÖt¾Ì#Û ÚÄôë^IJ/°'V|*aWÞ(˧$⣩ Y€, ›(0ø;#/}-¿g´¶èLO ãwÙJ8•ëjÝÇbÒº(6¶XÈðWúzƒWYIóÁÆû+mgõˇÜäÄ-Gêy¼4 x×$õ7J}pF/‡;ÐÇ-úRuÊA}èŽeÛÓ¶õ`Af\TùÛ+„dq ¶:‘FîEó9¬øbê¿äuV^×"5T×»R>×Y_ÏTº3/µ? ±Ëó(Ï3 ¢c·E]ä#µCx”ÜØ±6æªz#?%g?P ˆÃL¸¾Üá¾òÜþåLñýJrŸL‘>#‚ú1Ü]w ö!ÛI‡Æ®Ã ;¸hà?v³ëдÝ{oþÒÀ˃ÍßW3uó“|eeO]`×àãg\÷ºýxúJ´Úì€l._Èã·žìû˜L±Ç/I“’”Dž†oÍ/~M[¨X_\a±^ÊÚòç& n®sÕwâq(Œá\³Š˜þ¶Y!E{ꦻ‚%CÓ YäèÆGôϱùç·&þ0¾¥ËwsF‘üwûö»o¸ë“ÝahV«‡åûXã¾²¢Ø…Ù†/¤yZIÀýü%   õÛ O‹ ã°”—½³à!d.ÎàWÅýuÒŽ™4EQõb’„oEU]‰×ž]{0NÿÆR¬Ú%/¬oÙZ Wëâ:‹ k}ÔÁÏ{çffÍ̇0óþ§3—6FV²žóK=”ⵂYУÕVÛψ•³ÆçŸç\D(˜'óµu¿)K~¹'º÷6ùxÜ~Ü8•6 uœq gxY QpäTç€C+·ç:æ•GNçÕ©¼VùÖ¥òŸ¼}WhÃ)×3:(P¦V"H ;¯¬ù"m4º }ºùÒ¢šØƒ4’`‘ƒdNɇ‹ÕPÜ’9I¿,ÿzÚª/ªp怤ÛåAÑQQ"röKa`!ÀÿýüÕMœ£°6-{J.?.RWEË÷q¨•"=ñ´L,òãsfÁÚyÁ<X8UmÂ[l u25¤‹‡Aa RßAA w”™=§Ü0¤˜åƒÏòË"!9õˆuæKÀ¸°ó’£ ÷…$A"?õÜqþ”©±}lšµÍVxJÒáÎTŠÈF(^²nÖØl~Â9ŒovpÑ Âò {>e³™Á­«ÊVˆk/ÇÓlû3e˜HÞ™ë›àå:æ¡Ñþ‘iµ¾åìù*¾¹Ø÷¯V’fö?æ Êh§‡_>B­´"9'/5-3jµ ò×ËZAÖ3ô!…Dmä]¦—AàÛ‰>V:ûWNp›ÇÎÏC›ªAÕÍ’`Oœ 3z®ôW³ª¼~?Ñ·_ÅùâÞ óF ý¯…ôÚZbÒ@Å¿“x”3Ø ¹ûX0­ˆÌ½”ÜqqQȵp?U_"Îpmíd¯%…†Þ¹Ùu—ß\ËoŠ@[)‘b]Ñ0þ/Y館–%5°¹ ž€cԽЉU&9£šjÐpñ«%¬DA:sUøìÈ)ϤÓ•ÃC_ˆ")a "¸lùdDi Pàý=~Wç·{@N´d=j%n@Ló±[ïì.ø‹f\άO‰Ùì,§f1£I%a:ÝN´fàR•™ jn çá]¿9Vj×@ÑÕ¹³¯~újÄw*æÓNìÞú=¹q•±;¶­üâš}_öBýœ á%g®u˯Óñ[¯o¸àHΩƼ Ìü-rùŸ– ;ÙTóXiÅø‘ÀÍK„¾åÆ{Lò¡¾†¶7¥J 4¥í´¤öi…xi…éÉ´¾ÜõéÉrlmœ›ÂÑp×Ìì N*níé¾rý7ÌÍÖÙc §7^ø'a MQd‚3U=´sgâö0¿”¦ºF<æ §Ž•ÓùtMÿØ€T¨œ¢·Щñ°–ˆk7lé=8?ÊlÂc“WR¤¥â¨$Tô¥²[öª}ûª½ëÐ*IîòÀ»>’1Û"ûý€X¤—T•Þ±.Ï7Œ‡ßôÇ QàpÙúíéã &dHžN¾6a6ÝÝ>ÜJÏ“¥¢ÃßÕö0¢–;-ÓÝ©.C¨w~˜—ÆLßÁ1´—-å\¢Ú=ГÒHÜxxêÑÐÚjeÿ³ô°Í#¦› EkJ‘[抩­ÂÍ“öï›:¬µ"wc±„xüs~ãŒBHwäO"ݦ†³|ùÉæyXAæÐ^HøŽàô ÅßËXV½”ç˜}UÄËÀº³[Ÿ•²OOJÝø³ø>["üCoí6'0À»ª¡3Ú¬SAô V”}Puà†’)çÄ“XÆ neôiqCôú¿‹Ìï¿sD_^oøžŽ'O1zá¸åè)ò¢2±Ó¡D D1uJ"Ð+ãÍ*ƒÙÉ×ÌÜT@/{¼cß‘÷\xë,Mó.“ÒXRT#z&o;ãý^WœTéäU*†óžK•YÛ|†r³ªˆ4*W¾ë0ɨUÙÐݧ\‚›çQd¬«¡­ýÎV˜ºÌÁÅ_=í½È¡„ÈY‘d0ð:÷•F̧V}´WÔ¾ß{é¥eÀNnX°Ã¨O×éQïÉÙ†§8Ofa®ÏÆÜé5T=p!H bÜÚx®có šCÙGœIg±qA1_îÐÀ·¸¹óÃ'sçûÓ5Do; o†Óï¸6+äíRyZ¶þnª‰Ç)Vó{*Ž×ÔO_`^ø1&¬ùÓê­f!†A{å¡óªÎþOò°š }ý`Rü¾²|3v2H>ÎÊ&þ¿šŒ ž¼³ wå7ûQ„[EüÈÙq•ŸT–P² àŽvo>áÑqÔ—~Üê]0ì~èSÍ;hrwÄcdј1#2‚Fšx‡Ý)€Zþ| ”ãéŸ^•}A- Ñ÷µùÁø+¿0 cÁÜ:š‹VX^ /2 d°ˆ§ÖqGbUį_ Éšª$}ô´ñvS.=êzå\`Ç!u¶¤ŽU€„‚rŽù>ê¾Gdý*ôÓ^ÃC™ý»±å-$f»vF®¦Zbø©¿>mœnÙHt¢ÖŠÉ` øþ«aÜÍ7xµ·ZH Ö£’ÇäÁrRùeÏŠÇ/ Jf¸àdXÚù]?¯kžRM¤­“ÊE¼4Ç.®¯$IŸ+¸¡®bk¿Ô.F1[('ÓªýÎŒûNË·|”ÿFÖÖp½¬¹?F™,+]6¦'"b 8æ)ü0ç'PëÝFaä)¡~¡‘-|ý†ù3”âeŒ¤]5Wû³NàW=ÑÏsYfÍÛ„r¯Œ²ïàjûºÔ;Øõ0ÙRb-i˜r1ÅÔ¥Þ"wW0ÒIؤ47ă#H;¡•;ÙVþ¾E MUÁü{¸M-÷bdãÆ×á¼2$~^ ”»} m–ªì©Þg.¹’Ãæ•'^x3-~ÒðÑ;ajÜP¾æ„«7Ñ IÜa  Ž/„C½ìY󩌩‘ÉpÆ8|éòiª.ëÚþouŒ%«{ƽ÷.ÿ)¶-øØþpš”1xj§mê­–D»ÚÕR‰õÅûÙLjã÷ÁüR~"•Ê«¡99š6Ò©ðRÆî~i®_þ<Ñ{—¹ÍƒÇôu)s;X%¾õ©Ñ¦MŸu¤I®*”Xy›À £ñfބƃ d(ÓRÖ5ˆÐ®yD%qƒ%¹µ¿Ì Ò‚¢Ë §àsvÞW²ŸI NOj(N>êhï-]ß8…ÚÃUB?WÖÿ$A1¹ªT[BŽy½qîºO;S(麃_û@øM7átTUÝ®J™WüY¢(ÕvÚ#®«9›öh‹ ĵ‚™îÝäÅ…b³Œ¼xŽÞ„{Frü¬«pÄuùßÖƒMïj lY›S…/}1+^àq…ÔÌJ]êæ3®eÂR#úÓeñ’¸.¿LŒPWõg¾4ƪĞáù/Sœö+¸šÏF²N.ÒÄ)H’µ ‡Î)§LˆÞ–ÞHOPöbµ7ÔÚ¡†Ò“yO“{èiŒ>Ghnà"û¿¬‰³KZ÷†8ý ñwK–4cGù"Ö|@ªØÒ„˜’½šþˆ»×=G©6:m¶¤nê´2ò¢‡¶Ðd‘,fêŸÊN)k‡¿CR¼7ʪg"_íÇPãŸ=oÒî™ÞiÑBäã½°%‰¬Q(Wÿ»T ídž3úqâƒrZu# ÄéMÆÆ~ÏöRG€¸Å 9˜(¯l!ªo2ðæ·¤s&åOþi'Ju6 ˜¬ìãž]³…KÔHÅÐPÞA4hÆ ÷ãÉoWYÃUÍí'ñn]!KÃèœÓÓ·í*Úò,–-øÎ@äÆ òaˆ×$¶$—ø-2éô{S¯üQü:¸ÆI¾º½2¸tßW! ƒ,“O±î{¿ø{àf²‹pÝ•ü"P}z@â 2Çh}Vp³§ÖŸQ¾1K´–åùÚ"àé]ó±"’r‚êU$02$û Ýs$©®Lc³JWin¿Ù#5ÌÐÑÈ£†o…ys¼Ì¥•M}ò%8Ç-Kü\Ø “Yæ/ðLüýhýž[-háøµqÈ4°W;Ëèõ6÷]Ná`ïª uSSpíTEv¿V#¦®8°µ pµ(ÓD£)Wxùv5h8›Ñ…'š‡{š²m(˜5µ[šeÝz,œßˆiŽ·£—´`—š}ëÒª[Mþ~TLòK÷­º IˆV—CVìÁ‹gí‘ÿ½|ö64ü1=•oµY%ƒÙôÜ£¥fq´#½Å{ímñžžT8“àÐòNÐ%\Îh×Aõ *‰YûÈ&°ãk’Å”úâ3êqÖÔÁš^ã£Ýóqø±Už›ïÁAösóãÚ‰JÌz?ž6ò9½è•‰{BÁúÁgäLJl=T!`‚ÂÆŽÆÜÛaCh šä®ÏOßÅÌ/<$™og[,„=k‰éÈx®ˆF®®®å3‚á~H²R轕¡Ï^WLÀÓkqasÆÕX¬*€ù<\µÈD¬×EÝ¢þÛx„Húº`öž±>?¾üÌ’çõ»OgZ=_ä´å´<®ÃНÔdTé¡ë@)#鳑>D×/ë ³øà¥ž èƒ[S~êÞÛ—sÔ{ Ÿ3ŸéÓ°¯±Å^Œón¢tõðY51¿–07Ç·жI.ÏYßQ#Áš6„­ù¦ JÁ(B% jWù *Ï$<ûê¬äËž&ûžÌÉÁîÿ ±-SÚÜÌLfD×ɪº ]jÁ^t—¶ r¿’”n!’“z¡‹£Ê@,k÷R}T²;f(\lƒPúR@Yè`ä IÅïç0Xªes„±«OŸÕsæ‘'xÆï¡Éùï%sÁp™xº|²Þ‚iIךÉnëj|:03¶®èöŒL9¡jð±…¶¨Ù+'&AT•tªœ´îÚ©ÓšMßM,Ä>c2$ëV!¾?þææ^jáÈ.DÚ‰jóG4¿l½¾a½XQà#Ê~5?úƪ¢[âíº? ®âúN ̺þnyýSê‡$MÆ\z†ß0Pì28)™çñ‘nd„à Ì1c`WS ä[8ÝÜCÔ´‰Öpœûàæ˜4߃{ޫ׹¬/ðÕÅ[$+]Ëi8^yËslDœQÍŽY}’Ñ‘dëOFú¾ulMÄä§uMDœqi‰~€Áï¤#‰Ð±.J(IW¤ï»Bõ³ÜœÚ:¥·ØžJüÆY)ËìÕûíŒàò¨nœ4NmÈ šñN™Á×gñnž•ué|],ÖTÀ¡ªó„òét7¦~¼ýþÝámaný§vfþ0Ìò‚í‘D(óÌø±?¯n Š\dŒÄz¸ú¼•”+µ:EsÑÒÑFbnA·meN²ûÑro¿²:;÷Ue„=D:íÏ¥±¦ JqŸÁù‡–ñäV hÎ'ýbü#ÚèiùÛ'.CÁ­§¤FuF‚©J.G¥66ÝÎÆõÞ,»ÇújœAóÔc4¦XâKâS©O«Õ‹+­Äû·ÒÕ<|]®Ô‹,E ý-i;5`+ÐÚIhA£hšÞír j ¿W†ºV¥q\ïëJßdær²ñÓ1Xfàúf?µ‰y¾Þâ£Ï¼±§€<º*Q˜ï”ªSïNýM×ÛßîPÕ7.ßä ‚v…öJÜ œ«^!D”©è\¾¾«/vÛS¬¥°J˜TÄÃ&³CNŸ4c“N/LhI-\ØÏk}¬£—q ;ð¨ýð¡^8–Ž˜¶ñj1‚MMÌ ˆ{*»áÊ.ÞT1Ì”' F¥`KZÒà×|ùò­t¢°!eKž•F¨E}|ù¡f¾SfÃgZÕŠéN5—‚öÝ– q6¡ÕÉú…~lØÑ¬ExoŒõÅpub…èÍÊìñ.µ ·ŽÞ¼‰xö°PXa!íq¼ÿ-èå۱ΫwþEÁKhˆ1˜ò^8–Z OMU¨Ív·™8€K=¤þš÷NzÍËÜçØ> endobj 349 0 obj << /Length1 1642 /Length2 4693 /Length3 0 /Length 5517 /Filter /FlateDecode >> stream xÚ­Vg8œëÖÖÅ-¼:ÑK´½NDˆ6fØ3£Eô’­Eï„"Ñ{.¢QÑ"|#9ûìsíï;Îw~Ì\ï³îµîµÖs¯w]/?·±™˜* í×B£ðbRâ’J€!ÂÍÁgŠv3D+ê‹Àa]< °« ~~u,‚G Q<\ °€Ã 8–¤Aü€:ãƒE89ã!sS aÑ¿,g.€ƒÏŸ!‡pB„O8qƒ£ðŠÿ8Ð ðÎpÀ„êFÆ–º†Ú€¶¡9  GÁ±„&Œ=( €ÂQ8¸0àˆÆÈߊFÁg­áÄ \ª8à0p(‚÷†Â1g(€cÝ8á@à',…'Ü PP¤쬂Ýý« Mðp#`2c4ƒb<@Èj¬¡õ»N¼3–‡ ÀÚ‘à CC=ÎZú…h(‚@á<Ü–ËÀ8 âCÈM Ã`¿ÊðÀ!PNU `áN, Çá4î³Ûù«Oà_º‡`0HŸ_Ñè_^ÿ¬ÇÁ‘Žâ )iBN(žÛ IœÍ‹.Ê HIþ¶Ã<0bžpì¯ :›aB…ô`pG„!OH ýg*‹ÿ÷Dþ/Hü_ø¿"ïÿOÜ¿kô//ñÿ÷}þ;µ–iq# Àï= v  œ-7àlß  ÿ+â†@úü»Ø¿{[À­†FÂþŽýæWE9Ô“º*.óÛŒÀi!¼á0cê 8B„‹ûe7GÁàX$'üën A’’Ãn9# ®¨3%®þ†à(Øß hö«|‰Ûê:Ú`=‘³i9&Ëþ‘É ûçáŒJM í øŠIJ“‘–åE9Y¿ÿ#ë/©¿Î<á Ü•—””ÿþþ:ÙüFEÃÎFÈ AÁS÷Oà õÀb bÿZ„Æÿ<ÿš8ÜMŽ£¡×B]RÒSñ³»4î¶·J‘v‡aŠ«nä>G·¤DÌ+–Ú—‡‰¿R:©óy·Šù¹¾²ÜÛÊ‚lI‚oæ^öãnËcø Ð /²,a[|>uÍâß­1ý92+9ÉÛËLLm‹Ž)8†d°ç¶„y=ó™ø¾ahý¡É/b˜é_1V䯮 į|ì|ÝÓÝÕ²CÞ¶Ä.’CÅ rÑ?q•;ïcÝ«‚žyÊcöUAý«ðÃiïvxÂS•vceí¬; ÿø—eMäÚml&iÔÙijYÛõ•BýðvöÒ¢…*ožnÍScòßÕQU ¢©:F³Ëú”-Âti¶iR¦ˆ½z=ºZ_ÜbK½Lé2}u¤»òs·µB¶üþŸ¶1kw¥·Gæê]Ëm×ÙÏ»ò]ò¶¨þþö•ù7dGØ)õ×éË|‘UC/¯W>8¹oÎÖZ÷iŒ:¬§’|HV=À¸#}GOíÓXÚ|ûakxÖÍRæSM£EâLµ•»sK1]lRèG„`ùöóÕ®¡™Á¥—D5Íx·‹b/‚‘\Z{_Sú‹T3 –7T ‹Xwz’ÝæËöë•A>VÉ“9`Îd:0£e’T};kæƒ6ܨn—ì´ÇTD½ut¯`:P÷Sí£ˆ¯@Ï0( ˜ìpøª_2ž®þjÊŃ6)=âJ0}ärºæVT¤•è9Z8XHí£õ¤. cV™­õ»YE{š²X׿yž ¯U󚀭¨Ô…ƒ( ž6to饵“P¨Î4nÒ¾ XrŸûx®üŠ./É1o•bßè'¹ÛñË´ÆëšdÌÇdîlíŸuãdô­¾dÜ$ý~ÊÒ©kð¤ ÒUÚsnݳuôŠ‹Ô½]ßÍ)äøCÉÑ0{àzÈSß´¥4¹øŽéÝ×:šÃw8¢JÉÐ- a¶–úƒ®²ÖØ©"ØR£k„îϱÉçίdªÒx¸SÊ­²æG¾sVgAbžŸŒFò­¸šXؒǤ°‚¢Ç0× U5³+§ÒvË@58_2äãH61£Ë…2 {™ 㾸ò"ýǵ™$}3m³,Üçà¶<Ç"PëæO‰67õfJýЉA³#ãbˉ»A6/Xè ;ߌ¤uÖθN|ŽoCgÐݾcŽWtÌzu·CÎ…s8¸ñ…kÕ/ãÓ¶˜Î€ìœëHP#“#)CÙ²z®®ýð—òëÉ;m"sLƒ¥;–J\V¿/ôñ<#í²²Iêæ©0œV©öØ"—ñ’3XsZ`i™{¿uØÉ•8ˆv8y6ìÿ%aRôǃG5ü+œ é×9:",¶‡ÁLï¹5›~$e¾õOÒkñhü´XÉÔFžû`©lžÕõaÿMù×A&@F|f «háv²ÿÐýd–ñ‡¿áþ‚ok€îðç'K4ÃÈ“$0fç1°U‡£(ª¨œ»¶[Ž ½ôæcoF[T•“–Ñ@hˆpcs(Ÿ•žmR=•äë"_Ý6ɤ:Þ†ÐÏ ¾i4`ß°ÌÈIfÙ€:Å4³Óm ë“ü\çÅ%3²ŽÂLê¥Ç6ƒ¡·Ýj×­wMÁŒŽ‰MDà›î;®õY* 3¯C]/Üd×}4q*1 .½Òwþ´ÜarNr ˆ’HkAœéTð¨tl ¶C\°RR-'Õa­Õåš2ÿ¤£d73Ý$3ö±E3Sÿ.™ïBàFÇmË›D™±v µ·h,]S)1€,ÍÃoŒwÔÛè\I5î&ëàÃò|=6m-Ëã…Ï ëi6›`ãÉŠ7wáØzu5x—r{“*m;že<ËÊ89¦8f^Æ ñ–_hÑ|:åð²XÛ¢lVÃÎäý…W^µxvçH' ™Ã|J¸oNÁò Ç©Y“ksú‚Ÿ‘f{œ×‹¤·ÉÂ-$Úñ7ÝP ê5 ]Dfã“„H’:ý«Jzj³6뇻ç& Ú¨'¿å¹Xo˜Í¯©½¬¿¤¦\ë(®œ|ö(²w¶×’]|ÎÑ¢§QvûÝÜÙÍ·Ï *§©ÜK{e½VôDÃ*ÔY¤ËÈŠÊ‡Ü ’–ñ*#nµÑÏöÍìÖXrM]EFy>çÕÛCÓ÷OS¦7ä2í¦#vÄÖãbƒgxï%1®åhÏñ»°‰ä©Œ6Ú%î‹óª×B%P_´Šf_Öß ¿…FtÉ'xG\ªº9“Eîž])Ó› ·+#™]ü‡õ…%ªZv4›¦BÁ'ªÝ˜,¯¯Î4d¢…/LÇPCrï•=Þº^~Ž6ÑçÉö‰Ja_ øtwqìËy6(œÛ_¼¦6·î}Fi¹`“áaó"1îmâÇIUiê¼"=µ6y¥áÝqw›Ýó|Ÿ:±)énߥ®Ã’¢äKJñQ©ôâ« ªSË,]÷8§g\WmîeöÚÅŠj0€·k™P ='¿óŠHÔ$^q›HLb„AÙj9‰ímL0_¸—”ªRÛYY‰Î<èQ4‘ EŒ<ð¨¡9¦1OÙ^â‹=&Èo>Ø{Û«àÛû¥çoÊdÄ?Ö„¡aOÐZ`w°–¥‹Ö¸(}â-L?ßg¢¯ÔÄ`Ʊ;É-A¹³ ²ƒÙÚ´e¾hB¬ìGY½ÃkD'­Õ;§ýÛ-M )«m~fKÃÝA¹~=)©k2P6Ϥ¾(ãÈÏ·%‰æ`õÔâ›D¹É¦_7¥¬ÄG¬L"ç»ò9¯j„y »Þ›RšGr"å+ôX584’?z‡ÖT¦„Ôý|÷\P€té ­¯Äº©°¦Ü.×ýƒÉÕÆº$ê±.O×!L÷šþ o ‘š­}9Pòù$"jНÙþ­ºàÏÎÔ‘¹ ÄÑE¾Ý:]§¼Ü Ïþlå…®ñÍ‚u1ìÉM–"ÓT÷þ~ {ÉÍÃ-¾d†ÉØË{U½rÐw¦ëÒ±<êÆ¯mÜ9*az¯?š¨WH1¬ å­ÙJ¹¶¾OF`{8›EcôøoÎÚ;wßï<‰¾.t¤nm‘þ•Ýlô§|*5}ŽåÞÿW͸åö}®”Vö½KƒØ™{D"vƒmuŸ½l”嬽5ùæl[yô££+J¿˜ÏíFx-£DñB´R"ø ‰›Åò|Á«¨suP†^ÍõâíÑ–Ö)Aþ‹–Ñ«C¦,6Qd‰‚ÜáÖ`b&õõÓǯ¡åæ6z̼ձW†)Ö_£ÛôÈ .¼%z ö‹Œ£lª:øHÌŒŸ\k—÷Éz:™T’\O,µÛÕR?oÿþ{"V\XC÷þzœk¿Å+f& bHwº±Óí²j~g¾Æü[Õ!“ ˆêéE/rGrúåÇ]N[ÁšYIS©S{úZÄÒ® ÙF`cB£vLSóÖ²Hﻘªªøý‹,"¹O“0ZF])Äx{ÙQEÙ”õÁ~Jÿ0ÚA% rj÷çâ¨U?,ú kœ,õÎT¶îFá…ékøó|¨JÛvVåË5p3Ïýë8øÙJ1Ö¥ýá<ÜÖæpœG4É ?/ßO¹ÙsEJ5L˜ ¦µ°ð4*sQ¶Äï>±¢oÅ\ÖcHŠåî:úø}\%áMÓÜ)‹^ÂVQû–= h'!¦\zå@õ¦Æ«íÆVizËqÕI²J÷ä郔ôy«ãìí; ¥bW÷†ÞOK\ûr?©ÐÙwr÷›´ç` ³(1e\”ƶECVK_ûûœAõã í¬¨<^¯uÐU’ ὜°²Ìk%"b\@ÚX8ìi÷áOgÖ‚8Ûr&Kñ“ÙÏ‹IJ÷|ûézñ_ΆO§Ñˉ­´Ý4“¾0FA&:È'>ëH¸ò¤áS“I8yí[ÃDêÍøãÓÁâ™û‘1ň‡ëâ8}öUªMshz2=ûŽ!†ý#wÑb¯ôÏŽËÌZ-çÌ‹<´êZ›¸û±u™w±ûš7m£!Ó¬ 9£ÂÞ"Û2ã†É³Š2%!»cc*C$žŒ9l ¬v›¦ïG‡?$X¾CãHR/m•ôêèâ„ìȇŸ?LTé$š¨˜êEùÒÀj‘ w‘mFlQõ÷¢ùi)µ[ ‚É?ú6EdÝØÙ}ú*زS«]Wèôøó1Êt“¬NMÜ"^#üäî‡:<6+…Žƒ®Ôôœ?ì ŸSµ{±üü´§Px ô9³Í€Œp7ź²µ yöøý(v¶zEÄ„ý¦¢w©ˆtó¸Òf¤¿Ms±¦µL=gd§Ñ!þOÛ¡¦üÖÿŽ›êS›åø7Èvá ¼œ+[s+¾d®‚èÛ1¥MYdU¡¨¤bˆ„?IvȉÑnV׬?X;†€scÚ&øb·•â½àþHŽSˆøKtE’Uœ†®¶&Šåûí=‘SÍô‰§Ó¦“2kÏAK7eêqaÂ-—RŸ‰F Þ¹I|Ñ‘¥ËgDNÞ;1žF¼ o.C‡Í6M|¢èÄ[>M6«’5[óZªí±GõÈuFú™”_¬»-€^˜b6’ènÞDʲGî™Öãû@Ô’ÏW±Ï…jNEèV޼ι'oû¼Ö}; <­ƒ{Ñiõ‰jÌj—åsÏOîÑ%”OÉÊG‡ˆ£‚i/g|Ôo±z+¨à½Ì_mo¾ìŽ©ZÙSû†#ᆌÈcqŠ'=.E¯S^—éˆnÜ绞!-7 ßp'Å\ÙÂ'+£«“?i~!7î¥Ý5¤óO¶¹¸R1鈈æ¹))Yë)ˆÀPr,iA9Òº/¨i g9½ )iÁ"¦G×vŠå Èøxç­›ÚJÉô«'h•ËH«í²ä€8B7×Xµ‹òyK‘¬ã·Ôt¾šzr– ·Ê—wÊ}›Sî;Àß2”C?Ï›÷ƒá¾&«ªzg¼Hð‰ì\ïÚøÅ£³[êÃ+åû ~AþYT}ÔÕ)¤Ø.EDZ©¾ø÷û•s3/Ü¥ˆú–ëÈíÇŽmQŸªôþhòuŽDE±R2Óðï°Qr:©ý4œ1S²¸+ýéiaL…Ÿ,W¬ÿÕqO´æz5ÕÏq´$S%'t‚&÷FR“ c¤S• = Eѻގ¯ ýƒEÍKú˜ª\G—ÑS’‚Ç/L2Wi»ƒºb­ìùš¤ÏŒ©¿>§R5bßÇãeGïžK¸ÃAÒMÉP^¹,rÞEÞáaƒIl?_wëXz”jËæ6Á¿—²÷8NaûÔý\I–,-c­d(+éhí¾~|íÞ”bkIrŸÐ½ÜïGå¿{™ö±~gòO‘ò8Ò$d Í‘ôhßÇ“¢._.̬Çq°RíöÕ©@Ás‘ÃãÄÅQw†E~tV¾ó‰¯ÚgJƺSy/§Á&èÇXk‰6ºkS@ 'ã\܉ ïYÕ¾»Ö8ðæ!‚*º Âîj _Up±YU9ÈqþB ÿ€iwŽ‹ŽjÊ ii ±‹rO¥:* lا/†Oi_ó*ØI/™ðëWÐg3KÇx ‰6\Âh>ãU—)¬ò‘­E)²\¤›‰ÏUU^©Ç5´ëpßÚ0uë¼óœäûƒXD9(Co¾Â$™U/]=÷³NJ6È•êbn0Óm¹3’Ø BwjaÖ ¦D%nãÞÌhßø¤(”?s4Ý䳪ué;eN>¸ç¡¡qÍk¦fiGWTTLr>W²ÊRñg~>cI±wÁ÷ zÃI;êeª­/˜„4/û¯«o0;i$jˆÕÎ*Fþaûº8@æÜ¨}ÿOۋغšG ”ë§ÅZKÂ±6Ñ…ûÔ4ì»?|ŒÎÑ)R“…?×IQÔëx¿ öŽòyÉdffjÉ‹EþkŽ7Åìè ¾ß7Û›ëqˆðÞÒ»|´Î®ÉF—õñÕý*ÐòÆ)ë…=:ßX“!¯ØK–?¸Çݯ72ºî8A©Ü±”QŠñŽvÇB•Ï0T%+0²ò;¾ÎkHû@>2y.dÒ—`µ˜¥Ç¡†ý·"ß«§cbiÞ—ßÞø1·È°ºÇS·B×Ë6™œ)°.¨H¬;žÀ…)óH²a}*êb”âfAMÃs‹7Óaé}Ä„¬¶Y¸Ò“|„+Üÿy=E7è†Ú‘Àu/‹;4b¬wcØ‹_ÍH±;þz~?Ë endstream endobj 350 0 obj << /Type /FontDescriptor /FontName /VCHGJK+NimbusRomNo9L-MediItal /Flags 4 /FontBBox [-200 -324 996 964] /Ascent 688 /CapHeight 688 /Descent -209 /ItalicAngle -15 /StemV 120 /XHeight 462 /CharSet (/m/s) /FontFile 349 0 R >> endobj 351 0 obj << /Length1 1630 /Length2 18911 /Length3 0 /Length 19744 /Filter /FlateDecode >> stream xÚ¬ºctem·&ÛvvT±mÛ¶UáŽmÛvR±m«R±íTlVœ¯ž÷íÓ§ÇùºÿtŸ{ŒuO\×¼çkMA¢¤J/l41—Ú»Ð330ñ¬ìL\U€v @n9zsKWÀ_9;…¨“¹±‹Ð^ÌØÅœ in37°°˜¹¹¹á(¢@O'+Ëï.*uMjZZºÿ”üc0ñüÍ_Og+K{À·¿næ¶@;s{—¿ÿ׎ªææ—ïæ +[s€¨¢’¶´‚$€JRA inoîdl Pr5±µ2ÈY™šÛ;›S,€NÛ¦@{3«Jsfø‹%ì 08;˜›Zýu3÷05wøGEp0w²³rvþû °rX:Û»üí `eojëjöOåÀ%äàüka÷W÷L èìâlêdåàøUILâßyº|7vù'¶³Õ_5hñ×Ò hêúOIÿÒý…ù«u1¶²w¸˜{¸üËÄ`fåì`kìù7ö_0'«¥áêleoùŸÐœÌ-ÌlÍÿÂüÅþ§;ÿY'à©ÞØÁÁÖó_ÞÀYýϬ\œÍm-à˜YþÆ4uùÛÒÊŽñŸY‘¶·˜™þ-7suø›¹Ó¿DõÏÌPÿMÂØ hoë 03·€cTºü  ú¿c™á¿äÿŠÿ[þo¡÷ÿÜÿÊÑÿr‰ÿ_ïó…–pµµU0¶û;ÿÞ1€¿KÆØðwÏäÿ,[c§ÿŸ±•­çÿÉë¿Zkšÿ;Ýÿ˜´‹ñß¶Û[þ¥†‰éßB+g +s3%+Óï cÛ¿=û—\ÝÞÌÜÉÖÊÞü/·ÿj+€ž™‰é¿èÔ¾[™ÚØÿCû¿Uæöfÿµ‚¿tý+F5e9u ÚÿÍ‚ý—¡ÒßApQótø›Ûÿ¨Fhö?ÿÀˆˆ=ÞôÌ\z.æ¿÷ïoBÜ,l¾ÿ›ÿbþϳ¼±‹“•@÷oÝLÌÿªþüþó¤ÿ_`ÄíMfÿŒŽª‹±½ÙßiûŸ‚Ô¦®NNIþ×ø[õœÿ5÷æææ¦pkË@SÞëŒìL—zìüÑI1ÝÁ~fðÑP‡²&µâ¢€Z`ŸFÄ.w•Ñ{](Có4Ïg‡çÒ™ÃÇošÃ±~,[ʾ4ó«B_2ê"Ô­o]œ´‡AŒeˆ™çš1Þ׋r;:L‡{“Ê*¥ïP„Ó]¬N0רÈÜŠ0ÈŸüLÓã1»QšAÐêœK>ùóD9üëçèHß-äÀo|Ú¼xX ^cl¿Ô3’O#§‡&ÓOÈW7Nç꥜6ÍZÔduw/ü·eWbòǸ]tæÌKV"Ë/aÐ&¡e“xY÷«ð0ø8–â$:âqÑ5ƒ†îeéóUŽõ‹Fž ›ìUî8+ø£æèeÉ ²böíOT *!©áÅl°D3) &.”LemhþN¶÷©m}º=½âìAˆ ‚F3ǃͲ¥{0žM£ÚR½— å²°q ~l©:çH‹&u#ÍÍtºÑ'z»Uø9"iÙ}Qû)¼„Ù€§k6¬ýon‚ê…iãˆaQ6H q#õh2¿@ -™lOejµ`¼]:Ñ8ºÏ…Qâv`ñ&«{þrïS›Ð¢o`þ`)Uî›Ñß(`}Üܲ— òk0Ézˆ–>B\û[¼SA±µçJôš26gÜ r6Ò¾›ØŒ™Öj¦A€¢«M ô(·ÈàWxä»y¨Ùl?Éå(OÍå(4cxe}hûj$ÍȪ´Fü¥KärÅjØíPìÃÊ C=œ5PžÜ<‚0˜‹”X…A”­ÜZ(bÈ÷—ŚÏ5¤èQ¬V f*8†!yûÊBP`f ë~íu—OIŠô5/b¿¯ØìY í=¬°Øöb„=ïâ7,¬ia.”‹Q˜¾ö Åíj ñA)èçÊ…êÝã·Š…ßíW䯆é,*tP‹"-dõgÈèq1`UÒÛñrO͘É7µü·aV-O¯·¥ƒ·Ä>Xëe‹Ï¦.›Žþôçj蘡U3½ÇöFT€ã(ifƒMëÅù—ù9?r1hÕbˆ–l¿—I"•Ò&ì~C®|¬ðrR«O¤Áñ𦮶Þ)Îñ²OU%×°¨3srðÝlv~½Æ¿ºKžg·NRã÷;³b2olžù6ÊeƒýŠ´& ›ÅÅ[f­g§e·MÎð[3æÌÐ4˜ÿà€ ÈÇŽ`6ys®U–ÏÑ´Tw:xaE›«W{ôîí,:^}´ç/¡bɪ6v'! -åbÒ6Ÿ; B|îÀ·‘ßC%mð+ÙÓì£ïïp:ã P¢¼ýh´-™ ©Ñû'jþ¢¹ï üïIxİc’ºq ä£>æ`;Íøõ߹ޖ¶îçû³ X{UŽ+£cýz_ÙÎ+™¢ýí»[;s3'“£ -=±Wîä…B”Aì36^.‘7ßµ6L¦‘üýyc‚39ªûGÆUŒß¦ì±ÛÞ£ŸSœÞR¦ü Ðõ:ó’4Ëæ4x Ü5ÓVçÛ<5 #ïë¥i¯Ù|¦eÃë¿ Z&¼8Ñ•ôt–øbWᦚ<¬ó›4&¿¥Nº •ܱ×âÿ½Wó¿“€2'Ò ÿŒÈYMäßÎç…ÍÙ]!xRÁ¥èQ\ÅTÊ›!¿ÈÀÃùI fõ F¤Ðí<„ݱ}<ל«Óúù¡Tjú-,iƒÂIAþ›)¶³yjgù9ÄNñþౡ7CŽã–¦0O3àõq鎑º?Ë2’:1Nǰø1Æô'}Š2n¯MÈÄý›68¹ÍˆñkÑvò<ù¥@CŸZDR·Y€­BbXQ£Ûìç"IK‰8Ó6`#ðû¢®ääñ+áØŸ$/mBËŒ‘¢ÔСcÙÖjš§›Èb€¬©'uöØ“WÜ ³1\‡§âëÃ/,Ϭy(Ú”¬ØÄ½<¸Ûc!ŒÈû@о–GÄþÍ»&šW’ ÈÓÛ–ý<=dK²P-6vr ÔÒ¨ïèϵjÎt8ðÒÒ7Üì *Än{BJ eµXÀ&e.&dãp`í)¢¿ÔÜÄà3ÌŽ%nÃÁYˆô cJög½q5=Ÿ –˘QxߊCÞ3™w*?y…íAî¸U¾€AÖui^¿®|>¸÷`Bˆ¹7c_|Ý­×0Èš}Ô ¥jfÑ3Öç,´'‡P¬uDäSL<‚±=¹x:k¼yÁ[6;œIòé q92"·œ~K\¤îq‚ú÷…>@)Þùl(&b÷’GÅꘓl1ó¿ÄkdS]Ö• …‘q§š„éT…ëò×|çnI粇ԚGí_¶G2*·M Åmo‚\êôëf¬ñi×Ve²ˆÁóvßL7é¬kÆEœÄ«µ„!R¹!qÙëÇ>àPÚWlY¬qÀk_D^ñì!¡Î°|±8å[&¹gy…(*M¬…ÇÎ%\æ¶x‘ÄjM \í~· -Û8%É8¥°Ê…ï«ØÞµ¨ËÊi ÃbŠä]a‡Ï˜Ž‰†AcÖ¼ãÎoY—°@RCÔ³x!]öE©kïõ©Í\í”®¢×÷zq÷‘[èØ8¯-ý9[¤C ~uõËõž¬Â1D¦ÂÜê»e餂çÑÐu§~¿c^?̓Y•>Hð¢ b¬å}¿Eõ¡§à’óÎk"ôÜ6r!áÊ Ü ߸‰-ÙêÖL÷ô"ž->õZÉžíñDƒD1.Õ“gÂpü Xrá";¸Ø°3UiíQæÉ¶é¬J)³C«IþÊ|íl² ü>Ó*'‹™áì9‰–oëƒm¼£ï;l›v¨”ÑD]Oi·”/{Ý–4ü[° u™ÿ!۞♤#³ÅzW‹ÍÒ}P3o »¥Üòá»MQå„^3ƤùÔitÒO  ¢WF¤ÍÚ;äìG¢$ìÐ;–‡ŸiÿÚļøWBÄ_3KC¸lšmZ?DÖ8~Àbn,aÁ’VÞ »ôcÛ78‘—¬Œ"BQöèÜ…ä}ßÉcݰàÀõMÕfÁˆÌ:6ÖÀ0S™5-6ú)§¿9ûÌZ"O0ômÛ Hï_«aÎ:ƒ«óª],×KNO?™;¬èYh‘waÃ÷ôšæâ´«o|Ò0ci¯@(~÷é€"3ô*:,º¡Ô ¢¹gkyF®—ãèÛFjÀñÁǬ²'Ѓ5él 'w{JKNdiÉ?†7fAGé¥ÞUD'³íþŸÜƒ:¨8)+.¤ƒ^jPìƒÞK­a2„Õ¼¡ÙÛZ9Ó®ˆHc¹ñzÛ÷•Ô›EÞ»(zº!HxÖÊsªpq-ZKø]\ëÛÔ°ÆÊi¹tE»’€n>Xþ1è÷`¢†þÁaI,Ê7Czðžg'›É=™(,Úµ®oèNªÑZ¸ÂÇÚeãžØ‹äò?Åw,B69ð×#š  Ô ¯ëW•›ãt[#‘0;D»¦5|$WÞ¢Þ¹@­«ÙnD,mdÈœšÇ2×<],à àz„lÍ©ùo@x–îœi|¡fóEôß;K¢¥Š:WYLŠÀÓÁ% ¾‚& w6>ÊwI0àØCa7Þ'ãýàŸ¢#0˜ìòÌE~ÿ­êTûÉ+¶ª%Ä~ß§³&¦]jXè lK‰ïDÃÓCŽïUá¡ñù蔄ÞhÓ÷0CX:E[Ÿ´Ãh}%oÜqÜ;7' *›‰…RÔoY8}aû ´•£àsñZ`Ò|¬˜ .<‹)Ju2õ°%ö˜¹aó.¦dR“2ïõl6ö댹 ’µþ£ù ´›döñ·rÝ'ª)á¢.œUF(E^5Pݳ_È Ûþá±ü@Ò{ ùŘGŠ{˜—êöûšä;Øpú6ƒÃNl°«°E‘; «ßh{3Dñ·Â!tdzgè±e®9{sÌk¨dsüÁ1‡Â²¡%ˆ^ä³>ò–îð<×Bœ^RŠr†Ú„²¤7D‹q³(‚ÆÞ–eÍšGà5œt"ÛwôýŠ£'û‚íâÌ5ÕóòY~º(å§cDþ±•xrEŽ\Œ÷Â0Âd¥"nÿîîðd„1uÏ8«ÜrŠ)i cðž„#EÛ9_^ ÉG]0Žã܃O¹@R…/L`#þm‘#Ù, ·c¯xåÛ·­‡E—ް”¿+|ÇòJy6;ðs]Gýxc©w¹a'!®/„æ\Èú–$.’÷™A«rÃËZ¢)£&|‚¸”ð Ø ¨œ0âè;È–¼êXÚñ-í¤Á‚»ýø!J7/èôDZ¸ñ­[â9"€Ø-ô‹ÖÅ_ øpur1eß5Q·›s³è^E` fµ*CÒ˜ÍÌi{øžµ¹]áîë£kŒª’µ½Í¡‰<%V ÀVOÎxvôU¤«áEGÁölŒ3·,ì´ª.0B;mÊP†ÌI3K#{ä-O‰t–WtN ãѸ$¤>x¿¤Õ¦R`ïEѧ¢Š³ªWd/Ü_*=4{0žŽ‹ÙнY…£+÷’'FÎS©:*S™Èýúcº.êiú†­-Ã䬲¤ìÑÂk €4b6ÿ÷Ü{ý»\<µh‡… 9Yl#©æp^ŽÞ¬(õ]T󇓅±sv’KÍÊ`ňÆo^>îZÙÞ°,òbG1·¦…´ë'Ï N¸ø¬!Ù?’©äx ÷’BúB0RW€ùÕèОî?3 Ü<Σ~lçÏB0-Ú64µ%Õ­ªîÂOŸ¨.ޝjwe×À߆•âÚD¾·‹yfR5¯»zÅÌ Ù¾(+%L< ròÔa¢ª•YMh9ÈÑ™‚Řáí““ém`¯f=rÇóÖ‰QE5oHJêRíb“Ë‚èaD°IÙK È5 YªxÄW$s¬”•ÝÖ]ô„ßbF óØ b’W­@ÛW•žá×"g^…¾pQñ•îìô«–³3)7DÏ2Sï5;skÍaXÖ\N¯åîØ{xn^rpã¢òµ{ZÕKè›uبýq©MCsªýhS(â«ÓŠÚ}jvJ ñ›åß›$í ľ‚:0M)5p¯Òª‹>sÒ8~®:~ôâ:ˆ}jEôà×HÐÑwOICè0 )gÇP2Ù%mÐ~u’¬ÖJ@õ¢ËÊ´”Jl`sC¼Æ ­i_¬–Á@‰°ÿŠU ©I Û°@y'òa|Ä…B²Ý©_í‹]SøP†¼ÔÂo­iaÛZØÑMuþ¨/Ÿ*hVʉyÂσÑÏJ4k;ë·«yö¸Ž<°é1è Û[á'Au­‚`Xúr‡«úA›ŸèT¸œÏY_ˆò+rÌi\;×,fŽ~§¹kqzæòj$HxÚóugX h2¶$*^‹K fm/ïCNÿ±ê‹ ¸¼Ÿi¨4 Î8qMÿÂãzPaë) Íõ«õ'Q|0C„‚U™Y–`ÂiîgqÝ.¨I÷æïMç÷{'ýµÕ'OC¦õDå“)ñutš±éÆ«ÓY2(ŠÌØqW_’!sO["×H©èjehXÉ·tŽ)‹ŒÿJŸuʯ%µÀkK¶ïŸ…³Û®}û ¬Õéƒ?‡n;+~ºEùûŽ¿ï°1ËÂJƒªÜSz Qs Ê ëjktbô¦ä§èâ;EH­Ã\ûïzb§y¦Lð9Û–3ÄYù›î™ŸEî©X{ l_ÉMGß| ¶tC¢·ÛlÂUÈóÄ£è°õNý"×!§Û•æUcØž0áõ€™ƒŽ­‡GË2>NœTì2™]ÜeµÄ`¨8[óè߯pú¶Yér@N-ÕÑ"P}p:ƒœwÒ Uç ΂¹\·î$Tã‹ÊrrPŸ¿³ú„ˆÏî8âvt=ÞÐY#•„:Tç/4Âm2n2„Q´sJ—Ê|M3ÇÓ@8ÀO¾f,ˆÇÔ´¦Î‚!ùM—>Iý©¨7ó‹sO‘êéAçk'+Š= ¦ÞâÔÁ³ë¥«Ñ¡V¸’íÞ…Xh»4!Ó4º˜úF:×ûþãýÑ›©Ó%^H……>Œù+?e'¬Š¸¿XÇ“ûæîuÇç·+Š..Vln)ÎßõdãGz“öB6Csé÷­«©«¸Ÿ7IÌhíÍ–f0F÷Dµê8Ë(ƒ…JéfÝ òSÿàÇ1âwGÅÀ ±8ø˜)>y7µ®Íy…³åÑv„$!ô$ç’«8òö=¿wß ·«ÂÍ’GiƒÞ©pUs=¶®Fìhá$r°Å?1Ü7b—Ö7|ŲRsàã—eA`õé©RY”&n´þFÌD3/¥€Bˆàúœ(0|£u¹¡V ý¿®&w™úgªö;¤íùzì?ásO‚µÂdiûo‹‰´/1Ƚð¡ygÂÔñH(­¤ÌIºŽ¸ä¥Å4s·~._lûJr'ë>uÓ•SD¡°^-MS­­j:¸ôZ^Tß¶F˜¿±ÙÀ¾[+JÄÚ(ß“QINÀ»’N—‡Á¤ “h¥t¡0oVÆí/îÇ Î¶§9uÍrWB2u¶X•ºy‰ÛÉ>€­²Œ¶²ÛÅ’‹ÂúV×ÇóÚÁÉßµúì‰réCÁxF%¥—É>j4†#t™ =˜+œØž_²dÄn…ÿæ§Šd§•ÈièÎPt{$ÆÞ@uô?–˜4davÝ ˜%Ð^ŠCõÄþÓ«p¯…ÚÕÒ¢ø§TR=ƒØ4üÄü+¶—]â‰\‡á‰ÂÛÝF’AÎPŠý÷UCÙZ¸6¨o|hÕ #”ö+}‰d}:Äîoe×Å]¼œpÉŽ/ÑfþŒø|¿qž@Ô'U̶[¢Z±—Œ¼J¬øufH'ñ r†k4×5Ÿ›Ýóô­—íÏ K#š—A )Fz®L‹Wj9#çý|ÿj.}Šó$]Ù.$Î+´›xP­Ö ËÔi ñ:7Pü'ºé§-ö™?:N`]··ݰg[(“YMenÄ„Ö3†Ño8“_Il@×ûœ;…ó^WÌûÉÝÇ„xº€mdŠœÏ:õÇa e6ZþªñtYNO–k¨-DèÔÏÕj§7r±ŠhBD–žÓë` XÈ€ƒ©2e:=<‰6k‚Æ>Üy’ rŽH5ŽÛÇZj°šˆ?çâª|j1•D´Vå)†oñ[¡%À¹ï–,o‡äÁ% µ0Ktš‡Dô¸¢©îÃQ d½À!CÇà(ÓënŸ†¦ô›ÐXÒiMJmEàf‹ §ÛÆi­+Ï„:ß0B°œ Šæ›8ŽìK¾Â§-Ѻ‚Tý¶Pc¡Ï6®+ç(=Š˜{íÑÌ;ü}Ïì$@?Š£GWT[Áx;êXÿaÍ»œgÑId…CvtÜŸ‚BOoq3;é§uI•ï¢_Øð‰øHxœ|»7ËŸï±]$äì˜JªÃ(6UÉiñÅÆmT¯¶Òä¥Ís¿C`Ñc ¿ŸŒPQ‹W1ȨW„ÜÈ.ò_¸!…hpî~N9ö¥Ò¿;Š>’¿¤OËæÀ.53^6c¼{\iwp¢¬½Ø‰µ4±dÈ0æ#± ,Ve ">Z½ÏgñVÎJÎÓgÇA-Bȯ̾áPZhèjß‚a–_ýI¹›”wQËR¹·Ùz¿±TËç³­89°Æ¹}k ²®~Ê>Ahëã# šDqƒèq”?»î\LžUn½U–ûv+5¯MDÜuÃÁd<γÄÑ¢­?zYKÛ“{2ñÕ„#ö®bü v<)Y…kÏ’>"Û{g$[º>…:î½êÛŒPt>ƥѴÁOG=9”Š`+&€O¯Ò¬Ël½íQ­¬áÆ/›kÅ0í± ½Á¾÷s4{ö­@°é7Ÿ6xSç®cH,ƒÏr›…ïÆ)^žwZnÀM]=°nT&ò³Ã uç,»T»3ÐÁ:áö‰ÒW@?0”–[ °ä´îmz>&̧I²ÿ»GZà…ô9!ºãh¼(L¨ «ð¬¯º‘ËQxžJÿ@ŽY Q=ðéÒ÷hP÷ Vì¶Ì"Œî>¿‹q¡EA&øêÎÌ6Z²Glî¯Óy@V¸üÆ81÷:©"¯—)ÍKrЮúêªaµzcŽ£4æ <£> Ыëå yôàƒ]…¯ ÔðŠ¾šHç ï^ùÞ‹Î=“|ÌQø|Ó[ ã©)WŠNÓÏCå/Þ`NRšÙg¼K{²¢a.¿¡Ž:=þðÍ/—3fsŽäSii} Ú$ ®|朊,•}™¦¥TqÑ ÷¥Ù¦³Ê4×\Rœ`,1÷+ŠšÒ¯ÏyH؇6µq“€Ùó\{çàÌèÔ1ªÎ¦/„û‘}e°¢e’ÄÈÀ›,i…¾ð5ö[ €ÛÉÇ3(Æ•aäЈ_"t1Zg e‰U|˜qq’ÎÁs­¡˜+í­bJÕkJoV™?¯§F©??;@ ÿ­’rBÀUØÄ*_=ü´­¯®¼þº÷Zx¤¿‰äV„ô^¡“θ€5n])³yÈíվϟf!RBËľ« õwƒþöÏÕªRÁ—°[g*1KƒÎë™Ðî·ðGYïY· )ÉlàYœ(Ù ÷‹Zëá®P’ê=¿’áÁ%V`èÌhA²|3kFÇÊHt 2(>»ƒ¯ÖÈV;µ žô©£,K¡º#BVòì§OQ:½Ü LêÒÃy?»«çÄá$túþJàVmc>ß(»K–7 ÷P…?m$÷SXع¨§3*c ˆ˜  N¦Ó¥ƒ5"uɈ;?ü¨¼“•¹Ù ß˜q´-¢þZ¬q‰‹ÖRÝü‡ÝX™`Ù}ìžNåÍ΀Æ:ë~LWÊT‡tãFŒ% eáö”æ5Þ½i ¯²–7ùœnvàóX¹²Oi&h¹]vƒEJÐ$S|P'M¹¯­³Í!‰kp P©ºB(îŠËŽlÕ®[¼ÞWöÖ¸¡£mš£:J*ßü;äÉ,=X–E ë“V÷ãd¿éœ=2ô‹³Kï"Þ†¾fvšÆ‰ÕLß#õ¯ñ°©#ƒ+ŸËD³Fø˜?YÁHÂ[ž°B£ùœ]üÓ£ùçTKb˜"a z=Zy )‘(!1˜ztò–‘¶;X.%¢z|NÄ“"š›M¸¨u[Ø_ˆgK—q™K˜_Ùÿ… õ&ÚpvÀ°iÕ" =æÍb„¸Âÿ]q;Z ÄQC¨ß=·–îµNP.klo\e‡ZHTôšEë,ó#¨D¿øLÙ¢å‹,‚ C™;C‚0ˆœ©–Í þ—D`e¢ê §çã[¾œKI„Õ‚¾e'ïN­WÌ‹5ió/?be~j‹.ÑRX) !ˆ[)0£Õ(» gt¿?8äüÄÁ6õß÷A˜ ~î$"tŠd‹ )âX[»à¿#57=©÷@Q©JÅ ½'¢V=å»2:•Y!¥Ê:»«aNIy¿Ð°fäa$hÛº‡ûž´8Äd0¸”$BY_”k®¾ØKç™Údñ‘`(š×<}œ©Ö.É“U¥>ê¿|yŸüäË8¿ZËΈn^™ÀCéKêosŸ†½Cpý# âú ¢l³àG¶—â>œ8/‡£ƒ+7ƒuãmkm˜ µi&of¥‰Îûž– ¡@Š~ì»Î]A'ЦèQÖI^ WuáGìš¡îw÷~ÅkjR"å“”4vÅs_”7œ«¸^Yo»¦c`BÇþÇ'“b¡ËÇÞPæ;T Іˆ²»\‹¹Øi€mH²Ic fÓ3¥ ‰XÁ÷R½gPkJ8z››öûD1Ý6V o¤SNãü°ºT·Ñ ÙM½é `Rå-ªèš9¤9EÄ´’¤$Àöù¶]’UÓØþ§ó6%üd°ÁKÙ»e·xHã•ÃêPÏÁ¤â’:[Ûæ´‚_ÁˆÞñêgø=O7«ú0ÀŸ]\U¬wÔHW/Cãj •žgJWÊÍF ?·Í˜ ®Ú¯r®€Àì'\d[ý©œUÈO `ß›·)~“'8+¢º™.b¤ÌѦö#ƒR=E)íéS2²šÄæRΡ‚ 4Ⱥ1h´1ínê•À\\^¨=µÃâÃÏe5Æëw)ýy±07*FB°×Z—®Æt]²mS™4®àw¢{ê·£¢®¤d.ÒÍ–M3SÙºó|[4¡PdMºÄŸ9•wõ’ÅæÈ_h³Ö •p&“ñ»¹íÒyÛÞwfþ¼qìn^d·,Õa ù „MNÞ«­ô7š9aFÜÒÜ¢ÆÜÇYb·­ùÃ+îÂÎóØžÒ¶pœ%Â_ÃÄüBýÝ^ÃÛ†Tõïiu/X2`–ôÏŽL‹*ÄÅÆVXU?}xëÔzŸ†úq*'~7i®]eXU¨ü IÜÐÏü`»Ó3Ëeí|AÉ‘«ø~bmXÂé1ÿÁ¤×Éí4FÞj•ƒ¡xåé¹Ä;¡Ì·<9ëo–ðTQ¢¹N¢!ø5”Ù(,{×·)[@u×˜äª M*KkQ±ˆ›ø¿pUãq²²¶ÆBhí»ZŸ4ô¾:$5ÿ*¾‰’nÒØ “¥÷ÄÜa3vzÒ]\¼à[\®U/Žº³ƒtSÒ"ï,ú™˜ã‡jA}jzƒÜ‹ÖÕëhN6ê=w$ß=®†ÿó(wiØûBwñ!¾o†õ°Y‘ìq ´çéÊǻߴhÇHìÁÁ_P„Û]ad¾„]`²³˜áë»óÐŽ[›w(¢ZZ¹ H4~*YÓ¶v $éXí«šò s82M¦“ïÉ QÚ¢USÚÚ…Ó6Ú‹çýSôßisV3Œ×yŒ\ÙMYç S×G€°ñÚA‹Z•ì ¶<Ñ&ò~àÇã)Ãèâþ=î•äê2já×RëëYäÅŠ>õ'`üAÉy¹t†QvÔÚ/¬Ì“Êm}¼¯’îù:ëõ2ؤҧÊÈoM+‡°s]÷ªÕØuø*©.Çb¬wø«˜1ùz}×’%¦”C~K1·ÒAY(Jà„‚®Û8ú«Ñ"fGGê‡õ¨Mä?¯Uˆxà›V´}•ÆÆ¢Õ/:ñ˜UM·&w’ÂVìæZÌ;WhE%îãê ]÷kouôûŒ™Ü£:פo"ÌÃÑ”{w¯Ÿj½ ÄS{¨`íY/ ¡»4=£»p9ÒQ|Ó‚æë6ìØ&œ,q TG·kLØåƒïBY{-™Qùxg¿•ߔ呯»n9 Ú¥ˆ¦ KCGd4Ë~ºÛ«•§¢œšô"'äè„Ù²ÐDÔ߇ ×à70p ÉZ|'Òl y7ŒØôêc¹ŽÞ© Bé$=À†ô¸ì±1hN6½v¯±ƒx~’úQ±§­íã¤2m)"Ì{¢f–pÜçg*ÊEð7Bð¿Å¤Ï+fntJ¨«IG#̾QJ‚ZNý9á’Í'wãúc‘[œJ­ÖSHÕewʰ(;n±œÄ{3tìu>†0Yž÷Hï6îòÝŸh©˜‡mw!NœÎˆë'']©Öò²×eTÃÎr_]‰ËXö(€åÁh°ºæ']SƒæÒ£ô5¾PbÖ²Å0$U,õŒ_hßÚ;UÂ`¾ ¥ZgÈp¢È¿1ÄhÍçÁñ\¥#ߨS¯³;IOÊb¾ù'5ƒ™)Ðý¡`šf!¨ÀQ»¦ c÷YÃôHóõR‡@Dó$)gP\EŒ¡=]¦Ø:*ÂèI2æëky™&Áqûä?ý²Fžúô‡ØéK¥¼xì”òÇ\™4ÕÝ<“g‚é(ÍY§l›¶üá³=܆Œ{z&ƒ²ßÍSÝÑFìÉÓ7¿ó×{q“ ˜ÚµsI®î‚šZ›Ä!ß~@D÷ÀK!üNhØ8>_p"òùl¤àÍ´¸æþäz/ ò8S©5UªÆÎøiY. ®Ÿ$’“{åë¸^Á¾ü<ôv¶ VÙÒñ”â ˆÐãÊÄûïX?þ­ð¢g.‚ 97Å "Öq'˳æm‹¨¡ Nólœuþ|6`Ü’µûä;öcrÚ!¨MN׌T4McS@O3LËøëQ’@:ÐÃî²cê0mFÙÎ_>ǹ>*¸šla}a¶6o‚/jlNÁ¤]à)Ê×爆1”_G¸0¸hŠcPE:t¨õ¿Ð%õÉDA¬ß¹äûÃ]rïU¬ÄðÂÖÂ2FÂ\9¦FtЂVâìËŸnÆ<Ï4‡§N2ׄg“-R Ãoô}X~¸§ûyÔ?ÌÆÇDÞèàœôYh6<8n•ÑçÕ‚%b¢l÷xà»X”É NâS³è,ú»{"]H¤¢v.NP›ÒK‡­Ý‡NÑyÂçý˜ 3’Â:«¹ˆ •`oÇUþô¢è’}Kq#ÆãØ]êÐ$—÷p2†Ž|ÍÜiŒlä°D!ÁÔ¤ï.µ"&àó ×Ý–œË»tîX'4ÑFäàH}][ãV¾||Šñ°7žµà2PqÁ¨/Øòöýø|=îD£ó¾E O—XÍ][†™¦¼ÙZ•zà¯xh×zQ,éÐÍ'ÓØýûøX6ÈàÏ«ÜQÍ s(&°Í|굃!k;hKľ¯LrC²U£Ã­láX¼=¨¡äW¯ 5€h‚¢µ¤½£ÞÚæÑ}2DH=v´Ä¡-‘ÏF¿Ý8ÿmFÞîæBc}تâ„j(®§ÏY ¼ÁÅíËþÝfÃ$uP7ír(lüš¿c”ucŠV>ÅÌ$íÆyü"tÛ2¸X¼\ö)òÕ·”Eä.éÇŠ©‚o%dKS_‹ãÓ}yÜ ×lcj/…q:­,* !†Ë»géOö„® ÈîNUǰ¾•ZÚŒ(î<\lÕvt »û6ë&¦FS¨¸ºJÆÉd!¦“k·ÓqGx›px¼8ížÎ골 C¬¹0Õ‡MVsÙ¦‚V°h/GíVðæß=~D¸Œ›$vÄ ŸSçÚAUy5Ù8ˆ ‰£%7¿¥)Ž œFv| [wQ…Ìä¨e¶Óõ¤_Sø´‘v´c¹­gY[œO=4Üž ýiè>,ÄN[ôF%ÒƒÌ<~:þY]ºñ^+d2›¹aõ*ìÒÐo0µ¸DÎqIŸš~»°}3RîàØn=·Õ³ Bš[òLlTF…ú5Ž`dsúU@vçh¡”“¿¯­i»•ò$þ}ÅŸ* Ø—õøy1lã›I˜ˆlšÞK¨T4®7fÃHJCÆG„xiÞ\¹+ôù½Š•ô*ËÊs§j6=† O Ô5ÞlQÞv^> %~¤Š‹äÇ2(ÒŒÌ÷—§0S—Š7)8¬àAžÎ?¿ÈÚ¥AѤOœÅ…Pk¦ñ|Øoºv'fiu©ÎŠBõlHô])‚ôäqô0©šÄÑiŒ¦ÆåÀµÛNävõò‚ÊL‚Æ; Vða9À4iµL27ÉÞ籘{›9á÷µYèuoÍužû&ÕÏÈðNyïžÎEw7áDù† qŽîÓ£»ôÅWÇ<›ÅÐë±m±åËŸÒ•«ÅËzÚî¿ÚÏ ¼ ÉÇ6áŠE<ë2s*-Œ’(èïK¾Kng”¯ˆ0 ´ÚÙU©(Ñ›$1é™·‡ Yxt’|É%Š2JÏ9¸ú.7TXZõN®Œvì”àzæ\^/2×â’ ñV*ÎC?(V”d±`Ǩʔ^$k¥É`^=b-dµ {GŠÆî#ÞT òN(e\Âç)HãqŒ¥LSO|–ÕŠÛOˆW«á½ö[»‰¿vm¹§2ãàpSA«–ŠP§dáÄ#,ƒ,uø¼=øûxµÅ90 ¡˜x«ä†ø‰šÛ"zƒj{Tû~‹ØÐDcˆÒDˆÁöe½'‹ UmpàWÊ ˆ²QE–¥ãX’§4)î·óx³Qgâ‹7F<%Æ-×Ð.ãÖ`njCA±;y¿Ó‰2–Õ‘8øêòK>ÅRíl|ôñ\‚BzÜPs8–@¬&•vŒ5)ZÍn°‡éÕ7‘HG”cSp܃ÁÖ{Düº=šB„åÓ]¿R¢QãLü®W’Tejìó-d9´e™CÏQ 2ƒ˜’’Ƿ̓¶­b{ °PÛöÎ8Ûê+\xƒk}¤Íÿ¬¼,¯78Çæ™†™uç3ÅŠ‰CMàÜé}ìÙömÝx8â‘tȺqñàS‡Ü-ö:ð‰Œ¸†¿•OK ýd®™R2¼yù;¦÷BƒfD±©+/¿r{UÕå ŽómÃ[ÁãÊbÓŸÓ½}*vç|Q¹)gv¬*èä1µãH8gÚp¿¢íå\û ­¢;_l#ÉОØ'í¥ùCÈJXÿëãYéÚÂg´ùÂÈ#ã\BÝB©WÚ»ï&ì—0<©EJ-™ô—Þå=®›‡3Ú¦ž”f—Hv·‚Þ¾Zù9ÜUZ_¶kI’jqOQjÏSHßEPU  r[¶tªø&ñ;ÜCÜúf¡ÃÎP VžgÔ:Ýg]¦’RÙˆ5°¯öÚ`ÛR˜`­ÑµR%a®™¹júf8ÌÓœgšŠ®SùP¾jÃêÛ2‡¢T¦¹´¦—Ò²ÁJÃRŠç[ÕW—\ç¡ôºe¡Ûq#ˆê™ÅRHd™¹‚¾µ¨›™Sc,ÏÀóV…)™?)Õ¥w.¨w9˜´J?ï•2ÅwÚx¶Q×e°7­vÙYÈN~iعA8Ÿ(Á¥»‘nÕBo55ê“§nF’«Ná³E(pò5¿ƒ4GR9E´s••èFë4`kFæ¿?Í×·g¨æiŽùà6Jüìs5³$ÝUf†WàQ“ÝÖŒ'™ìyèP;„ýfª’»P“ïõsÌó(mrÄ3b*¡öî¶Ÿ¿Ç8/ˆãÈxì—”\†ñÛç·±ÄÊ ¹ßa»áó*ûÙCƒý7%9U7ßÄûQX]¾! ±´H&SÂæèÛÒ°Žjw†×à>dIJ—×,90ýÑËTËò{ØT1èd é4¹SWø´Ú‘@£39uŒ (ÌŽ}»Åò SÈG?MSÊ ›/Ÿ";§¢û„v:,KJà䜜QlmÊÏãX÷ùUQ "x‰šª7¢Ë,¶´W~±íÎ A YÈ“§íb=­ü£õi¶†pO`À¥çœðŸÃü¨ýt#ÌIòÍtAÉ\r.`ÕÖòèa¬2T-ÿ tYV SvÛÈ@ßõ¡DÁÔ‰™ôY¹±^_½ß¹Êc,4õï#k3£xoâƒräº,2˜O§ô÷Ï J 커z8ŒÏËQÝäÎêPૼhWIñ¯G˜3qŒùnÅWR6¦LíKÁ›š«.¯®6ÇôÑÁ¦"¡&EcôæŒIqZãë+ùûÒÌìeJaYd09¤oP˜(ñÛ¨jöä7«áð/ ðÔ‚Ÿéë š}ÞV]ðU{ 0GôÃúš“*ãy[?¯?6|¢6x5&“ ’}\„(úhO(Ȭ ’Gaø`”i¾Ü(@hf¢$xÚÅkkh¡ô%ñݦÃz^`Báµ6té|='8Ü«¾Ååíç„ÛT¡ÙŒEL‘Ï Ñªœ™ik£±þímÁ¾S·B\‹U’1vØçQ­<Þ\ÚY¾ØˆÖ›0:ƒ@­¬QVw< n=ÊÉ+Ñîlûb‚¬b’c-ËLq‡þeì`a»|Šôì¢GEæ2©÷ÜKîá$S/¶œ":§ñ,¶½Ð€AݬŠ%"NûD&ßßnØÚ¬ Í(ç»=ðŠú”‰z>^ÆðêƒüMbøA^„^8 ¶ÜãøÉ¸g‰%1/Ò‡Ê*¨öªãç¦Ij†äé`¶ßk 2q‰0¬N5]Ýñµ9+fÕêÝI^`çÞˆ'ÚpŸE²\·„6çP„-Ð|¬ûÚº_øðl¬:7CûyF.xö%Ȧ¶·†÷`«Í€®¦\p`} Ç\eKQÜ(‡5Fâ.£ÃD+œ·ƒ©Øú ¾,idJ(ìëÛàæ^Há5CZc[Bo€î¯˜ðæ7 7Äœ¡M¹è•Téf·ó)1d*{êÁ¯IsP ¶‡8âÜ9c¹ûЗ¯¢gÃØ‚Aº¼õšíPª,¿P¹Žú=¥U›«ìƒ¥4ÁE4MÖqÏ`âí‰Ï¥ÝãZ‚'ÞÐ;áIs£ÁH¸$ÍHý±UÃ6cÎyø(^û¨£ó5¿ð²^øt‡!öÓ $‰eWÓÎ¥ñ ZOhù «õ:C…#ú3²p£E Mĉg\j¦Ãjýh?!´t+ëéFVåsíÍo4å2º?Mˆfÿ”èÒš‚/öå©agñÔ NÝû{†mî\,”µqG¡qˆA趉k 8µ8r=IDàåù¶(ïÖÉ9D 6$Ó³ÁÚ¼q­šwˆ·éˆÊØÈ€w‹Úªz5ÝJ㆔{ÜÚOi¨6›ÂU«‡ßÞߨ„yž¸Ñ5F©uù=ûÇYrä/"^û…'ËYm פ<ÎÊ&‚bVcúÀ³!y"ÇLåhÚû{yëøý2ñªÔQJvÓ´Ú“µŸé¡ÿÀ|Ó@ºuA£F÷7 ‡—Œ-ǯUýÿ éó;U¯:c*êvÜ.G¸÷—TGx;ç'U¬+Æ¿a¤Aü.y $ÁÊuË_™= ­^ø]˜¸†FØhýÞ´Ø3°:ÊiW+ÂÜ£~© ŠÏ̇Uæßý»Ì†}Sl®åØML›¦xÈŸwÌ~‘›ñe{Õiì//“Þ…Kf²FñÚˆ ¢™Í††'< ðw=÷Õ²'ÇG=fàK㎕)ÆÑ¶§xd—}õ`DÊÎÈøÓæj0\µÈ9—O\'×9…”íuìôBkô[ÖhÜ 0˜—ÜyÅ÷9|þ—qk}PHÔzWè¸(x=Ìý#¡Œàâñ—SÐÏSÑW–¿òâ¦Ò öוH‘s£ÊÊtý1…cñ‰Û…Ð7‘•’¸Ç&¼µ”S¼kqOaÖÖJòö\V(=ŽL_éUxI\s ¯N…œÏékÏI78Dh¨m6³Wž~“ÍeQ{"}QлŸ×9sÇKN1¸ xªî‹ËsÆà¸<þP¯¦° ¨ðÎÆ°^>.$q"‹ö‘ È´C…öûÄß˽ÒÃÝS9{{o&Al\^"1 ß…[ó#ÓCÐ`e¯¥n‘œiÆàç¼ÌWpÕ~Bœ*#%ÔT¬a;š R¯¤"ª<:=˜CBÔ Àÿ‡?íZÎĤD¼)‡“„†·; #*æRi[5.»«Ø\kòÓò‰º0t«ï¡ ÉU¾]‘ÿºJùºW¾C ÷†ÀĤӶ~1A¨0©Í¢û2pp õ¤ ð«Û˜w´glÅÖÃŦôusL¤lã¹*XŽâ»S/°¤šwc¾wú½;|Yœ.t*«&É6m+ZN-ÍWÙª؜֒œ2ˆ5rÁ!cÿôÕ™Ü b CWÌ*”®Ú¸F-ê—4T$t+œ…¿„=›zŽ" oN^XÓ°žEãڢǻ`ñ«A,l³¯Z6Á8 `¾iç»K èŠoös"P@½½P£u^õ£™¨ì“ôÓ{*°ÂšÓÃyÛê!7ct¸0ZBbÉF{–sxÇ+™?§£ ÃKŒ^hoéÇ aš>­¦Ù‡‚3sc–³y¬>ù??Nš/’á´2ØëÒ!ÍÍ>ó:¦ø€4R€t7¬qñã¸×üÿ æA ›¶@µÔJÐ"OÀ…Q¶=e6ø…«×q2ù¼'É¢ Î«Ú×þê^ôÄ5¯ã4Xf³»{>Æ‹“,íŒë¿‹¬,Z‚i«QéëÝ~„›|ÝÙ7OÒ:=šz¡ÛÆÊú…%ìeb¬aMKE›ôBùJÉê•ü”ÆžÝçÚ·®ï„³™IcwC}Ðÿôë;0ã«¶”ªµÓ´}ÐÙ¦+ðs›„è±¼>jFŒ×ìÞ+”h_ζÉ¿ŸëŸx‘¨”‰h¤67kÞQNŒ5™bÚ—& šù+ûÎ^÷hR‰"ï X†W3Çï:ósk-ªj@© D±÷Å` …0zö[t@ÈZó\×#T)fÒ0লBEÖ?llR„ÔR TI&¥$“Tp IlGáuò‘Ø%õKJ®Ë(«^ıégTßëÜ•VÞdº$Ö½E¥ÁÆ›^f×ý^¯´úÈKËÓF˜ŽyŒ2äjóv™/?¾hËDó™—beõ"*])xéÀÉ%o„½åÿUÕ½‰óñ™x7t÷ §eZŸ€ÞÈŽP·#v1ÛæysúèÚ&–¥¦"¢·xÚX´öŽfÇv”u†ŽÁ ,Ášî¨ð¿¢ëoö}-œFe>Zm9ðS»¡~‰Þ±WÑ„•3¡cSÝúœ‡^Ü: ½07Ë®¹^ëû Äg)(èvÀ§Ÿ°w ;Gì`$é©îc.a‘Ń»ý5n õm«luË"O'5Ôô¾äSãã`g7`²atP±¶‚r ®FÀÂ(?6gc&ÈŸ+–%“†i|Ÿ2ÜK3d‚ˆÅ qZTNñT¸ž&Oì®@ݹA¯)7h\Z5ZáÞ8´ör¨,“%ƱP3h®ŸëgR¶$ê£fè pãºxî¤6žî°xžší@•¤9’e-›‰o3 ’Ck:èw‚ê7¯ÝïWt…—Bmjï«qÔkS3Ž0I,Ýê£ZþÞI>lÈý|ºÛ"X®ÓÞaê{Ç Òr˜Ús&ÿÝ|ç²~8²¡ìvÙöÝ­7³¹qÃyŖ܉¢Ö§a,ä~k|®mÿ8Ô-=ˆÊŠÜ 5_d"D¡Üa ¨@Ýøþiˆþ?ˆy71}—]d/í&eñiì5ª¤Ìçç•ñ{ µ4]?ÌU|~›:%rÓ•6Œ•ŸþA4Øà·6A&ŸTÌ}j%™ªÂƒÔ‹ÛÓòø.Ðvª×u4󨩻áܸöû²Ò–h„9•:¢b1Àxª u¬P¬NM`äøÞì…©ÿÜQç4ú 67ææ4Yã²×¨§Ý¨¬ý:EocÅñY—õ4ÆöT~¥ÆØ;Õô®mA¹žÑÙgzO…†Z§ª£FgQ )Eï—yÓÞ†7B¼G @$¶-1é=é}àݼŠ!T˜IwÅðp‚³ÅùO Á&hÙl‚}SãL,ä¥:ó6oû¾¦û+p¹Pƒ ÈY ©C1rh˜)¿4>÷ü2—…}³ ‰×ÿ¶ÅP“—\‰¼5eŠA¿JšòÅ&¶uæÍ¼ËŒìFÏå \¿Úp ¯ •Jb°Š›( D’@KëzxRT`A v tXñçä8„"ŸÁÇÛGrÀß{³Ê¢AzÖlÍ2·‚¥9¼ˆ1]*^aÿ¨>Zý•Æ­1=0âñ °í帿­ù†›³ü)ôñõïÉ‘øækQ™ kRlÂfªK"¢™j‡ДÝçU½†AÅ©¡ðÈÓ ïž%Ò—3‹‘E,á~> T²7n糂¡ àŸ.s3ˆp…g!ø¾¸ñ®ÜLòwò'^+#“ gNßR£J¥þ[´n ö.Én‚DÞÔSÑXd*.…ƒV2½–¶ºËAuâA 5cŽÞ-èÁоw ³ÁrÖÁ]$RäÂÙÚô14¶·Y‰„pðɰ¶²öRÕ”ÙdÚÏä®ÂaðÆœãÜ íøüžåSƒPj艤蟦ó-óŸ&TµÅ?£sØ ¿Ž©”#œ—qµ“þ‚¢/ZU0Ñ'TFï«-[Ig×uÀð¾èü©‡•È®œqOVzš¡ÍAí:´sÏY·>dÒîf/~· P@V¢bÍÇá;‰Ód¼§z´5¯Ú¹f÷Î=ÒÄjØúƒOÅ’méF•» endstream endobj 352 0 obj << /Type /FontDescriptor /FontName /TQLUFV+NimbusRomNo9L-Regu /Flags 4 /FontBBox [-168 -281 1000 924] /Ascent 678 /CapHeight 651 /Descent -216 /ItalicAngle 0 /StemV 85 /XHeight 450 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/Y/Z/a/b/bracketleft/bracketright/bullet/c/colon/comma/d/e/eacute/eight/emdash/endash/equal/exclam/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/q/quotedbl/quotedblleft/quotedblright/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/udieresis/v/w/x/y/z/zero) /FontFile 351 0 R >> endobj 353 0 obj << /Length1 1647 /Length2 13507 /Length3 0 /Length 14363 /Filter /FlateDecode >> stream xÚ­teXœÝ’-Ü- àîîÜÝhÜiÜÝ!¸»w îNÐàw üò}gΜyνógîüè~Þ]«jUÕ^µ‹‚TI•AÄÔÞ$iof`adæ(XÚ»8«ØÛ*ØóÈ1¨€Ì]¤Á@À;ÆHA!æ‚-ííÄ`/@d ™XY,<<<ˆ1{'Ks 0€Z]E“†ŽŽþ_–¿\ÆÿDÞ#-Íí”ï® {[øâ¨ À €™¥  ¦¨¤-­ð@ýEAðdrzoBÉÅØÆÒ gi²sÑÌì6ÿ8LìíL-ÿjÍ™ñKÄ8;€L,ßÃ@î& ‡¿ z€ÈÉÖÒÙùý`é 0wÚßïl°´3±q1ý«€w»™ýß98Ù¿{ؾcïdJöÎ`g'K0à=«’¸ä?ê[Áåv¶|‡öfö&.µô7öNóŽ‚–vÎ0ÈüW.cÀÔÒÙÁèñžûÌÁÉòï2\œ-íÌÿU=À dt2µ9;¿Ó¼sÿu;ÿêð_º:8Øxümÿ·×Ö` vÙ˜1"²°¾ç4¿ç6·´Cdúk^¤íÌì,Ìÿ°›º8üs9ý}AÔÍ Í{@S{;€)È ‘IÁüž@ý?S™ñOäÿ‰ÿWþ_‘÷ÿOÜ×è¿<âÿß÷üïÔ’.66 @Û÷øÇž¼/ à}×ä- ௅ciò…m-m<þ»à÷Öý£êÿàüwø)DìÌßb`á`äø‡ÙÒYÒÒdªd 6±˜mÞ/ïo»º)ÈÉÆÒô.òß÷ûÄÌüo˜š…¥‰µÝ_jpüÙ™þ{ïºýÝ“¬º´†¦Ý³mÿvVzŸ °š‡ð™4åíMÿó𕨨½;À‹…“ÀÀÊÅüþߟ#+»Ïÿ#íßD,ÿ:ËÁN–î]fFffÀûÿ?ÿ:éÿ„‰½é_s¤ Ú™¾Þþ‚M\œœÞÿ{¼wþÏóßr™ þ\´7á ¶JËL×âåMˆëöõ°@…8”6¨øWÛwû¥…oñT=ׄ06Nñ¾¶y,;¼ìÊÐîôàÚPu§€Îó?ùÓô`¬SvpÑí2”¢¤ŸhF{]ÌËmÂèp2kìmO(«”<ÃMu°9Á_ÜÓø“»øc¾s@õ5I­ÃéDo„À¬-<>¡L<¼¿£쾂íÝ%¤Ë‰C àâù&“&=ŒœnL^a]¹\ÜP¼°Ò_\ÈìÈÒìÅê<<°úSw”þšÒMunøiÑÈìy1tc!&@ûòœÁå YKkz}‰¾ÛÇw‹Æü)yƒNF=㻫–ÿmÃr Š·$5[Æ©´û50O¨ÅnÑÂ'¹B­²J”‰¤z'ê¢Ü|èG€Ÿ½žÊŸéŽ!©©—ím(¶“ Š?|J€+ÝÄu;”*ñ–V›„gð ¦ÀôŒÏ}<"»;uU©V5c<®[-`.©°ú}íù\oÁ%å;¥‚Ý…•õÃÇ`@ºÒ{øŠé¾…¥¹º@Üøw÷ØÆwüòœΙ*N¨óÄ~Zá§d国#ÍØ˜Ëê’mô€^¼—DíÌÜ·tÁ’gF¼c±VAãŠ<¼†é¥ j¡ðrß>™Òʧ~üj¡Œâk4ÒŽ$Õ6E6gIP4‚U쇫ۂþ‰¨í5Iô·(þ"È‹P@X‹ßmâkŒ*­p̯©»æiŒ½"™S]NvžºÜþöI…·ï·4U 1~&2.?§A‡Dø‘Žîˆ}º…¦CÉï7½T‘j¥QS¶Ãâ½Õ=ð>7KŒ’Ÿü=®‹1=äÝPx æ©ŸÇ¾)L ^Lc6©.?kkE%P€* z=ê³§¦Š)ä—„¸£Úd|‹®lPó¨bŽóIèöl«kźÝIšpä?ÇwÌóÀ3Fßçéuóð–3!Ô[^Y@›õ‰ÃKêŸ-»ªd±=ª]öTjäp¸ |VÒL H.ûÛ³VEŽúŽ Åm…óàÆ…Ls=,ß~ ©‚êYQÕ?&ÆÊq¹\‡æé cLßìÿVílÐäþ€p4Ã27¨Þôxc{–‘+Ý»LÙÞÓÓ*xDJõü³"Èu£‚æ³ËQp§noª[áï¸W‹*gö!aìç,S¡ ÿ)ÙiR \š3„Ü/âp{/=‚cvbÖ× >CU\>oÎ Ø»ÂP\‘èÉ`köC0S´ç$$ØXÈ/ƒ^dó‹±=ÐÓ¶J]ÒÈ*F¥U§ƒ|ø,6û';’…x”8醿8gèÌKwDÿ/£ñ¼a<èßµ:AU?÷QïØ`?_ðÓòj@æúæéÆÍF\;EiÛíáùÝÏÇ„˜Hòš¥‡;çãè"*ªýÊžÙ%î+"â¯?Ù¸ 4 o–öÀiHïK·n é™X/œ‘c®ÏW—¦¥NþèO¨H’h NO…d‚s2Ýñ£;6®†b•ÏÖ<åyŠ #1ÆH§ö…¢K6l^H¨äž½Ï)O2/ÇœPWyéÝÍFÝÌ£5?Mä¾uô²óxÂb¨&¯1%'ïîåÅ®ã¥K?´f•àiP)˜¥Þ±F¹Œä!ëÉy:iEPËó/ïmZTýÁ¢.[H€JúáªòD®et™‚¯A¿h\-ŸâLü!Í…f“ÜÆ.ä5 X\Ý}Ã΄’äHùNé.p6»Ä±2ºkf ª8¿ð+º˜(Dæ¸ûpÛK_¡ ŸCM0ÞHªôQïÛëü«uáIrÙä¦ì¸‹ïÅÛ£k³ð3ì¼UE¾4ŠRbÓˆ´çª˜|Ä#'ó;,îØß £}û{ecÏ 3¶ÌéSz [úÎ:WzÚ4h&v;÷WOÆö¼àcÚÞ–¹ô#¼ðÌ„Y|iŠõetÝj<”MDj5Ø¿º—ê|&/§ºæM3õ=Ò”¤DÖ¹õŸINöHa–Ùç±'N‰d „0Rn¾ð¸ŒËO6Ú ™„Ÿ [ˆ^¾eA}­.Þ/ÝD Øjù•?È»J‡O‘1C¿ªe¦V®ÅÏ:E@J( )?Þ,Špó–~ÁY­ˆéõñ1_¤AÎ$—g/ëC7UÝHû¼• ^âÜÍî£ì.1…˜ŸcºU¿’‡Ûn£ÈÎfaºå¢…ZÓj»€:ž¦ýTÜ+ÐÑHU=ÓÚȶ¡6!ò+ü[…™µÔT—Gby.ÛÔ®´»¡¡òŠH½ŽUø«`ðŒbjçsx¬1·cIšEr…ÆüëŸ&·hªØ·C&cî®Bšœ4¥l^Ì¢ÔõØ%µ«Ùr‚BOAQÊ¥wÙnýĦ0i%}Z™î‘F¸ShØ0ÏP&¥BØDä£ç¼MßT´Báè™2Ý©R 6¦!2Úä£ð>»!ž9Bi6¥M|Æ[f¿ƒÕÀÄíF|1¤ Ætº·XS,¿Íf4MnmGs©ß*p¾A¹®ùDÉ7äO„nSòƒ<ØÈÓnivš3#Ïq¨W–f$¬cNìÑ©©…{?SDkÇÈÏX™1ap\‘{Ôa`}Íw‘+^üB@CKB™ u‡Tæ“®íÖ¯ZT¶-ÂÉ~JWO±ùf’Í¢{¿G JiuÄ!”W™ö¶P6•ˆâ{à wõð(ƒD7Û·åX“ð¬m§é1˱çIzØÅ¸`ån…W¦Ù odLÓ>›uiÞÄúKl@J)h¼™)HáŠDpПÄ ½Þ† ^”83¹Q™~Òa™®ñÖU‡•Ó”Â\mNÀº÷“’¥tÜ?¨ï0o\D~ŸƒzÔi'}Ñ/:xðôO;GÑè#¿Åf…#²4+‰…ÒM ±éÕ_LÀs˜<¯¼Ýýƒ:teÝ^á%£ƒE€…rñ³’ñôã.€ÁÑ5QØ)”OÅ×aô×Ú"´’,`J^pïÓ‰nÆg¬¨†rKL[¡Q(`Pµ hà±s(ïèÍ’>uq7§ý/wN'øÄA7EaÇÐ¥†ÌŽ_/›¾’ÇÉ÷¨¯&k‰¦u?'Dº)h¼\Ä­](°âc­Þx5ªÃ¥ÜÅ5»¿´Œ½-¥ÍQ‡Í¸ÜÇ­‡ßj¯Ï ÐRÆ ´Óð}/È=Þ. üè²½±:ì×='Ìì·©bÙ(ÿM ¯:¤YŽ÷#ú\E¤Z ûΜɢ\¤çÜxVøÊžßZ›æôþ«:ŠX‚M½¯{kNZ½Z¦Èùþ~8¥ ã‹QáÎ!8ŸkÔ;¬×í×£p¡F޵)4pöÊ1ƒ6'ÌPý~à¶{•8*°t9ë 勳p"e³, C k]pí½…ú¡Rȯêðû³¬Œ ¨x¶&GM­gKŸÓ,šõ„ê9Ũ™þíâ óC#C­¹—¦_Ú:)r.¨eëg·ÅwøÏV3Œt#ti„ܧåÆáÜ+¦ìƒõÖ?¬«yžŸ©²~ØE.þe»M£¹ßÍ„iÉþ„ðåÍu»SÝèºü²8D_ò‰ÄxÒ&«üÔ'‰Û‚fáqJøû½ÇÔ]ÿM{vN¹Š7—Û–ì2?¼nXdlöÏÄ«l–ÔâšçaˆLpçR|7f ´Í¡›²ý‹¨Œc'Ø? ´Ñ…Ãøô‚¶~-cÜþȽ“;oŸµ %œùîm(*H‘]ªP†˜yÉŸ »ÎfÛîMdÝ]‰|¯ôZ6( ,óMNáêVhs®ÞÚ¨¸Ú¶ÿ[ ?ôb5ý½FžOJüg'G$Þ9£2Mæ°dCü\ƒ!à ÿÖ3}`qÙÂ+’p!Ö<‘ð׈!,ÝèúsÿÔ"ôbâpíB=z $mwEâMµ)óâÄ<â¡à#pûý |xØTcyïù¿ @2Ò𫆠é+%¥ô •9¹Hç½ÃŸ’"ãCU× ¿Ìä§sxµîã9œ‹•µ¶Vƒ‚±Îf\­Xd-KC”²z-¡C‰Õ-ñÅ|q¨—ËåòP èÑ U—±ÉC}í„<yk€Ð‹VêÖ¹zº>îÖi Kꦷq{-4ö™Ôfí¹¨³g…¼‡ã‘X—HLÌâ$bÎùZ*°çA㨊Ƥâ»8Çj[‘—!ù2´ê’æÓ5Šð~H^GŸUÏEôÃø¢±§øíÑ“9*yÿ¾6fîžÃ†…(x~ƱWR/yKwö®º’Ÿ–VøBÔœûýÖ³'cÍë.àu‚d¬¦Ñy{S?±ta=NK’ª²m¡k„ÂÎUø%ÿtls<à(Œ1B£@Ÿ¯hå0Ð8Ìõà™X³«¾òÎÞÓ$ 3ÛºÄFßú¥ƒ¬ê®šÎxg”B Øt+Ì£ÈÉRÒ4Æa 5…Òƒýe(ƒ;S•óÒ!‹±¸MÕˆ#a»Á’Pž.à=˜‡˜¶†`f…n›µkè™Pep”å•K!vSò Ë?@-Ó±¤IÝðKª ½ „yŠ'ûjÇøØÖlŸ—ªè"B¤7Ù÷`Áð*×aÆìäot)\V|A\™Q‘ã•ó ]-DÙ.qxžbYn½ dzBõ]ojb¾·­žÃ[_‘>ýxñe‡Ô ¬vÐåë.Ò*lw£ÞF”¯Ø¹Ü½q‚÷óIJk:ìåÝô}Ú÷Úú%¬=|II0ÒÒ×ntaÿ~ÂÀÙ©k˜˜ð|ž¤ñovëlò0”xÛòoÖÚüÆ 0¤¬!ÈãnØ<þ:«Êa+ ˆ×O[,#”4~­”£YÿéTûéKA²Êd®§G½šþ™6¨ãè(H¶üŽ:-Œþçž.#ïÁýï™?Ê…dÜï=·+“u±ñô¢fÒ²ùä4˜8fÌñ#Ëü8›]¸ÌÄtåw+Ë“2-Ygczn«QuS·j áÚ;¢I{ŠËvè{¼HëÁ'û\s9kÒcòl{:;DH¥8ãꮿj?®]£Ù›^Œ®Ðñ§=!´Òâ”sÕÒH™«J³>BoΠS|õõ>ãž»N…|N®lå³ìo²’¢¥|Br}Îäw%^eê*Ì“ú= “¤bAwî»-Ëdœzeàkç•#ê"äðý¸Ý€®‚2âÂ0}£Å šê{~J¬K8êï%È'v–òQÎî,ìµÅpu…Ç?¦g_+ †u•;ðSZ‡‹çTúSII23‰V£7ÍÈ·LéÊgG,ܤØß6qŽH’ž `š¾hƒ#r3e§2:›ÕBJù’¨þ¢$®r¤gͺâ1ŒA dß¹d&‰c¤ì ju-eWS]ý™¥VrXQÔµC.“# ”ïû¸bz²a<„Rsqù1»‚ÁV1èw0Ûˆ‹H&úLN“uôµ…øãG¿ÓÎçùúpßø¸cÈV†ÓZó;NCž±“à"'Ryø÷™N:†,ªŸü$F”cXtDœ,Ù­AJÝÔ§Vˆîk ìbºúˆ¯±«¦¿ ¦€3ó8¤—[ïÜ|sñ?Éi‡"¹Añ,‡ãõëüUÔ1ƒ?9É“ó>¶êêü‰dŒF~»Ï5iZša‘*Bÿ>Z™++à_ £‹ôqTÙáwxÎñç਀¿¡ÌßW§ÚÝp¬þ´"Û%Ø3“眬NÚiUìFrÂö2=Ƴ±yÍf©@ÊWt6Œ+¹»^k5øÛXÕ'_‡"@?Ô¨á~ª·!Vc… µnsN\…-åç2ŸY+qFv ¹7JrëÂ4×çu„F~“‰'9½=3þFè“nŽòªyí„"x%Fºuãù—°*Á(ƒÅ°`Ú[¤®™ŽvwÛKÎ\ ƒÝìê×0ôÝß‹¤ ±›¥B8~o;sÕ(ºÕ;L%Õ°£lW~°>öÊŸˆ£AèwfÁ8þÊ{™n`/­_T.…bvį“d“[¡c:ìlyÂ>êŽU°/¬”ÄNí}ÑóŒ$£ªR ±Køõ·C·‚[?øÜ6åˆÁ•‹óÎâ{¢:E¼e°'v|;ÏÒi \?«‡^2á”qSý 8™ÍR0vú Ñ · ܩ։갻ñ¿¦\àtŒ·,¡*‘3¤¥›V¨ö¯¾Ùa=›äEú„FîD`Ø,u®+–/½<_Ìm61¼ì¶œ¤Ôž¢ŠLêÊÄ¿5Árê¶µ{x[ –cÉ] ÆPùßFvô‰­ñs¤Yw§èÔåF^½„ÒØf§ ׈yEÎ_?l!Z…ì}±/Rîø™{º]Fy¦­[άd×îÙW{ÈlŠ}½uÔ±z+ص}Jî”ÀÓ3“Éx7¬Œ!¨-þQö¾;oÏ"ADض`‘ûådóÞÂ3U‚ "Ts…áJUj% dwø‹‘’Xžì. ~ýäÇo#Ž›rclŒë`CNq¬çoÒóUß\w…[«ü2óhw ÚðñDOC5(‚ ¯î`ò? ŽQ£›ô³´-gfì5[õ}ÒéWñg$=Dórú2÷çŒ ˜™)üDן×÷0à´J™`Š$2G§½èJÓçœQÛ›?‘ qüÂ÷¥É »k×}}§Î(Ki×äs˜g)æJ“x¤Û뜣×v’jÖ=3R oñ¾¬©u–Xó“C9>8LOÒ»¾Ì¿Ð2b5 “+u¶ô3´üdõC“g”¸Ò|˜ÍµœlÑ}ºWëÑÿ® »îˆcUC’·JTÝKÌðu„Ší<¦áÛÒ›idH¥«_æõY}¨GÝêIØa‹XnÜå§‹ýõ¨j»°2îžcþ*ó`ê±%/¥ŸÖºäúêœ(?Pê8ìó׸гá#mÇ1·бm‹çqߢILóåVûËrõ«Õ½×wÚ”ŠË~5 õàß;T¾ËëoòWS0ó‰É#°ÃN zF¶hLÞe…¶øg1v¤(jÚõyÝ¥®ÐÆ"Þ™Z‹OÖ‹ 1z¥‡A>ƒ![t2´Þ©ð‚Wãó4̼ÄÚÊë@»Ôçø¼Ãád]1©ªMïM¬ž[gvIY¾i£b Ú¸Xµ)¢_ùëKgüoL­A>6س˜‘PçɃÄã©ϑД̒e™Ë(o†ä`=†+ ¶Â>´^òJÅV;–Ïa±ÒÚÑß`û¿Þ,9“ù¡ûù·QG~5TJn}xqX[ÅE[0V¿^hP_Ë`–§54áw¤¬R§­^ãŠKrôb„é8¢eD©)È10úÄ-ʃo•{E3á{j%®ÎW=©ys²Â„ØCBñ…adVš/‘ߥ¹¡·Éw:w]1hãî@Tÿ h ÷`¾,çM˜Ýª6—µ5îçÆnRØø9ïG¸úœŠðküàçxÛ;1iàjö¦~Þ ‡D°ãº±®¼ÀzwŸ4] /Æ­™þ‰ßKí[]Aœñ[øÇ㛈^Éù©”¾¦Þõ5¦)ÐoÇ¿?.»ÚåQÛD¼5úim7•çäœÑmÖ Œ¥#w½1-*—kD¿më_D •t ì¥ô©ºò}‚ ™7è*Ÿ:Xp¨ó\Ë|(¾\¨ÛùcIãN¤;Ä™æÇ¸üÑј¶š7Bwë%¾Óvt³íÕè^+Ö$á™0ðW;&¯š:vuÑD²ž¿17èþ,†/ìâ$þ—¶{¬È}ú«Ç©Ç}–àFX4ÿ‡¾Ÿ"WÖuK£ŽuÙûHUˆõ¿1ÊÄ.ötÂv1 }6L+E•BX¼§CÍ®g¤ÝlQ›ûËbÐó7þl'm%# h=ôF°³—e¹s³ï ©ØÄérIºð—Ö^ ̵äŸ>›fû†wÛàpC°F$‰j=hr{T;ísgÆŸÍ–÷ú?ÞÐ%3y¨Ýb‰¬Ùª[ 9ÚçÒ^›ÑV‡´{qžaƒ^Yž¼ Ê—NÑ"Šø/Ðî·-É&ôe*Ä¿üªU£'L¶ðî—s^÷R%E6›•‡ÿÄsÁ°š+BT˜ŸÈ=Ä b Y©6Å͆7êúÄø n› ð–à‹.Ó^¡b|ʺí92£WäÚ¤e6¾Æ×¢ÿʈ¾½‘Éw¯W”Ú8õdž:¸÷9ן°ƒ_0 JÜô‹’GËdÆíJº¶_Æl›Ÿ)ƒNÆ7e…?„?ú¤U5[Pf~@ƒVÜRG8¶§–òyˆ7 °0õ‚~|í!¯¼pUúÂL¿Gu/oß>·÷Z¦+ÇV[¡VÃs£ÿýŽÁ¥ ^ˆŽ¹d4ì”8¨­1°W‚TZ)UvŽÆK#$ˆ=/ã¶^>¸Pm°pÌÐÊ/¥}IÔ°W¨íåÅÚ =/,Äk” 1E.ÅŸ ”­‡=¢(]«KÃaÎpÙþhh»úé·p7<É0RArû8ÑꯙxSGgqØ‚GY·Ð¨µ>¤®|BÒGmT!J°e$.•ó.š Ú·³ëZ1 m¾º^_çK¯2T‹Ë£»:)N)NéièšxZN5úó¬Yv.™+ÖO~ÏUü}¡ZæfX;U]Ë c¥Òì±âØ^æCÄeÀÎUKÝf×ìÀOê¾Ow·3øÛùþuEGŽÚˆ”?פÊÄÄ RÓs|á‹Ô»ïóZ@çk˜\¹}UlŸ©>Ÿ’¯³4GwZ) QB¦K-tæŸ.a0Té®)›‹ûø&ÕÉdÖ‚ÍäfÞ äGŸÙ7€Š™A<–*ý9I9|æ6(ÍÌ×Á•QK«é…ì–ÙÆ³ðꡬƒ´é‡ãœÎŒûUVM’àåŠÈùèy'äô‘(шxDz.µeZé \&6Îö§­S]W-ýQâ-›’/¹ª2aÞ•$Ý‚ZV±j'J:»h ù¯ªu.£fW$¹©¡í@4ȵëTÃÒÊÅUl”„6FIúÆtsÏÙËr+±E§MŒ•vÝLA}nê/¸Ñ¡ùHñÁ;Ôr+¬XÚšJQ+EÊƒÆø& ¡ ,INžFî‰õ±À‚47_³À,¿pÑp~—&PX´Iø1ï.}-©Ê¢ÕÓ€3Õß8j ÞáÕã‚ö’ŽL€#éüe†EJ sXѦÿü†öVä—ˆ1"7ÂAFYäÔ€Z>“ÝX¾¶„ÓqÄ.Š…Æë,IIÂÆÏþx)rÃù7=1͇ƒ‘ñ7½‰hÚ<Ù¸iRç›ôž´Ñïôá¸$z­$¯?iŽÕL–éUן°Þrfleu’ÎsÎÑXE‚ípYôéx—¨_Ø7k*0W3ÁQíåðdh49sÊ“E2yrú@±Ñ]Þu½=úfÑÌðßîS§Ë`Û >ÑÉçö¤çø÷â=bV릑m3ÂÀCAz’' ~6DuêšÆ­y¨!7ÿ®€âÖ%÷ë|õ‡FÿLØ„$Ý›jƒu L8>úiaG˜n•,DÀ ~«1>Í­mÆ’€£èõŒ¹™ýmÞZ•Î~UÖ­iØaµ—;G)楯µÊß[yGò©"ʬü²B¤´DÍ.” âxž¶ý¾ÍBq¶”tV˜¨T§¡/ëbºkçˆÏ™ýªÓ,È«ôiͽH SÝ ƒläÈz-« ,àAݬP\‹´âO%€fõ#iˆD3„¸ãƒ‘^¡J®l©ñaþ„Ƹbõº9™EÌ‹¿ï›JE²"# =e0É«B‘vM³uÉ3²KkÐL‚LNÍf§ž :¶,-»¡;î<ü½VŽ ˜1ËTÌÒ¿yÞs6Òv+~Õ^t+|}ãxL¹²Nq¸0 3œ˜»+ø¤ƒ|+_Ö óñœ˜!ò¨Æ7âB÷ƒÄ‰dÝËQ1£'}K(¸r¡Â”\}h%n¨6¥ýÃtA(8âöxÁ…ðÑ¢mm3AÚ£kçw­¤°èNîMèàâp–ƒäsûÙÍLùååˆÊ`msýÊÂ×$à=xÎîÚÍÁXƒ1.±%ÐUœÌ’!í1ÈóªÝ­:ÔÒÚöÒ¡ö‹·&½Q‡œH›ª`ýä÷7s€8ûA^ öÅoIGi–†Éœ¡-&X[œ\a§ ®ê«„¦ÊŸ§Q”".±^O+œ1h…K_E !ËAebއVÄA³âªRúË£”ÉQEfÞÙõ]x´_¾t¸S‰Úÿ9bOv¹GêæIýÔDÛ¾:0d¶3VHvÒ hà Çð¹RM·ÎCg ÀQå;¹ÎæSPô³dIóMMÉ4˜“:^ðlÄ$GE–ø’Tç–Vºp}³dƒ<$j冑HÇ>$ÜŒ>P¾›J³˜*Î6F°;V“<׺´è1ð'ü®V\Ìs2Lù¦ÙÚ+‚&Æ g`ÄR2F”Gsâ†i±ìYËêâ Læöªð®¤¾ûµÓwozóÈcN“Ox’€Ú-hf׊ˆ]ݧtÒ•2SçÀHUý}¥œ¼.öºlüdC?]\ Tˆ n”cšZæ4 ߯óp3æðôÊ€ìÛ›x6ÌLܲåDáòdK(ÁÆd>3ý­EÄ.WŠSÍQ)À^IôFÏnÓ¶fbƒà›¯iÂþÙ®Õ™Àw@â(Ô9HG ThÓÜéS­J¦flÙù]¥öêi,꣌ý3’H ¯ùö>BC?pžriþÅDý„GiE:Í¡5ë ¬*L×[%êB©=°âS›­EéZ(*¡ÈôhR3Þû ¿¨ÿøZá·ek„ WMCiJ¶˜Rã?¡õ8Ú鬹ðkÕÔ¨)8X½ø× ç³Q»•ñ’û4ó¾.õúfïÛõCíía cûŸdòuI2\ ‹.Ê¥Ïgý7L"•üÌæç=Ó¤aë‹Ö˜qè®pM#ué&k…*=`ü¦NEN«™¤rã‘°2µJÏ d)]lòPåNÃô¹S•¯X¤MŒù£´íûà íÉ(–ÙŒ8ýȼ+>®Õ­ÕaÒ&j’×Ð.éeORìpßWuþvØ@›Bïf¯¶TŒaSÄê;¾Ä(æ´åô·nƒ´ñôç[WoµöýÐ.UÄvtQk»$öÎ1ÃO’‹q®‹b–˜H‹ˆÙää§tíHí?¡b0RÑÑ€[™·4žÄ¡Ï(f{!Êh’AT¨T‹œÌpNb³o3ˆûõ'G<䟅è«Ó¨?´ÍЫ@ˆŠk‘èšÜñ›&ÊÁ=„’HШæèݯÙ,ÏwŒP½žÌ¤WæÝdo=oÎO§HÁ” 'âk;¯â±²eôÇdƒ~|À¡Iáï«2K%>‰m¿`¤¬¹ô©2‰Î;‹åƒ^mqË7£œI\krÿœ’"í9»öá9|r‡q×C·ó"Êú“Ƀ}¹6Ä}`×Ê  wùÓÙyÅO+¶%Œ9›–Âñ°,Ûœ+4¤U'r|žtqØÌ´Z¹r)HPþ«È¢g7«£×¯>![S¨¿:—âVˆN_é†V‰Cè”+#z3À•^œúª2ÆÞúx_©÷‹”\.:™céâ›.v-]¹Æ4,Mqý}|߯ëÇMAòx¥Í“]¹ö&QÞÔM»{]¿ôxYz¼ DW ”“²¿™ÈÔ)“Iˆ˜Ï”Ð{ž^¯Ñ0A±Œ,hî6bLE¦ñ<Ñð9VFÃáz²í¨"§¹á 6e³dÆáOoì¥a‘ÿøÉ>ÞžõJÂUïf·‡Ïž¿à©…Yu÷_`7{t¯‹ýU…OC‚.² 4#ó¹&%aúŒ0 !_EÚÃË™WÖm…¨‡„% ù›‚ –fµxwé}ð­#F›M|˜;# ðýx£ù8W¬)³PíV4Îmöfrm~I¬‘™¾ö–ÕÃøbÖð}ôILÿÕŸp؆ÞI[ã2—Å`¯°¶Ø²ßm€?¸­‰/OÞêb"ØuËv4MÙÔ£®ÀÚ£` Š$¿€œ“Ö\ÓzÝŸÍ«c “BÞ*ÒÍýpÙµÛés59<ñ\Hw{¬Y4±ŒIï 2à}JÍ&®rô@îÆÖ# ´0ãŽUÔů•÷¢Úã¦Rt‘†k8ñŸ‡¬R&|Šä‡t¥šý€)–ïæÝà®+ÝfDºóŒrªåÖËf‹òƒQF`(m“Í%d8ùy]_æSû¬å°Ï7F&Ae£ÕYû+Jo¡èœÜØÐ×°©úaÚµÀä²/?”p zJ›¾ú%¯¡{ Z7,!?@Ó&3XQÒÙ;O캟0?öÚ —äê%ª 8SȨ̂Fââëc9¹ñkH½}™G²È(J¿ElôjxÒràGÏzÃV»ÉVPªÄÄulEáÞˆ¡—Ò«>'7^ Ñ…ÿ‰É×]šºåGÜ;úó½ÕRË Ì;’m<Ø].¿ÏŽO‹¸VZDÞ§ŽlÖ~°ømHšö!é9ü:C&\÷ð—.㟼©¶{iᦓu¿N"ÔÏZšýaerFlõ 5G‡ÔÄѺ ŒµØVâ¾Ò,¦î^áOd¸¾§XY*¬ý2ø—a–½Žn×¶ì`þbÖ›mŠ:;9¿ð Yµ±^b ¡âÇ[“ë8ú[i£3+”ùpõâøN*6p>Â&¨ë=¦¼†´íÏ]b´3¸75ªÚóÏü®Âw7ÑË`2ËßlG­Jè]í'_lú9 ¾<vÂãÊ|/ê¾ñ  ãFÏ­sÜY&¨“öTîÅËëÇ ”'øgnLºT xòâ/¤˜â:_¼’m—жUèGl@’¼‰¼ä F¹ãßDr‘ÍKã—­òYM]É”]ÌüÚÎÑÇ;AãÒÞZ_B®At.e ÷`dÏ£RImÂ(»- ¯¸ãˆe¯CªžDÒ)˜«DŸ!tUÔDéÛ pb+´DCŒïëu<:HØS´]V<NÈúöà€®‰„(0ÞÀØub¶…Ú Ð9óŒ:H_ûwKºP+6æ,ýT/ëÙk™kû2•¾g[mµ…OüL©<ÑÄØŒJû3¦>a×-®E•IØ„nÚ›‘ŸÌ†@Öy(HÐ%7.”R³/ÑZÚD­bAâLò£$½&-Èi[4Õ~.YˆðJ7ÜÞãö]VUæ:®B‹òù‘+Wö­ñHX ³¯þ㜲2X7ËV•úZqUpæ[t¡ änôÐîí+{8!ÖB½åßÑúÓ¯û¢¨)Ô†Ùåjû n5Õ·a%_½7«ãªe“¼|U!põ×å’Iúà »ôz»I·'HÀçoµ‡´ÏkÀ±Õ–ÃáЗ¦Ò0ê7ì*¨À<é ç6¿ iÉÕ_—‰£gã0’ ^ŒjøVO#|:ÒÈ®Z¤ù¿ÒiªwPz“õnV޼ç(Æ´\fnô\¶ bB>FühL²C¤GÕúÊ“p‹³47eF]ñgñDJ£ëcµ‹å]l+‘ö hìô ïËV0÷`œÇ“ëÜ"иҼÙtt[=Üçòfƒ6¿ä£M2džqâ†ijý«ªÔÔȰwpËïe=4}¢iõE²„ŸUºZ` ±Ñ^qȨ̂¹fÏA0¯-ÐÝNÚ¯—Ü\\YðȘÌ<2FÒáA¾è¥ulÛP†òRåÚB”4Ž8XÂGüµ•¯§!›Ùó N){Ri½8â°¶Éa ½ë~÷n_ÂË•ÓÝG÷Aêvx?ð3ºÂ·Ä#ÃõàEÅâ–É þ¦!î–ž²CÛÔ;7ˆW^û²IœÙ¶÷q®›Ç‚@­àAˆàñCšºÒ‰Í‚±Ï9CWÿÀ™6“óÕçLþÝ¥ËÑ– wúRö¬‹ó#ñ ¡JBù20ußÒõ&ÂþÍB• BäWN%A0I4\I,®l;ç Ruæ7ÃPç©V ù¹kI‹ÙÅᢇà}„%CtFaÕ£âë!Ä}´æ ó<¼ïŠ;íë»—ýj®úó+ZÀ`DŸÍ¥¼»±œ Ae´«èʇ‹à%¼/¹:Ä\5åìóç÷ÃC(fvÑUÌž IÉ ¹â¢Ðš@À°øAÃÑ”“ºëj>dÄMŠ®u¯¦^r=²àòGçñ˜¯Íh„7¢$æù…· ‹aÐ\\…|ËødƒÞ2Ú»BDZæ2“ß²ÕÊÍ9-ô¢¤´‚¬Ì¾tT-è“pÆóðïøõ9°îg€´>á‰ßp'*ØQº­ÚS£|‰_Õ¢¼ó%žU0𽽡-ñƒƒG¼_gµÜÂBW¯ó^g¦øsÊt$†»Ld/gGƒ¼AŸUâNßKèY‰Ë0‰Hjöãì SP é9Ï»Íñ|òTJVáëbÊ`ï'<ºO—à"”Ñq»á†‹‡SWùÈ'>Ö&Ñ2'³° Û Û—ŒHIÿ¼= OÉ|9ÕWÖpéY\¼Û[žÎ™\4­Õ· ¡S¸Õ ?o¯ß»ø÷³À/<¦Ÿ|tu½úýúúÆd^=Î’£Ër•_܃ÃVš¥”ŠÉæ„;/†E¯=üú¯Ú \K“8I¶èŸVct0(ÝÆtàï(5BÜ_BR0_뿽2Ž 鄳ðµå1½1 ì­o¸M*¶§ Ω-0%KÖ•@¶&_¬z·OVCÝŽîžbƒ»î>Æ}Ø.$²bäqy.˯<ï¼sézBA¸e’Q™E"2kêµj•(KÍÀD0p­ø®jÔMûÓ3o×’Åô|Èe-«»pj5JŸj­b¾1otI·/ÀÎ4^­> @ÿn>Ô49(j±nŲ̈…áeØ+Ôýuä5è3¤¿$× ‰].3óšT,$©">d-ùŽÐ®’Eç.Mlä N§;äA²½‚²S%B]¸ƒb‚nù*}ÈתæMÉÛ¸9¥n6M•ØD6¶qÆ]ÜHíxýöCu}Ïê/øº6jLLqììy‹×_à  9¥Uö=ï;ó,,µc´ýùüªòç×ù~Dß8øoRÁ/D_Ðñ© <ÐÖ‰eq¹2Õdˆ£+JãÆ@uú{`Àe“ÎÚ”}g®´ÿ`•Ö¨Ô¥ˆ_7½Ü}$‹Ø{­m¥!m±ÃùÀèdåJ#,y³ÁJú)ß:éP·GWE¨ŠÜÑÌ®ï[γþ©B¢‹ß§k+ºzüwN· KÛZds«B[2Z:‰¿‹çV'©ŽŸk9-É÷r‹ßRi>>Òâ­ãâÖ¹ Áê×—£ ¢!(TŒ¸}*´½©ó›I¼‡ÉF_¿ƒÞ›NuM¾ùÖ(jíÍO|q‚™¤AO¸n$"ìï,bæ®LÙãc ºüd¾5„}OL›Ô|©Ü_©Ì¸1Ú´;²y ™|ÄÀƒDSlÇ\™w]>Z PÜ|Å`L/in‡ÚcHš…¡ËU´ÓÙæL+‹± ètK¹¿½ØÒ;¼áb(%Ö€áË¥ýÑÌwá55¤êšˆY}ìM¤AgGÝXB€> endobj 293 0 obj << /Type /Encoding /Differences [2/fi/fl 31/quotesingle 33/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater 64/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft 93/bracketright 96/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 147/quotedblleft/quotedblright/bullet/endash/emdash 233/eacute 252/udieresis] >> endobj 355 0 obj << /Length 741 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHB²ó!qØmUªÕ^!1ÝH ¤í¿__‚—m ñóøyÆÌÝ·—ÍDUíÎLÂGÎ^͹½t¥™¤ß·§àî.kËËÑ4ýc*S³ç'öÒµåÆôì>]gë¦î,yÝ”‡KeFÖ×$mÞëÆS°»3¿&åq÷GðÉîRúº™pßêþ`I_Î3[d·Eæý4ݹn›'&9ç¶7UÚaãL)l:ŠÛ×MÕ zØê!YU—ý0rßåÑžo>ν9®›},—lúj'Ï}÷á4>Óç®2]ݼ³û[ivjs92V+V™½íhýÿØ ›~éñÊyû8&ÝX®²­Ìù´-M·mÞM°ä|Å–E± LSý7—ЊÝ~¤&–Êçø U´ –2´XÆ(p‹m“¡¦ÂÜÂÂ∠ËXXœ(W°8X&˜LR4â=z¨Åu«kTÌGEåïm7hçáË8KÉc`Iu(à!a <#œG´Ž »>ÃÎn-tJ!]O2Çø`œúñãÌSŒóø#§¸­'œâ,<Ø“L€%q¡O8\Ï€™:Žó 3ht ‡,ª+à9­uçgŽCwËpÞDÿ‚|ŽOžRÇɉ#ɇÛW ºmè—’®1NÃwH=8!õ Á éŒ4ôDCp&q"p¢œüBCT/ôŒ9ñ¡!ɨ~Bü }ÒéîRqÒ‰óTÂçFIŸúܨ™ÏŠ|nTìs£Ÿ¥|neEA¼;~æó¤òÛ<©â6OšßæI‹ÏyÒòsžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçI§>O:óyҹϓ.|žRîó” Ÿ§Tú<¥³ë¹_¾û¥ãmÂKz}öÊK×ÙÑ=·î¡ÃW7æú"ŸÚV¹{ÊÇÿŒž‹à/@̪X endstream endobj 109 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UAGOMC+CMBX10 /FontDescriptor 318 0 R /FirstChar 49 /LastChar 49 /Widths 302 0 R /ToUnicode 355 0 R >> endobj 356 0 obj << /Length 494 /Filter /FlateDecode >> stream xÚm“Mo£0†ïü ï!Rz ˜|U‰ÄAÊaÛª‰V½&ö$E 6ÿ~=HÕUAgÞ¿“ɯ÷½Ÿ«ú~üÌÙ´uo$ø›ßÇÆ›LD-û t÷  @Ùö…½›Zî¡cÓÍNìtÙ=YñNËk¯`T=­áRêo ÞæøôeCîŸúòÚ•Úç(>”ÝÕŠæ™ ²ŸAæŠþ€iËZ¿°ð™sn[­6u…c´^0XaÁhî\je?ì„î¼0bª”ÝprOYÙ÷Åû[ÛAµÓçÚKS|ØdÛ™›óøäoF)õ…MZ³©}ß4W@Œ{YÆœmG;ÿë±<œñ®9Ü`‘;‡äKÖ Úæ(Áõ¼”óŒ¥E‘y Õ¹¡ât¤ba¥bi<Îg®bÌÅw­ü:/]×åvYsäˆâ[ä˜â+䄘#ψ]íœôò‚â9ò’8D^osâyMìîÚGÈ‚X o‰ä‚îBŸÉà5Éà‰<øÇ»’ÁÿÂò k£(Do9Örá,Âq¼B?"tŽýEDqì)bbœW$ÄèYÌèM»>sb×gEìjqÞ(ŒæÃ×po¿$îÝ}IdoŒÝ·œn-p!J ÷ýmê«ÜÏ-þøOÃÓ[áýL‡ endstream endobj 21 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YHJIXX+CMEX10 /FontDescriptor 320 0 R /FirstChar 0 /LastChar 112 /Widths 306 0 R /ToUnicode 356 0 R >> endobj 357 0 obj << /Length 696 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS >Ù_êãP·ò{=éÇsæ@öd”ôÇöçºkŸ˜xäœ;`ÝVY×`Œs4½JaÓQÜ¡n«þª‡í¡.’Uu9\ßèY6î>¼ý<¶Ù´‡.Z.ÙôÍž‡þ“4>DÓ—¾²}Ý~°û¯ÒÜÑör:-d0­V¬²WÑÍÿ¼k,›þ8ãóþy²LÒ»ðºÊ®²çÓ®´ý®ý°Ñ’ó[Å*²mõíLrŸ²?ŒÜÔqù¥ã• â5F8@ šˆ=@Šð)&°  È8Ô¹€ÂÅRx u€Dº\j2H—†ª¡ÐVÁ¹0CzL]ø Âb°ct‘I ©g$`htÑ‹0œÆ\F„áŒ0ä†sê‡á jd< —Iê6œ»õñzgóñºË»þê W ¤qÈ’£+—Ÿ#ö•ñÌÇkÄÞ .‰bªsré…¤šáæÄç†bïmŽXú¾„Kß7ǵHß7Géû„û¾nb§>&jÊØµäuœ¯¼ú•ñ1ÜV™÷•âÜãâµÇ‰Ou$ÕŸqWèS/%1{\øxB!€§ÔK(hH©—TЖ枃»J©Ïϯv×ÜëÁ=küÒ2ø¥UðKÏ‚_:~é$ø¥Óà—ÖÁ/¿Œ ~™Eð+7¿èË¢/ ÿlì¡ÛÒ(/}ïö -+ZXukoûìÔE?Z„ãæÅÛKýqíƒÄ endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QDOZHF+CMMI10 /FontDescriptor 322 0 R /FirstChar 11 /LastChar 122 /Widths 312 0 R /ToUnicode 357 0 R >> endobj 358 0 obj << /Length 695 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MSÇ“ý¥>u;áà¾×ÃÑq~:fc_0F)l®»ö‰‰GιÖm•u f8GÓ«6•ê¶ê¯bØÒ"!YU—Ãõžeã.ÉÛÏó`›M{è¢å’MßÜáyè?IáC4}é+Û×í»ÿ¢Ìl/§ÓÑBãÑjÅ*{pÝìϻƲéOÞ(ïŸ'Ë$½ ¯ªì*{>íJÛïÚ-9_±eQ¬"ÛVßÎ$÷)ûÃÈM—ÏñP:^9À ^`„ª‰Ø ¤Ÿbr š€Œ@ ‘{@(\,…RH¤Ë¡&€ti  mœ+3¤ÇÔ…Ï ,;F™$Б€‘zF†F½ÃiÌeDÎ(ó0œAº1a8§ÎyΠFÆÃp™ nù[¯w6¯»ü·ë¯Îpµ@‡ )9ºréñ9b_iaÏ|¼Fì-ÐÐà’(¦:×ù(—nQHªY^`nA|n(öÞæˆ¥ïK¸ô}s\‹ô}sÔ‘¾oA¸ïë&vqêcâ ¦Œ YK^ÇøÊ›!¡_Ãm•y_)Î=^ ^{œøTGRý÷w…¾1õR³Ç…'ÄxJ½„‚†”zImiî9¸«”êðøüj'pͽܳÁ/-ƒ_Z¿ô,ø¥ãà—N‚_: ~iüÒyðËÈà—Y¿2qó‹¾,ú’ðÏÆºíŒòÒ÷nЪ¢5Q·ö¶ÍNÝ Yô£58.]¼½Ñ‰ç‚è endstream endobj 104 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GGCSTO+CMMI5 /FontDescriptor 324 0 R /FirstChar 15 /LastChar 120 /Widths 304 0 R /ToUnicode 358 0 R >> endobj 359 0 obj << /Length 695 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS§“ý¥>u;áà¾×ÃÑq~:fc_0F)l®»ö‰‰GιÖm•u f8GÓ«6•ê¶ê¯bØÒ"!YU—Ãõžeã.ÉÛÏó`›M{è¢å’MßÜáyè?IáC4}é+Û×í»ÿ¢Ìl/§ÓÑBãÑjÅ*{pÝìϻƲéOÞ(ïŸ'Ë$½ ¯ªì*{>íJÛïÚ-9_±eQ¬"ÛVßÎ$÷)ûÃÈM—ÏñP:^9À ^`„ª‰Ø ¤Ÿbr š€Œ@ ‘{@(\,…RH¤Ë¡&€ti  mœ+3¤ÇÔ…Ï ,;F™$Б€‘zF†F½ÃiÌeDÎ(ó0œAº1a8§ÎyΠFÆÃp™ nù[¯w6¯»ü·ë¯Îpµ@‡ )9ºréñ9b_iaÏ|¼Fì-ÐÐà’(¦:×ù(—nQHªY^`nA|n(öÞæˆ¥ïK¸ô}s\‹ô}sÔ‘¾oA¸ïë&vqêcâ ¦Œ YK^ÇøÊ›!¡_Ãm•y_)Î=^ ^{œøTGRý÷w…¾1õR³Ç…'ÄxJ½„‚†”zImiî9¸«”êðøüj'pͽܳÁ/-ƒ_Z¿ô,ø¥ãà—N‚_: ~iüÒyðËÈà—Y¿2qó‹¾,ú’ðÏÆºíŒòÒ÷nЪ¢5Q·ö¶ÍNÝ Yô£58.]¼½Ñ»á‚ò endstream endobj 10 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EDOCOG+CMMI7 /FontDescriptor 326 0 R /FirstChar 14 /LastChar 120 /Widths 310 0 R /ToUnicode 359 0 R >> endobj 360 0 obj << /Length 739 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvHU„dçCâ°mUªÕ^!1ÝH ý÷ëñ#xÙö?ŸgìÁÜýx]OTÝmÍ$|äìÍœºs_™Iöss îîò®:L;<S›zœ==±×¾«Öf`÷Ù*_µÍð`É«¶ÚŸk3²¾'ióÑ´ž‚}Øý»ù=©½à“í¹ÙM;áà¾7ÃÞr¾›f¶ÆnjÌ-ùeúSÓµOLg~¼À8÷ã ãâþÈ)okà çA„8 ö$`I\èÎ×3`çAfŽã<ÈZ]ƒÂ!‹„ê xNkÇyã¹ãÐð"œ7Á¿ _¥ã“§Ìq âH`òáö•‚nú¥¤kÌÂðRONH=CpB:# =Ñ%8“ˆ88QA~¡!*ÉzÆœøÐäT?!~Ž> étw©8éÄy*ás£¤Ï }nÔÌçFE>7*ö¹Q‰ÏR>7в¢ G]¼;~îó¤ŠÛ<©ò6OšßæI‹¯yÒòkžtèó¤g>O:òyұϓN|žôÜçI/|ž´òyÒÚçIg>O:÷yÒ…Ï“.}ž2îó” Ÿ§Lú> endobj 361 0 obj << /Length 709 /Filter /FlateDecode >> stream xÚmTMo£0½ó+¼‡Jí!m$Šdó!å°mÕT«½&àt‘@„úï×32UÕè1~3~ö<æî×ëvfênïfá£oîÜ]†ÊͲ߻>¸»Ë»êrríøì\íêiõü$^‡®ÚºQÜg›|Ó6ãƒ'oÚêx©ÝÄú™dÝGÓ2ö÷ïîï¬: ÑliŽcÓÎ$Pß›ñè)?¬ _Cþ¸áÜtí“PRJ(Ú:ëNp€s0¿ŠóIÖ¡iëáªDìAW ´¨›j¼~á»:ù›€äíçyt§M{è‚4ó7¿x‡OÔ÷Ì_†Ú Mû!î¿ ó ÛK߈2X¯Eí¾ž?÷óîäÄü‡ÓÝ¿iªºÚû]å†]ûá‚TʵHËr¸¶þ¶SÆþ0QO•Kx…&Z©=Ö1¤Ç>‹‘¥ÀÒbåqb0àq&°˜d'¤H1«[Q/cÚ0‰&Õ¿Ýp•*äI(¬µŒkŠÃ†2$l/€#ÚAŽ cëΘ :µÒXÓ"^f™F~N‡Kˆ rJÄÖ_dªP§ !®@§¿à+M÷THü`Ô©3ä NƒE7k°fBqxI¹ÈAý2GÝsú6AE Ye/‘Oú3äÄÑ€I?î«ôkM­Ê'„WG×f€©fœ¨ ³@ý¨$ÍÀ%ñ¡~’Sø ñs¨“ì…‘¤îÊ(î»ÑÜwrßÍ‚ûn"¹ï&á¾Ã}7dXz Ýñsöƒ)ئd?XÉ~°Šý`5ûÁ†ì»`?؈ý`cöƒMØvÉ~°+öƒ5ìkÙ6c?Øœý` öƒ-Ù™d?dŠýiöC¶¸õÿNüa\À`»Í¡ê2 ~DáôÃÙS§iÝm@ö]Yøàd†8|½”ÁpJ‘ endstream endobj 67 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UZEWHU+CMR5 /FontDescriptor 330 0 R /FirstChar 0 /LastChar 61 /Widths 305 0 R /ToUnicode 361 0 R >> endobj 362 0 obj << /Length 740 /Filter /FlateDecode >> stream xÚmUMoâ0¼çWx•ÚÅvH U„dçCâ°ÛªT«½Bbº‘ ‰B8ô߯ß{ .Û@ãçñóŒ=˜»/Û™®Ú½…œ½Ús{éK;Kîºàî.kËËÉ6Ã/k+[M³ç'öÒ·åÖì>Ýd›¦yÓ”ÇKe'Ö÷$cßëÆS`vÿfÿÌÊS¯fûK}êfÆúVGGùf–¹û\b¸à·íÏuÛ<1ñÈ9w…¼©ÒöÎÁ|Á擬CÝTý¨„íAW $«êrGø]žÜIÀâíÇy°§Mshƒ$aóW7yúÔ÷ÌŸûÊöuóÎî? sÛK×-ˆ`ãθtJ!±'™ˆcøÀ8õãŒ3?NaœâOœâ¶<Dg!Àƒ;IXô ôÀÍ0z)rЃÌ@« kÐpÈBQ]^ÒZä 7ž!‡î /½‰ü òU Ÿ<¥Èɉ#“ÜW ºmÐ/%]cXß!õÔÀ ©gœÎÈ€žhŒœIDœ8QN~ACT/ès⃕QøŠøôQ¤ïRsÒ ç©…Ï–>7:ô¹Ñ ŸùÜèØçF+Ÿ­}n4eEƒ=zG~æó¤óÛ<éâ6O†ßæÉˆ¯y2òkžLèód>O&òy2±Ï“Q>OféódV>OFû<ãódRŸ'“ù<™ÜçÉ>O)÷yJ…ÏS*}žÒÅõÎð—¿tx›à½>zå¥ïÝ{ˆO->tðÄÕ½¾Æ]ÛÁ*üà3>ýcÀè¹þ¤C§~ endstream endobj 19 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PPERUW+CMR7 /FontDescriptor 332 0 R /FirstChar 0 /LastChar 120 /Widths 308 0 R /ToUnicode 362 0 R >> endobj 363 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx˜ÏJ›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌYÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vðc­48¸’ï¼äØWtù]Í:P~`áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×Mñ?®Xê endstream endobj 20 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UFMTYJ+CMSY10 /FontDescriptor 334 0 R /FirstChar 0 /LastChar 106 /Widths 307 0 R /ToUnicode 363 0 R >> endobj 364 0 obj << /Length 898 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇ÷jö|ÞNÃ8“È}No)ç£e‘0ñ&hË?q:ûñ«P_¤” X}³ßa†c1¿ðó+³—aì§ ñ j…Ò¢ºÓå‹~»]›ß§¸{_öÅr)æ¿Òâñ4½ÃÏÅüÇÔÇi_ÅýÌÒÊãùpx‹`!d±Z‰>¾¤‚iöïÛ]ó¼¥<½¢Ðô­˜U·ïãñ°íâ´_c±”r%–›Íªˆcÿךv¼åùåš[§\Ù¤­ÕªX*be¨-€@E€-X€÷@à-ê©–·xkM PY«…@ ,Õ#bªE†A Ã5rEqIø†b>ù,¥å½A²$ G#é¨eÛ"&ÎÕcÊ «Dž`%r‰EÅ*˜ñ‚s »–ì(¬Ǩ£5ÇØ«™CIªÙ*”¿à˜ò=Ç”ßò^pÓkŽˆù¬¸ê+ öæ™Ü›bVšLbX+“‰«@­8¦:¤•1”Ï3Jp3<£¤|6¯Çì†ï„ Û^Μø—¬‰ANÅùV¨øþjÌRñµ«ÁÙòy9ð´Žcp³Üס¾½ÔAMË}ÉÄ–û¶¯)¿¢|ÖªÄ,îâ+pp¤•70¯»hÿ8ÖJƒƒ+ùNÀKŽ}E—ßÕ¬åöÎÈk)§å˜ð5Çt7ƒOý›g¼¤:|CUö¿×ÙÿÞdÿû2ûßWÙÿÞfÿ{—ýïëìÿ ³ÿƒÊþ:û?˜ìÿPfÿ‡ýšìÿÆäYšò6#ÝrºÕøçއèöltçiJ/ ½VôRàÆx{Ðûvѽ„×w_?6ÅÿÑéF endstream endobj 108 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XMIFGE+CMSY5 /FontDescriptor 336 0 R /FirstChar 0 /LastChar 49 /Widths 303 0 R /ToUnicode 364 0 R >> endobj 365 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw7{>o§aœIä> §·”óѲH˜ø´åŸ8‡ýøU¨/RʬǾÙï0ñ˜_xˆù•ÙË0öÓ…ŒxµBiÑÝéòE¿Ý.‰ÍïÇSÜ=Œ/ûb¹ó_iñxšÞ‰áçbþcêã4Œ¯âþfiåñ|8¼E°²X­D_RÁ4û÷í.ŠùGÞRžÞQhúV̪Û÷ñxØvqÚŽ¯±XJ¹ËÍfUıÿkM;ÞòürÍ­S®lÒÖ‹jU,•N±2Ô@  "À–,Àû  ð õTË[<€5€ €¦¨¬Õ –€ê1Õ"à†á›×cvÃ÷GÂ@†m¯gÎ üKÖÄ §â| +T|5f©øÚÕàlù¼xZÇ1¸YîëPß^ê ¦å¾dbË}[Š×”_Q>kUbwñ88Òʘ×]´‚k¥ÁÁ•|'à%Ǿ¢ËïjÖò{ g䈵”ÓrŒsqkŽé:n8Ÿú7ÏxIuø†ªì¯³ÿ½Éþ÷eö¿¯²ÿ½Íþ÷.ûß×ÙÿAfÿ•ýtö0Ùÿ¡Ìþ!û?4Ùÿɳ4åmFºåt«ñÏÑíÙèÎÓ”^z­è¥À1Œñö öì¢?z ¯ï.¾~lŠÿP}éL endstream endobj 18 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QIYSQL+CMSY7 /FontDescriptor 338 0 R /FirstChar 0 /LastChar 112 /Widths 309 0 R /ToUnicode 365 0 R >> endobj 366 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.Rˆ$‡þýΛ1i·Z)Aãç™yoÆ7?ž·“¬îönÝkõâNÝe¨Ü$ÿ¹ëƒ››¢«.Gמ«]=îžÔóÐU[wV·ù¦Ø´ÍùŽ’7mõ~©Ý˜õÿ¤•{kÚÏð¨ÛW÷{ÒWÃÞúiä½6çwÚÿ¾¥h­®kÅ©¿ÜpjºöA™{­5ë¶Î»#tŸ‚©çVÓQÍ¡iëÁ P{È L¨ê¦:û?«#€âíÇé쎛öЋ…š¾Ðæé<|°²»`ú4ÔnhÚ7u{UEèöÒ÷ï ”–KU»5£YwG§¦ß‡ºn¿~ôN…¼6¢¦êjwêw•ví› Z/Õ¢,—këo{&–’ýaÌM(WÏñ03³$`¸d`^`,Å&¥G&3B´¹NSL2âRK@b(žs# ©E¶K(%iDq:cÀä‘J†‰ÈÐ#˹G†úsÖ ]KFÚu¹EØÒKd—+(&Ù¥£NÄzt¦ú³Èðë°HáI(£$ôçuô¹†x-ƒÌàŽŽ¥üÚJ¼BœJœ!^I Ñ:ggM«5ã9¤æ7F7ÌFŒáN°ž}Y{}&þƒF“È„ûf.œpÑdkæ_ Μ¢‹NÅ0VG9×ú×ʱçÐúwþDKŒù¬Ä4XÃ=CøaCÉ–g2)4X( ÍÆrb0§/sŽù4êlƵ¬Ç®‡ËÃÄÜúÉb®]ËŒÌ[r<ƒÎÔs!?õïf*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñϨxè?Wúðáâr¹^Õeè¦àˆo|ÿMë®—Tßõ¨â?ßnãý‰ÕSüÈr+ endstream endobj 149 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GVHTSJ+NimbusMonL-Bold /FontDescriptor 340 0 R /FirstChar 105 /LastChar 116 /Widths 300 0 R /Encoding 293 0 R /ToUnicode 366 0 R >> endobj 367 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šhµ×œ.Rˆ$‡þýΛ1i·Z)Aãç™yoÆ7?ž·“¬î^Ý$º×êźËP¹Iþsß77EW]Ž®=?:W»zÜ==¨ç¡«¶î¬nóM±i›ó%oÚêýR»1ëÿI+÷Ö´Ÿ)àQ·;÷{ÒWÃ`‡ ý4òvÍùö¿o)Z«ëZqê/7œš®}Pæ^kMÀº­óîݧ`ê¹ÕtTshÚzðÔ+ä&TuSýŠŸÕ‘ @ñöãtvÇM{è‚ÅBM_hót>XÙ]0}j74훺½ª"t{éûwJË¥ªÝšÑ¬û£SÓïC]·w½S!¯¨©ºÚú}å†}ûæ‚…ÖKµ(ËeàÚúÛž‰¥äõ0æ&”«çx˜™Y°F\20/0–b“Ò# “!Ú‡\§)&q)€% 1Ϲ‘NÐÔ"Û‚%”’4¢81`rÈH%ÃDdè‘åÜ#C ýйk Ю%£íºÀÜ"l é%²Ë€ìR„Q ƒF'b=:SýÙäøuX¤ð$”Qúó:ú\C¼–AfpGÇR~m%^!N%ί$†h³³&„ÕšñR 󛣿#Æ¿p'XϾ¬½>ÿ‹A£Iä Â}3N¸h2Ž5ó¯gNÑE'b«£œkýkåØ¿sè ý»¢%Æ|Vâ ¬áž!ü°¡äÀË3™¬?Ðfc91˜ÓŠ—9Ç|u 6ãZÖcW‚Cƒåƒabî ýd1×®eFæ-9žAg깟ú÷Æ3•ZÆ=üI=ú¤ž ç6-Ä7p¥Ìçœã?)pe…øÆgT<ôŸ«?}øpq¹\¯ƒê2 tSð Ä·¾ÿ¦u×KªïzTñŸo·ñþÄê© þ…çr{ endstream endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MPTMQO+NimbusMonL-Regu /FontDescriptor 342 0 R /FirstChar 34 /LastChar 148 /Widths 315 0 R /Encoding 293 0 R /ToUnicode 367 0 R >> endobj 368 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.R’Cÿ~çÍ8M»])AãÇ̼7ÏÆW?·“¬î^Ü$ºÕêÉÝi¨Ü$ÿ¹ëƒ««¢«N×ï«]}~;Þ©Ç¡«¶î¨®óM±i›ã %oÚêíT»sÖÿ“Vîµi/)àQ×Ïî÷¤¯†¡³Ã„~‰ÏÍñ¾½S¨  8ù—ƦkÕZ°në¼;@úL=½šží›¶¼õE UÝTG¿âgu P¼}î°i÷]°X¨é½Ã;k» ¦C톦}U×YoO}ÿæ Aé`¹TµÛS7š÷~wpjúm®÷Ïï½S!¯è©ºÚý®rî}uÁBë¥Z”å2pmýÏ;KÉËþœ›P®žãaffIÀqÉÀ¼ ÀXŠMJ0Lf„hr¦˜dÄ¥–€ÄP<çF:AS‹l –PJÒˆâtÆ€É #• ¡G–s =2ô+æ¬ (@»–Œ´ës‹°5¤—È.W PL²KF1 :;ë³3ÕŸÝ@>€_‡E OB%¡?¯£Ëâµ 2ƒ;:–:ðk+ñ q*q†x%1Dëœ5!¬ÖŒçj˜ßDÝ01þ‰;Ázöiíõ™ø+&‘„ûf.œpÑdkæ_ Μ¢‹NÅ0VG9×úmåØï9t…~ïÀŸh‰1Ÿ•8ƒk¸g?l(9ðÃòL&…ë´ÙXN æ´âeÎ1ŸFAƒÍ¸–õØ•àÐ`ù`˜˜{B?Y̵k™‘yKŽgЙz.ä§~ßø`¦R˸ç‚?©çBŸÔsáܦ…ø®”¹âœsü'®¬ßøŒŠ‡þsõ§.®—û : ]|ñ-€ï¿iÝÇ5Õw=ªøÏ÷ÛùÅê¡ þ‰Rt¦ endstream endobj 136 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UJXKBR+NimbusMonL-ReguObli /FontDescriptor 344 0 R /FirstChar 31 /LastChar 126 /Widths 301 0 R /Encoding 293 0 R /ToUnicode 368 0 R >> endobj 369 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ©D’•ú÷;oƤÝj¥Ÿgæ½y_ýxÜN²º{q“èV«'wìÎCå&ùÏ]\]]u>¸ötï\íêq÷x§‡®Úº“ºÎ7ŦmN7”¼i«÷síÆ¬ÿ'­ÜkÓ~¦€G]?»ß“þíÏ`‡ ý4òž›Ó;íßR´V—µâÔ_n86]{§Ì­Öš€u[çݺÁÔs«é¨fß´õà¨È L¨ê¦:ù?«€âíÇñä›vß‹…š>Ñæñ4|°²›`ú0ÔnhÚWu}QEèöÜ÷ï ”–KU»=5£Yïw§¦ß‡ºl?ôN…¼6¢¦êjwìw•ví« Z/Õ¢,—këo{&–’—ý˜›P®žãaffIÀqÉÀ¼ ÀXŠMJ0Lf„hr¦˜dÄ¥–€ÄP<çF:AS‹l –PJÒˆâtÆ€É #• ¡G–s =2ô+æ¬ (@»–Œ´ës‹°5¤—È.W PL²KF1 ˆõèLõ¶Èðë°HáI(£$ôçuô¹†x-ƒÌàŽŽ¥üÚJ¼BœJœ!^I Ñ:ggM«5ã9¤æ7F7ÌFŒáN°ž}Y{}&þƒF“È„ûf.œpÑdkæ_ Μ¢‹NÅ0VG9×ú×ʱçÐúwþDKŒù¬Ä4XÃ=CøaCÉ–g2)4X( ÍÆrb0§/sŽù4êlƵ¬Ç®‡ËÃÄÜúÉb®]ËŒÌ[r<ƒÎÔs!?õïf*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñϨxè?Wúðáâr¹\Õyè¦àˆo|ÿMë.—Tßõ¨â?ßnãý‰ÕCü_er¨ endstream endobj 282 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FYVMNP+NimbusSanL-Regu /FontDescriptor 346 0 R /FirstChar 80 /LastChar 115 /Widths 294 0 R /Encoding 293 0 R /ToUnicode 369 0 R >> endobj 370 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.RˆCÿ~çÍ8i·Z)Aãç™yoÆ7?ž·“¬îönÝkõâNÝy¨Ü$ÿ¹ëƒ››¢«ÎG׎ÎÕ®¾ìžÔóÐU[7ªÛ|SlÚf¼£äM[½ŸkwÉúÒʽ5íg xÔí«û=éÇãÞúiä½6ã;íßR´V×µâÔ_n85]û Ì½Öš€u[çݺOÁÔs«éEÍ¡iëÁ P{È L¨ê¦ýŠŸÕ‘ @ñöã4ºã¦=tÁb¡¦/´y‡VvLŸ†Ú Mû¦n¯ªÝžûþÝAÒÁr©jw f4ëãîèÔôûP×í×Þ©×FÔT]íNý®rî}sÁBë¥Z”å2pmýmÏÄR²?\rÊÕs<ÌÌ, X#.˜K±Ié†ÉŒ€íC®Ó€Œ¸ÀŠçÜH'hj‘mÁJIQœÎ09d¤’a"2ôÈrî‘¡G†~Å\€5h×’Q€v]`n¶†ôÙ劊 @v)Â(†A'b}q¦ú³Èðë°HáI(£$ôçuô¹†x-ƒÌàŽŽ¥üÚJ¼BœJœ!^I Ñ:ggM«5ã9¤æ7F7ÌFŒáN°ž}Y{}&þƒF“È„ûf.œpÑdkæ_ Μ¢‹NÅ0VG9×ú×ʱçÐúwþDKŒù¬Ä4XÃ=CøaCÉ–g2)4X( ÍÆrb0§/sŽù4êlƵ¬Ç®‡ËÃÄÜúÉb®]ËŒÌ[r<ƒÎÔs!?õïf*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñϨxè?Wúðáâr¹^Õyè¦àˆo|ÿMë®—Tßõ¨â?ßn—û«§2ø %ôrg endstream endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XOSZRV+NimbusRomNo9L-Medi /FontDescriptor 348 0 R /FirstChar 2 /LastChar 122 /Widths 314 0 R /Encoding 293 0 R /ToUnicode 370 0 R >> endobj 371 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁn›@½óÛC¤äàx ^"Ë#ùÐ&Š£ªWÖ)R ãCþ¾ófÖqÚT²ÑìcfÞ›·ËÞ|{ÚN²ºÛ»It¯Õ³;uç¡r“üû®nnŠ®:];þp®võåíéA= ]µu£ºÍ7ŦmÆ;JÞ´ÕÛ¹v—¬ÿ'­ÜkÓ^SÀ£n_ܯI?÷&ôÓH|iÆ7JøòN ®€âäŸn85]û Ì½Öš€u[çÝÒOÁÔÓ«éEСiëÁkP{( L¨ê¦ýŠŸÕ‘<@ñöý4ºã¦=tÁb¡¦Ïôò4ï¬í.˜>µšöUÝ^e¼=÷ý›ƒ¥ƒåRÕî@ÝhÞ»£SÓ/s}¼yï ymDOÕÕîÔï*7ìÚW,´^ªEY.×Öÿ¼3±”ì—Ü„rõ33KÖˆKæÆRlRz„a2# Dûë4Å #.°$†â97Ò šZd[°„R’F§3L©d˜ˆ€ =²œ{dè‘¡_1`M@Úµd ]˜[„­!½Dv¹b€b]Š0ŠaÐʼnX_œ©~ïòü:,RxÊ( ýy]ׯeÜѱÔ_[‰WˆS‰3Ä+‰!Zçì¬ aµf<‡TÃü&Âè†ùÈñOÜ Ö³Ok¯ÏÄcÐhÙA¸oæÂ MƱfþ•àÌ)ºè$P cu”s­ßVŽýžCWè÷ü‰–óY‰3h°†{†ðÆ’?,ÏdRh°þP@›åÄ`N+^æóiÔ4ØŒkY]  –†‰¹'ô“Å\»–™·äx©çB~ê÷f*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñϨxè?Wúðáâzù¸ªó0ÐUÁwßøþ›Ö}\S}×£Šÿ|¿].Q¬Ëà˜tt endstream endobj 221 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VCHGJK+NimbusRomNo9L-MediItal /FontDescriptor 350 0 R /FirstChar 109 /LastChar 115 /Widths 295 0 R /Encoding 293 0 R /ToUnicode 371 0 R >> endobj 372 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šhµ×œ.RˆCÿ~çÍ8i·Z)Aãç™yoÆ7?ž·“¬î^Ý$º×êźóP¹Iþsß77EW®«]}Ù==¨ç¡«¶nT·ù¦Ø´ÍxGÉ›¶z?×î’õÿ¤•{kÚÏð¨Ûû=éÇã`‡ ý4òvÍøNûß·­Õu­8õ—NM×>(s¯µ&`ÝÖyw„îS0õÜjzQshÚzðÔ+ä&TuS~ÅÏêH xûqÝqÓº`±PÓÚ<Ã+» ¦OC톦}S·WU„nÏ}ÿî @é`¹Tµ;P3šõqtjú}¨ëöî£w*äµ5UW»S¿¯Ü°oß\°Ðz©e¹ \[Û3±”¼.¹ åê9ff–¬— Ì Œ¥Ø¤ôÃdF@ˆö!×iŠ @F\ ` H Åsn¤4µÈ¶` ¥$(Ng ˜2RÉ0zd9÷ÈÐ#C¿b.Àš€´kÉ(@».0·[Cz‰ìrÅÅ »aà‹±¾8SýÙäøuX¤ð$”Qúó:ú\C¼–AfpGÇR~m%^!N%ί$†h³³&„ÕšñR 󛣿#Æ¿p'XϾ¬½>ÿ‹A£Iä Â}3N¸h2Ž5ó¯gNÑE'b«£œkýkåØ¿sè ý»¢%Æ|Vâ ¬áž!ü°¡äÀË3™¬?Ðfc91˜ÓŠ—9Ç|u 6ãZÖcW‚Cƒåƒabî ýd1×®eFæ-9žAg깟ú÷Æ3•ZÆ=üI=ú¤ž ç6-Ä7p¥Ìçœã?)pe…øÆgT<ôŸ«?}øpq¹\¯ƒê< tSð Ä·¾ÿ¦u×KªïzTñŸo·Ëý‰ÕSü¨r· endstream endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TQLUFV+NimbusRomNo9L-Regu /FontDescriptor 352 0 R /FirstChar 2 /LastChar 252 /Widths 316 0 R /Encoding 293 0 R /ToUnicode 372 0 R >> endobj 373 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ.RˆCÿ~çÍ8M»])AãÇ̼7ÏÆW?·“¬î^Ü$ºÕêÉ»ÓP¹Iþs×WWEW®ï«]}~{¼SCWmݨ®óM±i›ñ†’7mõvªÝ9ëÿI+÷Ú´—ð¨ëg÷{Ò‡¡±Ã„~‰ÏÍøF ßÞ)ÔPœüË Ç¦kÕZ°në¼;@ú1˜zz5= Ú7m=x ꊪº©F¿âgu P¼}?Žî°i÷]°X¨é½<ŽÃ;k» ¦C톦}U×YoO}ÿæ Aé`¹TµÛS7š÷~wpjúm®÷Ïï½S!¯è©ºÚû]å†]ûê‚…ÖKµ(ËeàÚúŸw&–’—ý97¡\=ÇÃÌÌ’€5â’yA€±›”a˜ÌÑ>ä:M1ȈK,‰¡xÎt‚¦Ù,¡”¤Å錓@F*&" C,çzdèWÌXP€v-h׿akH/‘]® ˜d—"Œbtv"Öggª?»|¿‹ž„2JB^G—5Äkdwt,uà×VââTâ ñJbˆÖ9;kBX­Ï!Õ0¿‰0ºaþ0büw‚õìÓÚë3ñW M";÷Í\8á¢É8ÖÌ¿œ9EŠa¬Žr®õÛʱßsè ýÞ?Ñc>+q ÖpÏ~ØPrà‡å™L Ö h³±œÌiÅËœc>:‚›q-ë±+Á¡ÁòÁ01÷„~²˜k×2#ó–Ï 3õ\ÈOý¾ñÁL¥–qÏRÏ…>©ç¹M ñ \)sÅ9çøO \Y!¾ñýçêO>\\/÷Auº*øâ[ßÓºkªïzTñŸï·ó%ŠÕCü0tÄ endstream endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KUIVWV+NimbusRomNo9L-ReguItal /FontDescriptor 354 0 R /FirstChar 2 /LastChar 122 /Widths 313 0 R /Encoding 293 0 R /ToUnicode 373 0 R >> endobj 11 0 obj << /Type /Pages /Count 6 /Parent 374 0 R /Kids [2 0 R 16 0 R 23 0 R 34 0 R 37 0 R 65 0 R] >> endobj 71 0 obj << /Type /Pages /Count 6 /Parent 374 0 R /Kids [69 0 R 89 0 R 102 0 R 106 0 R 112 0 R 124 0 R] >> endobj 129 0 obj << /Type /Pages /Count 6 /Parent 374 0 R /Kids [127 0 R 131 0 R 134 0 R 138 0 R 141 0 R 144 0 R] >> endobj 150 0 obj << /Type /Pages /Count 6 /Parent 374 0 R /Kids [147 0 R 152 0 R 155 0 R 158 0 R 161 0 R 164 0 R] >> endobj 169 0 obj << /Type /Pages /Count 6 /Parent 374 0 R /Kids [167 0 R 171 0 R 175 0 R 178 0 R 186 0 R 189 0 R] >> endobj 194 0 obj << /Type /Pages /Count 6 /Parent 374 0 R /Kids [192 0 R 196 0 R 201 0 R 210 0 R 213 0 R 216 0 R] >> endobj 222 0 obj << /Type /Pages /Count 6 /Parent 375 0 R /Kids [219 0 R 224 0 R 227 0 R 230 0 R 233 0 R 236 0 R] >> endobj 241 0 obj << /Type /Pages /Count 6 /Parent 375 0 R /Kids [239 0 R 243 0 R 246 0 R 249 0 R 252 0 R 255 0 R] >> endobj 260 0 obj << /Type /Pages /Count 6 /Parent 375 0 R /Kids [258 0 R 263 0 R 271 0 R 274 0 R 277 0 R 280 0 R] >> endobj 286 0 obj << /Type /Pages /Count 3 /Parent 375 0 R /Kids [284 0 R 288 0 R 291 0 R] >> endobj 374 0 obj << /Type /Pages /Count 36 /Parent 376 0 R /Kids [11 0 R 71 0 R 129 0 R 150 0 R 169 0 R 194 0 R] >> endobj 375 0 obj << /Type /Pages /Count 21 /Parent 376 0 R /Kids [222 0 R 241 0 R 260 0 R 286 0 R] >> endobj 376 0 obj << /Type /Pages /Count 57 /Kids [374 0 R 375 0 R] >> endobj 377 0 obj << /Type /Catalog /Pages 376 0 R >> endobj 378 0 obj << /Producer (MiKTeX pdfTeX-1.40.25) /Creator (TeX) /CreationDate (D:20241107141859Z) /ModDate (D:20241107141859Z) /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 4.18.0 (1.40.25)) >> endobj xref 0 379 0000000000 65535 f 0000002479 00000 n 0000002374 00000 n 0000000015 00000 n 0000432709 00000 n 0000427846 00000 n 0000430760 00000 n 0000433680 00000 n 0000417729 00000 n 0000420585 00000 n 0000419604 00000 n 0000433874 00000 n 0000007625 00000 n 0000009307 00000 n 0000015280 00000 n 0000006478 00000 n 0000006370 00000 n 0000002614 00000 n 0000425935 00000 n 0000422514 00000 n 0000423654 00000 n 0000416791 00000 n 0000011274 00000 n 0000007517 00000 n 0000006651 00000 n 0000008954 00000 n 0000009185 00000 n 0000009231 00000 n 0000010844 00000 n 0000011072 00000 n 0000011118 00000 n 0000011211 00000 n 0000016533 00000 n 0000014668 00000 n 0000014560 00000 n 0000011440 00000 n 0000018389 00000 n 0000015172 00000 n 0000014793 00000 n 0000016182 00000 n 0000016411 00000 n 0000016457 00000 n 0000017371 00000 n 0000017536 00000 n 0000017638 00000 n 0000017720 00000 n 0000017807 00000 n 0000017897 00000 n 0000017991 00000 n 0000018070 00000 n 0000018229 00000 n 0000022806 00000 n 0000023420 00000 n 0000024058 00000 n 0000024721 00000 n 0000025376 00000 n 0000026033 00000 n 0000026711 00000 n 0000027396 00000 n 0000029098 00000 n 0000029794 00000 n 0000030612 00000 n 0000031353 00000 n 0000032238 00000 n 0000021805 00000 n 0000021697 00000 n 0000018497 00000 n 0000421535 00000 n 0000028112 00000 n 0000022698 00000 n 0000021979 00000 n 0000433983 00000 n 0000023214 00000 n 0000023374 00000 n 0000023852 00000 n 0000024012 00000 n 0000024515 00000 n 0000024675 00000 n 0000025170 00000 n 0000025330 00000 n 0000025827 00000 n 0000025987 00000 n 0000026505 00000 n 0000026665 00000 n 0000027190 00000 n 0000027350 00000 n 0000027906 00000 n 0000028066 00000 n 0000033009 00000 n 0000028990 00000 n 0000028328 00000 n 0000029588 00000 n 0000029748 00000 n 0000030406 00000 n 0000030566 00000 n 0000031147 00000 n 0000031307 00000 n 0000032032 00000 n 0000032192 00000 n 0000032802 00000 n 0000032962 00000 n 0000036808 00000 n 0000036697 00000 n 0000033191 00000 n 0000418666 00000 n 0000040914 00000 n 0000040803 00000 n 0000037007 00000 n 0000424794 00000 n 0000416054 00000 n 0000042922 00000 n 0000045070 00000 n 0000042811 00000 n 0000041139 00000 n 0000044041 00000 n 0000044207 00000 n 0000044312 00000 n 0000044395 00000 n 0000044483 00000 n 0000044574 00000 n 0000044669 00000 n 0000044749 00000 n 0000044909 00000 n 0000048921 00000 n 0000048810 00000 n 0000045202 00000 n 0000052735 00000 n 0000052623 00000 n 0000049083 00000 n 0000434097 00000 n 0000056134 00000 n 0000056022 00000 n 0000052960 00000 n 0000058607 00000 n 0000058495 00000 n 0000056308 00000 n 0000428815 00000 n 0000060750 00000 n 0000060638 00000 n 0000058723 00000 n 0000062834 00000 n 0000062722 00000 n 0000060855 00000 n 0000066453 00000 n 0000066341 00000 n 0000063008 00000 n 0000069548 00000 n 0000069436 00000 n 0000066616 00000 n 0000426875 00000 n 0000434214 00000 n 0000072268 00000 n 0000072156 00000 n 0000069666 00000 n 0000074497 00000 n 0000074385 00000 n 0000072431 00000 n 0000075696 00000 n 0000075584 00000 n 0000074648 00000 n 0000078267 00000 n 0000078155 00000 n 0000075801 00000 n 0000081155 00000 n 0000081043 00000 n 0000078395 00000 n 0000083822 00000 n 0000083710 00000 n 0000081293 00000 n 0000434331 00000 n 0000086205 00000 n 0000086093 00000 n 0000084009 00000 n 0000089663 00000 n 0000087789 00000 n 0000087677 00000 n 0000086344 00000 n 0000094622 00000 n 0000089551 00000 n 0000087916 00000 n 0000091548 00000 n 0000091692 00000 n 0000091792 00000 n 0000091829 00000 n 0000091924 00000 n 0000097971 00000 n 0000097859 00000 n 0000094754 00000 n 0000101668 00000 n 0000101556 00000 n 0000098099 00000 n 0000105106 00000 n 0000104994 00000 n 0000101818 00000 n 0000434448 00000 n 0000106312 00000 n 0000106200 00000 n 0000105281 00000 n 0000180708 00000 n 0000107835 00000 n 0000116900 00000 n 0000107723 00000 n 0000106407 00000 n 0000113721 00000 n 0000113865 00000 n 0000113965 00000 n 0000114070 00000 n 0000114107 00000 n 0000114202 00000 n 0000120359 00000 n 0000120247 00000 n 0000117034 00000 n 0000123529 00000 n 0000123417 00000 n 0000120545 00000 n 0000125064 00000 n 0000124952 00000 n 0000123693 00000 n 0000128700 00000 n 0000128588 00000 n 0000125159 00000 n 0000431731 00000 n 0000434565 00000 n 0000131474 00000 n 0000131362 00000 n 0000128924 00000 n 0000133466 00000 n 0000133354 00000 n 0000131602 00000 n 0000135127 00000 n 0000135015 00000 n 0000133571 00000 n 0000136544 00000 n 0000136432 00000 n 0000135232 00000 n 0000138887 00000 n 0000138775 00000 n 0000136660 00000 n 0000141456 00000 n 0000141344 00000 n 0000139037 00000 n 0000434682 00000 n 0000143845 00000 n 0000143733 00000 n 0000141656 00000 n 0000147133 00000 n 0000147021 00000 n 0000144033 00000 n 0000150975 00000 n 0000150863 00000 n 0000147319 00000 n 0000154293 00000 n 0000154181 00000 n 0000151153 00000 n 0000155532 00000 n 0000155420 00000 n 0000154443 00000 n 0000158554 00000 n 0000158442 00000 n 0000155626 00000 n 0000434799 00000 n 0000160041 00000 n 0000164642 00000 n 0000159929 00000 n 0000158694 00000 n 0000161420 00000 n 0000161564 00000 n 0000161664 00000 n 0000161701 00000 n 0000161944 00000 n 0000167467 00000 n 0000167355 00000 n 0000164798 00000 n 0000170110 00000 n 0000169998 00000 n 0000167583 00000 n 0000171651 00000 n 0000171539 00000 n 0000170204 00000 n 0000173273 00000 n 0000173161 00000 n 0000171745 00000 n 0000429790 00000 n 0000176043 00000 n 0000175931 00000 n 0000173428 00000 n 0000434916 00000 n 0000178849 00000 n 0000178737 00000 n 0000176135 00000 n 0000180214 00000 n 0000180102 00000 n 0000178930 00000 n 0000414679 00000 n 0000180295 00000 n 0000180458 00000 n 0000180505 00000 n 0000180958 00000 n 0000180984 00000 n 0000181045 00000 n 0000181081 00000 n 0000181148 00000 n 0000181551 00000 n 0000181574 00000 n 0000181927 00000 n 0000182579 00000 n 0000182984 00000 n 0000183680 00000 n 0000184298 00000 n 0000185007 00000 n 0000185712 00000 n 0000186370 00000 n 0000186923 00000 n 0000187564 00000 n 0000188039 00000 n 0000188516 00000 n 0000188977 00000 n 0000189951 00000 n 0000196954 00000 n 0000197177 00000 n 0000207408 00000 n 0000207912 00000 n 0000226153 00000 n 0000226516 00000 n 0000237149 00000 n 0000237426 00000 n 0000251901 00000 n 0000252239 00000 n 0000265922 00000 n 0000266261 00000 n 0000274402 00000 n 0000274675 00000 n 0000285447 00000 n 0000285775 00000 n 0000293970 00000 n 0000294254 00000 n 0000301567 00000 n 0000301800 00000 n 0000310277 00000 n 0000310584 00000 n 0000316844 00000 n 0000317083 00000 n 0000335512 00000 n 0000336056 00000 n 0000353175 00000 n 0000353755 00000 n 0000357554 00000 n 0000357798 00000 n 0000373090 00000 n 0000373494 00000 n 0000379131 00000 n 0000379372 00000 n 0000399237 00000 n 0000399828 00000 n 0000414312 00000 n 0000415232 00000 n 0000416216 00000 n 0000416952 00000 n 0000417890 00000 n 0000418828 00000 n 0000419765 00000 n 0000420745 00000 n 0000421693 00000 n 0000422673 00000 n 0000423815 00000 n 0000424954 00000 n 0000426095 00000 n 0000427066 00000 n 0000428034 00000 n 0000429009 00000 n 0000429980 00000 n 0000430950 00000 n 0000431929 00000 n 0000432899 00000 n 0000435009 00000 n 0000435125 00000 n 0000435227 00000 n 0000435297 00000 n 0000435350 00000 n trailer << /Size 379 /Root 377 0 R /Info 378 0 R /ID [<866E907E2EB670DD7062CF345220C076> <866E907E2EB670DD7062CF345220C076>] >> startxref 435559 %%EOF msm/inst/NEWS0000644000176200001440000013007414527640376012545 0ustar liggesusers-*- text -*- USER-VISIBLE CHANGES -------------------- For versions subsequent to 1.7.1, changes will be documented in NEWS.md in the root directory, so that they get rendered nicely with pkgdown at https://chjackson.github.io/msm For internal changes, see https://github.com/chjackson/msm from Nov 2016 onwards, and the ChangeLog in the source package before that Version 1.7.1 (2023-11-23) ------------- o Fix of a bug in the Viterbi algorithm for the calculation of the fitted state at the initial time for each subject. o Bug fix for pmatrix.piecewise.msm given just intensity matrices instead of a fitted model. o Auto-generated initial values set to a small positive number rather than zero when there are no observed data for a particular permitted transition. This fixes consistency checks (e.g. for qconstraint) in this situation. o Fix when covariates come into the data as one-column matrices instead of vectors. o Modernised to use roxygen, and pkgdown website created at https://chjackson.github.io/msm o Some internal functions (e.g. deriv.msm) that clash with base S3 generics renamed Version 1.7 (2022-11-27) ------------ o rpexp is now more efficient. Thanks to Mark Clements. Note that the values simulated by rpexp, sim.msm and simmulti.msm for a specific seed will now be different in models where the intensities are piecewise constant. o Bug fix: in HMMs with partially known initial states specified through "obstrue" and "censor", initprobs is now accounted for. o Bug fix for bootstrapping with character subject IDs. o crudeinits.msm handled when state is a factor. o Fix for hranges on multiple parameters. o obstrue handled in forward-backward algorithm (viterbi.msm). Version 1.6.9 (2021-09-26) ------------- o Bug fix for likelihood calculation for models with both censoring and exact transition times (obstype=2). This includes models with "pci" specified and obstype=2. o Bug fix for the Viterbi algorithm which was ignoring the first observation in cases when the hidden state is unknown at the first time. o Remove the ancient message about "printold.msm" from the print output. Version 1.6.8 (2019-12-16) ------------- o Bug fix for bootstrapping with factor subject IDs. o Fix of bug that broke piecewise-constant intensities with "pci" and transition-specific covariates. o Bug fix for multivariate hidden Markov models and hmmIdent. Version 1.6.7 (2019-03-15) ------------- o Beta-binomial outcome model in HMMs added. o Fix of bug that affected HMMs with categorical outcomes and multiple outcomes, where outcome probabilites did not add up to 1. o Fix of bug affecting bootstrapping with factor covariates. Version 1.6.6 (2018-02-02) ------------- o New function updatepars.msm() to overwrite the estimates in a fitted model object to a given vector of values. o Fix of bug in pearson.msm, triggered by r-devel. o Fix of random memory crashes for models with censoring, revealed by asan testing. Version 1.6.5 (2017-12-05) ------------- o New feature viterbi.msm(..., normboot=TRUE) to return Viterbi results for a parameter estimate randomly sampled from the distribution of the MLEs. o Bug fix to prevalence.msm with factor subject IDs. o Bug fix to observed state prevalences in prevalence.msm for "ematrix"-style misclassification models with censoring - censored states were not being imputed correctly. o Bug fix to plot.survfit.msm, which had been assuming that everyone starts at time zero. o plot.survfit.msm gets a speed-up for bigger datasets, and "from" is now handled properly in the empirical curve. o Bug fix to qpexp, and new "special" argument to qgeneric. Version 1.6.4 (2016-10-02) ------------- o CRAN release. Vignette source included in vignettes directory, on request of CRAN. Version 1.6.3 (2016-06-03) ------------- o r-forge release only. Fix of bug for qtnorm with vectorised arguments. Thanks to James Gibbons for the report. Version 1.6.2 (2016-03-17) ------------- o r-forge release only. Fix of bug for Pearson test with censored states. Thanks to Casimir Sofeu for the report. Version 1.6.1 (2016-03-09) ------------- o Fix of bug introduced in 1.5.2 for models with "obstrue" and "ematrix". This affected the first misclassification model presented in the PDF manual. Documented behaviour of "obstrue" clarified: with "ematrix" models, the state data are assumed to contain the true state if "obstrue" is turned on at the corresponding observation, and with "hmodel" models, the state data are generated from the HMM outcome model conditionally on the true state. o Fix of minor bugs in draic.msm and output printing. Version 1.6 (2015-11-17) ------------ o CRAN release. Includes the changes from versions 1.5.1 - 1.5.3, plus also: o Analytic derivatives for HMMs with multiple outcomes. o Bug fix for printing model output when only one transition rate is affected by covariates. Thanks to Jordi Blanch for the report. Version 1.5.3 (2015-09-14) ------------- o More underflow correction for probabilities of hidden states in viterbi.msm. Thanks to Hannah Linder for the report. o "death" argument in msm() is deprecated and renamed to "deathexact". o censor.states now defaults to all transient states if not supplied, instead of complaining, even if there is no absorbing state. Thanks to Jonathan Williams for the report. Version 1.5.2 (2015-02-17) ------------- o HMMs can now have multiple observations at each time generated from different distributions. See new function hmmMV(). o obstrue can now contain the actual true state, instead of an indicator. This allows the information from HMM outcomes generated conditionally on this state to be included in the model. Version 1.5.1 (2015-01-15) ------------- o R-forge only release. o HMMs can now have multiple observations at each time from the same distribution. The "state" in the "formula" argument of msm() is supplied as a matrix. o Up-to-date version of the vignette included in the package. Version 1.5 (2015-01-05) ----------- o CRAN release. Includes the changes from versions 1.4.1 - 1.4.3. Version 1.4.3 (2014-12-12) ------------- o R-forge only release. o Phase type models now allow an extra hidden Markov model on top. Version 1.4.2 (2014-12-11) ------------- o R-forge only release. o viterbi.msm now returns the "posterior" probability of each hidden state at each time, given the full data. o Bug fixes to misclassification models where some states were misclassified as other states with probability 1, for both ematrix and hmmCat specifications. Thanks to Li Su. Version 1.4.1 (2014-12-10) ------------- o R-forge only release. o Experimental facility for two-phase semi-Markov models. o Memory leaks in C code fixed. Thanks to Brian Ripley. o Don't print CIs for fixed parameters. o Documented that factors are allowed as the state variable as long as their levels are called "1", "2",... o Bug fixes for covariates on initial state occupancy probabilities with structural zeros. Thanks to Jeffrey Eaton and Tara Mangal. o Bug fixes for drlcv.msm. Thanks to Howard Thom. o Give warning that polynomial contrasts aren't supported. o Three and four-state versions of the BOS data provided. Version 1.4 (2014-07-04) ------------ o CRAN release. Includes the major changes from versions 1.3.2 and 1.3.3 below, previously only released on R-forge, plus: o Default confidence interval method for pnext.msm changed to "normal", since delta method may not respect probability <1 constraint. Version 1.3.3 (2014-06-23) -------------- o R-forge only release. o C interface changed from .C to .Call, giving a slight speed improvement. o Probabilities of passage, see ppass.msm. Version 1.3.2 (2014-06-19) -------------- o R-forge only release. o The new compact format for printing results from fitted models is now the default. The underlying numbers can be accessed from the functions msm.form.qoutput or msm.form.eoutput, or from the object returned by the print function, in the same tidy matrix form. The old print method is still available as "printold.msm". o Analytic derivatives available for most hidden Markov models and models with censored states (excluding unknown initial state probabilities, constraints on misclassification / categorical outcome probabilities and their covariates, and truncated or measurement error distributions). This should speed up optimisation with the BFGS or CG methods. The corresponding Fisher information matrix is also available for misclassification (categorical/identity outcome) and censored state models. o The BFGS optimisation method is now the default, rather than Nelder-Mead. o The internal code that deals with reading the data and passing it to models has been rewritten to use formulae, model frames and model matrices more efficiently. As a result the "data" component of msm objects now has a different structure. The data can be extracted with the new model.frame() and model.matrix() methods for msm objects. Also see help(recreate.olddata) for a utility to get the old (undocumented) format back, but this will not be supported in the long term. o New methods (draic.msm, drlcv.msm) for comparing models with differently-aggregated states. Thanks to Howard Thom. o Parallel processing supported for bootstrapping and bootstrap confidence intervals (ci="boot"), if the "doParallel" package is installed. o If msm is called with hessian=FALSE, then the Fisher (expected) information is used to obtain standard errors and CIs, though this is only available for non-hidden and misclassification models. This may be preferable if the observed Hessian is very intensive to approximate. o Optimisation code tidied, making it easier to add new methods. As an example, the "bobyqa" algorithm, a fast derivative-free method, is now supported if the "minqa" package is installed. o Give informative warning for initial outcomes in HMMs which are impossible for given initial state probabilites and outcome models. o Internal centering of "timeperiod" covariates around their means for inhomogeneous models specified with "pci" is now done consistently with other covariates, by omitting subjects' last observations before calculating the mean, since they don't contribute to the likelihood. Therefore for these models, the initial values (with "covariates centered around their means in the data") and outputs for covariates="mean", have a very slightly different meaning from previous versions. o When calculating the likelihood for hidden Markov or censoring models, P matrices are not recalculated when the same one occurs more than once. This may speed up some models. o Test suite tidied up and converted to use "testthat" package. o Data consistency check added to crudeinits.msm(). o Bug fix for misclassification models with constraints on baseline misclassification probabilities and fixed parameters. o Bug fix for bootstrap CIs with efpt.msm o Miscellaneous minor bug fixes, see Changelog. Version 1.3.1 (2014-04-04) -------------- o R-forge only release. o Time-dependent covariates supported in totlos.msm. o New function envisits.msm() for expected number of visits to each state over a period, calculated as a corollary of totlos.msm(). o New utility "msm2Surv" to export data from msm format to counting process format for use with the survival and mstate packages. This assumes the exact transition times of the process are known. o More informative messages from model fits which have not converged. In particular, a warning is now given when the optimiser iteration limit was reached without convergence, which previously happened silently. o Miscellaneous minor bug fixes, see Changelog. Version 1.3 (2014-01-15) ------------- o CRAN release. Includes the changes below from R-forge versions 1.2.1 up to 1.2.7, plus: o Fix of bug introduced in 1.2.3 which broke models with non-standard state ordering. o Datasets now lazy loaded so data() not required. o New "start" argument to efpt.msm, allowing averaging over a set of starting states. Version 1.2.7 (2013-10-07) ------------- o R-forge only release o Fix of bug for logLik.msm with by.subject=TRUE. Version 1.2.6 (2013-09-13) ------------- o R-forge only release o Row numbers reported in error message about different states at the same time corrected to account for missing data. Thanks to Lucy Leigh for the report. o An informative error is now shown if trying to use gen.inits with a hidden Markov model, and it is now documented that this is not supported. Version 1.2.5 (2013-07-30) ------------- o R-forge only release o Analytic formula for totlos.msm implemented, which is vastly more efficient than the numerical integration used previously. Debugging outputs left in 1.2.3 also removed. o Matrix exponentials, in MatrixExp and non-analytic likelihood calculations, are now calculated using expm from the expm package by default. As a result msm now depends on the expm package. Version 1.2.4 (2013-07-23) ------------- o R-forge only release o Range constraints can now be given for HMM outcome parameters, through a new argument "hranges" to msm. This may improve HMM identifiability. Version 1.2.3 (2013-06-06) ------------- o R-forge only release o New interface for easily specifiying different covariates for each transition intensity, through a named list in the "covariates" argument to msm. Previously this required "fixedpars". o Major restructuring of the internal code, mainly so that parameters are adjusted for covariates in R rather than C. There should be no differences visible to the user. o Initial state occupancy probabilities are estimated on the multivariate logit scale, not univariate, and confidence intervals are calculated using a simulation-based method (with 10000 simulations, so there will be a small Monte Carlo error). o When centering covariates around their means for the default likelihood calculation, the means used are now after dropping missing values and subjects with one observation, not before. Thanks to Howard Thom for the report. o Relatedly, the covariate values for subjects' last observations are not included in this mean, since they don't contribute to the likelihood, so interpretation of initial values for the qmatrix, and outputs for covariates="mean", will now be very slightly different. o Bug fix in totlos.msm: calculations were wrong for fromt > 0. o Memory bug in Viterbi, which could crash R, fixed. Version 1.2.2 (2013-05-21) ------------- o R-forge only release o Can now examine subject-specific -2 log likelihoods at the maximum likelihood estimates, via logLik.msm(). o The state can now be a factor with levels (1:nstates), as well as numeric. Previously supplying a factor state led to unpredictable behaviour and potential crashes. Version 1.2.1 (2013-05-16) ------------- o R-forge only release o A matrix of fixed patient-specific initial state distributions can now be supplied as "initprobs" in hidden Markov models. Version 1.2 (2013-05-14) ----------- o Implemented accurate p-value for the Pearson-type test from Titman (Lifetime Data Analysis, 2009). Non-hidden Markov models for pure panel data only. o A Fisher scoring algorithm can now be used to maximise the likelihood for panel data without censored / hidden states. Thanks to Andrew Titman for help with this. o New function efpt.msm for expected first passage times for time-homogeneous models. o prevalence.msm now produces expected values by integrating model predictions over the covariate histories observed in the data, if 'covariates="population"' is supplied. This is the default, but the old behaviour is available by supplying fixed covariates in the "covariates" argument. o In prevalence.msm and plot.prevalence.msm, subjects reaching the absorbing state can be removed from the risk set after they have reached an optional censoring time. Thanks to Andrew Titman. o Newly user-accessible function simfitted.msm for simulating from a model defined by the estimates from a model fitted in msm. o Subjects with only one observation are dropped from the data stored in fitted model objects. This gives more accurate numbers at risk in prevalence.msm. o Arguments can be passed through summary.msm to prevalence.msm. o pmatrix.piecewise.msm allows time-homogeneous models with change point vector "times" of length 0. o Fixes for bugs in the the Pearson test introduced in 0.9.5. o Misclassification models where some off-diagonal misclassification probabilities are 1 are now handled properly. Thanks to Howard Thom for uncovering this. o Bug fix for interp="midpoint" method in calculation of observed prevalences (prevalence.msm). Thanks to Erica Liu. o Bug fix for Viterbi algorithm with obstrue. Thanks to Linda Sharples. Version 1.1.4 (2012-12-10) ------------- o Minor modification of package tests to enable R CMD check to pass with the forthcoming release of mvtnorm. Version 1.1.3 (2012-09-28) ------------- o Bug fix: qmatrix.msm and ematrix.msm were returning inaccurate delta method standard errors / CIs with center=FALSE, covariates and user-supplied covariate values. Thanks to Vikki O'Neill for the report. o Use BFGS method for one-parameter optimisation unless method supplied explicitly, avoiding warning about unreliability of Nelder-Mead. Version 1.1.2 (2012-07-31) ------------- o New Student t distribution for hidden Markov model outcomes. Thanks to Darren Gillis. o Removed debugging browser which had been inadvertently left in pearson.msm. Thanks to Chyi-Hung Hsu. o Corrected equation 5 in the PDF manual for the likelihood under exact transition times. The code was unaffected. Thanks to Simon Bond. Version 1.1.1 (2012-05-11) ------------- o Fix of bug in calculation of confidence intervals using "ci=normal". Affected models were those with fixed parameters or HMMs. Users are advised to check their results with the corrected package - apologies. o If user supplies an ematrix with all misclassification probabilities zero, this degrades gracefully to a non-misclassification model. Thanks to Sharareh Taghipour for the report. o Bug fix for error messages when model inconsistent with data, and when subject IDs not adjacent. Thanks to Kelly Williams-Sieg for the report. o Bug fix in pearson.msm for models where transitions are only allowed from one state. Thanks to Gavin Chan for the report. o qtnorm fixed for p=0 or 1 and upper < lower. Thanks to Art Owen for the report. Version 1.1 (2011-09-09) ------------- o New function "pnext.msm" to compute a matrix of probabilities for the next state of the process. o New "[" method to intuitively extract a row and column of matrix-based estimates and confidence intervals, for example qmatrix.msm(x)[1,2] o Miscellaneous doc and minor bug fixes, see Changelog. Version 1.0.1 (2011-05-26) ------------- o Fix of a bug which made pmatrix.msm break for time-inhomogeneous models with non-integer time cut points "pci". Thanks to Christos Argyropoulos for the report. o Return -Inf in dtnorm when outside truncation bounds and log=TRUE. Version 1.0 (2010-11-24) ------------- o 1.0 release to accompany the forthcoming Journal of Statistical Software paper about msm. o Line types, colours and widths can be configured in plotprog.msm, plot.survfit.msm and plot.prevalence.msm. o Added warning for multiple observations at the same time on the same person with different states, which leads to zero likelihood and the dreaded "cannot be evaluated at initial values" message. o If center=FALSE, the $Qmatrices$baseline, $Ematrices$baseline and $sojourn components of msm objects are evaluated with covariate values of 0, for consistency with "logbaseline". Documentation and printed output corrected accordingly. These issues caused problems with viterbi.msm. Thanks to Kenneth Gundersen for the report. Version 0.9.7 (2010-05-18) ------------- o Bug fixes for bootstrapping with totlos, covariates on HMM outcomes and fixedpars. Thanks to Li Su for the report. Version 0.9.6 (2010-02-09) ------------- o Fix of a bug which caused occasional wrong likelihood calculations for models with "exacttimes". Thanks to Brian Tom for the report. o Fix for "NA in probability vector" error in pearson.msm. Thanks to Wen-Wen Yang for the report. Version 0.9.5 (2009-11-25) ------------- o Fix for a bug in pearson.msm triggered by a change in R version 2.10.0, which caused all expected values to be returned as zero. Thanks to Brian Tom for the report. Version 0.9.4 (2009-11-13) ------------- o Bug fix for calculation error in scoreresid.msm. Thanks to Aidan O'Keeffe for the report. o Options to MatrixExp for calculating the matrix exponential can be passed through from pmatrix.msm and pmatrix.piecewise.msm. Thanks to Peter Adamson for the suggestion. o Missing data handling bug fixes, in particular, crudeinits.msm and gen.inits no longer give errors if there are missing values in the subject, time or state variable. o Other minor bug fixes, see ChangeLog. Version 0.9.3 (2009-08-20) ------------- o Bug fix - estimates of covariate effects in matrices outputted by msm were ordered wrongly in models with "qconstraint". Thanks to Brian Tom for the report. o Bug fix - "gradient in optim evaluated to wrong length" was still affecting certain models with fixed parameters. Thanks to Aidan O'Keeffe for the report. o Fix to pearson.msm for R versions >= 2.9.1 ("replacement has 0 rows" error) Version 0.9.2 (2009-07-07) ------------- o Bug fix for models with fixed parameters fitted using optimisation methods with derivatives ("BFGS"), which failed with the error "gradient in optim evaluated to wrong length". Thanks to Isaac Dinner for the report. Version 0.9.1 (2009-06-12) ------------- o Minor update to the test suite to allow build on Fedora / Red Hat Linux. Version 0.9 (2009-06-09) ----------- o Time-inhomogeneous models fitted with the "pci" argument to msm are now fully supported in all output functions. pmatrix.msm can now compute transition probabilities over any given time interval for time-inhomogeneous models fitted with "pci". A new argument "t1" to pmatrix.msm specifies the starting time, while "t" still specifies the interval length. All functions which call on pmatrix.msm, such as plot.msm, plot.survfit.msm, prevalence.msm and totlos.msm, now account for time-inhomogeneity in models fitted using "pci". o Extractor functions are now more tolerant. If a list of covariate values is supplied, unknown covariates are ignored and covariates with unspecified values are set to zero. Factor values can be specified either by factor levels or by 0/1 contrasts. o Bug fix - score residuals were being calculated wrongly for models with covariates. o Derivatives are now used in the optimisation by default (use.deriv=TRUE) for optimisation methods such as BFGS which employ them. o Licence clarified as GPL-2 or later, to enable packaging of msm for Fedora/Red Hat Linux. Version 0.8.2 (2009-04-08) ------------- o Bug fix - extractor functions were not being calculated for models with interactions between covariates. o Sources for the PDF manual included in the source package, to enable inclusion of msm in Debian GNU/Linux. Version 0.8.1 (2008-07-25) ------------- o New option "pci" to msm, which automatically constructs a model with piecewise-constant transition intensities which change at the supplied times. o The HMM outcome model is assumed to apply to censored states in HMMs, unless obstrue = 1. o totlos.msm now calculates total length of stay for all states, not just transient states. New argument "end" added. o Bug fix in the likelihood calculation for data containing a mixture of obstype = 1 and obstype = 2. Thanks to Peter Jepsen for uncovering this. Version 0.8 (2008-03-28) ------------- o New function "pearson.msm" implementing the Pearson-type goodness-of-fit test for multi-state models fitted to panel data (Aguirre-Hernandez and Farewell, Statistics in Medicine 2002; Titman and Sharples, Statistics in Medicine 2007). Thanks to Andrew Titman for his work on this. o New function "scoreresid.msm" to compute and plot score residuals for detecting influential subjects. o New function "plotprog.msm" to plot Kaplan-Meier estimates of time to first occurrence of each state. o New function "plot.survfit.msm" to plot Kaplan-Meier estimate of survival probabilty compared with the fitted survival probability from a model. o New convenience function "lrtest.msm" for comparing a set of models with likelihood ratio tests. o logLik method returns the log-likelihood, not the minus log-likelihood, for consistency with methods in other packages. Thanks to Jay Rotella. o msm now depends on the "survival" package. o Data "heart" renamed to "cav" to avoid clashing with the dataset in the "survival" package. Version 0.7.6 (2007-12-10) ------------- o Covariates on misclassification probabilities can now be specified in simmulti.msm. Simulation bug introduced in 0.7.5 fixed. o quantile functions (qtnorm,qmenorm,qmeunif,qpexp) made more robust for small probabilities. Version 0.7.5 (2007-11-20) ------------- o The Viterbi algorithm can now be used to impute the most likely true state for censored states, as well as for HMMs o prevalence.msm now handles models with censored states correctly, using the Viterbi algorithm to determine the observed states. o Bug fix: account for extra arguments supplied to "prevalence.msm" when producing the plot of prevalences against time. Thanks to Peter Jepsen for the report. o Bug fixes involving factor covariates in bootstrapping and qratio.msm. Thanks to Peter Jepsen. o New beta outcome distribution for hidden Markov models. Version 0.7.4 (2007-10-01) ------------- o Minor changes to satisfy the package-building tools in the new R version 2.6.0. Version 0.7.3 (2007-08-15) ------------- o Confidence intervals in various output functions can now be calculated by simulating from the asymptotic normal distribution of the maximum likelihood estimates of the Q matrix and transforming. The "ci.boot" argument in these functions has been replaced by the "ci" argument, which can take values "none", "normal" and "bootstrap". This is implemented for qmatrix.msm, ematrix.msm, sojourn.msm, qratio.msm, pmatrix.msm, pmatrix.piecewise.msm, totlos.msm and prevalence.msm. Such CIs are expected to be more accurate than the delta method, but less accurate than bootstrapping. There is a similar compromise in computation time. Thanks to Andrew Titman for the suggestion. o As a result, msm now depends on the mvtnorm package. o In prevalence.msm, observed and expected prevalences can now be plotted against time. Thanks to Andrew Titman for the suggestion. o In prevalence.msm, observed states can be interpolated using the assumption that they change at the midpoints between observation times. o Matrix exponential routines now handle matrices with complex eigenvalues. Thanks to Véronique Bouchard for uncovering the bug. o Bug fix to surface.msm for HMMs. Thanks to Michael Sweeting. o Bug fix for bootstrapping - now handles models with obstype and obstrue. Thanks to Peter Jepsen for the report. Version 0.7.2 (2007-05-31) ------------- o An error in the calculation of multinomial logistic regression probabilities has been fixed. This will change the results of misclassification models where there were both a) three or more possible classifications for a particular underlying state and b) covariates on the corresponding classification probabilities. Any changes are not expected to be substantial. o Misclassification probabilities are now estimated on a different scale during the optimisation: log relative to baseline probability, instead of on a univariate logit scale. Therefore maximum likelihood estimates for misclassification models may be very slightly different from previous versions. o Confidence intervals for probabilities are now more appropriately calculated using a delta method approximation to the variance of logit(p), instead of log(p). o New argument "initcovariates" and "initcovinits" to msm, to allow covariate effects on initial state probabilities in hidden Markov models to be estimated through multinomial logistic regression. o Initial state probabilities initialised to zero are now fixed at zero during optimisation, if initprobs is being estimated ("structural zeroes"). o New argument "obstrue" to msm, to allow some observations to be observed without error in misclassification models. o Constraints on covariate effects on transition intensities are now allowed such that some effects are equal to other effects multiplied by -1. o New option "ci.boot" to prevalence.msm. This is a helper to calculate bootstrap confidence limits for the expected prevalences using "boot.msm". o rtnorm() for sampling from the truncated normal distribution now uses the efficient rejection sampling methods by Christian Robert. Version 0.7.1 (2007-04-18) ------------- o Maintainer's email address is now chris.jackson@mrc-bsu.cam.ac.uk o msm now gives a warning when the standard errors cannot be calculated due to the Hessian at the converged "solution" being non-positive-definite. This issue had been causing a lot of user confusion. o prevalence.msm can now calculate expected prevalences for models with piecewise-constant intensities, in the same manner as pmatrix.piecewise.msm. Intensities must still be common to all individuals. o Bug fix for presentation of intensity matrices in print.msm and qmatrix.msm when center = FALSE. These had been returning matrices with covariates set to zero, when they should have been set to their means. Thanks to Ross Boylan. o Covariates on transition process which are missing at an individual's last observation are not dropped, because they are not used in the analysis. Thanks to Jonathan Williams. This has the consequence that output from prevalence.msm may be different from earlier versions (0.7 or earlier) if there are missing values in the data. Users are advised to deal with missing values in their data appropriately before using msm. o Miscellaneous other bug fixes, see ChangeLog. Version 0.7 (2006-11-21) ----------- o Initial state occupancy probabilities in hidden Markov models can now be estimated. See new argument "est.initprobs" to msm. o Bootstrap resampling is implemented. This may be used to calculate confidence intervals or standard errors for quantities such as the transition probability matrix where this was previously not possible with msm, or as an alternative to Hessian-based standard errors or the delta method for other quantities. See new function boot.msm. o Bootstrap confidence intervals can be calculated directly from pmatrix.msm and totlos.msm. o Bug fix in estimation of observed prevalences at maximum observed time. Thanks to Jeremy Penn for the report. The function has also been rewritten so that the calculation of these prevalences is now much faster. o prevalence.msm is adapted sensibly to handle data where not all individuals start at a common time. o The values of categorical (factor) covariates in output functions, such as qmatrix.msm, are now specified in an intuitive way. For example, to calculate a statistic with the categorical covariate "smoke" at the level "CURRENT", just supply list(smoke="CURRENT") as the "covariates" argument to the output function. Version 0.6.4 (2006-09-21) ------------- o Bug fix to rtnorm for vector parameters. Thanks to Jean-Baptiste Denis for the report. o Bug fix to sim.msm: multiply covariates by baseline intensities in the correct order. Thanks to Stephan Lenz for the report. Version 0.6.3 (2006-06-28) ------------- o Correction to version 0.6.2 with the references reinstated in the manual. Version 0.6.2 (2006-06-23) ------------- o The likelihood for certain transient 2, 3, 4 and 5 state models is now calculated using analytic expressions for the transition probability matrix, instead of by numerically calculating the matrix exponential. This can give big speed improvements. o Various bug fixes, including support for character subject IDs. Version 0.6.1 (2006-03-26) ------------- o Bug fix release. In Viterbi algorithm, don't ignore initial state occupancy probabilities. Thanks to Melanie Wall for reporting this. For other bug fixes see the ChangeLog. Version 0.6 (2005-11-25) ------------- o New argument "use.deriv" to msm. If TRUE, then analytic derivatives are used in the algorithm to maximise the likelihood, where an appropriate algorithm is being used, such as optim's BFGS. These derivatives are also used to calculate the Hessian at the maximum. Not supported for hidden Markov models or models with censoring. This may substantially speed up convergence, especially for larger models. o The Newton-type algorithm (Dennis and Schnabel) from the R function "nlm" can also be used to maximise the likelihood, as an alternative to the algorithms in "optim". o New function "surface.msm" to plot likelihood surfaces, for example, in the region of a suspected maximum. Includes methods for the generic R functions contour(), persp() and image(), to produce each respective type of surface plot for a "msm" object. Version 0.5.2 (2005-10-11) ------------- o Bug fix in Viterbi algorithm. It didn't handle underlying Markov models with progressive and regressive states properly. Thanks to Rochelle Watkins. o Negative binomial hidden Markov output distribution added. o Miscellaneous other bug fixes, see ChangeLog. Version 0.5.1 (2005-05-25) ------------- o Bug fix in simulation functions (sim.msm, simmulti.msm). Models with time dependent covariates were not being simulated properly, the covariate changes were not fully accounted for. Thanks to Mike Sweeting for the report. o New functions dpexp, ppexp, qpexp, rpexp for the exponential distribution with piecewise-constant rates. o Bug fix. covariates with the same names as internal msm variable names, such as "subject", "time" and "state", are now allowed. o Argument "hessian" added to msm, to avoid calculating standard errors, for example when bootstrapping. o Miscellaneous internal edits and fixes, see ChangeLog. Version 0.5 (2005-03-06) ----------- o Major update. Much of the internal R and C code has been re-written. o General continuous-time hidden Markov models can now be fitted with msm, as well as misclassification models. Allowed response distributions conditionally on the hidden state include categorical, normal, Poisson, exponential and others. See the new "hmodel" argument. Misclassification models can either be fitted in the old style using an ematrix, or using a general HMM with a categorical response distribution. Covariates can be fitted to many of the new hidden response processes via generalized regressions. See "hcovariates", "hcovinits" arguments. o Per-observation observation schemes, generalising the "exacttimes" and "death" concepts. An optional new variable in the data can specify whether each observation is a snapshot of the process, an exactly-observed transition time, or a death state. Observations are allowed to be at identical times, for example, a snapshot followed instantly by an exact transition time. o Various syntax changes for cleaner moder specification. - Instead of 0/1 indicators, qmatrix and ematrix should contain the initial values for the transition intensity / misclassification matrix. These matrices can be named with names for the states of the Markov chain. - The inits argument is abolished. Initial values are estimated automatically if the new argument to msm "gen.inits = TRUE" is supplied. This uses the initial values calculated by crudeinits.msm. - misc no longer needs to be specified if an ematrix is supplied. - fixedpars=TRUE fixes all parameters, or specific parameters can be fixed as before. - crudeinits.msm takes a state ~ time formula instead of two separate state, time arguments, for consistency with the msm function. - Initial values for covariate effects on transition rates / misclassification probabilities are assumed to be zero unless otherwise specified by the new "covinits" / "misccovinits" argument. o Support for 'from-to' style data has been withdrawn. Storing data in this format is inadvisable as it destroys the longitudinal nature of the data. o Speed improvements. The algorithm for calculating the likelihood for non-hidden multi-state models has changed so that the matrix exponential of the Q matrix is only calculated once for each time difference / covariate combination. Therefore, users should see speed improvements for data where the same from-state, to-state, time difference, covariates combination appears many times. o Confidence intervals are now presented instead of standard errors for uncertainty in parameter estimates. o New method of calculating matrix exponentials when the eigenvector matrix is not invertible. It now uses the more robust method of Pade approximants with scaling and squaring, instead of power series. Faster LAPACK routines are now used for matrix inversion. o covmatch argument to msm has been abolished. To take a time-dependent covariate value from the end of the relevant transition instead of the default start, users are expected to manipulate their data accordingly before calling msm, shifting the positions of the covariate back by one within each subject. o Syntax changes for simmulti.msm. Bug fixes --------- o The likelihood is now calculated correctly for individuals with censored intermediate states, as well as censored initial and final states. Thanks to Michael Sweeting for reporting this. o hazard.scale and odds.scale were interpreted wrongly in hazard.msm and odds.msm respectively. o time-dependent covariate values now taken from the start instead of end of the transition under hidden Markov models. Version 0.41 (2005-01-28) ------------ o Censored outcomes in misclassification models are assumed to be not subject to misclassification. o A couple of bug fixes for exact transition times. Version 0.4 (2005-01-07) ----------- o Censored observations are now supported, via new "censor" and "censor.states" arguments. A censored observation is unknown, but known to be one of a particular set of states. A major update to msm is under development, for release in the first half of 2005. This will support hidden Markov models with general response distributions. Version 0.3.3 (2004-09-18) ------------- o Maintenance release with minor fixes and enhancements ready for R-2.0.0. Version 0.3.2 (2003-03-25) ------------- o More than one death state is now permitted, through the "death" argument. Death states are those whose exact entry time is known, but the state at the previous instant before death is unknown. o The "tunit" argument has been abolished. Death times are now assumed to be exact rather than known within one day. This makes more sense since for longitudinal studies, all observations are usually recorded to within one basic time unit, not just death times. o Cleanups of the manual and minor fixes, as detailed in ChangeLog. Version 0.3.1 (2003-10-14) ------------- o Bug fix. The likelihood was being wrongly calculated in cases when both the data represent exact transition times and the transition intensity matrix had repeated eigenvalues. o The "death" argument is no longer ignored when exacttimes=TRUE, as it is reasonable to have the entry time into one state accurate to within one day, and all other times exactly accurate. o More memory problems should be fixed. Version 0.3 (2003-09-29) ------------- o Two errors in the calculation of the likelihood for a multi-state model have been corrected. These bugs affect only models with reversible transition matrices, that is, models which allow progression and regression between states. o The first bug occurred when death times were known to within one time unit (death = TRUE) - the likelihood calculation did not account for reversible states. o The second bug occurred when the data represent exact transition times (exacttimes = TRUE). The likelihood calculation did not properly account for reversible states. o Baseline transition intensities, or misclassification probabilities, can now be constrained to be equal to each other, in the same manner as covariate effects. Specified by new arguments "qconstraint" or "econstraint". o The memory allocation problems of version 0.2 have been fixed. Version 0.22 (2003-06-30) -------------- o Fixed some minor bugs, as detailed in ChangeLog. o New function, pmatrix.piecewise.msm, for calculating transition probability matrices for processes with piecewise-constant intensities. Version 0.21 (2003-06-03) -------------- o Fixed a handful of minor bugs, as detailed in ChangeLog. o Minor edits and additions to the manual. o The subject ID can now be factor or character. Version 0.2 (2003-01) ------------- o A full manual in PDF format is included in the doc directory. This gives the mathematical background behind multi-state modelling, and a tutorial in the typical use of the functions in the msm package. o Many more methods for extracting summary statistics from the fitted model are included. These are generally called with the fitted model as the argument, plus an optional argument indicating the assumed covariate values. The functions include qmatrix.msm, ematrix.msm, pmatrix.msm, qratio.msm, sojourn.msm, totlos.msm, hazard.msm, odds.msm, prevalence.msm. o New function statetable.msm to calculate frequencies of transitions between pairs of states observed in the data. o New function crudeinits.msm to estimate transition intensities assuming the data represent the exact transition times of the Markov process. These can be used as initial values in the msm function for fitting the model. o prevalencemisc.msm has been removed, as its methodology was overcomplicated and confusing. The methods used in prevalence.msm have been extended naturally to deal with misclassification models. o Fix of a bug in the likelihood calculation for misclassification models (the number of non-death states was assumed to be the same as the number of states that could be misclassified, leading to failure to calculate the likelihood for models where some states are observed without error, but are not death states. ) Thanks to Martyn Plummer for reporting this. o Fix of a bug in the simulation routines (getobs.msm, called by simmulti.msm), where for models with absorbing states, the absorbing state is not retained in the simulated data. o New heart transplant example data set, as used in the manual, so that all the examples given in the manual can be run by the user. o Tidying of the help pages. Version 0.1 (2002-11) ------------- o First release.msm/build/0000755000176200001440000000000014713146125012151 5ustar liggesusersmsm/build/vignette.rds0000644000176200001440000000034114713146125014506 0ustar liggesusers‹}QÍ‚0 0Qˆ^`'oò„‹C4ñº¸¢D6?Ao>¹XTŒNc“vÝú}í×lëBLB©AL SËÃ`£ÏÐ B‰ƒçT–r!¹ªyêGªÑªóM Û׉Ve ±¬Iªk²â‚Á‰Ë<…òOÏ\ÄZuü>z÷ÚƒFÍ7ì@qùÕ~@JtÏ×ß|£Õ(£%œQsÏùÀØO “ú¹ë¤z]¬U>S#Ò5|õÿÐïYã÷;Lºï¸`hÑôEw)/õE]Á+îÇò;Ý7ÏÝ.Ðmsm/man/0000755000176200001440000000000014713146130011621 5ustar liggesusersmsm/man/prevalence.msm.Rd0000644000176200001440000002162114534677441015050 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/prevalence.R \name{prevalence.msm} \alias{prevalence.msm} \title{Tables of observed and expected prevalences} \usage{ prevalence.msm( x, times = NULL, timezero = NULL, initstates = NULL, covariates = "population", misccovariates = "mean", piecewise.times = NULL, piecewise.covariates = NULL, ci = c("none", "normal", "bootstrap"), cl = 0.95, B = 1000, cores = NULL, interp = c("start", "midpoint"), censtime = Inf, subset = NULL, plot = FALSE, ... ) } \arguments{ \item{x}{A fitted multi-state model produced by \code{\link{msm}}.} \item{times}{Series of times at which to compute the observed and expected prevalences of states.} \item{timezero}{Initial time of the Markov process. Expected values are forecasted from here. Defaults to the minimum of the observation times given in the data.} \item{initstates}{Optional vector of the same length as the number of states. Gives the numbers of individuals occupying each state at the initial time, to be used for forecasting expected prevalences. The default is those observed in the data. These should add up to the actual number of people in the study at the start.} \item{covariates}{Covariate values for which to forecast expected state occupancy. With the default \code{covariates="population"}, expected prevalences are produced by summing model predictions over the covariates observed in the original data, for a fair comparison with the observed prevalences. This may be slow, particularly with continuous covariates. Predictions for fixed covariates can be obtained by supplying covariate values in the standard way, as in \code{\link{qmatrix.msm}}. Therefore if \code{covariates="population"} is too slow, using the mean observed values through \code{covariates="mean"} may give a reasonable approximation. This argument is ignored if \code{piecewise.times} is specified. If there are a mixture of time-constant and time-dependent covariates, then the values for all covariates should be supplied in \code{piecewise.covariates}.} \item{misccovariates}{(Misclassification models only) Values of covariates on the misclassification probability matrix for converting expected true to expected misclassified states. Ignored if \code{covariates="population"}, otherwise defaults to the mean values of the covariates in the data set.} \item{piecewise.times}{Times at which piecewise-constant intensities change. See \code{\link{pmatrix.piecewise.msm}} for how to specify this. Ignored if \code{covariates="population"}. This is only required for time-inhomogeneous models specified using explicit time-dependent covariates, and should not be used for models specified using "pci".} \item{piecewise.covariates}{Covariates on which the piecewise-constant intensities depend. See \code{\link{pmatrix.piecewise.msm}} for how to specify this. Ignored if \code{covariates="population"}.} \item{ci}{If \code{"normal"}, then calculate a confidence interval for the expected prevalences by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects, then calculating the expected prevalences for each replicate. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. If \code{"none"} (the default) then no confidence interval is calculated.} \item{cl}{Width of the symmetric confidence interval, relative to 1} \item{B}{Number of bootstrap replicates} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} \item{interp}{Suppose an individual was observed in states \eqn{S_{r-1}} and \eqn{S_r} at two consecutive times \eqn{t_{r-1}} and \eqn{t_r}, and we want to estimate 'observed' prevalences at a time \eqn{t} between \eqn{t_{r-1}} and \eqn{t_r}. If \code{interp="start"}, then individuals are assumed to be in state \eqn{S_{r-1}} at time \eqn{t}, the same state as they were at \eqn{t_{r-1}}. If \code{interp="midpoint"} then if \eqn{t <= (t_{r-1} + t_r) / 2}, the midpoint of \eqn{t_{r-1}} and \eqn{t_r}, the state at \eqn{t} is assumed to be \eqn{S_{r-1}}, otherwise \eqn{S_{r}}. This is generally more reasonable for "progressive" models.} \item{censtime}{Adjustment to the observed prevalences to account for limited follow-up in the data. If the time is greater than \code{censtime} and the patient has reached an absorbing state, then that subject will be removed from the risk set. For example, if patients have died but would only have been observed up to this time, then this avoids overestimating the proportion of people who are dead at later times. This can be supplied as a single value, or as a vector with one element per subject (after any \code{subset} has been taken), in the same order as the original data. This vector also only includes subjects with complete data, thus it excludes for example subjects with only one observation (thus no observed transitions), and subjects for whom every observation has missing values. (Note, to help construct this, the complete data used for the model fit can be accessed with \code{model.frame(x)}, where \code{x} is the fitted model object) This is ignored if it is less than the subject's maximum observation time.} \item{subset}{Subset of subjects to calculate observed prevalences for.} \item{plot}{Generate a plot of observed against expected prevalences. See \code{\link{plot.prevalence.msm}}} \item{...}{Further arguments to pass to \code{\link{plot.prevalence.msm}}.} } \value{ A list of matrices, with components: \item{Observed}{Table of observed numbers of individuals in each state at each time} \item{Observed percentages}{Corresponding percentage of the individuals at risk at each time.} \item{Expected}{Table of corresponding expected numbers.} \item{Expected percentages}{Corresponding percentage of the individuals at risk at each time.} Or if \code{ci.boot = TRUE}, the component \code{Expected} is a list with components \code{estimates} and \code{ci}.\cr \code{estimates} is a matrix of the expected prevalences, and \code{ci} is a list of two matrices, containing the confidence limits. The component \code{Expected percentages} has a similar format. } \description{ This provides a rough indication of the goodness of fit of a multi-state model, by estimating the observed numbers of individuals occupying each state at a series of times, and comparing these with forecasts from the fitted model. } \details{ The fitted transition probability matrix is used to forecast expected prevalences from the state occupancy at the initial time. To produce the expected number in state \eqn{j} at time \eqn{t} after the start, the number of individuals under observation at time \eqn{t} (including those who have died, but not those lost to follow-up) is multiplied by the product of the proportion of individuals in each state at the initial time and the transition probability matrix in the time interval \eqn{t}. The proportion of individuals in each state at the "initial" time is estimated, if necessary, in the same way as the observed prevalences. For misclassification models (fitted using an \code{ematrix}), this aims to assess the fit of the full model for the \emph{observed} states. That is, the combined Markov progression model for the true states and the misclassification model. Thus, expected prevalences of \emph{true} states are estimated from the assumed proportion occupying each state at the initial time using the fitted transition probabiliy matrix. The vector of expected prevalences of true states is then multiplied by the fitted misclassification probability matrix to obtain the expected prevalences of \emph{observed} states. For general hidden Markov models, the observed state is taken to be the predicted underlying state from the Viterbi algorithm (\code{\link{viterbi.msm}}). The goodness of fit of these states to the underlying Markov model is tested. In any model, if there are censored states, then these are replaced by imputed values of highest probability from the Viterbi algorithm in order to calculate the observed state prevalences. For an example of this approach, see Gentleman \emph{et al.} (1994). } \references{ Gentleman, R.C., Lawless, J.F., Lindsey, J.C. and Yan, P. Multi-state Markov models for analysing incomplete disease history data with illustrations for HIV disease. \emph{Statistics in Medicine} (1994) 13(3): 805--821. Titman, A.C., Sharples, L. D. Model diagnostics for multi-state models. \emph{Statistical Methods in Medical Research} (2010) 19(6):621-651. } \seealso{ \code{\link{msm}}, \code{\link{summary.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/simmulti.msm.Rd0000644000176200001440000001437614471426252014570 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/simul.R \name{simmulti.msm} \alias{simmulti.msm} \title{Simulate multiple trajectories from a multi-state Markov model with arbitrary observation times} \usage{ simmulti.msm( data, qmatrix, covariates = NULL, death = FALSE, start, ematrix = NULL, misccovariates = NULL, hmodel = NULL, hcovariates = NULL, censor.states = NULL, drop.absorb = TRUE ) } \arguments{ \item{data}{A data frame with a mandatory column named \code{time}, representing observation times. The optional column named \code{subject}, corresponds to subject identification numbers. If not given, all observations are assumed to be on the same individual. Observation times should be sorted within individuals. The optional column named \code{cens} indicates the times at which simulated states should be censored. If \code{cens==0} then the state is not censored, and if \code{cens==k}, say, then all simulated states at that time which are in the set \code{censor.states} are replaced by \code{k}. Other named columns of the data frame represent any covariates, which may be time-constant or time-dependent. Time-dependent covariates are assumed to be constant between the observation times.} \item{qmatrix}{The transition intensity matrix of the Markov process, with any covariates set to zero. The diagonal of \code{qmatrix} is ignored, and computed as appropriate so that the rows sum to zero. For example, a possible \code{qmatrix} for a three state illness-death model with recovery is: \code{rbind( c( 0, 0.1, 0.02 ), c( 0.1, 0, 0.01 ), c( 0, 0, 0 ) )}} \item{covariates}{List of linear covariate effects on log transition intensities. Each element is a vector of the effects of one covariate on all the transition intensities. The intensities are ordered by reading across rows of the intensity matrix, starting with the first, counting the positive off-diagonal elements of the matrix. For example, for a multi-state model with three transition intensities, and two covariates \code{x} and \code{y} on each intensity, \code{covariates=list(x = c(-0.3,-0.3,-0.3), y=c(0.1, 0.1, 0.1))}} \item{death}{Vector of indices of the death states. A death state is an absorbing state whose time of entry is known exactly, but the individual is assumed to be in an unknown transient state ("alive") at the previous instant. This is the usual situation for times of death in chronic disease monitoring data. For example, if you specify \code{death = c(4, 5)} then states 4 and 5 are assumed to be death states. \code{death = TRUE} indicates that the final state is a death state, and \code{death = FALSE} (the default) indicates that there is no death state.} \item{start}{A vector with the same number of elements as there are distinct subjects in the data, giving the states in which each corresponding individual begins. Or a single number, if all of these are the same. Defaults to state 1 for each subject.} \item{ematrix}{An optional misclassification matrix for generating observed states conditionally on the simulated true states. As defined in \code{\link{msm}}.} \item{misccovariates}{Covariate effects on misclassification probabilities via multinomial logistic regression. Linear effects operate on the log of each probability relative to the probability of classification in the correct state. In same format as \code{covariates}.} \item{hmodel}{An optional hidden Markov model for generating observed outcomes conditionally on the simulated true states. As defined in \code{\link{msm}}. Multivariate outcomes (\code{hmmMV}) are not supported.} \item{hcovariates}{List of the same length as \code{hmodel}, defining any covariates governing the hidden Markov outcome models. Unlike in the \code{msm} function, this should also define the values of the covariate effects. Each element of the list is a named vector of the initial values for each set of covariates for that state. For example, for a three-state hidden Markov model with two, one and no covariates on the state 1, 2 and 3 outcome models respectively, \code{ hcovariates = list (c(acute=-8, age=0), c(acute=-8), NULL) }} \item{censor.states}{Set of simulated states which should be replaced by a censoring indicator at censoring times. By default this is all transient states (representing alive, with unknown state).} \item{drop.absorb}{Drop repeated observations in the absorbing state, retaining only one.} } \value{ A data frame with columns, \item{subject}{Subject identification indicators} \item{time}{Observation times} \item{state}{Simulated (true) state at the corresponding time} \item{obs}{Observed outcome at the corresponding time, if \code{ematrix} or \code{hmodel} was supplied} \item{keep}{Row numbers of the original data. Useful when \code{drop.absorb=TRUE}, to show which rows were not dropped} plus any supplied covariates. } \description{ Simulate a number of individual realisations from a continuous-time Markov process. Observations of the process are made at specified arbitrary times for each individual, giving panel-observed data. } \details{ \code{\link{sim.msm}} is called repeatedly to produce a simulated trajectory for each individual. The state at each specified observation time is then taken to produce a new column \code{state}. The effect of time-dependent covariates on the transition intensity matrix for an individual is determined by assuming that the covariate is a step function which remains constant in between the individual's observation times. If the subject enters an absorbing state, then only the first observation in that state is kept in the data frame. Rows corresponding to future observations are deleted. The entry times into states given in \code{death} are assumed to be known exactly. } \examples{ ### Simulate 100 individuals with common observation times sim.df <- data.frame(subject = rep(1:100, rep(13,100)), time = rep(seq(0, 24, 2), 100)) qmatrix <- rbind(c(-0.11, 0.1, 0.01 ), c(0.05, -0.15, 0.1 ), c(0.02, 0.07, -0.09)) simmulti.msm(sim.df, qmatrix) } \seealso{ \code{\link{sim.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{datagen} msm/man/msm2Surv.Rd0000644000176200001440000001362614527460370013666 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mstate.R \name{msm2Surv} \alias{msm2Surv} \title{Convert data for `msm' to data for `survival', `mstate' or `flexsurv' analysis} \usage{ msm2Surv(data, subject, time, state, covs = NULL, Q) } \arguments{ \item{data}{Data frame in the format expected by a \code{\link{msm}} model fit with \code{exacttimes=TRUE} or all \code{obstype=2}. Each row represents an observation of a state, and the time variable contains the exact and complete transition times of the underlying process. This is explained in more detail in the help page for \code{\link{msm}}, section \code{obstype=2}.} \item{subject}{Name of the subject ID in the data (character format, i.e. quoted).} \item{time}{Name of the time variable in the data (character).} \item{state}{Name of the state variable in the data (character).} \item{covs}{Vector of covariate names to carry through (character). If not supplied, this is taken to be all remaining variables in the data.} \item{Q}{Transition intensity matrix. This should have number of rows and number of columns both equal to the number of states. If an instantaneous transition is not allowed from state \eqn{r} to state \eqn{s}, then \code{Q} should have \eqn{(r,s)} entry 0, otherwise it should be non-zero. The diagonal entries are ignored.} } \value{ A data frame of class \code{"msdata"}, with rows representing observed or censored transitions. There will be one row for each observed transition in the original data, and additional rows for every potential transition that could have occurred out of each observed state. The data frame will have columns called: \item{id}{Subject ID} \item{from}{Starting state of the transition} \item{to}{Finishing state of the transition} \item{Tstart}{The starting time of the transition} \item{Tstop}{The finishing time of the transition} \item{time}{The time difference = \code{Tstop} - \code{Tstart}} \item{status}{Event or censoring indicator, with 1 indicating an observed transition, and 0 indicating censoring} \item{trans}{Transition number} and any remaining columns will represent covariates. Any covariates whose names clash with the standard variables in the returned data (\code{"id"}, \code{"from"}, \code{"to"}, \code{"Tstart"}, \code{"Tstop"}, \code{"time"}, \code{"status"} or \code{"trans"}) have \code{".2"} appended to their names. The transition matrix in \pkg{mstate} format is stored in the \code{trans} attribute of the returned object. See the example code below. } \description{ Converts longitudinal data for a \code{\link{msm}} model fit, where observations represent the exact transition times of the process, to counting process data. This enables, for example, flexible parametric multi-state models to be fitted with \code{\link[flexsurv]{flexsurvreg}} from the \pkg{flexsurv} package, or semiparametric models to be implemented with \code{\link[survival]{coxph}} and the \pkg{mstate} package. } \details{ For example, if the data supplied to \code{\link{msm}} look like this: \tabular{lllll}{ \code{subj} \tab \code{days} \tab \code{status} \tab \code{age} \tab \code{treat} \cr 1\tab 0\tab 1 \tab 66\tab 1\cr 1\tab 27\tab 2 \tab 66\tab 1\cr 1\tab 75\tab 3 \tab 66\tab 1\cr 1\tab 97\tab 4 \tab 66\tab 1\cr 1\tab 1106\tab 4 \tab 69\tab 1\cr 2\tab 0\tab 1 \tab 49\tab 0\cr 2\tab 90\tab 2 \tab 49\tab 0\cr 2\tab 1037\tab 2 \tab 51\tab 0\cr } then the output of \code{\link{msm2Surv}} will be a data frame looking like this: \tabular{lllllllllll}{ \code{id} \tab \code{from} \tab \code{to} \tab \code{Tstart} \tab \code{Tstop} \tab \code{time} \tab \code{status} \tab \code{age} \tab \code{treat} \tab \code{trans}\cr 1 \tab 1 \tab 2 \tab 0 \tab 27 \tab 27 \tab 1 \tab 66 \tab 1 \tab 1\cr 1 \tab 1 \tab 4 \tab 0 \tab 27 \tab 27 \tab 0 \tab 66 \tab 1 \tab 2\cr 1 \tab 2 \tab 3 \tab 27 \tab 75 \tab 48 \tab 1 \tab 66 \tab 1 \tab 3\cr 1 \tab 2 \tab 4 \tab 27 \tab 75 \tab 48 \tab 0 \tab 66 \tab 1 \tab 4\cr 1 \tab 3 \tab 4 \tab 75 \tab 97 \tab 22 \tab 1 \tab 69 \tab 1 \tab 5\cr 2 \tab 1 \tab 2 \tab 0 \tab 90 \tab 90 \tab 1 \tab 49 \tab 0 \tab 1\cr 2 \tab 1 \tab 4 \tab 0 \tab 90 \tab 90 \tab 0 \tab 49 \tab 0 \tab 2\cr 2 \tab 2 \tab 3 \tab 90 \tab 1037 \tab 947 \tab 0 \tab 49 \tab 0 \tab 3\cr 2 \tab 2 \tab 4 \tab 90 \tab 1037 \tab 947 \tab 0\tab 49 \tab 0 \tab 4\cr } At 27 days, subject 1 is observed to move from state 1 to state 2 (first row, status 1), which means that their potential transition from state 1 to state 4 is censored (second row, status 0). See the \pkg{mstate} package and the references below for more details of this data format and using it for semi-parametric multi-state modelling. } \examples{ msmdat <- data.frame( subj = c(1, 1, 1, 1, 1, 2, 2, 2), days = c(0, 27, 75, 97, 1106, 0, 90, 1037), status = c(1, 2, 3, 4, 4, 1, 2, 2), age = c(66, 66, 66, 66, 69, 49, 49, 51), treat = c(1, 1, 1, 1, 1, 0, 0, 0) ) # transitions only allowed to next state up or state 4 Q <- rbind(c(1, 1, 0, 1), c(0, 1, 1, 1), c(0, 0, 1, 1), c(0, 0, 0, 0)) dat <- msm2Surv(data=msmdat, subject="subj", time="days", state="status", Q=Q) dat attr(dat, "trans") } \references{ Putter H, Fiocco M, Geskus RB (2007). Tutorial in biostatistics: Competing risks and multi-state models. \emph{Statistics in Medicine} 26: 2389-2430. Liesbeth C. de Wreede, Marta Fiocco, Hein Putter (2011). \pkg{mstate}: An R Package for the Analysis of Competing Risks and Multi-State Models. \emph{Journal of Statistical Software}, 38(7), 1-30. Jackson, C. H. (2014). flexsurv: Flexible parametric survival and multi-state models. R package version 0.5. } \seealso{ \code{\link[mstate]{msprep}}, in \pkg{mstate}, which produces data in a similar format, given data in "wide" format with one row per subject. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } msm/man/msm.form.qoutput.Rd0000644000176200001440000000333614534677442015413 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/print.R \name{msm.form.qoutput} \alias{msm.form.qoutput} \alias{msm.form.eoutput} \title{Extract msm model parameter estimates in compact format} \usage{ msm.form.qoutput(x, covariates = "mean", cl = 0.95, digits = 4, ...) msm.form.eoutput(x, covariates = "mean", cl = 0.95, digits = 4, ...) } \arguments{ \item{x}{A fitted multi-state model object, as returned by \code{\link{msm}}.} \item{covariates}{Covariate values defining the "baseline" parameters (see \code{\link{qmatrix.msm}}).} \item{cl}{Width of the symmetric confidence interval to present. Defaults to 0.95.} \item{digits}{Minimum number of significant digits for the formatted character matrix returned as an attribute. This is passed to \code{\link{format}}. Defaults to 4.} \item{...}{Other arguments to be passed to \code{\link{format}}.} } \value{ A numeric matrix with one row per transition, and one column for each estimate or confidence limit. The \code{"formatted"} attribute contains the same results formatted for pretty printing. \code{msm.form.qoutput} returns the transition intensities and their covariates, and \code{msm.form.eoutput} returns the misclassification probabilities and their covariates. } \description{ Extract estimates and confidence intervals for transition intensities (or misclassification probabilities), and their covariate effects, in a tidy matrix format with one row per transition. This is used by the print method (\code{\link{print.msm}}) for \code{msm} objects. Covariate effects are returned as hazard or odds ratios, not on the log scale. } \seealso{ \code{\link{print.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/updatepars.msm.Rd0000644000176200001440000000264014471426252015064 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/boot.R \name{updatepars.msm} \alias{updatepars.msm} \title{Update the maximum likelihood estimates in a fitted model object.} \usage{ updatepars.msm(x, pars) } \arguments{ \item{x}{A fitted multi-state model object, as returned by \code{\link{msm}}.} \item{pars}{Vector of new parameters, in their untransformed real-line parameterisations, to substitute for the maximum likelihood estimates corresponding to those in the \code{estimates} component of the fitted model object (\code{\link{msm.object}}). The order of the parameters is documented in \code{\link{msm}}, argument \code{fixedpars}.} } \value{ An updated \code{\link{msm}} model object with the updated maximum likelihood estimates, but with the covariances / standard errors unchanged. Point estimates from output functions such as \code{\link{qmatrix.msm}}, \code{\link{pmatrix.msm}}, or any related function, can then be evaluated with the new parameters, and at arbitrary covariate values. This function is used, for example, when computing confidence intervals from \code{\link{pmatrix.msm}}, and related functions, using the \code{ci="normal"} method. } \description{ Update the maximum likelihood estimates in a fitted model object. Intended for developer use only. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/hmm-dists.Rd0000644000176200001440000002106514535132372014026 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hmm-dists.R \name{hmm-dists} \alias{hmm-dists} \alias{hmmCat} \alias{hmmIdent} \alias{hmmUnif} \alias{hmmNorm} \alias{hmmLNorm} \alias{hmmExp} \alias{hmmGamma} \alias{hmmWeibull} \alias{hmmPois} \alias{hmmBinom} \alias{hmmTNorm} \alias{hmmMETNorm} \alias{hmmMEUnif} \alias{hmmNBinom} \alias{hmmBetaBinom} \alias{hmmBeta} \alias{hmmT} \title{Hidden Markov model constructors} \usage{ hmmCat(prob, basecat) hmmIdent(x) hmmUnif(lower, upper) hmmNorm(mean, sd) hmmLNorm(meanlog, sdlog) hmmExp(rate) hmmGamma(shape, rate) hmmWeibull(shape, scale) hmmPois(rate) hmmBinom(size, prob) hmmBetaBinom(size, meanp, sdp) hmmNBinom(disp, prob) hmmBeta(shape1, shape2) hmmTNorm(mean, sd, lower = -Inf, upper = Inf) hmmMETNorm(mean, sd, lower, upper, sderr, meanerr = 0) hmmMEUnif(lower, upper, sderr, meanerr = 0) hmmT(mean, scale, df) } \arguments{ \item{prob}{(\code{hmmCat}) Vector of probabilities of observing category \code{1, 2, \dots{}, length(prob)} respectively. Or the probability governing a binomial or negative binomial distribution.} \item{basecat}{(\code{hmmCat}) Category which is considered to be the "baseline", so that during estimation, the probabilities are parameterised as probabilities relative to this baseline category. By default, the category with the greatest probability is used as the baseline.} \item{x}{(\code{hmmIdent}) Code in the data which denotes the exactly-observed state.} \item{lower}{(\code{hmmUnif,hmmTNorm,hmmMEUnif}) Lower limit for an Uniform or truncated Normal distribution.} \item{upper}{(\code{hmmUnif,hmmTNorm,hmmMEUnif}) Upper limit for an Uniform or truncated Normal distribution.} \item{mean}{(\code{hmmNorm,hmmLNorm,hmmTNorm}) Mean defining a Normal, or truncated Normal distribution.} \item{sd}{(\code{hmmNorm,hmmLNorm,hmmTNorm}) Standard deviation defining a Normal, or truncated Normal distribution.} \item{meanlog}{(\code{hmmNorm,hmmLNorm,hmmTNorm}) Mean on the log scale, for a log Normal distribution.} \item{sdlog}{(\code{hmmNorm,hmmLNorm,hmmTNorm}) Standard deviation on the log scale, for a log Normal distribution.} \item{rate}{(\code{hmmPois,hmmExp,hmmGamma}) Rate of a Poisson, Exponential or Gamma distribution (see \code{\link{dpois}}, \code{\link{dexp}}, \code{\link{dgamma}}).} \item{shape}{(\code{hmmPois,hmmExp,hmmGamma}) Shape parameter of a Gamma or Weibull distribution (see \code{\link{dgamma}}, \code{\link{dweibull}}).} \item{scale}{(\code{hmmGamma}) Scale parameter of a Gamma distribution (see \code{\link{dgamma}}), or unstandardised Student t distribution.} \item{size}{Order of a Binomial distribution (see \code{\link{dbinom}}).} \item{meanp}{Mean outcome probability in a beta-binomial distribution} \item{sdp}{Standard deviation describing the overdispersion of the outcome probability in a beta-binomial distribution} \item{disp}{Dispersion parameter of a negative binomial distribution, also called \code{size} or \code{order}. (see \code{\link{dnbinom}}).} \item{shape1, shape2}{First and second parameters of a beta distribution (see \code{\link{dbeta}}).} \item{sderr}{(\code{hmmMETNorm,hmmUnif}) Standard deviation of the Normal measurement error distribution.} \item{meanerr}{(\code{hmmMETNorm,hmmUnif}) Additional shift in the measurement error, fixed to 0 by default. This may be modelled in terms of covariates.} \item{df}{Degrees of freedom of the Student t distribution.} } \value{ Each function returns an object of class \code{hmmdist}, which is a list containing information about the model. The only component which may be useful to end users is \code{r}, a function of one argument \code{n} which returns a random sample of size \code{n} from the given distribution. } \description{ These functions are used to specify the distribution of the response conditionally on the underlying state in a hidden Markov model. A list of these function calls, with one component for each state, should be used for the \code{hmodel} argument to \code{msm}. The initial values for the parameters of the distribution should be given as arguments. Note the initial values should be supplied as literal values - supplying them as variables is currently not supported. } \details{ \code{hmmCat} represents a categorical response distribution on the set \code{1, 2, \dots{}, length(prob)}. The Markov model with misclassification is an example of this type of model. The categories in this case are (some subset of) the underlying states. The \code{hmmIdent} distribution is used for underlying states which are observed exactly without error. For hidden Markov models with multiple outcomes, (see \code{\link{hmmMV}}), the outcome in the data which takes the special \code{hmmIdent} value must be the first of the multiple outcomes. \code{hmmUnif}, \code{hmmNorm}, \code{hmmLNorm}, \code{hmmExp}, \code{hmmGamma}, \code{hmmWeibull}, \code{hmmPois}, \code{hmmBinom}, \code{hmmTNorm}, \code{hmmNBinom} and \code{hmmBeta} represent Uniform, Normal, log-Normal, exponential, Gamma, Weibull, Poisson, Binomial, truncated Normal, negative binomial and beta distributions, respectively, with parameterisations the same as the default parameterisations in the corresponding base R distribution functions. \code{hmmT} is the Student t distribution with general mean \eqn{\mu}{mu}, scale \eqn{\sigma}{sigma} and degrees of freedom \code{df}. The variance is \eqn{\sigma^2 df/(df + 2)}{sigma^2 df/(df + 2)}. Note the t distribution in base R \code{\link{dt}} is a standardised one with mean 0 and scale 1. These allow any positive (integer or non-integer) \code{df}. By default, all three parameters, including \code{df}, are estimated when fitting a hidden Markov model, but in practice, \code{df} might need to be fixed for identifiability - this can be done using the \code{fixedpars} argument to \code{\link{msm}}. The \code{hmmMETNorm} and \code{hmmMEUnif} distributions are truncated Normal and Uniform distributions, but with additional Normal measurement error on the response. These are generalisations of the distributions proposed by Satten and Longini (1996) for modelling the progression of CD4 cell counts in monitoring HIV disease. See \code{\link{medists}} for density, distribution, quantile and random generation functions for these distributions. See also \code{\link{tnorm}} for density, distribution, quantile and random generation functions for the truncated Normal distribution. See the PDF manual \file{msm-manual.pdf} in the \file{doc} subdirectory for algebraic definitions of all these distributions. New hidden Markov model response distributions can be added to \pkg{msm} by following the instructions in Section 2.17.1. Parameters which can be modelled in terms of covariates, on the scale of a link function, are as follows. \tabular{ll}{ PARAMETER NAME \tab LINK FUNCTION \cr \code{mean} \tab identity \cr \code{meanlog} \tab identity \cr \code{rate} \tab log \cr \code{scale} \tab log \cr \code{meanerr} \tab identity \cr \code{meanp} \tab logit \cr \code{prob} \tab logit or multinomial logit } Parameters \code{basecat, lower, upper, size, meanerr} are fixed at their initial values. All other parameters are estimated while fitting the hidden Markov model, unless the appropriate \code{fixedpars} argument is supplied to \code{msm}. For categorical response distributions \code{(hmmCat)} the outcome probabilities initialized to zero are fixed at zero, and the probability corresponding to \code{basecat} is fixed to one minus the sum of the remaining probabilities. These remaining probabilities are estimated, and can be modelled in terms of covariates via multinomial logistic regression (relative to \code{basecat}). } \references{ Satten, G.A. and Longini, I.M. Markov chains with measurement error: estimating the 'true' course of a marker of the progression of human immunodeficiency virus disease (with discussion) \emph{Applied Statistics} 45(3): 275-309 (1996). Jackson, C.H. and Sharples, L.D. Hidden Markov models for the onset and progresison of bronchiolitis obliterans syndrome in lung transplant recipients \emph{Statistics in Medicine}, 21(1): 113--128 (2002). Jackson, C.H., Sharples, L.D., Thompson, S.G. and Duffy, S.W. and Couto, E. Multi-state Markov models for disease progression with classification error. \emph{The Statistician}, 52(2): 193--209 (2003). } \seealso{ \code{\link{msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{distribution} msm/man/plot.prevalence.msm.Rd0000644000176200001440000000752514534677442016035 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/prevalence.R \name{plot.prevalence.msm} \alias{plot.prevalence.msm} \title{Plot of observed and expected prevalences} \usage{ \method{plot}{prevalence.msm}( x, mintime = NULL, maxtime = NULL, timezero = NULL, initstates = NULL, interp = c("start", "midpoint"), censtime = Inf, subset = NULL, covariates = "population", misccovariates = "mean", piecewise.times = NULL, piecewise.covariates = NULL, xlab = "Times", ylab = "Prevalence (\%)", lwd.obs = 1, lwd.exp = 1, lty.obs = 1, lty.exp = 2, col.obs = "blue", col.exp = "red", legend.pos = NULL, ... ) } \arguments{ \item{x}{A fitted multi-state model produced by \code{\link{msm}}.} \item{mintime}{Minimum time at which to compute the observed and expected prevalences of states.} \item{maxtime}{Maximum time at which to compute the observed and expected prevalences of states.} \item{timezero}{Initial time of the Markov process. Expected values are forecasted from here. Defaults to the minimum of the observation times given in the data.} \item{initstates}{Optional vector of the same length as the number of states. Gives the numbers of individuals occupying each state at the initial time, to be used for forecasting expected prevalences. The default is those observed in the data. These should add up to the actual number of people in the study at the start.} \item{interp}{Interpolation method for observed states, see \code{\link{prevalence.msm}}.} \item{censtime}{Subject-specific maximum follow-up times, see \code{\link{prevalence.msm}}.} \item{subset}{Vector of the subject identifiers to calculated observed prevalences for.} \item{covariates}{Covariate values for which to forecast expected state occupancy. See \code{\link{prevalence.msm}} --- if this function runs too slowly, as it may if there are continuous covariates, replace \code{covariates="population"} with \code{covariates="mean"}.} \item{misccovariates}{(Misclassification models only) Values of covariates on the misclassification probability matrix. See \code{\link{prevalence.msm}}.} \item{piecewise.times}{Times at which piecewise-constant intensities change. See \code{\link{prevalence.msm}}.} \item{piecewise.covariates}{Covariates on which the piecewise-constant intensities depend. See \code{\link{prevalence.msm}}.} \item{xlab}{x axis label.} \item{ylab}{y axis label.} \item{lwd.obs}{Line width for observed prevalences. See \code{\link{par}}.} \item{lwd.exp}{Line width for expected prevalences. See \code{\link{par}}.} \item{lty.obs}{Line type for observed prevalences. See \code{\link{par}}.} \item{lty.exp}{Line type for expected prevalences. See \code{\link{par}}.} \item{col.obs}{Line colour for observed prevalences. See \code{\link{par}}.} \item{col.exp}{Line colour for expected prevalences. See \code{\link{par}}.} \item{legend.pos}{Vector of the \eqn{x} and \eqn{y} position, respectively, of the legend.} \item{...}{Further arguments to be passed to the generic \code{\link{plot}} function.} } \description{ Provides a rough indication of goodness of fit of a multi-state model, by estimating the observed numbers of individuals occupying a state at a series of times, and plotting these against forecasts from the fitted model, for each state. Observed prevalences are indicated as solid lines, expected prevalences as dashed lines. } \details{ See \code{\link{prevalence.msm}} for details of the assumptions underlying this method. Observed prevalences are plotted with a solid line, and expected prevalences with a dotted line. } \references{ Gentleman, R.C., Lawless, J.F., Lindsey, J.C. and Yan, P. Multi-state Markov models for analysing incomplete disease history data with illustrations for HIV disease. \emph{Statistics in Medicine} (1994) 13(3): 805--821. } \seealso{ \code{\link{prevalence.msm}} } \keyword{models} msm/man/statetable.msm.Rd0000644000176200001440000000325114471426252015043 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/msm.R \name{statetable.msm} \alias{statetable.msm} \title{Table of transitions} \usage{ statetable.msm(state, subject, data = NULL) } \arguments{ \item{state}{Observed states, assumed to be ordered by time within each subject.} \item{subject}{Subject identification numbers corresponding to \code{state}. If not given, all observations are assumed to be on the same subject.} \item{data}{An optional data frame in which the variables represented by \code{subject} and \code{state} can be found.} } \value{ A frequency table with starting states as rows and finishing states as columns. } \description{ Calculates a frequency table counting the number of times each pair of states were observed in successive observation times. This can be a useful way of summarising multi-state data. } \details{ If the data are intermittently observed (panel data) this table should not be used to decide what transitions should be allowed in the \eqn{Q} matrix, which works in continuous time. This function counts the transitions between states over a time interval, not in real time. There can be observed transitions between state \eqn{r} and \eqn{s} over an interval even if \eqn{q_{rs}=0}, because the process may have passed through one or more intermediate states in the middle of the interval. } \examples{ ## Heart transplant data data(cav) ## 148 deaths from state 1, 48 from state 2 and 55 from state 3. statetable.msm(state, PTNUM, data=cav) } \seealso{ \code{\link{crudeinits.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/printold.msm.Rd0000644000176200001440000000126414534677442014561 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/print.R \name{printold.msm} \alias{printold.msm} \title{Print a fitted msm model object} \usage{ printold.msm(x, ...) } \arguments{ \item{x}{Output from \code{\link{msm}}, representing a fitted multi-state model object.} \item{...}{Other arguments to be passed to \code{\link{format}}.} } \description{ Print a fitted msm model object (in old format, from msm 1.3.1 and earlier) } \details{ See \code{\link{print.msm}} for a better and cleaner output format, and an explanation of the change. } \seealso{ \code{\link{print.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/plot.survfit.msm.Rd0000644000176200001440000001347414471426252015402 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{plot.survfit.msm} \alias{plot.survfit.msm} \title{Plot empirical and fitted survival curves} \usage{ \method{plot}{survfit.msm}( x, from = 1, to = NULL, range = NULL, covariates = "mean", interp = c("start", "midpoint"), ci = c("none", "normal", "bootstrap"), B = 100, legend.pos = NULL, xlab = "Time", ylab = "Survival probability", lty = 1, lwd = 1, col = "red", lty.ci = 2, lwd.ci = 1, col.ci = "red", mark.time = TRUE, col.surv = "blue", lty.surv = 2, lwd.surv = 1, survdata = FALSE, ... ) } \arguments{ \item{x}{Output from \code{\link{msm}}, representing a fitted multi-state model object.} \item{from}{Non-absorbing state from which to consider survival. Defaults to state 1. The fitted probabilities will then be calculated as the transition probabilities from this state to \code{to}. The empirical survival curve plots survival from the first observation of \code{from} (where this exists) to the first entry time into \code{to}.} \item{to}{Absorbing state to consider. Defaults to the highest-labelled absorbing state.} \item{range}{Vector of two elements, giving the range of times to plot for.} \item{covariates}{Covariate values for which to evaluate the expected probabilities. This can either be:\cr the string \code{"mean"}, denoting the means of the covariates in the data (this is the default),\cr the number \code{0}, indicating that all the covariates should be set to zero,\cr or a list of values, with optional names. For example \code{list (60, 1)} where the order of the list follows the order of the covariates originally given in the model formula, or a named list, \code{list (age = 60, sex = 1)} but note the empirical curve is plotted for the full population. To consider subsets for the empirical curve, set \code{survdata=TRUE} to extract the survival data and build a survival plot by hand using \code{\link[survival]{plot.survfit}}.} \item{interp}{If \code{interp="start"} (the default) then the entry time into the absorbing state is assumed to be the time it is first observed in the data. If \code{interp="midpoint"} then the entry time into the absorbing state is assumed to be halfway between the time it is first observed and the previous observation time. This is generally more reasonable for "progressive" models with observations at arbitrary times.} \item{ci}{If \code{"none"} (the default) no confidence intervals are plotted. If \code{"normal"} or \code{"bootstrap"}, confidence intervals are plotted based on the respective method in \code{\link{pmatrix.msm}}. This is very computationally-intensive, since intervals must be computed at a series of times.} \item{B}{Number of bootstrap or normal replicates for the confidence interval. The default is 100 rather than the usual 1000, since these plots are for rough diagnostic purposes.} \item{legend.pos}{Vector of the \eqn{x} and \eqn{y} position, respectively, of the legend.} \item{xlab}{x axis label.} \item{ylab}{y axis label.} \item{lty}{Line type for the fitted curve. See \code{\link{par}}.} \item{lwd}{Line width for the fitted curve. See \code{\link{par}}.} \item{col}{Colour for the fitted curve. See \code{\link{par}}.} \item{lty.ci}{Line type for the fitted curve confidence limits. See \code{\link{par}}.} \item{lwd.ci}{Line width for the fitted curve confidence limits. See \code{\link{par}}.} \item{col.ci}{Colour for the fitted curve confidence limits. See \code{\link{par}}.} \item{mark.time}{Mark the empirical survival curve at each censoring point, see \code{\link[survival]{lines.survfit}}.} \item{col.surv}{Colour for the empirical survival curve, passed to \code{\link[survival]{lines.survfit}}. See \code{\link{par}}.} \item{lty.surv}{Line type for the empirical survival curve, passed to \code{\link[survival]{lines.survfit}}. See \code{\link{par}}.} \item{lwd.surv}{Line width for the empirical survival curve, passed to \code{\link[survival]{lines.survfit}}. See \code{\link{par}}.} \item{survdata}{Set to \code{TRUE} to return the survival data frame constructed when plotting the empirical curve. This can be used for constructing survival plots by hand using \code{\link[survival]{plot.survfit}}.} \item{...}{Other arguments to be passed to the \code{\link{plot}} function which draws the fitted curve, or the \code{\link[survival]{lines.survfit}} function which draws the empirical curve.} } \description{ Plot a Kaplan-Meier estimate of the survival probability and compare it with the fitted survival probability from a \code{msm} model. } \details{ If the data represent observations of the process at arbitrary times, then the first occurrence of the absorbing state in the data will usually be greater than the actual first transition time to that state. Therefore the Kaplan-Meier estimate of the survival probability will be an overestimate. The method of Turnbull (1976) could be used to give a non-parametric estimate of the time to an interval-censored event, and compared to the equivalent estimate from a multi-state model. This is implemented in the CRAN package \pkg{interval} (Fay and Shaw 2010). This currently only handles time-homogeneous models. } \references{ Turnbull, B. W. (1976) The empirical distribution function with arbitrarily grouped, censored and truncated data. J. R. Statist. Soc. B 38, 290-295. Fay, MP and Shaw, PA (2010). Exact and Asymptotic Weighted Logrank Tests for Interval Censored Data: The interval R package. Journal of Statistical Software. http://www.jstatsoft.org/v36/ i02/. 36 (2):1-34. } \seealso{ \code{\link[survival]{survfit}}, \code{\link[survival]{plot.survfit}}, \code{\link{plot.prevalence.msm}} } \keyword{models} msm/man/aneur.Rd0000644000176200001440000000366714527611346013247 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets_doc.R \docType{data} \name{aneur} \alias{aneur} \title{Aortic aneurysm progression data} \format{ A data frame containing 4337 rows, with each row corresponding to an ultrasound scan from one of 838 men over 65 years of age. \tabular{rll}{ \code{ptnum} \tab (numeric) \tab Patient identification number \cr \code{age} \tab (numeric) \tab Recipient age at examination (years) \cr \code{diam} \tab (numeric) \tab Aortic diameter\cr \code{state} \tab (numeric) \tab State of aneurysm. \cr } The states represent successive degrees of aneurysm severity, as indicated by the aortic diameter. \tabular{rll}{ State 1 \tab Aneurysm-free \tab < 30 cm \cr State 2 \tab Mild aneurysm \tab 30-44 cm \cr State 3 \tab Moderate aneurysm \tab 45-54 cm \cr State 4 \tab Severe aneurysm \tab > 55 cm \cr } 683 of these men were aneurysm-free at age 65 and were re-screened every two years. The remaining men were aneurysmal at entry and had successive screens with frequency depending on the state of the aneurysm. Severe aneurysms are repaired by surgery. } \source{ The Chichester, U.K. randomised controlled trial of screening for abdominal aortic aneurysms by ultrasonography. } \description{ This dataset contains longitudinal measurements of grades of aortic aneurysms, measured by ultrasound examination of the diameter of the aorta. } \references{ Jackson, C.H., Sharples, L.D., Thompson, S.G. and Duffy, S.W. and Couto, E. Multi-state Markov models for disease progression with classification error. \emph{The Statistician}, 52(2): 193--209 (2003) Couto, E. and Duffy, S. W. and Ashton, H. A. and Walker, N. M. and Myles, J. P. and Scott, R. A. P. and Thompson, S. G. (2002) \emph{Probabilities of progression of aortic aneurysms: estimates and implications for screening policy} Journal of Medical Screening 9(1):40--42 } \keyword{datasets} msm/man/qratio.msm.Rd0000644000176200001440000000647614471426252014226 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{qratio.msm} \alias{qratio.msm} \title{Estimated ratio of transition intensities} \usage{ qratio.msm( x, ind1, ind2, covariates = "mean", ci = c("delta", "normal", "bootstrap", "none"), cl = 0.95, B = 1000, cores = NULL ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{ind1}{Pair of numbers giving the indices in the intensity matrix of the numerator of the ratio, for example, \code{c(1,2)}.} \item{ind2}{Pair of numbers giving the indices in the intensity matrix of the denominator of the ratio, for example, \code{c(2,1)}.} \item{covariates}{The covariate values at which to estimate the intensities. This can either be:\cr the string \code{"mean"}, denoting the means of the covariates in the data (this is the default),\cr the number \code{0}, indicating that all the covariates should be set to zero,\cr or a list of values, with optional names. For example \code{list (60, 1)} where the order of the list follows the order of the covariates originally given in the model formula, or a named list, \code{list (age = 60, sex = 1)}} \item{ci}{If \code{"delta"} (the default) then confidence intervals are calculated by the delta method. If \code{"normal"}, then calculate a confidence interval by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects, then transforming. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}.} \item{cl}{Width of the symmetric confidence interval to present. Defaults to 0.95.} \item{B}{Number of bootstrap replicates, or number of normal simulations from the distribution of the MLEs} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} } \value{ A named vector with elements \code{estimate}, \code{se}, \code{L} and \code{U} containing the estimate, standard error, lower and upper confidence limits, respectively, of the ratio of intensities. } \description{ Compute the estimate and approximate standard error of the ratio of two estimated transition intensities from a fitted multi-state model at a given set of covariate values. } \details{ For example, we might want to compute the ratio of the progression rate and recovery rate for a fitted model \code{disease.msm} with a health state (state 1) and a disease state (state 2). In this case, the progression rate is the (1,2) entry of the intensity matrix, and the recovery rate is the (2,1) entry. Thus to compute this ratio with covariates set to their means, we call \code{qratio.msm(disease.msm, c(1,2), c(2,1))} . Standard errors are estimated by the delta method. Confidence limits are estimated by assuming normality on the log scale. } \seealso{ \code{\link{qmatrix.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/pnext.msm.Rd0000644000176200001440000000652714471426252014062 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{pnext.msm} \alias{pnext.msm} \title{Probability of each state being next} \usage{ pnext.msm( x, covariates = "mean", ci = c("normal", "bootstrap", "delta", "none"), cl = 0.95, B = 1000, cores = NULL ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{covariates}{The covariate values at which to estimate the intensities. This can either be:\cr the string \code{"mean"}, denoting the means of the covariates in the data (this is the default),\cr the number \code{0}, indicating that all the covariates should be set to zero,\cr or a list of values, with optional names. For example \code{list (60, 1)} where the order of the list follows the order of the covariates originally given in the model formula, or a named list, \code{list (age = 60, sex = 1)}} \item{ci}{If \code{"normal"} (the default) then calculate a confidence interval by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects, then transforming. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. If \code{"delta"} then confidence intervals are calculated based on the delta method SEs of the log rates, but this is not recommended since it may not respect the constraint that probabilities are less than one.} \item{cl}{Width of the symmetric confidence interval to present. Defaults to 0.95.} \item{B}{Number of bootstrap replicates, or number of normal simulations from the distribution of the MLEs.} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} } \value{ The matrix of probabilities that the next move of a process in state \eqn{r} (rows) is to state \eqn{s} (columns). } \description{ Compute a matrix of the probability of each state \eqn{s} being the next state of the process after each state \eqn{r}. Together with the mean sojourn times in each state (\code{\link{sojourn.msm}}), these fully define a continuous-time Markov model. } \details{ For a continuous-time Markov process in state \eqn{r}, the probability that the next state is \eqn{s} is \eqn{-q_{rs} / q_{rr}}, where \eqn{q_{rs}} is the transition intensity (\code{\link{qmatrix.msm}}). A continuous-time Markov model is fully specified by these probabilities together with the mean sojourn times \eqn{-1/q_{rr}} in each state \eqn{r}. This gives a more intuitively meaningful description of a model than the intensity matrix. Remember that \pkg{msm} deals with continuous-time, not discrete-time models, so these are \emph{not} the same as the probability of observing state \eqn{s} at a fixed time in the future. Those probabilities are given by \code{\link{pmatrix.msm}}. } \seealso{ \code{\link{qmatrix.msm}},\code{\link{pmatrix.msm}},\code{\link{qratio.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/lrtest.msm.Rd0000644000176200001440000000233114471426252014226 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{lrtest.msm} \alias{lrtest.msm} \title{Likelihood ratio test} \usage{ lrtest.msm(...) } \arguments{ \item{...}{Two or more fitted multi-state models, as returned by \code{\link{msm}}, ordered by increasing numbers of parameters.} } \value{ A matrix with three columns, giving the likelihood ratio statistic, difference in degrees of freedom and the chi-squared p-value for a comparison of the first model supplied with each subsequent model. } \description{ Likelihood ratio test between two or more fitted multi-state models } \section{Warning}{ The comparison between models will only be valid if they are fitted to the same dataset. This may be a problem if there are missing values and R's default of 'na.action = na.omit' is used. The likelihood ratio statistic only has the indicated chi-squared distribution if the models are nested. An alternative for comparing non-nested models is Akaike's information criterion. This can be computed for one or more fitted \code{msm} models \code{x,y,...} using \code{\link{AIC}(x,y,...)}. } \seealso{ \code{\link{logLik.msm}},\code{\link{msm}} } \keyword{models} msm/man/pexp.Rd0000644000176200001440000000625614527612011013074 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pexp.R \name{pexp} \alias{pexp} \alias{dpexp} \alias{ppexp} \alias{qpexp} \alias{rpexp} \title{Exponential distribution with piecewise-constant rate} \usage{ dpexp(x, rate = 1, t = 0, log = FALSE) ppexp(q, rate = 1, t = 0, lower.tail = TRUE, log.p = FALSE) qpexp(p, rate = 1, t = 0, lower.tail = TRUE, log.p = FALSE) rpexp(n = 1, rate = 1, t = 0, start = min(t)) } \arguments{ \item{x, q}{vector of quantiles.} \item{rate}{vector of rates.} \item{t}{vector of the same length as \code{rate}, giving the times at which the rate changes. The values of \code{t} should be in increasing order.} \item{log, log.p}{logical; if TRUE, probabilities p are given as log(p), or log density is returned.} \item{lower.tail}{logical; if TRUE (default), probabilities are P[X <= x], otherwise, P[X > x].} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} \item{start}{numeric scalar; delayed entry time. The random deviates will be left truncated from this start time.} } \value{ \code{dpexp} gives the density, \code{ppexp} gives the distribution function, \code{qpexp} gives the quantile function, and \code{rpexp} generates random deviates. } \description{ Density, distribution function, quantile function and random generation for a generalisation of the exponential distribution, in which the rate changes at a series of times. } \details{ Consider the exponential distribution with rates \eqn{r_1, \ldots, }{r1,\dots, rn}\eqn{ r_n}{r1,\dots, rn} changing at times \eqn{t_1, \ldots, t_n}{t1, \dots, tn}, with \eqn{t_1 = 0}{t1 = 0}. Suppose \eqn{t_k}{tk} is the maximum \eqn{t_i}{ti} such that \eqn{t_i < x}{ti < x}. The density of this distribution at \eqn{x > 0} is \eqn{f(x)} for \eqn{k = 1}, and \deqn{\prod_{i=1}^k (1 - F(t_{i} - t_{i-1}, r_i)) f(x - t_{k}, r_{k})}{\prod{i=1 \dots k} (1 - F(ti - t{i-1}, r{i-1})) f(x - tk, rk)} for k > 1. where \eqn{F()} and \eqn{f()} are the distribution and density functions of the standard exponential distribution. If \code{rate} is of length 1, this is just the standard exponential distribution. Therefore, for example, \code{dpexp(x)}, with no other arguments, is simply equivalent to \code{dexp(x)}. Only \code{rpexp} is used in the \code{msm} package, to simulate from Markov processes with piecewise-constant intensities depending on time-dependent covariates. These functions are merely provided for completion, and are not optimized for numerical stability or speed. } \examples{ x <- seq(0.1, 50, by=0.1) rate <- c(0.1, 0.2, 0.05, 0.3) t <- c(0, 10, 20, 30) ## standard exponential distribution plot(x, dexp(x, 0.1), type="l") ## distribution with piecewise constant rate lines(x, dpexp(x, rate, t), type="l", lty=2) ## standard exponential distribution plot(x, pexp(x, 0.1), type="l") ## distribution with piecewise constant rate lines(x, ppexp(x, rate, t), type="l", lty=2) } \seealso{ \code{\link{dexp}}, \code{\link{sim.msm}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{distribution} msm/man/medists.Rd0000644000176200001440000001407414527612011013565 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/medists.R \name{medists} \alias{medists} \alias{dmenorm} \alias{pmenorm} \alias{qmenorm} \alias{rmenorm} \alias{dmeunif} \alias{pmeunif} \alias{qmeunif} \alias{rmeunif} \title{Measurement error distributions} \usage{ dmenorm( x, mean = 0, sd = 1, lower = -Inf, upper = Inf, sderr = 0, meanerr = 0, log = FALSE ) pmenorm( q, mean = 0, sd = 1, lower = -Inf, upper = Inf, sderr = 0, meanerr = 0, lower.tail = TRUE, log.p = FALSE ) qmenorm( p, mean = 0, sd = 1, lower = -Inf, upper = Inf, sderr = 0, meanerr = 0, lower.tail = TRUE, log.p = FALSE ) rmenorm(n, mean = 0, sd = 1, lower = -Inf, upper = Inf, sderr = 0, meanerr = 0) dmeunif(x, lower = 0, upper = 1, sderr = 0, meanerr = 0, log = FALSE) pmeunif( q, lower = 0, upper = 1, sderr = 0, meanerr = 0, lower.tail = TRUE, log.p = FALSE ) qmeunif( p, lower = 0, upper = 1, sderr = 0, meanerr = 0, lower.tail = TRUE, log.p = FALSE ) rmeunif(n, lower = 0, upper = 1, sderr = 0, meanerr = 0) } \arguments{ \item{x, q}{vector of quantiles.} \item{mean}{vector of means.} \item{sd}{vector of standard deviations.} \item{lower}{lower truncation point.} \item{upper}{upper truncation point.} \item{sderr}{Standard deviation of measurement error distribution.} \item{meanerr}{Optional shift for the measurement error distribution.} \item{log, log.p}{logical; if TRUE, probabilities \eqn{p} are given as \eqn{\log(p)}{log(p)}, or log density is returned.} \item{lower.tail}{logical; if TRUE (default), probabilities are \eqn{P[X <= x]}, otherwise, \eqn{P[X > x]}.} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} } \value{ \code{dmenorm}, \code{dmeunif} give the density, \code{pmenorm}, \code{pmeunif} give the distribution function, \code{qmenorm}, \code{qmeunif} give the quantile function, and \code{rmenorm}, \code{rmeunif} generate random deviates, for the Normal and Uniform versions respectively. } \description{ Truncated Normal and Uniform distributions, where the response is also subject to a Normally distributed measurement error. } \details{ The normal distribution with measurement error has density \deqn{ \frac{\Phi(u, \mu_2, \sigma_3) - \Phi(l, \mu_2, \sigma_3)}{\Phi(u, \mu_2, \sigma_3) - \Phi(l, \mu_2, \sigma_3)} \phi(x, \mu_0 + \mu_\epsilon, \sigma_2)}{(Phi(upper, mu2, sigma3) - Phi(lower, mu2, sigma3)) / (Phi(upper, mean, sd) - Phi(lower, mean, sd)) * phi(x, mean + meanerr, sigma2)} where \deqn{\sigma_2^2 = \sigma_0^2 + \sigma_\epsilon^2,}{sigma2*sigma2 = sd*sd + sderr*sderr,} \deqn{\sigma_3 = \sigma_0 \sigma_\epsilon / \sigma_2,}{sigma3 = sd*sderr / sigma2,} \deqn{\mu_2 = (x - \mu_\epsilon) \sigma_0^2 + \mu_0 \sigma_\epsilon^2, }{mu2 = (x - meanerr)*sd*sd + mean*sderr*sderr,} \eqn{\mu_0}{mean} is the mean of the original Normal distribution before truncation, \cr \eqn{\sigma_0}{sd} is the corresponding standard deviation, \cr \eqn{u} is the upper truncation point, \cr \eqn{l} is the lower truncation point, \cr \eqn{\sigma_\epsilon}{sderr} is the standard deviation of the additional measurement error, \cr \eqn{\mu_\epsilon}{meanerr} is the mean of the measurement error (usually 0). \cr \eqn{\phi(x)}{phi(x)} is the density of the corresponding normal distribution, and \cr \eqn{\Phi(x)}{Phi(x)} is the distribution function of the corresponding normal distribution. The uniform distribution with measurement error has density \deqn{(\Phi(x, \mu_\epsilon+l, \sigma_\epsilon) - \Phi(x, \mu_\epsilon+u, \sigma_\epsilon)) }{(Phi(x, meanerr+l, sderr) - Phi(x, meanerr+u, sderr)) / (upper - lower)}\deqn{ / (u - l)}{(Phi(x, meanerr+l, sderr) - Phi(x, meanerr+u, sderr)) / (upper - lower)} These are calculated from the original truncated Normal or Uniform density functions \eqn{f(. | \mu, \sigma, l, u)}{f(. | mu, sd)} as \deqn{ \int f(y | \mu, \sigma, l, u) \phi(x, y + \mu_\epsilon, \sigma_\epsilon) dy }{ \int f(y | mu, sd, l, u) \phi(x, y + meanerr, sderr) dy } If \code{sderr} and \code{meanerr} are not specified they assume the default values of 0, representing no measurement error variance, and no constant shift in the measurement error, respectively. Therefore, for example with no other arguments, \code{dmenorm(x)}, is simply equivalent to \code{dtnorm(x)}, which in turn is equivalent to \code{dnorm(x)}. These distributions were used by Satten and Longini (1996) for CD4 cell counts conditionally on hidden Markov states of HIV infection, and later by Jackson and Sharples (2002) for FEV1 measurements conditionally on states of chronic lung transplant rejection. These distribution functions are just provided for convenience, and are not optimised for numerical accuracy or speed. To fit a hidden Markov model with these response distributions, use a \code{\link{hmmMETNorm}} or \code{\link{hmmMEUnif}} constructor. See the \code{\link{hmm-dists}} help page for further details. } \examples{ ## what does the distribution look like? x <- seq(50, 90, by=1) plot(x, dnorm(x, 70, 10), type="l", ylim=c(0,0.06)) ## standard Normal lines(x, dtnorm(x, 70, 10, 60, 80), type="l") ## truncated Normal ## truncated Normal with small measurement error lines(x, dmenorm(x, 70, 10, 60, 80, sderr=3), type="l") } \references{ Satten, G.A. and Longini, I.M. Markov chains with measurement error: estimating the 'true' course of a marker of the progression of human immunodeficiency virus disease (with discussion) \emph{Applied Statistics} 45(3): 275-309 (1996) Jackson, C.H. and Sharples, L.D. Hidden Markov models for the onset and progression of bronchiolitis obliterans syndrome in lung transplant recipients \emph{Statistics in Medicine}, 21(1): 113--128 (2002). } \seealso{ \code{\link{dnorm}}, \code{\link{dunif}}, \code{\link{dtnorm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{distribution} msm/man/cav.Rd0000644000176200001440000000400514527611346012671 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets_doc.R \docType{data} \name{cav} \alias{cav} \title{Heart transplant monitoring data} \format{ A data frame containing 2846 rows. There are 622 patients, the rows are grouped by patient number and ordered by years after transplant, with each row representing an examination and containing additional covariates. \tabular{rll}{ \code{PTNUM} \tab (numeric) \tab Patient identification number \cr \code{age} \tab (numeric) \tab Recipient age at examination (years) \cr \code{years} \tab (numeric) \tab Examination time (years after transplant)\cr \code{dage} \tab (numeric) \tab Age of heart donor (years) \cr \code{sex} \tab (numeric) \tab sex (0=male, 1=female) \cr \code{pdiag} \tab (factor) \tab Primary diagnosis (reason for transplant) \cr \tab \tab IHD=ischaemic heart disease, IDC=idiopathic dilated cardiomyopathy. \cr \code{cumrej} \tab (numeric) \tab Cumulative number of acute rejection episodes \cr \code{state} \tab (numeric) \tab State at the examination. \cr \tab \tab State 1 represents no CAV, state 2 is mild/moderate CAV \cr \tab \tab and state 3 is severe CAV. State 4 indicates death. \cr \code{firstobs} \tab (numeric) \tab 0 = record represents an angiogram or date of death.\cr \tab \tab 1 = record represents transplant (patient's first observation) \cr \code{statemax} \tab (numeric) \tab Maximum observed state so far for this patient (added in version 1.5.1) } } \source{ Papworth Hospital, U.K. } \description{ A series of approximately yearly angiographic examinations of heart transplant recipients. The state at each time is a grade of cardiac allograft vasculopathy (CAV), a deterioration of the arterial walls. } \references{ Sharples, L.D. and Jackson, C.H. and Parameshwar, J. and Wallwork, J. and Large, S.R. (2003). Diagnostic accuracy of coronary angiopathy and risk factors for post-heart-transplant cardiac allograft vasculopathy. Transplantation 76(4):679-82 } \keyword{datasets} msm/man/logLik.msm.Rd0000644000176200001440000000175014471426252014136 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{logLik.msm} \alias{logLik.msm} \title{Extract model log-likelihood} \usage{ \method{logLik}{msm}(object, by.subject = FALSE, ...) } \arguments{ \item{object}{A fitted multi-state model object, as returned by \code{\link{msm}}.} \item{by.subject}{Return vector of subject-specific log-likelihoods, which should sum to the total log-likelihood.} \item{...}{(unused) further arguments passed to or from other methods.} } \value{ The log-likelihood of the model represented by 'object' evaluated at the maximum likelihood estimates. Akaike's information criterion can also be computed using \code{\link{AIC}(object)}. } \description{ Extract the log-likelihood and the number of parameters of a model fitted with \code{\link{msm}}. } \seealso{ \code{\link{msm}},\code{\link{lrtest.msm}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/ematrix.msm.Rd0000644000176200001440000000671614471426252014375 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{ematrix.msm} \alias{ematrix.msm} \title{Misclassification probability matrix} \usage{ ematrix.msm( x, covariates = "mean", ci = c("delta", "normal", "bootstrap", "none"), cl = 0.95, B = 1000, cores = NULL ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}} \item{covariates}{The covariate values for which to estimate the misclassification probability matrix. This can either be:\cr the string \code{"mean"}, denoting the means of the covariates in the data (this is the default),\cr the number \code{0}, indicating that all the covariates should be set to zero,\cr or a list of values, with optional names. For example \code{list (60, 1)} where the order of the list follows the order of the covariates originally given in the model formula, or a named list, \code{list (age = 60, sex = 1)}} \item{ci}{If \code{"delta"} (the default) then confidence intervals are calculated by the delta method, or by simple transformation of the Hessian in the very simplest cases. If \code{"normal"}, then calculate a confidence interval by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the multinomial-logit-transformed misclassification probabilities and covariate effects, then transforming back. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}.} \item{cl}{Width of the symmetric confidence interval to present. Defaults to 0.95.} \item{B}{Number of bootstrap replicates, or number of normal simulations from the distribution of the MLEs} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} } \value{ A list with components: \item{estimate}{Estimated misclassification probability matrix. The rows correspond to true states, and columns observed states.} \item{SE}{Corresponding approximate standard errors.} \item{L}{Lower confidence limits.} \item{U}{Upper confidence limits.} Or if \code{ci="none"}, then \code{ematrix.msm} just returns the estimated misclassification probability matrix. The default print method for objects returned by \code{\link{ematrix.msm}} presents estimates and confidence limits. To present estimates and standard errors, do something like \code{ematrix.msm(x)[c("estimates","SE")]} } \description{ Extract the estimated misclassification probability matrix, and corresponding confidence intervals, from a fitted multi-state model at a given set of covariate values. } \details{ Misclassification probabilities and covariate effects are estimated on the multinomial-logit scale by \code{\link{msm}}. A covariance matrix is estimated from the Hessian of the maximised log-likelihood. From these, the delta method can be used to obtain standard errors of the probabilities on the natural scale at arbitrary covariate values. Confidence intervals are estimated by assuming normality on the multinomial-logit scale. } \seealso{ \code{\link{qmatrix.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/simfitted.msm.Rd0000644000176200001440000000422414471426252014704 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/simul.R \name{simfitted.msm} \alias{simfitted.msm} \title{Simulate from a Markov model fitted using msm} \usage{ simfitted.msm(x, drop.absorb = TRUE, drop.pci.imp = TRUE) } \arguments{ \item{x}{A fitted multi-state model object as returned by \code{\link{msm}}.} \item{drop.absorb}{Should repeated observations in an absorbing state be omitted. Use the default of \code{TRUE} to avoid warnings when using the simulated dataset for further \code{\link{msm}} fits. Or set to \code{FALSE} if exactly the same number of observations as the original data are needed.} \item{drop.pci.imp}{In time-inhomogeneous models fitted using the \code{pci} option to \code{\link{msm}}, censored observations are inserted into the data by \code{\link{msm}} at the times where the intensity changes, but dropped by default when simulating from the fitted model using this function. Set this argument to \code{FALSE} to keep these observations and the corresponding indicator variable.} } \value{ A dataset with variables as described in \code{\link{simmulti.msm}}. } \description{ Simulate a dataset from a Markov model fitted using \code{\link{msm}}, using the maximum likelihood estimates as parameters, and the same observation times as in the original data. } \details{ This function is a wrapper around \code{\link{simmulti.msm}}, and only simulates panel-observed data. To generate datasets with the exact times of transition, use the lower-level \code{\link{sim.msm}}. Markov models with misclassified states fitted through the \code{ematrix} option to \code{\link{msm}} are supported, but not general hidden Markov models with \code{hmodel}. For misclassification models, this function includes misclassification in the simulated states. This function is used for parametric bootstrapping to estimate the null distribution of the test statistic in \code{\link{pearson.msm}}. } \seealso{ \code{\link{simmulti.msm}}, \code{\link{sim.msm}}, \code{\link{pearson.msm}}, \code{\link{msm}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/tidy.msm.prevalence.Rd0000644000176200001440000000131014534654016016002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidy.R \name{tidy.msm.prevalence} \alias{tidy.msm.prevalence} \title{Tidy the output of prevalence.msm} \usage{ \method{tidy}{msm.prevalence}(x, ...) } \arguments{ \item{x}{Output of \code{\link{prevalence.msm}}.} \item{...}{Further arguments (unused).} } \value{ A tibble with one row per combination of output type (count or percentage) and state, and columns for observed value, expected value and confidence limits for the expected value (if available). } \description{ Note this should be called as \code{tidy()} not \code{tidy.msm.prevalence()} or anything else, as this is a method for the generic \code{tidy()} function. } msm/man/qcmodel.object.Rd0000644000176200001440000000374014527611170015011 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/internals_doc.R \name{qcmodel.object} \alias{qcmodel.object} \title{Developer documentation: model for covariates on transition intensities} \value{ \item{npars}{Number of covariate effect parameters. This is defined as the number of covariates on intensities (with factors expanded as contrasts) multiplied by the number of allowed transitions in the model. Note if \code{\link{msm}} was called with \code{covariates} set to a list of different covariates for different intensities, then this will include covariate effects that are implicitly defined as zero by this list. The information in \code{\link[=paramdata.object]{paramdata}} objects can be used to identify wich ones are fixed at zero. This also includes any \code{timeperiod} covariates in a time-inhomogeneous model defined by the \code{pci} option to \code{\link{msm}}. } \item{ndpars}{Number of distinct covariate effect parameters, as \code{npars}, but after any equality constraints have been applied.} \item{ncovs}{Number of covariates on intensities, with factors expanded as contrasts.} \item{constr}{List of equality constraints on these covariate effects, as supplied in the \code{constraint} argument to \code{\link{msm}}.} \item{covlabels}{Names / labels of these covariates in the model matrix (see \code{\link{model.matrix.msm}}).} \item{inits}{Initial values for these covariate effects, as a vector formed from the \code{covinits} list supplied to \code{\link{msm}}.} \item{covmeans}{Means of these covariates in the data (excluding data not required to fit the model, such as observations with missing data in other elements or subjects' last observations). This includes means of 0/1 factor contrasts as well as continuous covariates (for historic reasons, which may not be sensible).} } \description{ A list representing the model for covariates on transition intensities } \seealso{ \code{\link{msm.object}}. } msm/man/tidy.msm.estbystate.Rd0000644000176200001440000000134314534654576016066 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidy.R \name{tidy.msm.estbystate} \alias{tidy.msm.estbystate} \title{Tidy the output of totlos.msm and similar functions} \usage{ \method{tidy}{msm.estbystate}(x, ...) } \arguments{ \item{x}{Output of \code{\link{totlos.msm}}, \code{\link{envisits.msm}} or \code{\link{efpt.msm}}, which return objects of class \code{"msm.estbystate"}.} \item{...}{Further arguments (unused).} } \value{ A tibble with one row per state, and columns for the estimate, and confidence intervals if available. } \description{ Note this should be called as \code{tidy()} not \code{tidy.msm.totlos()} or anything else, as this is a method for the generic \code{tidy()} function. } msm/man/twophase.Rd0000644000176200001440000001350314567356025013761 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phase.R \name{twophase} \alias{twophase} \alias{d2phase} \alias{p2phase} \alias{q2phase} \alias{r2phase} \alias{h2phase} \title{Coxian phase-type distribution with two phases} \usage{ d2phase(x, l1, mu1, mu2, log = FALSE) p2phase(q, l1, mu1, mu2, lower.tail = TRUE, log.p = FALSE) q2phase(p, l1, mu1, mu2, lower.tail = TRUE, log.p = FALSE) r2phase(n, l1, mu1, mu2) h2phase(x, l1, mu1, mu2, log = FALSE) } \arguments{ \item{x, q}{vector of quantiles.} \item{l1}{Intensity for transition between phase 1 and phase 2.} \item{mu1}{Intensity for transition from phase 1 to exit.} \item{mu2}{Intensity for transition from phase 2 to exit.} \item{log}{logical; if TRUE, return log density or log hazard.} \item{lower.tail}{logical; if TRUE (default), probabilities are P[X <= x], otherwise, P[X > x].} \item{log.p}{logical; if TRUE, probabilities p are given as log(p).} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} } \value{ \code{d2phase} gives the density, \code{p2phase} gives the distribution function, \code{q2phase} gives the quantile function, \code{r2phase} generates random deviates, and \code{h2phase} gives the hazard. } \description{ Density, distribution, quantile functions and other utilities for the Coxian phase-type distribution with two phases. } \details{ This is the distribution of the time to reach state 3 in a continuous-time Markov model with three states and transitions permitted from state 1 to state 2 (with intensity \eqn{\lambda_1}{lambda1}) state 1 to state 3 (intensity \eqn{\mu_1}{mu1}) and state 2 to state 3 (intensity \eqn{\mu_2}{mu2}). States 1 and 2 are the two "phases" and state 3 is the "exit" state. The density is \deqn{f(t | \lambda_1, \mu_1) = e^{-(\lambda_1+\mu_1)t}(\mu_1 + (\lambda_1+\mu_1)\lambda_1 t)}{f(t | l1, mu1) = exp(-(l1+mu1)*t)*(mu1 + (l1+mu1)*l1*t)} if \eqn{\lambda_1 + \mu_1 = \mu_2}{l1 + mu1 = mu2}, and \deqn{f(t | \lambda_1, \mu_1, \mu_2) = \frac{(\lambda_1+\mu_1)e^{-(\lambda_1+\mu_1)t}(\mu_2-\mu_1) + \mu_2\lambda_1e^{-\mu_2t}}{\lambda_1+\mu_1-\mu_2}}{f(t | l1, mu1, mu2) = ((l1+mu1)*exp(-(l1+mu1)*t)*(mu2-mu1) + mu2*l1*exp(-mu2*t))/(l1+mu1-mu2)} otherwise. The distribution function is \deqn{F(t | \lambda_1, \mu_1) = 1 - e^{-(\lambda_1+\mu_1) t} (1 + \lambda_1 t)}{F(t | l1, mu1) = 1 - exp(-(l1+mu1)*t)*(1 + l1*t)} if \eqn{\lambda_1 + \mu_1 = \mu_2}{l1 + mu1 = mu2}, and \deqn{F(t | \lambda_1, \mu_1, \mu_2) = 1 - \frac{e^{-(\lambda_1 + \mu_1)t} (\mu_2 - \mu_1) + \lambda_1 e^{-\mu_2 t}}{ \lambda_1 + \mu_1 - \mu_2}}{F(t | l1, mu1, mu2) = 1 - (exp(-(l1+mu1)*t)*(-mu1+mu2) + l1*exp(-mu2*t))/(l1+mu1-mu2)} otherwise. Quantiles are calculated by numerically inverting the distribution function. The mean is \eqn{(1 + \lambda_1/\mu_2) / (\lambda_1 + \mu_1)}{(1 + l1/mu2) / (l1 + mu1)}. The variance is \eqn{(2 + 2\lambda_1(\lambda_1+\mu_1+ \mu_2)/\mu_2^2 - (1 + \lambda_1/\mu_2)^2)/(\lambda_1+\mu_1)^2}{(2 + 2*l1*(l1+mu1+ mu2)/mu2^2 - (1 + l1/mu2)^2)/(l1+mu1)^2}. If \eqn{\mu_1=\mu_2}{mu1=mu2} it reduces to an exponential distribution with rate \eqn{\mu_1}{mu1}, and the parameter \eqn{\lambda_1}{l1} is redundant. Or also if \eqn{\lambda_1=0}{l1=0}. The hazard at \eqn{x=0} is \eqn{\mu_1}, and smoothly increasing if \eqn{\mu_1<\mu_2}{mu1= mu2} it increases to an asymptote of \eqn{\mu_2}{mu2}, and if \eqn{\lambda_1 + \mu_1 \leq \mu_2}{l1 + mu1 <= mu2} it increases to an asymptote of \eqn{\lambda_1 + \mu_1}{l1 + mu1}. The hazard is decreasing if \eqn{\mu_1>\mu_2}{mu1>mu2}, to an asymptote of \eqn{\mu_2}{mu2}. } \section{Alternative parameterisation}{ An individual following this distribution can be seen as coming from a mixture of two populations: 1) "short stayers" whose mean sojourn time is \eqn{M_1 = }{M1 = 1/(l1+mu1)}\eqn{ 1/(\lambda_1+\mu_1)}{M1 = 1/(l1+mu1)} and sojourn distribution is exponential with rate \eqn{\lambda_1 + \mu_1}{l1+mu1}. 2) "long stayers" whose mean sojourn time \eqn{M_2 = }{1/(l1+mu1) + 1/mu2}\eqn{ 1/(\lambda_1+\mu_1) + 1/\mu_2}{1/(l1+mu1) + 1/mu2} and sojourn distribution is the sum of two exponentials with rate \eqn{\lambda_1 + }{l1+mu1}\eqn{ \mu_1}{l1+mu1} and \eqn{\mu_2}{mu2} respectively. The individual is a "long stayer" with probability \eqn{p=\lambda_1/(\lambda_1 + \mu_1)}. Thus a two-phase distribution can be more intuitively parameterised by the short and long stay means \eqn{M_1 < M_2} and the long stay probability \eqn{p}. Given these parameters, the transition intensities are \eqn{\lambda_1=p/M_1}{l1=p/M1}, \eqn{\mu_1=(1-p)/M_1}{mu1=(1-p)/M1}, and \eqn{\mu_2=1/(M_2-M_1)}{mu2 = 1/(M2 - M1)}. This can be useful for choosing intuitively reasonable initial values for procedures to fit these models to data. The hazard is increasing at least if \eqn{M_2 < 2M_1}{M2 < 2M1}, and also only if \eqn{(M_2 - 2M_1)/(M_2 - M_1) < p}{(M2 - 2M1)/(M2 - M1) < p}. For increasing hazards with \eqn{\lambda_1 + \mu_1 \leq \mu_2}{l1 + mu1 <= mu2}, the maximum hazard ratio between any time \eqn{t} and time 0 is \eqn{1/(1-p)}. For increasing hazards with \eqn{\lambda_1 + \mu_1 \geq \mu_2}{l1 + mu1 >= mu2}, the maximum hazard ratio is \eqn{M_1/((1-p)(M_2 - M_1))}{M1/((1-p)(M2 - M1))}\eqn{ M_1))}{M1/((1-p)(M2 - M1))}. This is the minimum hazard ratio for decreasing hazards. % Illustration of hazard ratio at short mean and long mean. } \references{ C. Dutang, V. Goulet and M. Pigeon (2008). actuar: An R Package for Actuarial Science. Journal of Statistical Software, vol. 25, no. 7, 1-37. URL http://www.jstatsoft.org/v25/i07 } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{distribution} msm/man/hmmMV.Rd0000644000176200001440000001175414471426252013153 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hmm-dists.R \name{hmmMV} \alias{hmmMV} \title{Multivariate hidden Markov models} \usage{ hmmMV(...) } \arguments{ \item{...}{The number of arguments supplied should equal the maximum number of observations made at one time. Each argument represents the univariate distribution of that outcome conditionally on the hidden state, and should be the result of calling a univariate hidden Markov model constructor (see \code{\link{hmm-dists}}).} } \value{ A list of objects, each of class \code{hmmdist} as returned by the univariate HMM constructors documented in \code{\link{hmm-dists}}. The whole list has class \code{hmmMVdist}, which inherits from \code{hmmdist}. } \description{ Constructor for a a multivariate hidden Markov model (HMM) where each of the \code{n} variables observed at the same time has a (potentially different) standard univariate distribution conditionally on the underlying state. The \code{n} outcomes are independent conditionally on the hidden state. } \details{ If a particular state in a HMM has such an outcome distribution, then a call to \code{\link{hmmMV}} is supplied as the corresponding element of the \code{hmodel} argument to \code{\link{msm}}. See Example 2 below. A multivariate HMM where multiple outcomes at the same time are generated from the \emph{same} distribution is specified in the same way as the corresponding univariate model, so that \code{\link{hmmMV}} is not required. The outcome data are simply supplied as a matrix instead of a vector. See Example 1 below. The outcome data for such models are supplied as a matrix, with number of columns equal to the maximum number of arguments supplied to the \code{\link{hmmMV}} calls for each state. If some but not all of the variables are missing (\code{NA}) at a particular time, then the observed data at that time still contribute to the likelihood. The missing data are assumed to be missing at random. The Viterbi algorithm may be used to predict the missing values given the fitted model and the observed data. Typically the outcome model for each state will be from the same family or set of families, but with different parameters. Theoretically, different numbers of distributions may be supplied for different states. If a particular state has fewer outcomes than the maximum, then the data for that state are taken from the first columns of the response data matrix. However this is not likely to be a useful model, since the number of observations will probably give information about the underlying state, violating the missing at random assumption. Models with outcomes that are dependent conditionally on the hidden state (e.g. correlated multivariate normal observations) are not currently supported. } \examples{ ## Simulate data from a Markov model nsubj <- 30; nobspt <- 5 sim.df <- data.frame(subject = rep(1:nsubj, each=nobspt), time = seq(0, 20, length=nobspt)) set.seed(1) two.q <- rbind(c(-0.1, 0.1), c(0, 0)) dat <- simmulti.msm(sim.df[,1:2], qmatrix=two.q, drop.absorb=FALSE) ### EXAMPLE 1 ## Generate two observations at each time from the same outcome ## distribution: ## Bin(40, 0.1) for state 1, Bin(40, 0.5) for state 2 dat$obs1[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.1) dat$obs2[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.1) dat$obs1[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.5) dat$obs2[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.5) dat$obs <- cbind(obs1 = dat$obs1, obs2 = dat$obs2) ## Fitted model should approximately recover true parameters msm(obs ~ time, subject=subject, data=dat, qmatrix=two.q, hmodel = list(hmmBinom(size=40, prob=0.2), hmmBinom(size=40, prob=0.2))) ### EXAMPLE 2 ## Generate two observations at each time from different ## outcome distributions: ## Bin(40, 0.1) and Bin(40, 0.2) for state 1, dat$obs1 <- dat$obs2 <- NA dat$obs1[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.1) dat$obs2[dat$state==1] <- rbinom(sum(dat$state==1), 40, 0.2) ## Bin(40, 0.5) and Bin(40, 0.6) for state 2 dat$obs1[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.6) dat$obs2[dat$state==2] <- rbinom(sum(dat$state==2), 40, 0.5) dat$obs <- cbind(obs1 = dat$obs1, obs2 = dat$obs2) ## Fitted model should approximately recover true parameters msm(obs ~ time, subject=subject, data=dat, qmatrix=two.q, hmodel = list(hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3)), hmmMV(hmmBinom(size=40, prob=0.3), hmmBinom(size=40, prob=0.3))), control=list(maxit=10000)) } \references{ Jackson, C. H., Su, L., Gladman, D. D. and Farewell, V. T. (2015) On modelling minimal disease activity. Arthritis Care and Research (early view). } \seealso{ \code{\link{hmm-dists}},\code{\link{msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{distribution} msm/man/hmodel2list.Rd0000644000176200001440000000244014535132541014341 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hmodel2list.R \name{hmodel2list} \alias{hmodel2list} \title{Convert a hmodel object to HMM constructor function calls} \usage{ hmodel2list(hmodel, hmmdist = TRUE) } \arguments{ \item{hmodel}{A list of class \code{hmodel}, as returned in the \code{hmodel} component of the fitted model object from \code{\link{msm}}.} \item{hmmdist}{\code{TRUE} or \code{FALSE} (see "Value" section).} } \value{ If \code{hmmdist=TRUE}, returns a list of objects of class \code{hmmdist}. These are the kind of objects returned by HMM constructor functions such as \code{\link{hmmNorm}}, \code{\link{hmmPois}} etc. Therefore the list can be passed as the \code{hmodel} argument to \code{\link{msm}}. If \code{hmmdist=FALSE}, returns a list comprised of the corresponding input arguments for the constructor functions, i.e. parameter values of HMM emission distributions. The list has one element per state. Each of these elements has one element per parameter (for univariate HMMs), or one element per outcome distribution, which in turn has one element per parameter (for multivariate HMMs). } \description{ Convert a hmodel object to HMM constructor function calls } \author{ Will Hulme \code{https://github.com/wjchulme} and Chris Jackson. } msm/man/print.msm.Rd0000644000176200001440000000445314534677442014065 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/print.R \name{print.msm} \alias{print.msm} \alias{printnew.msm} \title{Print a fitted msm model object} \usage{ \method{print}{msm}(x, covariates = NULL, digits = 4, ...) printnew.msm(x, covariates = NULL, digits = 4, ...) } \arguments{ \item{x}{Output from \code{\link{msm}}, representing a fitted multi-state model object.} \item{covariates}{Covariates for which to print ``baseline'' transition intensities or misclassification probabilities. See \code{\link{qmatrix.msm}} for more details.} \item{digits}{Minimum number of significant digits, passed to \code{\link{format}}. Defaults to 4.} \item{...}{Other arguments to be passed to \code{\link{format}}.} } \value{ The object returned by \code{print.msm} is a numeric matrix with one column for each estimate or confidence limit for intensities and their covariates, in the same arrangement as printed, but with the underlying numbers in full precision. The results formatted for printing are stored in the \code{"formatted"} attribute of the object, as a character matrix. These can alternatively be produced by \code{\link{msm.form.qoutput}}, which has no printing side-effect. \code{\link{msm.form.eoutput}} produces the same arrangement for misclassification probabilities instead of intensities. } \description{ Print a fitted msm model object } \details{ This is the new method of formatting msm objects for printing. The old method was based on printing lists of matrices. That produced a lot of wasted space for parameters which were zero, and it was difficult to match corresponding numbers between matrices. The new method presents all the transition intensities and covariate effects as a single compact table, and likewise for misclassification matrices. Also in the old method, covariate effects were presented as log hazard ratios or log odds ratios. The log scale is more convenient mathematically, but unnatural to interpret. The new method presents hazard ratios for covariates on transition intensities and odds ratios for misclassification probabilities. \code{printnew.msm} is an alias for \code{print.msm}. } \seealso{ \code{\link{msm}}, \code{\link{printold.msm}}, \code{\link{msm.form.qoutput}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/totlos.msm.Rd0000644000176200001440000002065214534673710014246 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/totlos.R \name{totlos.msm} \alias{totlos.msm} \alias{envisits.msm} \title{Total length of stay, or expected number of visits} \usage{ totlos.msm( x, start = 1, end = NULL, fromt = 0, tot = Inf, covariates = "mean", piecewise.times = NULL, piecewise.covariates = NULL, num.integ = FALSE, discount = 0, env = FALSE, ci = c("none", "normal", "bootstrap"), cl = 0.95, B = 1000, cores = NULL, ... ) envisits.msm( x = NULL, start = 1, end = NULL, fromt = 0, tot = Inf, covariates = "mean", piecewise.times = NULL, piecewise.covariates = NULL, num.integ = FALSE, discount = 0, ci = c("none", "normal", "bootstrap"), cl = 0.95, B = 1000, cores = NULL, ... ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{start}{Either a single number giving the state at the beginning of the period, or a vector of probabilities of being in each state at this time.} \item{end}{States to estimate the total length of stay (or number of visits) in. Defaults to all states. This is deprecated, since with the analytic solution (see "Details") it doesn't save any computation to only estimate for a subset of states.} \item{fromt}{Time from which to estimate. Defaults to 0, the beginning of the process.} \item{tot}{Time up to which the estimate is made. Defaults to infinity, giving the expected time spent in or number of visits to the state until absorption. However, the calculation will be much more efficient if a finite (potentially large) time is specified: see the "Details" section. For models without an absorbing state, \code{t} must be specified.} \item{covariates}{The covariate values to estimate for. This can either be:\cr the string \code{"mean"}, denoting the means of the covariates in the data (this is the default),\cr the number \code{0}, indicating that all the covariates should be set to zero,\cr or a list of values, with optional names. For example \code{list (60, 1)} where the order of the list follows the order of the covariates originally given in the model formula, or a named list, \code{list (age = 60, sex = 1)}} \item{piecewise.times}{Times at which piecewise-constant intensities change. See \code{\link{pmatrix.piecewise.msm}} for how to specify this. This is only required for time-inhomogeneous models specified using explicit time-dependent covariates, and should not be used for models specified using "pci".} \item{piecewise.covariates}{Covariates on which the piecewise-constant intensities depend. See \code{\link{pmatrix.piecewise.msm}} for how to specify this.} \item{num.integ}{Use numerical integration instead of analytic solution (see below).} \item{discount}{Discount rate in continuous time.} \item{env}{Supplied to \code{\link{totlos.msm}}. If \code{TRUE}, return the expected number of visits to each state. If \code{FALSE}, return the total length of stay in each state. \code{\link{envisits.msm}} simply calls \code{\link{totlos.msm}} with \code{env=TRUE}.} \item{ci}{If \code{"normal"}, then calculate a confidence interval by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects, then calculating the total length of stay for each replicate. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. If \code{"none"} (the default) then no confidence interval is calculated.} \item{cl}{Width of the symmetric confidence interval, relative to 1} \item{B}{Number of bootstrap replicates} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} \item{...}{Further arguments to be passed to the \code{\link{integrate}} function to control the numerical integration.} } \value{ A vector of expected total lengths of stay (\code{\link{totlos.msm}}), or expected number of visits (\code{\link{envisits.msm}}), for each transient state. } \description{ Estimate the expected total length of stay, or the expected number of visits, in each state, for an individual in a given period of evolution of a multi-state model. } \details{ The expected total length of stay in state \eqn{j} between times \eqn{t_1} and \eqn{t_2}, from the point of view of an individual in state \eqn{i} at time 0, is defined by the integral from \eqn{t_1} to \eqn{t_2} of the \eqn{i,j} entry of the transition probability matrix \eqn{P(t) = Exp(tQ)}, where \eqn{Q} is the transition intensity matrix. The corresponding expected number of visits to state \eqn{j} (excluding the stay in the current state at time 0) is \eqn{\sum_{i!=j} T_i Q_{i,j}}, where \eqn{T_i} is the expected amount of time spent in state \eqn{i}. More generally, suppose that \eqn{\pi_0}{pi_0} is the vector of probabilities of being in each state at time 0, supplied in \code{start}, and we want the vector \eqn{\mathbf{x}}{x} giving the expected lengths of stay in each state. The corresponding integral has the following solution (van Loan 1978; van Rosmalen et al. 2013) \deqn{\mathbf{x} = \left[ \begin{array}{ll} 1 & \mathbf{0}_K \end{array} \right] Exp(t Q') \left[ \begin{array}{l} \mathbf{0}_K\\I_K \end{array} \right] }{x = [1, 0_K] Exp(t Q') [0_K, I_K]'} where \deqn{Q' = \left[ \begin{array}{ll} 0 & \mathbf{\pi}_0\\ \mathbf{0}_K & Q - rI_K \end{array} \right] }{Q' = rbind(c(0, pi_0), cbind(0_K, Q - r I_K))} \eqn{\pi_0}{pi_0} is the row vector of initial state probabilities supplied in \code{start}, \eqn{\mathbf{0}_K}{0_K} is the row vector of K zeros, \eqn{r} is the discount rate, \eqn{I_K}{I_K} is the K x K identity matrix, and \eqn{Exp} is the matrix exponential. Alternatively, the integrals can be calculated numerically, using the \code{\link{integrate}} function. This may take a long time for models with many states where \eqn{P(t)} is expensive to calculate. This is required where \code{tot = Inf}, since the package author is not aware of any analytic expression for the limit of the above formula as \eqn{t} goes to infinity. With the argument \code{num.integ=TRUE}, numerical integration is used even where the analytic solution is available. This facility is just provided for checking results against versions 1.2.4 and earlier, and will be removed eventually. Please let the package maintainer know if any results are different. For a model where the individual has only one place to go from each state, and each state is visited only once, for example a progressive disease model with no recovery or death, these are equal to the mean sojourn time in each state. However, consider a three-state health-disease-death model with transitions from health to disease, health to death, and disease to death, where everybody starts healthy. In this case the mean sojourn time in the disease state will be greater than the expected length of stay in the disease state. This is because the mean sojourn time in a state is conditional on entering the state, whereas the expected total time diseased is a forecast for a healthy individual, who may die before getting the disease. In the above formulae, \eqn{Q} is assumed to be constant over time, but the results generalise easily to piecewise-constant intensities. This function automatically handles models fitted using the \code{pci} option to \code{\link{msm}}. For any other inhomogeneous models, the user must specify \code{piecewise.times} and \code{piecewise.covariates} arguments to \code{\link{totlos.msm}}. } \references{ C. van Loan (1978). Computing integrals involving the matrix exponential. IEEE Transactions on Automatic Control 23(3)395-404. J. van Rosmalen, M. Toy and J.F. O'Mahony (2013). A mathematical approach for evaluating Markov models in continuous time without discrete-event simulation. Medical Decision Making 33:767-779. } \seealso{ \code{\link{sojourn.msm}}, \code{\link{pmatrix.msm}}, \code{\link{integrate}}, \code{\link{boot.msm}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/pmatrix.piecewise.msm.Rd0000644000176200001440000001267714535055131016362 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{pmatrix.piecewise.msm} \alias{pmatrix.piecewise.msm} \title{Transition probability matrix for processes with piecewise-constant intensities} \usage{ pmatrix.piecewise.msm( x = NULL, t1, t2, times, covariates = NULL, ci = c("none", "normal", "bootstrap"), cl = 0.95, B = 1000, cores = NULL, qlist = NULL, ... ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}. This should be a non-homogeneous model, whose transition intensity matrix depends on a time-dependent covariate.} \item{t1}{The start of the time interval to estimate the transition probabilities for.} \item{t2}{The end of the time interval to estimate the transition probabilities for.} \item{times}{Cut points at which the transition intensity matrix changes.} \item{covariates}{A list with number of components one greater than the length of \code{times}. Each component of the list is specified in the same way as the \code{covariates} argument to \code{\link{pmatrix.msm}}. The components correspond to the covariate values in the intervals \code{(t1, times[1]], (times[1], times[2]], ..., (times[length(times)], t2]} (assuming that all elements of \code{times} are in the interval \code{(t1, t2)}).} \item{ci}{If \code{"normal"}, then calculate a confidence interval for the transition probabilities by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects, then calculating the resulting transition probability matrix for each replicate. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. If \code{"none"} (the default) then no confidence interval is calculated.} \item{cl}{Width of the symmetric confidence interval, relative to 1.} \item{B}{Number of bootstrap replicates, or number of normal simulations from the distribution of the MLEs} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} \item{qlist}{A list of transition intensity matrices, of length one greater than the length of \code{times}. Either this or a fitted model \code{x} must be supplied. No confidence intervals are available if (just) \code{qlist} is supplied.} \item{...}{Optional arguments to be passed to \code{\link{MatrixExp}} to control the method of computing the matrix exponential.} } \value{ The matrix of estimated transition probabilities \eqn{P(t)} for the time interval \code{[t1, tn]}. That is, the probabilities of occupying state \eqn{s} at time \eqn{t_n}{tn} conditionally on occupying state \eqn{r} at time \eqn{t_1}{t1}. Rows correspond to "from-state" and columns to "to-state". } \description{ Extract the estimated transition probability matrix from a fitted non-time-homogeneous multi-state model for a given time interval. This is a generalisation of \code{\link{pmatrix.msm}} to models with time-dependent covariates. Note that \code{\link{pmatrix.msm}} is sufficient to calculate transition probabilities for time-inhomogeneous models fitted using the \code{pci} argument to \code{\link{msm}}. } \details{ Suppose a multi-state model has been fitted, in which the transition intensity matrix \eqn{Q(x(t))} is modelled in terms of time-dependent covariates \eqn{x(t)}. The transition probability matrix \eqn{P(t_1, t_n)}{P(t1, tn)} for the time interval \eqn{(t_1, }{(t1, tn)}\eqn{ t_n)}{(t1, tn)} cannot be calculated from the estimated intensity matrix as \eqn{\exp((t_n - t_1) Q)}{exp((tn - t1) Q)}, because \eqn{Q} varies within the interval \eqn{t_1, t_n}{t1, tn}. However, if the covariates are piecewise-constant, or can be approximated as piecewise-constant, then we can calculate \eqn{P(t_1, t_n)}{P(t1, tn)} by multiplying together individual matrices \eqn{P(t_i, }{P(t_i, t_{i+1}) = exp((t_{i+1} - t_i) Q)}\eqn{ t_{i+1}) = \exp((t_{i+1} - t_i) Q)}{P(t_i, t_{i+1}) = exp((t_{i+1} - t_i) Q)}, calculated over intervals where Q is constant: \deqn{P(t_1, t_n) = P(t_1, t_2) P(t_2, t_3)\ldots P(t_{n-1}, }{P(t1, tn) = P(t1, t2) P(t2, t3)\ldotsP(tn-1, tn)}\deqn{ t_n)}{P(t1, tn) = P(t1, t2) P(t2, t3)\ldotsP(tn-1, tn)} } \examples{ \dontrun{ ## In a clinical study, suppose patients are given a placebo in the ## first 5 weeks, then they begin treatment 1 at 5 weeks, and ## a combination of treatments 1 and 2 from 10 weeks. ## Suppose a multi-state model x has been fitted for the patients' ## progress, with treat1 and treat2 as time dependent covariates. ## Cut points for when treatment covariate changes times <- c(0, 5, 10) ## Indicators for which treatments are active in the four intervals ## defined by the three cut points covariates <- list( list (treat1=0, treat2=0), list (treat1=0, treat2=0), list(treat1=1, treat2=0), list(treat1=1, treat2=1) ) ## Calculate transition probabilities from the start of the study to 15 weeks pmatrix.piecewise.msm(x, 0, 15, times, covariates) } } \seealso{ \code{\link{pmatrix.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/hmodel.object.Rd0000644000176200001440000001067614527611167014651 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/internals_doc.R \name{hmodel.object} \alias{hmodel.object} \title{Developer documentation: hidden Markov model structure object} \value{ \item{hidden}{\code{TRUE} for hidden Markov models, \code{FALSE} otherwise.} \item{nstates}{Number of states, the same as \code{qmodel$nstates}.} \item{fitted}{\code{TRUE} if the parameter values in \code{pars} are the maximum likelihood estimates, \code{FALSE} if they are the initial values.} \item{models}{The outcome distribution for each hidden state. A vector of length \code{nstates} whose \eqn{r}th entry is the index of the state \eqn{r} outcome distributions in the vector of supported distributions. The vector of supported distributions is given in full by \code{msm:::.msm.HMODELS}: the first few are 1 for categorical outcome, 2 for identity, 3 for uniform and 4 for normal. } \item{labels}{String identifying each distribution in \code{models}.} \item{npars}{Vector of length \code{nstates} giving the number of parameters in each outcome distribution, excluding covariate effects.} \item{nipars}{Number of initial state occupancy probabilities being estimated. This is zero if \code{est.initprobs=FALSE}, otherwise equal to the number of states.} \item{totpars}{Total number of parameters, equal to \code{sum(npars)}. } \item{pars}{A vector of length \code{totpars}, made from concatenating a list of length \code{nstates} whose \eqn{r}th component is vector of the parameters for the state \eqn{r} outcome distribution. } \item{plabs}{List with the names of the parameters in \code{pars}.} \item{parstate}{A vector of length \code{totpars}, whose \eqn{i}th element is the state corresponding to the \eqn{i}th parameter.} \item{firstpar}{A vector of length \code{nstates} giving the index in \code{pars} of the first parameter for each state.} \item{locpars}{Index in \code{pars} of parameters which can have covariates on them. } \item{initprobs}{Initial state occupancy probabilities, as supplied to \code{\link{msm}} (initial values before estimation, if \code{est.initprobs=TRUE}.)} \item{est.initprobs}{Are initial state occupancy probabilities estimated (\code{TRUE} or \code{FALSE}), as supplied in the \code{est.initprobs} argument of \code{\link{msm}}.} \item{ncovs}{Number of covariate effects per parameter in \code{pars}, with, e.g. factor contrasts expanded.} \item{coveffect}{Vector of covariate effects, of length \code{sum(ncovs)}.} \item{covlabels}{Labels of these effects.} \item{coveffstate}{Vector indicating state corresponding to each element of \code{coveffect}.} \item{ncoveffs}{Number of covariate effects on HMM outcomes, equal to \code{sum(ncovs)}.} \item{nicovs}{Vector of length \code{nstates-1} giving the number of covariate effects on each initial state occupancy probability (log relative to the baseline probability).} \item{icoveffect}{Vector of length \code{sum(nicovs)} giving covariate effects on initial state occupancy probabilities.} \item{nicoveffs}{Number of covariate effects on initial state occupancy probabilities, equal to \code{sum(nicovs)}.} \item{constr}{Constraints on (baseline) hidden Markov model outcome parameters, as supplied in the \code{hconstraint} argument of \code{\link{msm}}, excluding covariate effects, converted to a vector and mapped to the set 1,2,3,\ldots{} if necessary.} \item{covconstr}{Vector of constraints on covariate effects in hidden Markov outcome models, as supplied in the \code{hconstraint} argument of \code{\link{msm}}, excluding baseline parameters, converted to a vector and mapped to the set 1,2,3,\ldots{} if necessary.} \item{ranges}{Matrix of range restrictions for HMM parameters, including those given to the \code{hranges} argument to \code{\link{msm}}.} \item{foundse}{\code{TRUE} if standard errors are available for the estimates.} \item{initpmat}{Matrix of initial state occupancy probabilities with one row for each subject (estimated if \code{est.initprobs=TRUE}).} \item{ci}{Confidence intervals for baseline HMM outcome parameters.} \item{covci}{Confidence intervals for covariate effects in HMM outcome models.} } \description{ A list giving information about the models for the outcome data conditionally on the states of a hidden Markov model. Used in internal computations, and returned in a fitted \code{\link{msm}} model object. } \seealso{ \code{\link{msm.object}},\code{\link{qmodel.object}}, \code{\link{emodel.object}}. } msm/man/qgeneric.Rd0000644000176200001440000000503714527612512013717 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/qgeneric.R \name{qgeneric} \alias{qgeneric} \title{Generic function to find quantiles of a distribution} \usage{ qgeneric(pdist, p, special = NULL, ...) } \arguments{ \item{pdist}{Probability distribution function, for example, \code{\link{pnorm}} for the normal distribution, which must be defined in the current workspace. This should accept and return vectorised parameters and values. It should also return the correct values for the entire real line, for example a positive distribution should have \code{pdist(x)==0} for \eqn{x<0}.} \item{p}{Vector of probabilities to find the quantiles for.} \item{special}{Vector of character strings naming arguments of the distribution function that should not be vectorised over. Used, for example, for the \code{rate} and \code{t} arguments in \code{\link{qpexp}}.} \item{...}{The remaining arguments define parameters of the distribution \code{pdist}. These MUST be named explicitly. This may also contain the standard arguments \code{log.p} (logical; default \code{FALSE}, if \code{TRUE}, probabilities p are given as log(p)), and \code{lower.tail} (logical; if \code{TRUE} (default), probabilities are P[X <= x] otherwise, P[X > x].). If the distribution is bounded above or below, then this should contain arguments \code{lbound} and \code{ubound} respectively, and these will be returned if \code{p} is 0 or 1 respectively. Defaults to \code{-Inf} and \code{Inf} respectively.} } \value{ Vector of quantiles of the distribution at \code{p}. } \description{ Generic function to find the quantiles of a distribution, given the equivalent probability distribution function. } \details{ This function is intended to enable users to define \code{"q"} functions for new distributions, in cases where the distribution function \code{pdist} is available analytically, but the quantile function is not. It works by finding the root of the equation \eqn{h(q) = pdist(q) - p = 0}. Starting from the interval \eqn{(-1, 1)}, the interval width is expanded by 50\% until \eqn{h()} is of opposite sign at either end. The root is then found using \code{\link{uniroot}}. This assumes a suitably smooth, continuous distribution. An identical function is provided in the \pkg{flexsurv} package. } \examples{ qnorm(c(0.025, 0.975), 0, 1) qgeneric(pnorm, c(0.025, 0.975), mean=0, sd=1) # must name the arguments } \author{ Christopher Jackson } \keyword{distribution} msm/man/summary.msm.Rd0000644000176200001440000000254414534677442014425 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/summary.R \name{summary.msm} \alias{summary.msm} \alias{print.summary.msm} \title{Summarise a fitted multi-state model} \usage{ \method{summary}{msm}(object, hazard.scale = 1, ...) } \arguments{ \item{object}{A fitted multi-state model object, as returned by \code{\link{msm}}.} \item{hazard.scale}{Vector with same elements as number of covariates on transition rates. Corresponds to the increase in each covariate used to calculate its hazard ratio. Defaults to all 1.} \item{...}{Further arguments passed to \code{\link{prevalence.msm}}.} } \value{ A list of class \code{summary.msm}, with components: \item{prevalences}{Output from \code{\link{prevalence.msm}}.} \item{hazard}{Output from \code{\link{hazard.msm}}.} \item{hazard.scale}{Value of the \code{hazard.scale} argument.} } \description{ Summary method for fitted \code{\link{msm}} models. This is simply a wrapper around \code{\link{prevalence.msm}} which produces a table of observed and expected state prevalences for each time, and for models with covariates, \code{\link{hazard.msm}} to print hazard ratios with 95\% confidence intervals for covariate effects. } \seealso{ \code{\link{msm}},\code{\link{prevalence.msm}}, \code{\link{hazard.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/crudeinits.msm.Rd0000644000176200001440000000577114471426252015075 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/msm.R \name{crudeinits.msm} \alias{crudeinits.msm} \title{Calculate crude initial values for transition intensities} \usage{ crudeinits.msm( formula, subject, qmatrix, data = NULL, censor = NULL, censor.states = NULL ) } \arguments{ \item{formula}{A formula giving the vectors containing the observed states and the corresponding observation times. For example, \code{state ~ time} Observed states should be in the set \code{1, \dots{}, n}, where \code{n} is the number of states. Note hidden Markov models are not supported by this function.} \item{subject}{Vector of subject identification numbers for the data specified by \code{formula}. If missing, then all observations are assumed to be on the same subject. These must be sorted so that all observations on the same subject are adjacent.} \item{qmatrix}{Matrix of indicators for the allowed transitions. An initial value will be estimated for each value of qmatrix that is greater than zero. Transitions are taken as disallowed for each entry of \code{qmatrix} that is 0.} \item{data}{An optional data frame in which the variables represented by \code{subject} and \code{state} can be found.} \item{censor}{A state, or vector of states, which indicates censoring. See \code{\link{msm}}.} \item{censor.states}{Specifies the underlying states which censored observations can represent. See \code{\link{msm}}.} } \value{ The estimated transition intensity matrix. This can be used as the \code{qmatrix} argument to \code{\link{msm}}. } \description{ Calculates crude initial values for transition intensities by assuming that the data represent the exact transition times of the Markov process. } \details{ Suppose we want a crude estimate of the transition intensity \eqn{q_{rs}}{q_rs} from state \eqn{r} to state \eqn{s}. If we observe \eqn{n_{rs}}{n_rs} transitions from state \eqn{r} to state \eqn{s}, and a total of \eqn{n_r} transitions from state \eqn{r}, then \eqn{q_{rs} / }{q_rs / q_rr}\eqn{ q_{rr}}{q_rs / q_rr} can be estimated by \eqn{n_{rs} / n_r}{n_rs / n_r}. Then, given a total of \eqn{T_r} years spent in state \eqn{r}, the mean sojourn time \eqn{1 / q_{rr}}{1 / q_rr} can be estimated as \eqn{T_r / n_r}. Thus, \eqn{n_{rs} / T_r}{n_rs / T_r} is a crude estimate of \eqn{q_{rs}}{q_rs}. If the data do represent the exact transition times of the Markov process, then these are the exact maximum likelihood estimates. Observed transitions which are incompatible with the given \code{qmatrix} are ignored. Censored states are ignored. } \examples{ data(cav) twoway4.q <- rbind(c(-0.5, 0.25, 0, 0.25), c(0.166, -0.498, 0.166, 0.166), c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)) statetable.msm(state, PTNUM, data=cav) crudeinits.msm(state ~ years, PTNUM, data=cav, qmatrix=twoway4.q) } \seealso{ \code{\link{statetable.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/draic.msm.Rd0000644000176200001440000001500514471426252013775 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/draic.R \name{draic.msm} \alias{draic.msm} \alias{drlcv.msm} \title{Criteria for comparing two multi-state models with nested state spaces} \usage{ draic.msm( msm.full, msm.coarse, likelihood.only = FALSE, information = c("expected", "observed"), tl = 0.95 ) drlcv.msm( msm.full, msm.coarse, tl = 0.95, cores = NULL, verbose = TRUE, outfile = NULL ) } \arguments{ \item{msm.full}{Model on the bigger state space.} \item{msm.coarse}{Model on the smaller state space. The two models must both be non-hidden Markov models without censored states. The two models must be fitted to the same datasets, except that the state space of the coarse model must be an aggregated version of the state space of the full model. That is, every state in the full dataset must correspond to a unique state in the coarse dataset. For example, for the full state variable \code{c(1,1,2,2,3,4)}, the corresponding coarse states could be \code{c(1,1,2,2,2,3)}, but not \code{c(1,2,3,4,4,4)}. The structure of allowed transitions in the coarse model must also be a collapsed version of the big model structure, but no check is currently made for this in the code. To use these functions, all objects which were used in the calls to fit \code{msm.full} and \code{msm.coarse} must be in the working environment, for example, datasets and definitions of transition matrices.} \item{likelihood.only}{Don't calculate Hessians and trace term (DRAIC).} \item{information}{Use observed or expected information in the DRAIC trace term. Expected is the default, and much faster, though is only available for models fitted to pure panel data (all \code{obstype=1} in the call to \code{\link{msm}}, thus not exact transition times or exact death times)} \item{tl}{Width of symmetric tracking interval, by default 0.95 for a 95\% interval.} \item{cores}{Number of processor cores to use in \code{drlcv} for cross-validation by parallel processing. Requires the \pkg{doParallel} package to be installed. If not specified, parallel processing is not used. If \code{cores} is set to the string \code{"default"}, the default methods of \code{\link[parallel]{makeCluster}} (on Windows) or \code{\link[doParallel]{registerDoParallel}} (on Unix-like) are used.} \item{verbose}{Print intermediate results of each iteration of cross-validation to the console while running. May not work with parallel processing.} \item{outfile}{Output file to print intermediate results of cross-validation. Useful to track execution speed when using parallel processing, where output to the console may not work.} } \value{ A list containing \eqn{D_{RAIC}}{D_RAIC} (\code{draic.msm}) or \eqn{D_{RLCV}}{D_RLCV} (\code{drlcv.msm}), its component terms, and tracking intervals. } \description{ A modification of Akaike's information criterion, and a leave-one-out likelihood cross-validation criterion, for comparing the predictive ability of two Markov multi-state models with nested state spaces. This is evaluated based on the restricted or aggregated data which the models have in common. } \details{ Note that standard AIC can be computed for one or more fitted \code{msm} models \code{x,y,...} using \code{\link{AIC}(x,y,...)}, and this can be used to compare models fitted to the same data. \code{draic.msm} and \code{drlcv.msm} are designed for models fitted to data with differently-aggregated state spaces. The difference in restricted AIC (Liquet and Commenges, 2011), as computed by this function, is defined as \deqn{D_{RAIC} = l(\gamma_n |\mathbf{x}'' ) - l(\theta_n |\mathbf{x}'' ) + trace ( J(\theta_n |\mathbf{x}'')J(\theta_n |\mathbf{x})^{-1} - J(\gamma_n |\mathbf{x}'' )J(\gamma_n |\mathbf{x}' )^{-1})}{D_RAIC = l(gamma_n |x'' ) - l(theta_n |x'' ) + trace ( J(theta_n |x'')J(theta_n |x)^{-1} - J(gamma_n |x'' )J(gamma_n |x' )^{-1})} where \eqn{\gamma}{gamma} and \eqn{\theta}{theta} are the maximum likelihood estimates of the smaller and bigger models, fitted to the smaller and bigger data, respectively. \eqn{l(\gamma_n |x'')}{l(gamma_n |x'')} represents the likelihood of the simpler model evaluated on the restricted data. \eqn{l(\theta_n |x'')}{l(theta_n |x'')} represents the likelihood of the complex model evaluated on the restricted data. This is a hidden Markov model, with a misclassification matrix and initial state occupancy probabilities as described by Thom et al (2014). \eqn{J()} are the corresponding (expected or observed, as specified by the user) information matrices. \eqn{\mathbf{x}}{x} is the expanded data, to which the bigger model was originally fitted, and \eqn{\mathbf{x}'}{x'} is the data to which the smaller model was originally fitted. \eqn{\mathbf{x}''}{x''} is the restricted data which the two models have in common. \eqn{\mathbf{x}'' = \mathbf{x}'}{x'' = x} in this implementation, so the models are nested. The difference in likelihood cross-validatory criteria (Liquet and Commenges, 2011) is defined as \deqn{D_{RLCV} = 1/n \sum_{i=1}^n \log( h_{X''}(x_i'' | \gamma_{-i}) / g_{X''}(x_i''| \theta_{-i}))}{D_{RLCV} = 1/n \sum_{i=1}^n log( h_{X''}(x_i'' | gamma_{-i}) / g_{X''}(x_i''| theta_{-i}))} where \eqn{\gamma_{-i}} and \eqn{\theta_{-i}} are the maximum likelihood estimates from the smaller and bigger models fitted to datasets with subject \eqn{i} left out, \eqn{g()} and \eqn{h()} are the densities of the corresponding models, and \eqn{x_i''} is the restricted data from subject \eqn{i}. Tracking intervals are analogous to confidence intervals, but not strictly the same, since the quantity which D_RAIC aims to estimate, the difference in expected Kullback-Leibler discrepancy for predicting a replicate dataset, depends on the sample size. See the references. Positive values for these criteria indicate the coarse model is preferred, while negative values indicate the full model is preferred. } \references{ Thom, H. and Jackson, C. and Commenges, D. and Sharples, L. (2015) State selection in multistate models with application to quality of life in psoriatic arthritis. Statistics In Medicine 34(16) 2381 - 2480. Liquet, B. and Commenges D. (2011) Choice of estimators based on different observations: Modified AIC and LCV criteria. Scandinavian Journal of Statistics; 38:268-287. } \seealso{ \code{\link{logLik.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk}, H. H. Z. Thom \email{howard.thom@bristol.ac.uk} } \keyword{models} msm/man/deltamethod.Rd0000644000176200001440000000653314527612511014415 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deltamethod.R \name{deltamethod} \alias{deltamethod} \title{The delta method} \usage{ deltamethod(g, mean, cov, ses = TRUE) } \arguments{ \item{g}{A formula representing the transformation. The variables must be labelled \code{x1, x2,\dots{}} For example, \code{~ 1 / (x1 + x2)} If the transformation returns a vector, then a list of formulae representing (\eqn{g_1, g_2, \ldots}{g1, g2, \ldots}) can be provided, for example \code{list( ~ x1 + x2, ~ x1 / (x1 + x2) )}} \item{mean}{The estimated mean of \eqn{X}} \item{cov}{The estimated covariance matrix of \eqn{X}} \item{ses}{If \code{TRUE}, then the standard errors of \eqn{g_1(X), g_2(X),\ldots}{g1(X), g2(X),\ldots} are returned. Otherwise the covariance matrix of \eqn{g(X)} is returned.} } \value{ A vector containing the standard errors of \eqn{g_1(X), g_2(X), \ldots}{g1(X), g2(X), \ldots} or a matrix containing the covariance of \eqn{g(X)}. } \description{ Delta method for approximating the standard error of a transformation \eqn{g(X)} of a random variable \eqn{X = (x_1, x_2, \ldots)}{X = (x1, x2, \ldots)}, given estimates of the mean and covariance matrix of \eqn{X}. } \details{ The delta method expands a differentiable function of a random variable about its mean, usually with a first-order Taylor approximation, and then takes the variance. For example, an approximation to the covariance matrix of \eqn{g(X)} is given by \deqn{ Cov(g(X)) = g'(\mu) Cov(X) [g'(\mu)]^T }{ Cov(g(X)) = g'(mu) Cov(X) [g'(mu)]^T } where \eqn{\mu}{mu} is an estimate of the mean of \eqn{X}. This function uses symbolic differentiation via \code{\link{deriv}}. A limitation of this function is that variables created by the user are not visible within the formula \code{g}. To work around this, it is necessary to build the formula as a string, using functions such as \code{sprintf}, then to convert the string to a formula using \code{as.formula}. See the example below. If you can spare the computational time, bootstrapping is a more accurate method of calculating confidence intervals or standard errors for transformations of parameters. See \code{\link{boot.msm}}. Simulation from the asymptotic distribution of the MLEs (see e.g. Mandel 2013) is also a convenient alternative. } \examples{ ## Simple linear regression, E(y) = alpha + beta x x <- 1:100 y <- rnorm(100, 4*x, 5) toy.lm <- lm(y ~ x) estmean <- coef(toy.lm) estvar <- summary(toy.lm)$cov.unscaled * summary(toy.lm)$sigma^2 ## Estimate of (1 / (alphahat + betahat)) 1 / (estmean[1] + estmean[2]) ## Approximate standard error deltamethod (~ 1 / (x1 + x2), estmean, estvar) ## We have a variable z we would like to use within the formula. z <- 1 ## deltamethod (~ z / (x1 + x2), estmean, estvar) will not work. ## Instead, build up the formula as a string, and convert to a formula. form <- sprintf("~ \%f / (x1 + x2)", z) form deltamethod(as.formula(form), estmean, estvar) } \references{ Oehlert, G. W. (1992) \emph{A note on the delta method}. American Statistician 46(1). Mandel, M. (2013) \emph{Simulation based confidence intervals for functions with complicated derivatives.} The American Statistician 67(2):76-81. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{math} msm/man/surface.msm.Rd0000644000176200001440000000630614534677441014357 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{surface.msm} \alias{surface.msm} \alias{persp.msm} \alias{contour.msm} \alias{image.msm} \title{Explore the likelihood surface} \usage{ surface.msm( x, params = c(1, 2), np = 10, type = c("contour", "filled.contour", "persp", "image"), point = NULL, xrange = NULL, yrange = NULL, ... ) \method{contour}{msm}(x, ...) \method{persp}{msm}(x, ...) \method{image}{msm}(x, ...) } \arguments{ \item{x}{Output from \code{\link{msm}}, representing a fitted msm model.} \item{params}{Integer vector with two elements, giving the indices of the parameters to vary. All other parameters will be fixed. Defaults to \code{c(1,2)}, representing the first two log transition intensities. See the \code{fixedpars} argument to \code{msm} for a definition of these indices.} \item{np}{Number of grid points to use in each direction, by default 10. An \code{np x np} grid will be used to evaluate the likelihood surface. If 100 likelihood function evaluations is slow, then reduce this.} \item{type}{Character string specifying the type of plot to produce. \tabular{ll}{ \code{"contour"} \tab Contour plot, using the R function \code{\link{contour}}. \cr \code{"filled.contour"} \tab Solid-color contour plot, using the R function \code{\link{filled.contour}}. \cr \code{"persp"} \tab Perspective plot, using the R function \code{\link{persp}}. \cr \code{"image"} \tab Grid color plot, using the R function \code{\link{image}}. \cr }} \item{point}{Vector of length \code{n}, where \code{n} is the number of parameters in the model, including the parameters that will be varied here. This specifies the point at which to fix the likelihood. By default, this is the maximum likelihood estimates stored in the fitted model \code{x}, \code{x$estimates}.} \item{xrange}{Range to plot for the first varied parameter. Defaults to plus and minus two standard errors, obtained from the Hessian at the maximum likelihood estimate.} \item{yrange}{Range to plot for the second varied parameter. Defaults to plus and minus two standard errors, obtained from the Hessian at the maximum likelihood estimate.} \item{...}{Further arguments to be passed to the plotting function.} } \description{ Plot the log-likelihood surface with respect to two parameters. } \details{ Draws a contour or perspective plot. Useful for diagnosing irregularities in the likelihood surface. If you want to use these plots before running the maximum likelihood estimation, then just run \code{msm} with all estimates fixed at their initial values. \code{contour.msm} just calls surface.msm with \code{type = "contour"}. \code{persp.msm} just calls surface.msm with \code{type = "persp"}. \code{image.msm} just calls surface.msm with \code{type = "image"}. As these three functions are methods of the generic functions \code{contour}, \code{persp} and \code{image}, they can be invoked as \code{contour(x)}, \code{persp(x)} or \code{image(x)}, where \code{x} is a fitted \code{msm} object. } \seealso{ \code{\link{msm}}, \code{\link{contour}}, \code{\link{filled.contour}}, \code{\link{persp}}, \code{\link{image}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/efpt.msm.Rd0000644000176200001440000001345114534673710013657 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/efpt.R \name{efpt.msm} \alias{efpt.msm} \title{Expected first passage time} \usage{ efpt.msm( x = NULL, qmatrix = NULL, tostate, start = "all", covariates = "mean", ci = c("none", "normal", "bootstrap"), cl = 0.95, B = 1000, cores = NULL, ... ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{qmatrix}{Instead of \code{x}, you can simply supply a transition intensity matrix in \code{qmatrix}.} \item{tostate}{State, or set of states supplied as a vector, for which to estimate the first passage time into. Can be integer, or character matched to the row names of the Q matrix.} \item{start}{Starting state (integer). By default (\code{start="all"}), this will return a vector of expected passage times from each state in turn. Alternatively, this can be used to obtain the expected first passage time from a \emph{set} of states, rather than single states. To achieve this, \code{state} is set to a vector of weights, with length equal to the number of states in the model. These weights should be proportional to the probability of starting in each of the states in the desired set, so that weights of zero are supplied for other states. The function will calculate the weighted average of the expected passage times from each of the corresponding states.} \item{covariates}{Covariate values defining the intensity matrix for the fitted model \code{x}, as supplied to \code{\link{qmatrix.msm}}.} \item{ci}{If \code{"normal"}, then calculate a confidence interval by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. If \code{"none"} (the default) then no confidence interval is calculated.} \item{cl}{Width of the symmetric confidence interval, relative to 1.} \item{B}{Number of bootstrap replicates.} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} \item{...}{Arguments to pass to \code{\link{MatrixExp}}.} } \value{ A vector of expected first passage times, or "hitting times", from each state to the desired state. } \description{ Expected time until first reaching a particular state or set of states in a Markov model. } \details{ The expected first passage times from each of a set of states \eqn{\mathbf{i}}{i} to to the remaining set of states \eqn{\overline{\mathbf{i}}}{ibar} in the state space, for a model with transition intensity matrix \eqn{Q}, are \deqn{-Q_{\mathbf{i},\mathbf{i}}^{-1} \mathbf{1}}{-Q_{i,i}^{-1} 1} where \eqn{\mathbf{1}}{1} is a vector of ones, and \eqn{Q_{\mathbf{i},\mathbf{i}}}{Q_{i,i}} is the square subset of \eqn{Q} pertaining to states \eqn{\mathbf{i}}{i}. It is equal to the sum of mean sojourn times for all states between the "from" and "to" states in a unidirectional model. If there is non-zero chance of reaching an absorbing state before reaching \code{tostate}, then it is infinite. It is trivially zero if the "from" state equals \code{tostate}. This function currently only handles time-homogeneous Markov models. For time-inhomogeneous models it will assume that \eqn{Q} equals the average intensity matrix over all times and observed covariates. Simulation might be used to handle time dependence. Note this is the \emph{expectation} of first passage time, and the confidence intervals are CIs for this mean, not predictive intervals for the first passage time. The full distribution of the first passage time to a set of states can be obtained by setting the rows of the intensity matrix \eqn{Q} corresponding to that set of states to zero to make a model where those states are absorbing. The corresponding transition probability matrix \eqn{Exp(Qt)} then gives the probabilities of having hit or passed that state by a time \eqn{t} (see the example below). This is implemented in \code{\link{ppass.msm}}. } \examples{ twoway4.q <- rbind(c(-0.5, 0.25, 0, 0.25), c(0.166, -0.498, 0.166, 0.166), c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)) efpt.msm(qmatrix=twoway4.q, tostate=3) # given in state 1, expected time to reaching state 3 is infinite # since may die (state 4) before entering state 3 # If we remove the death state from the model, EFPTs become finite Q <- twoway4.q[1:3,1:3]; diag(Q) <- 0; diag(Q) <- -rowSums(Q) efpt.msm(qmatrix=Q, tostate=3) # Suppose we cannot die or regress while in state 2, can only go to state 3 Q <- twoway4.q; Q[2,4] <- Q[2,1] <- 0; diag(Q) <- 0; diag(Q) <- -rowSums(Q) efpt.msm(qmatrix=Q, tostate=3) # The expected time from 2 to 3 now equals the mean sojourn time in 2. -1/Q[2,2] # Calculate cumulative distribution of the first passage time # into state 3 for the following three-state model Q <- twoway4.q[1:3,1:3]; diag(Q) <- 0; diag(Q) <- -rowSums(Q) # Firstly form a model where the desired hitting state is absorbing Q[3,] <- 0 MatrixExp(Q, t=10)[,3] ppass.msm(qmatrix=Q, tot=10) # Given in state 1 at time 0, P(hit 3 by time 10) = 0.479 MatrixExp(Q, t=50)[,3] # P(hit 3 by time 50) = 0.98 ppass.msm(qmatrix=Q, tot=50) } \references{ Norris, J. R. (1997) Markov Chains. Cambridge University Press. } \seealso{ \code{\link{sojourn.msm}}, \code{\link{totlos.msm}}, \code{\link{boot.msm}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/emodel.object.Rd0000644000176200001440000000417414527611167014642 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/internals_doc.R \name{emodel.object} \alias{emodel.object} \title{Developer documentation: misclassification model structure object} \value{ \item{nstates}{Number of states (same as \code{qmodel$nstates}).} \item{npars}{Number of allowed misclassifications, equal to \code{sum(imatrix)}.} \item{imatrix}{Indicator matrix for allowed misclassifications. This has \eqn{(r,s)} entry 1 if misclassification of true state \eqn{r} as observed state \eqn{s} is possible. diagonal entries are arbitrarily set to 0.} \item{ematrix}{Matrix of initial values for the misclassification probabilities, supplied as the \code{ematrix} argument of \code{\link{msm}}.} \item{inits}{Vector of these initial values, reading across rows of \code{qmatrix} and excluding the diagonal and disallowed transitions.} \item{constr}{Indicators for equality constraints on baseline misclassification probabilities, taken from the \code{econstraint} argument to \code{\link{msm}}, and mapped if necessary to the set (1,2,3,...)} \item{ndpars}{Number of distinct misclassification probabilities, after applying equality constraints.} \item{nipars}{Number of initial state occupancy probabilities being estimated. This is zero if \code{est.initprobs=FALSE}, otherwise equal to the number of states.} \item{initprobs}{Initial state occupancy probabilities, as supplied to \code{\link{msm}} (initial values before estimation, if \code{est.initprobs=TRUE}.)} \item{est.initprobs}{Are initial state occupancy probabilities estimated (\code{TRUE} or \code{FALSE}), as supplied in the \code{est.initprobs} argument of \code{\link{msm}}.} } \description{ A list giving information about the misclassifications assumed in a multi-state model fitted with the \code{ematrix} argument of \code{\link{msm}}. Returned in a fitted \code{\link{msm}} model object. This information is converted internally to a \code{hmodel} object (see \code{\link{hmodel.object}}) for use in likelihood computations. } \seealso{ \code{\link{msm.object}},\code{\link{qmodel.object}}, \code{\link{hmodel.object}}. } msm/man/psor.Rd0000644000176200001440000000404514527611346013107 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets_doc.R \docType{data} \name{psor} \alias{psor} \title{Psoriatic arthritis data} \format{ A data frame containing 806 observations, representing visits to a psoriatic arthritis (PsA) clinic from 305 patients. The rows are grouped by patient number and ordered by examination time. Each row represents an examination and contains additional covariates. \tabular{rll}{ \code{ptnum} \tab (numeric) \tab Patient identification number \cr \code{months} \tab (numeric) \tab Examination time in months \cr \code{state} \tab (numeric) \tab Clinical state of PsA. Patients in states 1, 2, 3 and 4 \cr \tab \tab have 0, 1 to 4, 5 to 9 and 10 or more damaged joints, \cr \tab \tab respectively. \cr \code{hieffusn} \tab (numeric) \tab Presence of five or more effusions \cr \code{ollwsdrt} \tab (character) \tab Erythrocyte sedimentation rate of less than 15 mm/h \cr } } \description{ A series of observations of grades of psoriatic arthritis, as indicated by numbers of damaged joints. } \examples{ ## Four-state progression-only model with high effusion and low ## sedimentation rate as covariates on the progression rates. High ## effusion is assumed to have the same effect on the 1-2, 2-3, and 3-4 ## progression rates, while low sedimentation rate has the same effect ## on the 1-2 and 2-3 intensities, but a different effect on the 3-4. data(psor) psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), fixedpars=FALSE, control = list(REPORT=1,trace=2), method="BFGS") qmatrix.msm(psor.msm) sojourn.msm(psor.msm) hazard.msm(psor.msm) } \references{ Gladman, D. D. and Farewell, V.T. (1999) Progression in psoriatic arthritis: role of time-varying clinical indicators. J. Rheumatol. 26(11):2409-13 } \keyword{datasets} msm/man/bos.Rd0000644000176200001440000000372714527611346012715 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets_doc.R \docType{data} \name{bos} \alias{bos} \alias{bos3} \alias{bos4} \title{Bronchiolitis obliterans syndrome after lung transplants} \format{ A data frame containing 638 rows, grouped by patient, including histories of 204 patients. The first observation for each patient is defined to be stage 1, no BOS, at six months after transplant. Subsequent observations denote the entry times into stages 2, 3, 4, representing mild, moderate and severe BOS respectively, and stage 5, representing death. \tabular{rll}{ \code{ptnum} \tab (numeric) \tab Patient identification number \cr \code{time} \tab (numeric) \tab Months after transplant \cr \code{state} \tab (numeric) \tab BOS state entered at this time \cr } } \source{ Papworth Hospital, U.K. } \description{ A dataset containing histories of bronchiolitis obliterans syndrome (BOS) from lung transplant recipients. BOS is a chronic decline in lung function, often observed after lung transplantation. The condition is classified into four stages of severity: none, mild, moderate and severe. } \details{ The entry time of each patient into each stage of BOS was estimated by clinicians, based on their history of lung function measurements and acute rejection and infection episodes. BOS is only assumed to occur beyond six months after transplant. In the first six months the function of each patient's new lung stabilises. Subsequently BOS is diagnosed by comparing the lung function against the "baseline" value. The objects \code{bos3} and \code{bos4} contain the same data, but with mild/moderate/severe combined, and moderate/severe combined, to give 3 and 4-state representations respectively. } \references{ Heng. D. et al. (1998). Bronchiolitis Obliterans Syndrome: Incidence, Natural History, Prognosis, and Risk Factors. Journal of Heart and Lung Transplantation 17(12)1255--1263. } \keyword{datasets} msm/man/fev.Rd0000644000176200001440000000343114527611346012702 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets_doc.R \docType{data} \name{fev} \alias{fev} \title{FEV1 measurements from lung transplant recipients} \format{ A data frame containing 5896 rows. There are 204 patients, the rows are grouped by patient number and ordered by days after transplant. Each row represents an examination and containing an additional covariate. \tabular{rll}{ \code{ptnum} \tab (numeric) \tab Patient identification number. \cr \code{days} \tab (numeric) \tab Examination time (days after transplant). \cr \code{fev} \tab (numeric) \tab Percentage of baseline FEV1. A code of 999 indicates the patient's date of death. \cr \code{acute} \tab (numeric) \tab 0/1 indicator for whether the patient suffered an acute infection or rejection \cr \tab \tab within 14 days of the visit. \cr } } \source{ Papworth Hospital, U.K. } \description{ A series of measurements of the forced expiratory volume in one second (FEV1) from lung transplant recipients, from six months onwards after their transplant. } \details{ A baseline "normal" FEV1 for each individual is calculated using measurements from the first six months after transplant. After six months, as presented in this dataset, FEV1 is expressed as a percentage of the baseline value. FEV1 is monitored to diagnose bronchiolitis obliterans syndrome (BOS), a long-term lung function decline, thought to be a form of chronic rejection. Acute rejections and infections also affect the lung function in the short term. } \references{ Jackson, C.H. and Sharples, L.D. Hidden Markov models for the onset and progression of bronchiolitis obliterans syndrome in lung transplant recipients \emph{Statistics in Medicine}, 21(1): 113--128 (2002). } \keyword{datasets} msm/man/tidy.msm.Rd0000644000176200001440000000531114534654470013670 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidy.R \name{tidy.msm} \alias{tidy.msm} \title{Tidy the parameter estimates from an msm model} \usage{ \method{tidy}{msm}(x, ...) } \arguments{ \item{x}{Object returned by \code{\link{msm}}, representing a fitted multi-state model.} \item{...}{Other arguments (currently unused).} } \value{ A "tibble", with one row for each parameter and the following columns describing the parameter. \itemize{ \item \code{parclass}: Class of parameters: \code{intens} (transition intensities), \code{hr} (hazard ratios representing effects of covariates on intensities), and their transformed versions \code{logintens} (log intensities) and \code{loghr} (log hazard ratios). For "misclassification" models fitted with the \code{ematrix} argument to \code{msm}, other classes of parameters include \code{misc} (misclassification probabilities), \code{logitmisc} (misclassification log odds), \code{or_misc} and \code{logor_misc} (effects of covariates on misclassification probabilities, as odds ratios or log odds ratios, with the first state as the reference category). For hidden Markov models fitted with the \code{hmodel} argument to \code{msm}, the parameter class called \code{hmm} comprises the parameters of the distributions of the outcome conditionally on the hidden state. Covariates on the location parameter of these distributions are included in class \code{hmmcov}. If initial state occupancy probabilities are estimated, these are included in class \code{initp} (or \code{initlogodds} for the log odds transforms of these), and any covariates on these probabilities are included in class \code{initpcov}. \item \code{state}: Starting state of the transition for transition intensities, and true state for misclassification probabilities or hidden Markov model parameters. \item \code{tostate}: Ending state of the transition for transition intensities, and observed state for misclassification probabilities \item \code{term}: Name of the covariate for covariate effects, or "baseline" for the baseline intensity or analogous parameter value. Note that the "baseline" parameters are the parameters with covariates set to their mean values in the data (stored in e.g. \code{x$qcmodel$covmeans}), unless \code{msm} was called with \code{center=FALSE}. \item \code{estimate}, \code{std.error}, \code{conf.low}, \code{conf.high}: Parameter estimate, standard error, and lower and upper confidence limits. \item \code{statistic}, \code{p.value}: For covariate effects, the Z-test statistic and p-value for a test of the null hypothesis that the covariate effect is zero, based on the estimate and standard error. } } \description{ Tidy the parameter estimates from an msm model } msm/man/pmatrix.msm.Rd0000644000176200001440000001245614471426252014406 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{pmatrix.msm} \alias{pmatrix.msm} \title{Transition probability matrix} \usage{ pmatrix.msm( x = NULL, t = 1, t1 = 0, covariates = "mean", ci = c("none", "normal", "bootstrap"), cl = 0.95, B = 1000, cores = NULL, qmatrix = NULL, ... ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{t}{The time interval to estimate the transition probabilities for, by default one unit.} \item{t1}{The starting time of the interval. Used for models \code{x} with piecewise-constant intensities fitted using the \code{pci} option to \code{\link{msm}}. The probabilities will be computed on the interval [t1, t1+t].} \item{covariates}{The covariate values at which to estimate the transition probabilities. This can either be:\cr the string \code{"mean"}, denoting the means of the covariates in the data (this is the default),\cr the number \code{0}, indicating that all the covariates should be set to zero,\cr or a list of values, with optional names. For example \code{list (60, 1)} where the order of the list follows the order of the covariates originally given in the model formula, or a named list, \code{list (age = 60, sex = 1)} If some covariates are specified but not others, the missing ones default to zero. For time-inhomogeneous models fitted using the \code{pci} option to \code{\link{msm}}, "covariates" here include only those specified using the \code{covariates} argument to \code{\link{msm}}, and exclude the artificial covariates representing the time period. For time-inhomogeneous models fitted "by hand" by using a time-dependent covariate in the \code{covariates} argument to \code{\link{msm}}, the function \code{\link{pmatrix.piecewise.msm}} should be used to to calculate transition probabilities.} \item{ci}{If \code{"normal"}, then calculate a confidence interval for the transition probabilities by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects, then calculating the resulting transition probability matrix for each replicate. See, e.g. Mandel (2013) for a discussion of this approach. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. If \code{"none"} (the default) then no confidence interval is calculated.} \item{cl}{Width of the symmetric confidence interval, relative to 1.} \item{B}{Number of bootstrap replicates, or number of normal simulations from the distribution of the MLEs} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} \item{qmatrix}{A transition intensity matrix. Either this or a fitted model \code{x} must be supplied. No confidence intervals are available if \code{qmatrix} is supplied.} \item{...}{Optional arguments to be passed to \code{\link{MatrixExp}} to control the method of computing the matrix exponential.} } \value{ The matrix of estimated transition probabilities \eqn{P(t)} in the given time. Rows correspond to "from-state" and columns to "to-state". Or if \code{ci="normal"} or \code{ci="bootstrap"}, \code{pmatrix.msm} returns a list with components \code{estimates} and \code{ci}, where \code{estimates} is the matrix of estimated transition probabilities, and \code{ci} is a list of two matrices containing the upper and lower confidence limits. } \description{ Extract the estimated transition probability matrix from a fitted continuous-time multi-state model for a given time interval, at a given set of covariate values. } \details{ For a continuous-time homogeneous Markov process with transition intensity matrix \eqn{Q}, the probability of occupying state \eqn{s} at time \eqn{u + t} conditionally on occupying state \eqn{r} at time \eqn{u} is given by the \eqn{(r,s)} entry of the matrix \eqn{P(t) = \exp(tQ)}{P(t) = exp(tQ)}, where \eqn{\exp()}{exp()} is the matrix exponential. For non-homogeneous processes, where covariates and hence the transition intensity matrix \eqn{Q} are piecewise-constant in time, the transition probability matrix is calculated as a product of matrices over a series of intervals, as explained in \code{\link{pmatrix.piecewise.msm}}. The \code{\link{pmatrix.piecewise.msm}} function is only necessary for models fitted using a time-dependent covariate in the \code{covariates} argument to \code{\link{msm}}. For time-inhomogeneous models fitted using "pci", \code{pmatrix.msm} can be used, with arguments \code{t} and \code{t1}, to calculate transition probabilities over any time period. } \references{ Mandel, M. (2013). "Simulation based confidence intervals for functions with complicated derivatives." The American Statistician 67(2):76-81 } \seealso{ \code{\link{qmatrix.msm}}, \code{\link{pmatrix.piecewise.msm}}, \code{\link{boot.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk}. } \keyword{models} msm/man/cmodel.object.Rd0000644000176200001440000000164314527611167014636 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/internals_doc.R \name{cmodel.object} \alias{cmodel.object} \title{Developer documentation: censoring model object} \value{ \item{ncens}{The number of distinct values used for censored observations in the \code{state} data supplied to \code{\link{msm}}.} \item{censor}{A vector of length \code{ncens}, giving the labels used for censored states in the data.} \item{states}{A vector obtained by \code{unlist()}ing a list with \code{ncens} elements, each giving the set of true states that an observation with this label could be.} \item{index}{Index into \code{states} for the first state corresponding to each \code{censor}, plus an extra \code{length(states)+1}.} } \description{ A list giving information about censored states, their labels in the data and what true states they represent. } \seealso{ \code{\link{msm.object}}. } msm/man/recreate.olddata.Rd0000644000176200001440000000203314471426252015316 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/olddata.R \name{recreate.olddata} \alias{recreate.olddata} \title{Convert data stored in msm object to old format} \usage{ recreate.olddata(x) } \arguments{ \item{x}{Object returned by the \code{\link{msm}} function, representing a fitted multi-state model.} } \value{ A list of vectors and matrices in the undocumented ad-hoc format used for the \code{data} component of \code{msm} objects in \pkg{msm} versions 1.3.1 and earlier. } \description{ Converts the \code{data} element of msm objects to the old format. } \details{ This is just provided for convenience and to illustrate the changes. It is not guaranteed to be complete, and is liable to be withdrawn. Users who were relying on the previous undocumented format are advised to upgrade their code to use the new format, which uses model frames and model design matrices in the standard format used in version 1.4, based on \code{\link{model.frame}} and \code{\link{model.matrix}}. } msm/man/boot.msm.Rd0000644000176200001440000001541714473410664013667 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/boot.R \name{boot.msm} \alias{boot.msm} \title{Bootstrap resampling for multi-state models} \usage{ boot.msm( x, stat = pmatrix.msm, B = 1000, file = NULL, cores = NULL, remove.errors = TRUE ) } \arguments{ \item{x}{A fitted msm model, as output by \code{\link{msm}}.} \item{stat}{A function to call on each refitted msm model. By default this is \code{\link{pmatrix.msm}}, returning the transition probability matrix in one time unit. If \code{NULL} then no function is computed.} \item{B}{Number of bootstrap resamples.} \item{file}{Name of a file in which to save partial results after each replicate. This is saved using \code{\link{save}} and can be restored using \code{\link{load}}, producing an object called \code{boot.list} containing the partial results. Not supported when using parallel processing.} \item{cores}{Number of processor cores to use for parallel processing. Requires the \pkg{doParallel} package to be installed. If not specified, parallel processing is not used. If \code{cores} is set to the string \code{"default"}, the default methods of \code{\link[parallel]{makeCluster}} (on Windows) or \code{\link[doParallel]{registerDoParallel}} (on Unix-like) are used.} \item{remove.errors}{If \code{TRUE} then bootstrap refits which resulted in an error are removed from the returned list, and a message is returned which states the proportion of failed fits and the first error message. If \code{FALSE}, then the error message for failed refits is placed in the corresponding component of the returned list.} } \value{ A list with \code{B} components, containing the result of calling function \code{stat} on each of the refitted models. If \code{stat} is \code{NULL}, then each component just contains the refitted model. If one of the \code{B} model fits was unsuccessful and resulted in an error, then the corresponding list component will contain the error message. } \description{ Draw a number of bootstrap resamples, refit a \code{\link{msm}} model to the resamples, and calculate statistics on the refitted models. } \details{ The bootstrap datasets are computed by resampling independent pairs of observations at successive times (for non-hidden models without censoring), or independent individual series (for hidden models or models with censoring). Therefore this approach doesn't work if, for example, the data for a HMM consist of a series of observations from just one individual, and is inaccurate for small numbers of independent transitions or individuals. Confidence intervals or standard errors for the corresponding statistic can be calculated by summarising the returned list of \code{B} replicated outputs. This is currently implemented for most the output functions \code{\link{qmatrix.msm}}, \code{\link{ematrix.msm}}, \code{\link{qratio.msm}}, \code{\link{pmatrix.msm}}, \code{\link{pmatrix.piecewise.msm}}, \code{\link{totlos.msm}} and \code{\link{prevalence.msm}}. For other outputs, users will have to write their own code to summarise the output of \code{\link{boot.msm}}. Most of \pkg{msm}'s output functions present confidence intervals based on asymptotic standard errors calculated from the Hessian. These are expected to be underestimates of the true standard errors (Cramer-Rao lower bound). Some of these functions use a further approximation, the delta method (see \code{\link{deltamethod}}) to obtain standard errors of transformed parameters. Bootstrapping should give a more accurate estimate of the uncertainty. An alternative method which is less accurate though faster than bootstrapping, but more accurate than the delta method, is to draw a sample from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix), and summarise the transformed estimates. See \code{\link{pmatrix.msm}}. All objects used in the original call to \code{\link{msm}} which produced \code{x}, such as the \code{qmatrix}, should be in the working environment, or else \code{boot.msm} will produce an \dQuote{object not found} error. This enables \code{boot.msm} to refit the original model to the replicate datasets. However there is currently a limitation. In the original call to \code{msm}, the \code{"formula"} argument should be specified directly, as, for example, \code{msm(state ~ time, data = ...)} and not, for example, \code{form = data$state ~ data$time} \code{msm(formula=form, data = ...)} otherwise \code{boot.msm} will be unable to draw the replicate datasets. \code{boot.msm} will also fail with an incomprehensible error if the original call to msm used a used-defined object whose name is the same as a built-in R object, or an object in any other loaded package. For example, if you have called a Q matrix \code{q}, when \code{q()} is the built-in function for quitting R. If \code{stat} is \code{NULL}, then \code{B} different \code{msm} model objects will be stored in memory. This is unadvisable, as \code{msm} objects tend to be large, since they contain the original data used for the \code{msm} fit, so this will be wasteful of memory. To specify more than one statistic, write a function consisting of a list of different function calls, for example, \code{stat = function(x) list (pmatrix.msm(x, t=1), pmatrix.msm(x, t=2))} } \examples{ \dontrun{ ## Psoriatic arthritis example data(psor) psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2)), control = list(REPORT=1,trace=2), method="BFGS") ## Bootstrap the baseline transition intensity matrix. This will take a long time. q.list <- boot.msm(psor.msm, function(x)x$Qmatrices$baseline) ## Manipulate the resulting list of matrices to calculate bootstrap standard errors. apply(array(unlist(q.list), dim=c(4,4,5)), c(1,2), sd) ## Similarly calculate a bootstrap 95\% confidence interval apply(array(unlist(q.list), dim=c(4,4,5)), c(1,2), function(x)quantile(x, c(0.025, 0.975))) ## Bootstrap standard errors are larger than the asymptotic standard ## errors calculated from the Hessian psor.msm$QmatricesSE$baseline } } \references{ Efron, B. and Tibshirani, R.J. (1993) \emph{An Introduction to the Bootstrap}, Chapman and Hall. } \seealso{ \code{\link{qmatrix.msm}}, \code{\link{qratio.msm}}, \code{\link{sojourn.msm}}, \code{\link{ematrix.msm}}, \code{\link{pmatrix.msm}}, \code{\link{pmatrix.piecewise.msm}}, \code{\link{totlos.msm}}, \code{\link{prevalence.msm}}. } \author{ C.H.Jackson } \keyword{models} msm/man/ecmodel.object.Rd0000644000176200001440000000305114527611167014776 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/internals_doc.R \name{ecmodel.object} \alias{ecmodel.object} \title{Developer documentation: model for covariates on misclassification probabilities} \value{ \item{npars}{Number of covariate effect parameters. This is defined as the number of covariates on misclassification (with factors expanded as contrasts) multiplied by the number of allowed misclassifications in the model. } \item{ndpars}{Number of distinct covariate effect parameters, as \code{npars}, but after any equality constraints have been applied.} \item{ncovs}{Number of covariates on misclassification, with factors expanded as contrasts.} \item{constr}{List of equality constraints on these covariate effects, as supplied in the \code{miscconstraint} argument to \code{\link{msm}}.} \item{covlabels}{Names / labels of these covariates in the model matrix (see \code{\link{model.matrix.msm}}).} \item{inits}{Initial values for these covariate effects, as a vector formed from the \code{misccovinits} list supplied to \code{\link{msm}}.} \item{covmeans}{Means of these covariates in the data (excluding data not required to fit the model, such as observations with missing data in other elements or subjects' last observations). This includes means of 0/1 factor contrasts as well as continuous covariates (for historic reasons, which may not be sensible).} } \description{ A list representing the model for covariates on misclassification probabilities. } \seealso{ \code{\link{msm.object}}. } msm/man/viterbi.msm.Rd0000644000176200001440000000423014567356025014363 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/viterbi.R \name{viterbi.msm} \alias{viterbi.msm} \title{Calculate the probabilities of underlying states and the most likely path through them} \usage{ viterbi.msm(x, normboot = FALSE, newdata = NULL) } \arguments{ \item{x}{A fitted hidden Markov multi-state model, or a model with censored state observations, as produced by \code{\link{msm}}} \item{normboot}{If \code{TRUE}, then before running the algorithm, the maximum likelihood estimates of the model parameters are replaced by an alternative set of parameters drawn randomly from the asymptotic multivariate normal distribution of the MLEs.} \item{newdata}{An optional data frame containing observations on which to construct the Viterbi path and forward-backward probabilities. It must be in the same format as the data frame used to fit \code{x}. If \code{NULL}, the data frame used to fit \code{x} is used.} } \value{ A data frame with columns: \code{subject} = subject identification numbers \code{time} = times of observations \code{observed} = corresponding observed states \code{fitted} = corresponding fitted states found by Viterbi recursion. If the model is not a hidden Markov model, and there are no censored state observations, this is just the observed states. For hidden Markov models, an additional matrix \code{pstate} is also returned inside the data frame, giving the probability of each hidden state at each point, conditionally on all the data. This is computed by the forward/backward algorithm. } \description{ For a fitted hidden Markov model, or a model with censored state observations, the Viterbi algorithm recursively constructs the path with the highest probability through the underlying states. The probability of each hidden state is also computed for hidden Markov models, using the forward-backward algorithm. } \references{ Durbin, R., Eddy, S., Krogh, A. and Mitchison, G. \emph{Biological sequence analysis}, Cambridge University Press, 1998. } \seealso{ \code{\link{msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/odds.msm.Rd0000644000176200001440000000235514471426252013650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{odds.msm} \alias{odds.msm} \title{Calculate tables of odds ratios for covariates on misclassification probabilities} \usage{ odds.msm(x, odds.scale = 1, cl = 0.95) } \arguments{ \item{x}{Output from \code{\link{msm}} representing a fitted multi-state model.} \item{odds.scale}{Vector with same elements as number of covariates on misclassification probabilities. Corresponds to the increase in each covariate used to calculate its odds ratio. Defaults to all 1.} \item{cl}{Width of the symmetric confidence interval to present. Defaults to 0.95.} } \value{ A list of tables containing odds ratio estimates, one table for each covariate. Each table has three columns, containing the odds ratio, and an approximate upper 95\% and lower 95\% confidence limit respectively (assuming normality on the log scale), for each misclassification probability. } \description{ Odds ratios are computed by exponentiating the estimated covariate effects on the logit-misclassification probabilities. } \seealso{ \code{\link{msm}}, \code{\link{hazard.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/MatrixExp.Rd0000644000176200001440000000750014654456156014053 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/MatrixExp.R \name{MatrixExp} \alias{MatrixExp} \title{Matrix exponential} \usage{ MatrixExp(mat, t = 1, method = NULL, ...) } \arguments{ \item{mat}{A square matrix} \item{t}{An optional scaling factor for \code{mat}. If a vector is supplied, then an array of matrices is returned with different scaling factors.} \item{method}{Under the default of \code{NULL}, this simply wraps the \code{\link[expm]{expm}} function from the \pkg{expm} package. This is recommended. Options to \code{\link[expm]{expm}} can be supplied to \code{\link{MatrixExp}}, including \code{method}. Otherwise, for backwards compatibility, the following options, which use code in the \pkg{msm} package, are available: \code{"pade"} for a Pade approximation method, \code{"series"} for the power series approximation, or \code{"analytic"} for the analytic formulae for simpler Markov model intensity matrices (see below). These options are only used if \code{mat} has repeated eigenvalues, thus the usual eigen-decomposition method cannot be used.} \item{...}{Arguments to pass to \code{\link[expm]{expm}}.} } \value{ The exponentiated matrix \eqn{\exp(mat)}{exp(mat)}. Or, if \code{t} is a vector of length 2 or more, an array of exponentiated matrices. } \description{ Calculates the exponential of a square matrix. } \details{ See the \code{\link[expm]{expm}} documentation for details of the algorithms it uses. Generally the exponential \eqn{E} of a square matrix \eqn{M} can often be calculated as \deqn{E = U \exp(D) U^{-1}}{E = U exp(D) U^{-1}} where \eqn{D} is a diagonal matrix with the eigenvalues of \eqn{M} on the diagonal, \eqn{\exp(D)}{exp(D)} is a diagonal matrix with the exponentiated eigenvalues of \eqn{M} on the diagonal, and \eqn{U} is a matrix whose columns are the eigenvectors of \eqn{M}. This method of calculation is used if \code{"pade"} or \code{"series"} is supplied but \eqn{M} has distinct eigenvalues. I If \eqn{M} has repeated eigenvalues, then its eigenvector matrix may be non-invertible. In this case, the matrix exponential is calculated using the Pade approximation defined by Moler and van Loan (2003), or the less robust power series approximation, \deqn{\exp(M) = I + M + M^2/2 + M^3 / 3! + M^4 / 4! + ...}{exp(M) = I + M + M^2/2 + M^3 / 3! + M^4 / 4! + ...} For a continuous-time homogeneous Markov process with transition intensity matrix \eqn{Q}, the probability of occupying state \eqn{s} at time \eqn{u + t} conditional on occupying state \eqn{r} at time \eqn{u} is given by the \eqn{(r,s)} entry of the matrix \eqn{\exp(tQ)}{exp(tQ)}. If \code{mat} is a valid transition intensity matrix for a continuous-time Markov model (i.e. diagonal entries non-positive, off-diagonal entries non-negative, rows sum to zero), then for certain simpler model structures, there are analytic formulae for the individual entries of the exponential of \code{mat}. These structures are listed in the PDF manual and the formulae are coded in the \pkg{msm} source file \code{src/analyticp.c}. These formulae are only used if \code{method="analytic"}. This is more efficient, but it is not the default in \code{MatrixExp} because the code is not robust to extreme values. However it is the default when calculating likelihoods for models fitted by \code{\link{msm}}. The implementation of the Pade approximation used by \code{method="pade"} was taken from JAGS by Martyn Plummer (\url{https://mcmc-jags.sourceforge.io}). } \references{ Cox, D. R. and Miller, H. D. \emph{The theory of stochastic processes}, Chapman and Hall, London (1965) Moler, C and van Loan, C (2003). Nineteen dubious ways to compute the exponential of a matrix, twenty-five years later. \emph{SIAM Review} \bold{45}, 3--49. } \keyword{math} msm/man/phasemeans.msm.Rd0000644000176200001440000000273214471426252015042 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phase.R \name{phasemeans.msm} \alias{phasemeans.msm} \title{Parameters of phase-type models in mixture form} \usage{ phasemeans.msm( x, covariates = "mean", ci = c("none", "normal", "bootstrap"), cl = 0.95, B = 1000, cores = NULL ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{covariates}{Covariate values, see \code{\link{qmatrix.msm}}.} \item{ci}{If \code{"none"} (the default) no confidence intervals are calculated. Otherwise \code{"normal"}, or \code{"boot"} as described by \code{\link{qmatrix.msm}}.} \item{cl}{Width of the symmetric confidence interval, relative to 1.} \item{B}{Number of bootstrap replicates, or number of normal simulations from the distribution of the MLEs.} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} } \value{ Matrix with one row for each state that has a two-phase distribution, and three columns: the short-stay mean, long-stay mean and long-stay probability. These are functions of the transition intensities of the expanded hidden Markov model, defined in \code{\link{d2phase}}. } \description{ Parameters of fitted two-phase models, in mixture model parameterisation. } \seealso{ \code{\link{d2phase}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/msm-package.Rd0000644000176200001440000000173414556436067014322 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/msm-package.R \docType{package} \name{msm-package} \alias{msm-package} \title{Multi-State Markov and Hidden Markov Models in Continuous Time} \description{ msm: Functions for fitting continuous-time Markov and hidden Markov multi-state models to longitudinal data. Designed for processes observed at arbitrary times in continuous time (intermittently observed or panel data) but some other observation schemes are supported. Both Markov transition rates and the hidden Markov output process can be modelled in terms of covariates, which may be constant or piecewise-constant in time. } \seealso{ Useful links: \itemize{ \item \url{https://github.com/chjackson/msm} \item \url{https://chjackson.github.io/msm/} \item Report bugs at \url{https://github.com/chjackson/msm/issues} } } \author{ \strong{Maintainer}: Christopher Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } msm/man/scoreresid.msm.Rd0000644000176200001440000000261214534673710015060 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scoreresid.R \name{scoreresid.msm} \alias{scoreresid.msm} \title{Score residuals} \usage{ scoreresid.msm(x, plot = FALSE) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{plot}{If \code{TRUE}, display a simple plot of the residuals in subject order, labelled by subject identifiers} } \value{ Vector of the residuals, named by subject identifiers. } \description{ Score residuals for detecting outlying subjects. } \details{ The score residual for a single subject is \deqn{U(\theta)^T I(\theta)^{-1} U(\theta)}{U(theta)^T I(theta)^{-1} U(theta)} where \eqn{U(\theta)}{U(theta)} is the vector of first derivatives of the log-likelihood for that subject at maximum likelihood estimates \eqn{\theta}{theta}, and \eqn{I(\theta)}{theta} is the observed Fisher information matrix, that is, the matrix of second derivatives of minus the log-likelihood for that subject at theta. Subjects with a higher influence on the maximum likelihood estimates will have higher score residuals. These are only available for models with analytic derivatives (which includes all non-hidden and most hidden Markov models). } \author{ Andrew Titman \email{a.titman@lancaster.ac.uk} (theory), Chris Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} (code) } \keyword{models} msm/man/msm.Rd0000644000176200001440000013454714562212371012725 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/msm.R \name{msm} \alias{msm} \title{Multi-state Markov and hidden Markov models in continuous time} \usage{ msm( formula, subject = NULL, data = list(), qmatrix, gen.inits = FALSE, ematrix = NULL, hmodel = NULL, obstype = NULL, obstrue = NULL, covariates = NULL, covinits = NULL, constraint = NULL, misccovariates = NULL, misccovinits = NULL, miscconstraint = NULL, hcovariates = NULL, hcovinits = NULL, hconstraint = NULL, hranges = NULL, qconstraint = NULL, econstraint = NULL, initprobs = NULL, est.initprobs = FALSE, initcovariates = NULL, initcovinits = NULL, deathexact = NULL, death = NULL, exacttimes = FALSE, censor = NULL, censor.states = NULL, pci = NULL, phase.states = NULL, phase.inits = NULL, subject.weights = NULL, cl = 0.95, fixedpars = NULL, center = TRUE, opt.method = "optim", hessian = NULL, use.deriv = TRUE, use.expm = TRUE, analyticp = TRUE, na.action = na.omit, ... ) } \arguments{ \item{formula}{A formula giving the vectors containing the observed states and the corresponding observation times. For example, \code{state ~ time} Observed states should be numeric variables in the set \code{1, \dots{}, n}, where \code{n} is the number of states. Factors are allowed only if their levels are called \code{"1", \dots{}, "n"}. The times can indicate different types of observation scheme, so be careful to choose the correct \code{obstype}. For hidden Markov models, \code{state} refers to the outcome variable, which need not be a discrete state. It may also be a matrix, giving multiple observations at each time (see \code{\link{hmmMV}}).} \item{subject}{Vector of subject identification numbers for the data specified by \code{formula}. If missing, then all observations are assumed to be on the same subject. These must be sorted so that all observations on the same subject are adjacent.} \item{data}{Optional data frame in which to interpret the variables supplied in \code{formula}, \code{subject}, \code{covariates}, \code{misccovariates}, \code{hcovariates}, \code{obstype} and \code{obstrue}.} \item{qmatrix}{Matrix which indicates the allowed transitions in the continuous-time Markov chain, and optionally also the initial values of those transitions. If an instantaneous transition is not allowed from state \eqn{r} to state \eqn{s}, then \code{qmatrix} should have \eqn{(r,s)} entry 0, otherwise it should be non-zero. If supplying initial values yourself, then the non-zero entries should be those values. If using \code{gen.inits=TRUE} then the non-zero entries can be anything you like (conventionally 1). Any diagonal entry of \code{qmatrix} is ignored, as it is constrained to be equal to minus the sum of the rest of the row. For example,\cr \code{ rbind( c( 0, 0.1, 0.01 ), c( 0.1, 0, 0.2 ), c( 0, 0, 0 ) ) }\cr represents a 'health - disease - death' model, with initial transition intensities 0.1 from health to disease, 0.01 from health to death, 0.1 from disease to health, and 0.2 from disease to death. If the states represent ordered levels of severity of a disease, then this matrix should usually only allow transitions between adjacent states. For example, if someone was observed in state 1 ("mild") at their first observation, followed by state 3 ("severe") at their second observation, they are assumed to have passed through state 2 ("moderate") in between, and the 1,3 entry of \code{qmatrix} should be zero. The initial intensities given here are with any covariates set to their means in the data (or set to zero, if \code{center = FALSE}). If any intensities are constrained to be equal using \code{qconstraint}, then the initial value is taken from the first of these (reading across rows).} \item{gen.inits}{If \code{TRUE}, then initial values for the transition intensities are generated automatically using the method in \code{\link{crudeinits.msm}}. The non-zero entries of the supplied \code{qmatrix} are assumed to indicate the allowed transitions of the model. This is not available for hidden Markov models, including models with misclassified states.} \item{ematrix}{If misclassification between states is to be modelled, this should be a matrix of initial values for the misclassification probabilities. The rows represent underlying states, and the columns represent observed states. If an observation of state \eqn{s} is not possible when the subject occupies underlying state \eqn{r}, then \code{ematrix} should have \eqn{(r,s)} entry 0. Otherwise \code{ematrix} should have \eqn{(r,s)} entry corresponding to the probability of observing \eqn{s} conditionally on occupying true state \eqn{r}. The diagonal of \code{ematrix} is ignored, as rows are constrained to sum to 1. For example, \cr \code{ rbind( c( 0, 0.1, 0 ), c( 0.1, 0, 0.1 ), c( 0, 0.1, 0 ) ) }\cr represents a model in which misclassifications are only permitted between adjacent states. If any probabilities are constrained to be equal using \code{econstraint}, then the initial value is taken from the first of these (reading across rows). For an alternative way of specifying misclassification models, see \code{hmodel}.} \item{hmodel}{Specification of the hidden Markov model (HMM). This should be a list of return values from HMM constructor functions. Each element of the list corresponds to the outcome model conditionally on the corresponding underlying state. Univariate constructors are described in the\code{\link{hmm-dists}} help page. These may also be grouped together to specify a multivariate HMM with a set of conditionally independent univariate outcomes at each time, as described in \code{\link{hmmMV}}. For example, consider a three-state hidden Markov model. Suppose the observations in underlying state 1 are generated from a Normal distribution with mean 100 and standard deviation 16, while observations in underlying state 2 are Normal with mean 54 and standard deviation 18. Observations in state 3, representing death, are exactly observed, and coded as 999 in the data. This model is specified as \code{hmodel = list(hmmNorm(mean=100, sd=16), hmmNorm(mean=54, sd=18), hmmIdent(999))} The mean and standard deviation parameters are estimated starting from these initial values. If multiple parameters are constrained to be equal using \code{hconstraint}, then the initial value is taken from the value given on the first occasion that parameter appears in \code{hmodel}. See the \code{\link{hmm-dists}} help page for details of the constructor functions for each univariate distribution. A misclassification model, that is, a hidden Markov model where the outcomes are misclassified observations of the underlying states, can either be specified using a list of \code{\link{hmmCat}} or \code{\link{hmmIdent}} objects, or by using an \code{ematrix}. For example, \cr \code{ ematrix = rbind( c( 0, 0.1, 0, 0 ), c( 0.1, 0, 0.1, 0 ), c( 0, 0.1, 0, 0), c( 0, 0, 0, 0) ) }\cr is equivalent to \cr \code{hmodel = list( hmmCat(prob=c(0.9, 0.1, 0, 0)), hmmCat(prob=c(0.1, 0.8, 0.1, 0)), hmmCat(prob=c(0, 0.1, 0.9, 0)), hmmIdent()) }\cr} \item{obstype}{A vector specifying the observation scheme for each row of the data. This can be included in the data frame \code{data} along with the state, time, subject IDs and covariates. Its elements should be either 1, 2 or 3, meaning as follows: \describe{ \item{1}{An observation of the process at an arbitrary time (a "snapshot" of the process, or "panel-observed" data). The states are unknown between observation times.} \item{2}{An exact transition time, with the state at the previous observation retained until the current observation. An observation may represent a transition to a different state or a repeated observation of the same state (e.g. at the end of follow-up). Note that if all transition times are known, more flexible models could be fitted with packages other than \pkg{msm} - see the note under \code{exacttimes}. Note also that if the previous state was censored using \code{censor}, for example known only to be state 1 or state 2, then \code{obstype} 2 means that either state 1 is retained or state 2 is retained until the current observation - this does not allow for a change of state in the middle of the observation interval. } \item{3}{An exact transition time, but the state at the instant before entering this state is unknown. A common example is death times in studies of chronic diseases.} } If \code{obstype} is not specified, this defaults to all 1. If \code{obstype} is a single number, all observations are assumed to be of this type. The obstype value for the first observation from each subject is not used. This is a generalisation of the \code{deathexact} and \code{exacttimes} arguments to allow different schemes per observation. \code{obstype} overrides both \code{deathexact} and \code{exacttimes}. \code{exacttimes=TRUE} specifies that all observations are of obstype 2. \code{deathexact = death.states} specifies that all observations of \code{death.states} are of type 3. \code{deathexact = TRUE} specifies that all observations in the final absorbing state are of type 3.} \item{obstrue}{In misclassification models specified with \code{ematrix}, \code{obstrue} is a vector of logicals (\code{TRUE} or \code{FALSE}) or numerics (1 or 0) specifying which observations (\code{TRUE}, 1) are observations of the underlying state without error, and which (\code{FALSE}, 0) are realisations of a hidden Markov model. In HMMs specified with \code{hmodel}, where the hidden state is known at some times, if \code{obstrue} is supplied it is assumed to contain the actual true state data. Elements of \code{obstrue} at times when the hidden state is unknown are set to \code{NA}. This allows the information from HMM outcomes generated conditionally on the known state to be included in the model, thus improving the estimation of the HMM outcome distributions. HMMs where the true state is known to be within a specific set at specific times can be defined with a combination of \code{censor} and \code{obstrue}. In these models, a code is defined for the \code{state} outcome (see \code{censor}), and \code{obstrue} is set to 1 for observations where the true state is known to be one of the elements of \code{censor.states} at the corresponding time.} \item{covariates}{A formula or a list of formulae representing the covariates on the transition intensities via a log-linear model. If a single formula is supplied, like \code{covariates = ~ age + sex + treatment} then these covariates are assumed to apply to all intensities. If a named list is supplied, then this defines a potentially different model for each named intensity. For example, \code{covariates = list("1-2" = ~ age, "2-3" = ~ age + treatment)} specifies an age effect on the state 1 - state 2 transition, additive age and treatment effects on the state 2 - state 3 transition, but no covariates on any other transitions that are allowed by the \code{qmatrix}. If covariates are time dependent, they are assumed to be constant in between the times they are observed, and the transition probability between a pair of times \eqn{(t1, t2)} is assumed to depend on the covariate value at \eqn{t1}.} \item{covinits}{Initial values for log-linear effects of covariates on the transition intensities. This should be a named list with each element corresponding to a covariate. A single element contains the initial values for that covariate on each transition intensity, reading across the rows in order. For a pair of effects constrained to be equal, the initial value for the first of the two effects is used. For example, for a model with the above \code{qmatrix} and age and sex covariates, the following initialises all covariate effects to zero apart from the age effect on the 2-1 transition, and the sex effect on the 1-3 transition. \code{ covinits = list(sex=c(0, 0, 0.1, 0), age=c(0, 0.1, 0, 0))} For factor covariates, name each level by concatenating the name of the covariate with the level name, quoting if necessary. For example, for a covariate \code{agegroup} with three levels \code{0-15, 15-60, 60-}, use something like \code{ covinits = list("agegroup15-60"=c(0, 0.1, 0, 0), "agegroup60-"=c(0.1, 0.1, 0, 0))} If not specified or wrongly specified, initial values are assumed to be zero.} \item{constraint}{A list of one numeric vector for each named covariate. The vector indicates which covariate effects on intensities are constrained to be equal. Take, for example, a model with five transition intensities and two covariates. Specifying\cr \code{constraint = list (age = c(1,1,1,2,2), treatment = c(1,2,3,4,5))}\cr constrains the effect of age to be equal for the first three intensities, and equal for the fourth and fifth. The effect of treatment is assumed to be different for each intensity. Any vector of increasing numbers can be used as indicators. The intensity parameters are assumed to be ordered by reading across the rows of the transition matrix, starting at the first row, ignoring the diagonals. Negative elements of the vector can be used to indicate that particular covariate effects are constrained to be equal to minus some other effects. For example: \code{constraint = list (age = c(-1,1,1,2,-2), treatment = c(1,2,3,4,5)) }\cr constrains the second and third age effects to be equal, the first effect to be minus the second, and the fifth age effect to be minus the fourth. For example, it may be realisitic that the effect of a covariate on the "reverse" transition rate from state 2 to state 1 is minus the effect on the "forward" transition rate, state 1 to state 2. Note that it is not possible to specify exactly which of the covariate effects are constrained to be positive and which negative. The maximum likelihood estimation chooses the combination of signs which has the higher likelihood. For categorical covariates, defined as factors, specify constraints as follows:\cr \code{list(..., covnameVALUE1 = c(...), covnameVALUE2 = c(...), ...)}\cr where \code{covname} is the name of the factor, and \code{VALUE1}, \code{VALUE2}, ... are the labels of the factor levels (usually excluding the baseline, if using the default contrasts). Make sure the \code{contrasts} option is set appropriately, for example, the default \code{options(contrasts=c(contr.treatment, contr.poly))} sets the first (baseline) level of unordered factors to zero, then the baseline level is ignored in this specification. To assume no covariate effect on a certain transition, use the \code{fixedpars} argument to fix it at its initial value (which is zero by default) during the optimisation.} \item{misccovariates}{A formula representing the covariates on the misclassification probabilities, analogously to \code{covariates}, via multinomial logistic regression. Only used if the model is specified using \code{ematrix}, rather than \code{hmodel}. This must be a single formula - lists are not supported, unlike \code{covariates}. If a different model on each probability is required, include all covariates in this formula, and use \code{fixedpars} to fix some of their effects (for particular probabilities) at their default initial values of zero.} \item{misccovinits}{Initial values for the covariates on the misclassification probabilities, defined in the same way as \code{covinits}. Only used if the model is specified using \code{ematrix}.} \item{miscconstraint}{A list of one vector for each named covariate on misclassification probabilities. The vector indicates which covariate effects on misclassification probabilities are constrained to be equal, analogously to \code{constraint}. Only used if the model is specified using \code{ematrix}.} \item{hcovariates}{List of formulae the same length as \code{hmodel}, defining any covariates governing the hidden Markov outcome models. The covariates operate on a suitably link-transformed linear scale, for example, log scale for a Poisson outcome model. If there are no covariates for a certain hidden state, then insert a NULL in the corresponding place in the list. For example, \code{hcovariates = list(~acute + age, ~acute, NULL).}} \item{hcovinits}{Initial values for the hidden Markov model covariate effects. A list of the same length as \code{hcovariates}. Each element is a vector with initial values for the effect of each covariate on that state. For example, the above \code{hcovariates} can be initialised with \code{hcovariates = list(c(-8, 0), -8, NULL)}. Initial values must be given for all or no covariates, if none are given these are all set to zero. The initial value given in the \code{hmodel} constructor function for the corresponding baseline parameter is interpreted as the value of that parameter with any covariates fixed to their means in the data. If multiple effects are constrained to be equal using \code{hconstraint}, then the initial value is taken from the first of the multiple initial values supplied.} \item{hconstraint}{A named list. Each element is a vector of constraints on the named hidden Markov model parameter. The vector has length equal to the number of times that class of parameter appears in the whole model. For example consider the three-state hidden Markov model described above, with normally-distributed outcomes for states 1 and 2. To constrain the outcome variance to be equal for states 1 and 2, and to also constrain the effect of \code{acute} on the outcome mean to be equal for states 1 and 2, specify \code{hconstraint = list(sd = c(1,1), acute=c(1,1))} Note this excludes initial state occupancy probabilities and covariate effects on those probabilities, which cannot be constrained.} \item{hranges}{Range constraints for hidden Markov model parameters. Supplied as a named list, with each element corresponding to the named hidden Markov model parameter. This element is itself a list with two elements, vectors named "lower" and "upper". These vectors each have length equal to the number of times that class of parameter appears in the whole model, and give the corresponding mininum amd maximum allowable values for that parameter. Maximum likelihood estimation is performed with these parameters constrained in these ranges (through a log or logit-type transformation). Lower bounds of \code{-Inf} and upper bounds of \code{Inf} can be given if the parameter is unbounded above or below. For example, in the three-state model above, to constrain the mean for state 1 to be between 0 and 6, and the mean of state 2 to be between 7 and 12, supply \code{hranges=list(mean=list(lower=c(0, 7), upper=c(6, 12)))} These default to the natural ranges, e.g. the positive real line for variance parameters, and [0,1] for probabilities. Therefore \code{hranges} need not be specified for such parameters unless an even stricter constraint is desired. If only one limit is supplied for a parameter, only the first occurrence of that parameter is constrained. Initial values should be strictly within any ranges, and not on the range boundary, otherwise optimisation will fail with a "non-finite value" error.} \item{qconstraint}{A vector of indicators specifying which baseline transition intensities are equal. For example, \code{qconstraint = c(1,2,3,3)} constrains the third and fourth intensities to be equal, in a model with four allowed instantaneous transitions. When there are covariates on the intensities and \code{center=TRUE} (the default), \code{qconstraint} is applied to the intensities with covariates taking the values of the means in the data. When \code{center=FALSE}, \code{qconstraint} is applied to the intensities with covariates set to zero.} \item{econstraint}{A similar vector of indicators specifying which baseline misclassification probabilities are constrained to be equal. Only used if the model is specified using \code{ematrix}, rather than \code{hmodel}.} \item{initprobs}{Only used in hidden Markov models. Underlying state occupancy probabilities at each subject's first observation. Can either be a vector of \eqn{nstates} elements with common probabilities to all subjects, or a \eqn{nsubjects} by \eqn{nstates} matrix of subject-specific probabilities. This refers to observations after missing data and subjects with only one observation have been excluded. If these are estimated (see \code{est.initprobs}), then this represents an initial value, and defaults to equal probability for each state. Otherwise this defaults to \code{c(1, rep(0, nstates-1))}, that is, in state 1 with a probability of 1. Scaled to sum to 1 if necessary. The state 1 occupancy probability should be non-zero.} \item{est.initprobs}{Only used in hidden Markov models. If \code{TRUE}, then the underlying state occupancy probabilities at the first observation will be estimated, starting from a vector of initial values supplied in the \code{initprobs} argument. Structural zeroes are allowed: if any of these initial values are zero they will be fixed at zero during optimisation, even if \code{est.initprobs=TRUE}, and no covariate effects on them are estimated. The exception is state 1, which should have non-zero occupancy probability. Note that the free parameters during this estimation exclude the state 1 occupancy probability, which is fixed at one minus the sum of the other probabilities.} \item{initcovariates}{Formula representing covariates on the initial state occupancy probabilities, via multinomial logistic regression. The linear effects of these covariates, observed at the individual's first observation time, operate on the log ratio of the state \eqn{r} occupancy probability to the state 1 occupancy probability, for each \eqn{r = 2} to the number of states. Thus the state 1 occupancy probability should be non-zero. If \code{est.initprobs} is \code{TRUE}, these effects are estimated starting from their initial values. If \code{est.initprobs} is \code{FALSE}, these effects are fixed at theit initial values.} \item{initcovinits}{Initial values for the covariate effects \code{initcovariates}. A named list with each element corresponding to a covariate, as in \code{covinits}. Each element is a vector with (1 - number of states) elements, containing the initial values for the linear effect of that covariate on the log odds of that state relative to state 1, from state 2 to the final state. If \code{initcovinits} is not specified, all covariate effects are initialised to zero.} \item{deathexact}{Vector of indices of absorbing states whose time of entry is known exactly, but the individual is assumed to be in an unknown transient state ("alive") at the previous instant. This is the usual situation for times of death in chronic disease monitoring data. For example, if you specify \code{deathexact = c(4, 5)} then states 4 and 5 are assumed to be exactly-observed death states. See the \code{obstype} argument. States of this kind correspond to \code{obstype=3}. \code{deathexact = TRUE} indicates that the final absorbing state is of this kind, and \code{deathexact = FALSE} or \code{deathexact = NULL} (the default) indicates that there is no state of this kind. The \code{deathexact} argument is overridden by \code{obstype} or \code{exacttimes}. Note that you do not always supply a \code{deathexact} argument, even if there are states that correspond to deaths, because they do not necessarily have \code{obstype=3}. If the state is known between the time of death and the previous observation, then you should specify \code{obstype=2} for the death times, or \code{exacttimes=TRUE} if the state is known at all times, and the \code{deathexact} argument is ignored.} \item{death}{Old name for the \code{deathexact} argument. Overridden by \code{deathexact} if both are supplied. Deprecated.} \item{exacttimes}{By default, the transitions of the Markov process are assumed to take place at unknown occasions in between the observation times. If \code{exacttimes} is set to \code{TRUE}, then the observation times are assumed to represent the exact times of transition of the process. The subject is assumed to be in the same state between these times. An observation may represent a transition to a different state or a repeated observation of the same state (e.g. at the end of follow-up). This is equivalent to every row of the data having \code{obstype = 2}. See the \code{obstype} argument. If both \code{obstype} and \code{exacttimes} are specified then \code{exacttimes} is ignored. Note that the complete history of the multi-state process is known with this type of data. The models which \pkg{msm} fits have the strong assumption of constant (or piecewise-constant) transition rates. Knowing the exact transition times allows more realistic models to be fitted with other packages. For example parametric models with sojourn distributions more flexible than the exponential can be fitted with the \pkg{flexsurv} package, or semi-parametric models can be implemented with \pkg{survival} in conjunction with \pkg{mstate}.} \item{censor}{A state, or vector of states, which indicates censoring. Censoring means that the observed state is known only to be one of a particular set of states. For example, \code{censor=999} indicates that all observations of \code{999} in the vector of observed states are censored states. By default, this means that the true state could have been any of the transient (non-absorbing) states. To specify corresponding true states explicitly, use a \code{censor.states} argument. Note that in contrast to the usual terminology of survival analysis, here it is the \emph{state} which is considered to be censored, rather than the \emph{event time}. If at the end of a study, an individual has not died, but their true state is \emph{known}, then \code{censor} is unnecessary, since the standard multi-state model likelihood is applicable. Also a "censored" state here can be at any time, not just at the end. For hidden Markov models, censoring may indicate either a set of possible observed states, or a set of (hidden) true states. The later case is specified by setting the relevant elements of \code{obstrue} to 1 (and \code{NA} otherwise). Note in particular that general time-inhomogeneous Markov models with piecewise constant transition intensities can be constructed using the \code{censor} facility. If the true state is unknown on occasions when a piecewise constant covariate is known to change, then censored states can be inserted in the data on those occasions. The covariate may represent time itself, in which case the \code{pci} option to msm can be used to perform this trick automatically, or some other time-dependent variable. Not supported for multivariate hidden Markov models specified with \code{\link{hmmMV}}.} \item{censor.states}{Specifies the underlying states which censored observations can represent. If \code{censor} is a single number (the default) this can be a vector, or a list with one element. If \code{censor} is a vector with more than one element, this should be a list, with each element a vector corresponding to the equivalent element of \code{censor}. For example \code{censor = c(99, 999), censor.states = list(c(2,3), c(3,4))} means that observations coded 99 represent either state 2 or state 3, while observations coded 999 are really either state 3 or state 4.} \item{pci}{Model for piecewise-constant intensities. Vector of cut points defining the times, since the start of the process, at which intensities change for all subjects. For example \code{pci = c(5, 10)} specifies that the intensity changes at time points 5 and 10. This will automatically construct a model with a categorical (factor) covariate called \code{timeperiod}, with levels \code{"[-Inf,5)"}, \code{"[5,10)"} and \code{"[10,Inf)"}, where the first level is the baseline. This covariate defines the time period in which the observation was made. Initial values and constraints on covariate effects are specified the same way as for a model with a covariate of this name, for example, \code{covinits = list("timeperiod[5,10)"=c(0.1,0.1), "timeperiod[10,Inf)"=c(0.1,0.1))} Thus if \code{pci} is supplied, you cannot have a previously-existing variable called \code{timeperiod} as a covariate in any part of a \code{msm} model. To assume piecewise constant intensities for some transitions but not others with \code{pci}, use the \code{fixedpars} argument to fix the appropriate covariate effects at their default initial values of zero. Internally, this works by inserting censored observations in the data at times when the intensity changes but the state is not observed. If the supplied times are outside the range of the time variable in the data, \code{pci} is ignored and a time-homogeneous model is fitted. After fitting a time-inhomogeneous model, \code{\link{qmatrix.msm}} can be used to obtain the fitted intensity matrices for each time period, for example, \code{qmatrix.msm(example.msm, covariates=list(timeperiod="[5,Inf)"))} This facility does not support interactions between time and other covariates. Such models need to be specified "by hand", using a state variable with censored observations inserted. Note that the \code{data} component of the \code{msm} object returned from a call to \code{msm} with \code{pci} supplied contains the states with inserted censored observations and time period indicators. These can be used to construct such models. Note that you do not need to use \code{pci} in order to model the effect of a time-dependent covariate in the data. \code{msm} will automatically assume that covariates are piecewise-constant and change at the times when they are observed. \code{pci} is for when you want all intensities to change at the same pre-specified times for all subjects. \code{pci} is not supported for multivariate hidden Markov models specified with \code{\link{hmmMV}}. An approximate equivalent can be constructed by creating a variable in the data to represent the time period, and treating that as a covariate using the \code{covariates} argument to \code{msm}. This will assume that the value of this variable is constant between observations.} \item{phase.states}{Indices of states which have a two-phase sojourn distribution. This defines a semi-Markov model, in which the hazard of an onward transition depends on the time spent in the state. This uses the technique described by Titman and Sharples (2009). A hidden Markov model is automatically constructed on an expanded state space, where the phases correspond to the hidden states. The "tau" proportionality constraint described in this paper is currently not supported. Covariates, constraints, \code{deathexact} and \code{censor} are expressed with respect to the expanded state space. If not supplied by hand, \code{initprobs} is defined automatically so that subjects are assumed to begin in the first of the two phases. Hidden Markov models can additionally be given phased states. The user supplies an outcome distribution for each original state using \code{hmodel}, which is expanded internally so that it is assumed to be the same within each of the phased states. \code{initprobs} is interpreted on the expanded state space. Misclassification models defined using \code{ematrix} are not supported, and these must be defined using \code{hmmCat} or \code{hmmIdent} constructors, as described in the \code{hmodel} section of this help page. Or the HMM on the expanded state space can be defined by hand. Output functions are presented as it were a hidden Markov model on the expanded state space, for example, transition probabilities between states, covariate effects on transition rates, or prevalence counts, are not aggregated over the hidden phases. Numerical estimation will be unstable when there is weak evidence for a two-phase sojourn distribution, that is, if the model is close to Markov. See \code{\link{d2phase}} for the definition of the two-phase distribution and the interpretation of its parameters. This is an experimental feature, and some functions are not implemented. Please report any experiences of using this feature to the author!} \item{phase.inits}{Initial values for phase-type models. A list with one component for each "two-phased" state. Each component is itself a list of two elements. The first of these elements is a scalar defining the transition intensity from phase 1 to phase 2. The second element is a matrix, with one row for each potential destination state from the two-phased state, and two columns. The first column is the transition rate from phase 1 to the destination state, and the second column is the transition rate from phase 2 to the destination state. If there is only one destination state, then this may be supplied as a vector. In phase type models, the initial values for transition rates out of non-phased states are taken from the \code{qmatrix} supplied to msm, and entries of this matrix corresponding to transitions out of phased states are ignored.} \item{subject.weights}{Name of a variable in the data (unquoted) giving weights to apply to each subject in the data when calculating the log-likelihood as a weighted sum over subjects. These are taken from the first observation for each subject, and any weights supplied for subsequent observations are not used. Weights at the observation level are not supported.} \item{cl}{Width of symmetric confidence intervals for maximum likelihood estimates, by default 0.95.} \item{fixedpars}{Vector of indices of parameters whose values will be fixed at their initial values during the optimisation. These are given in the order: transition intensities (reading across rows of the transition matrix), covariates on intensities (ordered by intensities within covariates), hidden Markov model parameters, including misclassification probabilities or parameters of HMM outcome distributions (ordered by parameters within states), hidden Markov model covariate parameters (ordered by covariates within parameters within states), initial state occupancy probabilities (excluding the first probability, which is fixed at one minus the sum of the others). If there are equality constraints on certain parameters, then \code{fixedpars} indexes the set of unique parameters, excluding those which are constrained to be equal to previous parameters. To fix all parameters, specify \code{fixedpars = TRUE}. This can be useful for profiling likelihoods, and building complex models stage by stage.} \item{center}{If \code{TRUE} (the default, unless \code{fixedpars=TRUE}) then covariates are centered at their means during the maximum likelihood estimation. This usually improves stability of the numerical optimisation.} \item{opt.method}{If "optim", "nlm" or "bobyqa", then the corresponding R function will be used for maximum likelihood estimation. \code{\link{optim}} is the default. "bobyqa" requires the package \pkg{minqa} to be installed. See the help of these functions for further details. Advanced users can also add their own optimisation methods, see the source for \code{optim.R} in msm for some examples. If "fisher", then a specialised Fisher scoring method is used (Kalbfleisch and Lawless, 1985) which can be faster than the generic methods, though less robust. This is only available for Markov models with panel data (\code{obstype=1}), that is, not for models with censored states, hidden Markov models, exact observation or exact death times (\code{obstype=2,3}).} \item{hessian}{If \code{TRUE} then standard errors and confidence intervals are obtained from a numerical estimate of the Hessian (the observed information matrix). This is the default when maximum likelihood estimation is performed. If all parameters are fixed at their initial values and no optimisation is performed, then this defaults to \code{FALSE}. If requested, the actual Hessian is returned in \code{x$paramdata$opt$hessian}, where \code{x} is the fitted model object. If \code{hessian} is set to \code{FALSE}, then standard errors and confidence intervals are obtained from the Fisher (expected) information matrix, if this is available. This may be preferable if the numerical estimation of the Hessian is computationally intensive, or if the resulting estimate is non-invertible or not positive definite.} \item{use.deriv}{If \code{TRUE} then analytic first derivatives are used in the optimisation of the likelihood, where available and an appropriate quasi-Newton optimisation method, such as BFGS, is being used. Analytic derivatives are not available for all models.} \item{use.expm}{If \code{TRUE} then any matrix exponentiation needed to calculate the likelihood is done using the \pkg{expm} package. Otherwise the original routines used in \pkg{msm} 1.2.4 and earlier are used. Set to \code{FALSE} for backward compatibility, and let the package maintainer know if this gives any substantive differences.} \item{analyticp}{By default, the likelihood for certain simpler 3, 4 and 5 state models is calculated using an analytic expression for the transition probability (P) matrix. For all other models, matrix exponentiation is used to obtain P. To revert to the original method of using the matrix exponential for all models, specify \code{analyticp=FALSE}. See the PDF manual for a list of the models for which analytic P matrices are implemented.} \item{na.action}{What to do with missing data: either \code{na.omit} to drop it and carry on, or \code{na.fail} to stop with an error. Missing data includes all NAs in the states, times, \code{subject} or \code{obstrue}, all NAs at the first observation for a subject for covariates in \code{initcovariates}, all NAs in other covariates (excluding the last observation for a subject), all NAs in \code{obstype} (excluding the first observation for a subject), and any subjects with only one observation (thus no observed transitions).} \item{...}{Optional arguments to the general-purpose optimisation routine, \code{\link{optim}} by default. For example \code{method="Nelder-Mead"} to change the optimisation algorithm from the \code{"BFGS"} method that msm calls by default. It is often worthwhile to normalize the optimisation using \code{control=list(fnscale = a)}, where \code{a} is the a number of the order of magnitude of the -2 log likelihood. If 'false' convergence is reported and the standard errors cannot be calculated due to a non-positive-definite Hessian, then consider tightening the tolerance criteria for convergence. If the optimisation takes a long time, intermediate steps can be printed using the \code{trace} argument of the control list. See \code{\link{optim}} for details. For the Fisher scoring method, a \code{control} list can be supplied in the same way, but the only supported options are \code{reltol}, \code{trace} and \code{damp}. The first two are used in the same way as for \code{\link{optim}}. If the algorithm fails with a singular information matrix, adjust \code{damp} from the default of zero (to, e.g. 1). This adds a constant identity matrix multiplied by \code{damp} to the information matrix during optimisation.} } \value{ To obtain summary information from models fitted by the \code{\link{msm}} function, it is recommended to use extractor functions such as \code{\link{qmatrix.msm}}, \code{\link{pmatrix.msm}}, \code{\link{sojourn.msm}}, \code{\link{msm.form.qoutput}}. These provide estimates and confidence intervals for quantities such as transition probabilities for given covariate values. For advanced use, it may be necessary to directly use information stored in the object returned by \code{\link{msm}}. This is documented in the help page \code{\link{msm.object}}. Printing a \code{msm} object by typing the object's name at the command line implicitly invokes \code{\link{print.msm}}. This formats and prints the important information in the model fit, and also returns that information in an R object. This includes estimates and confidence intervals for the transition intensities and (log) hazard ratios for the corresponding covariates. When there is a hidden Markov model, the chief information in the \code{hmodel} component is also formatted and printed. This includes estimates and confidence intervals for each parameter. } \description{ Fit a continuous-time Markov or hidden Markov multi-state model by maximum likelihood. Observations of the process can be made at arbitrary times, or the exact times of transition between states can be known. Covariates can be fitted to the Markov chain transition intensities or to the hidden Markov observation process. } \details{ For full details about the methodology behind the \pkg{msm} package, refer to the PDF manual \file{msm-manual.pdf} in the \file{doc} subdirectory of the package. This includes a tutorial in the typical use of \pkg{msm}. The paper by Jackson (2011) in Journal of Statistical Software presents the material in this manual in a more concise form. \pkg{msm} was designed for fitting \emph{continuous-time} Markov models, processes where transitions can occur at any time. These models are defined by \emph{intensities}, which govern both the time spent in the current state and the probabilities of the next state. In \emph{discrete-time models}, transitions are known in advance to only occur at multiples of some time unit, and the model is purely governed by the probability distributions of the state at the next time point, conditionally on the state at the current time. These can also be fitted in \pkg{msm}, assuming that there is a continuous-time process underlying the data. Then the fitted transition probability matrix over one time period, as returned by \code{pmatrix.msm(...,t=1)} is equivalent to the matrix that governs the discrete-time model. However, these can be fitted more efficiently using multinomial logistic regression, for example, using \code{multinom} from the R package \pkg{nnet} (Venables and Ripley, 2002). For simple continuous-time multi-state Markov models, the likelihood is calculated in terms of the transition intensity matrix \eqn{Q}. When the data consist of observations of the Markov process at arbitrary times, the exact transition times are not known. Then the likelihood is calculated using the transition probability matrix \eqn{P(t) = \exp(tQ)}{P(t) = exp(tQ)}, where \eqn{\exp}{exp} is the matrix exponential. If state \eqn{i} is observed at time \eqn{t} and state \eqn{j} is observed at time \eqn{u}, then the contribution to the likelihood from this pair of observations is the \eqn{i,j} element of \eqn{P(u - t)}. See, for example, Kalbfleisch and Lawless (1985), Kay (1986), or Gentleman \emph{et al.} (1994). For hidden Markov models, the likelihood for an individual with \eqn{k} observations is calculated directly by summing over the unknown state at each time, producing a product of \eqn{k} matrices. The calculation is a generalisation of the method described by Satten and Longini (1996), and also by Jackson and Sharples (2002), and Jackson \emph{et al.} (2003). There must be enough information in the data on each state to estimate each transition rate, otherwise the likelihood will be flat and the maximum will not be found. It may be appropriate to reduce the number of states in the model, the number of allowed transitions, or the number of covariate effects, to ensure convergence. Hidden Markov models, and situations where the value of the process is only known at a series of snapshots, are particularly susceptible to non-identifiability, especially when combined with a complex transition matrix. Choosing an appropriate set of initial values for the optimisation can also be important. For flat likelihoods, 'informative' initial values will often be required. See the PDF manual for other tips. } \examples{ ### Heart transplant data ### For further details and background to this example, see ### Jackson (2011) or the PDF manual in the doc directory. print(cav[1:10,]) twoway4.q <- rbind(c(-0.5, 0.25, 0, 0.25), c(0.166, -0.498, 0.166, 0.166), c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)) statetable.msm(state, PTNUM, data=cav) crudeinits.msm(state ~ years, PTNUM, data=cav, qmatrix=twoway4.q) cav.msm <- msm( state ~ years, subject=PTNUM, data = cav, qmatrix = twoway4.q, deathexact = 4, control = list ( trace = 2, REPORT = 1 ) ) cav.msm qmatrix.msm(cav.msm) pmatrix.msm(cav.msm, t=10) sojourn.msm(cav.msm) } \references{ Jackson, C.H. (2011). Multi-State Models for Panel Data: The msm Package for R., Journal of Statistical Software, 38(8), 1-29. URL http://www.jstatsoft.org/v38/i08/. Kalbfleisch, J., Lawless, J.F., The analysis of panel data under a Markov assumption \emph{Journal of the Americal Statistical Association} (1985) 80(392): 863--871. Kay, R. A Markov model for analysing cancer markers and disease states in survival studies. \emph{Biometrics} (1986) 42: 855--865. Gentleman, R.C., Lawless, J.F., Lindsey, J.C. and Yan, P. Multi-state Markov models for analysing incomplete disease history data with illustrations for HIV disease. \emph{Statistics in Medicine} (1994) 13(3): 805--821. Satten, G.A. and Longini, I.M. Markov chains with measurement error: estimating the 'true' course of a marker of the progression of human immunodeficiency virus disease (with discussion) \emph{Applied Statistics} 45(3): 275-309 (1996) Jackson, C.H. and Sharples, L.D. Hidden Markov models for the onset and progression of bronchiolitis obliterans syndrome in lung transplant recipients \emph{Statistics in Medicine}, 21(1): 113--128 (2002). Jackson, C.H., Sharples, L.D., Thompson, S.G. and Duffy, S.W. and Couto, E. Multi-state Markov models for disease progression with classification error. \emph{The Statistician}, 52(2): 193--209 (2003) Titman, A.C. and Sharples, L.D. Semi-Markov models with phase-type sojourn distributions. \emph{Biometrics} 66, 742-752 (2009). Venables, W.N. and Ripley, B.D. (2002) \emph{Modern Applied Statistics with S}, second edition. Springer. } \seealso{ \code{\link{simmulti.msm}}, \code{\link{plot.msm}}, \code{\link{summary.msm}}, \code{\link{qmatrix.msm}}, \code{\link{pmatrix.msm}}, \code{\link{sojourn.msm}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/qmatrix.msm.Rd0000644000176200001440000001033014527726565014410 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{qmatrix.msm} \alias{qmatrix.msm} \title{Transition intensity matrix} \usage{ qmatrix.msm( x, covariates = "mean", sojourn = FALSE, ci = c("delta", "normal", "bootstrap", "none"), cl = 0.95, B = 1000, cores = NULL ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{covariates}{The covariate values at which to estimate the intensity matrix. This can either be:\cr the string \code{"mean"}, denoting the means of the covariates in the data (this is the default),\cr the number \code{0}, indicating that all the covariates should be set to zero,\cr or a list of values, with optional names. For example \code{list (60, 1)} where the order of the list follows the order of the covariates originally given in the model formula. Or more clearly, a named list, \code{list (age = 60, sex = 1)} If some covariates are specified but not others, the missing ones default to zero. With \code{covariates="mean"}, for factor / categorical variables, the mean of the 0/1 dummy variable for each factor level is used, representing an average over all values in the data, rather than a specific factor level.} \item{sojourn}{Set to TRUE if the estimated sojourn times and their standard errors should also be returned.} \item{ci}{If \code{"delta"} (the default) then confidence intervals are calculated by the delta method, or by simple transformation of the Hessian in the very simplest cases. Normality on the log scale is assumed. If \code{"normal"}, then calculate a confidence interval by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects, then transforming. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}.} \item{cl}{Width of the symmetric confidence interval to present. Defaults to 0.95.} \item{B}{Number of bootstrap replicates, or number of normal simulations from the distribution of the MLEs.} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} } \value{ A list with components: \item{estimate}{Estimated transition intensity matrix.} \item{SE}{Corresponding approximate standard errors.} \item{L}{Lower confidence limits} \item{U}{Upper confidence limits} Or if \code{ci="none"}, then \code{qmatrix.msm} just returns the estimated transition intensity matrix. If \code{sojourn} is \code{TRUE}, extra components called \code{sojourn}, \code{sojournSE}, \code{sojournL} and \code{sojournU} are included, containing the estimates, standard errors and confidence limits, respectively, of the mean sojourn times in each transient state. The default print method for objects returned by \code{\link{qmatrix.msm}} presents estimates and confidence limits. To present estimates and standard errors, do something like \code{qmatrix.msm(x)[c("estimates","SE")]} } \description{ Extract the estimated transition intensity matrix, and the corresponding standard errors, from a fitted multi-state model at a given set of covariate values. } \details{ Transition intensities and covariate effects are estimated on the log scale by \code{\link{msm}}. A covariance matrix is estimated from the Hessian of the maximised log-likelihood. A more practically meaningful parameterisation of a continuous-time Markov model with transition intensities \eqn{q_{rs}} is in terms of the mean sojourn times \eqn{-1 / q_{rr}} in each state \eqn{r} and the probabilities that the next move of the process when in state \eqn{r} is to state \eqn{s}, \eqn{-q_{rs} / q_{rr}}. } \seealso{ \code{\link{pmatrix.msm}}, \code{\link{sojourn.msm}}, \code{\link{deltamethod}}, \code{\link{ematrix.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/tnorm.Rd0000644000176200001440000000726414654466432013276 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tnorm.R \name{tnorm} \alias{tnorm} \alias{dtnorm} \alias{ptnorm} \alias{qtnorm} \alias{rtnorm} \title{Truncated Normal distribution} \usage{ dtnorm(x, mean = 0, sd = 1, lower = -Inf, upper = Inf, log = FALSE) ptnorm( q, mean = 0, sd = 1, lower = -Inf, upper = Inf, lower.tail = TRUE, log.p = FALSE ) qtnorm( p, mean = 0, sd = 1, lower = -Inf, upper = Inf, lower.tail = TRUE, log.p = FALSE ) rtnorm(n, mean = 0, sd = 1, lower = -Inf, upper = Inf) } \arguments{ \item{x, q}{vector of quantiles.} \item{mean}{vector of means.} \item{sd}{vector of standard deviations.} \item{lower}{lower truncation point.} \item{upper}{upper truncation point.} \item{log}{logical; if TRUE, return log density or log hazard.} \item{lower.tail}{logical; if TRUE (default), probabilities are P[X <= x], otherwise, P[X > x].} \item{log.p}{logical; if TRUE, probabilities p are given as log(p).} \item{p}{vector of probabilities.} \item{n}{number of observations. If \code{length(n) > 1}, the length is taken to be the number required.} } \value{ \code{dtnorm} gives the density, \code{ptnorm} gives the distribution function, \code{qtnorm} gives the quantile function, and \code{rtnorm} generates random deviates. } \description{ Density, distribution function, quantile function and random generation for the truncated Normal distribution with mean equal to \code{mean} and standard deviation equal to \code{sd} before truncation, and truncated on the interval \code{[lower, upper]}. } \details{ The truncated normal distribution has density \deqn{ f(x, \mu, \sigma) = \phi(x, \mu, \sigma) / (\Phi(u, \mu, \sigma) - \Phi(l, \mu, \sigma)) }{ f(x, mu, sigma) = phi(x, mu, sigma) / (Phi(upper, mu, sigma) - Phi(lower, mu, sigma)) } for \eqn{l <= x <= u}{lower <= x <= upper}, and 0 otherwise. \eqn{\mu}{mean} is the mean of the original Normal distribution before truncation, \cr \eqn{\sigma}{sd} is the corresponding standard deviation, \cr \eqn{u} is the upper truncation point, \cr \eqn{l} is the lower truncation point, \cr \eqn{\phi(x)}{phi(x)} is the density of the corresponding normal distribution, and \cr \eqn{\Phi(x)}{Phi(x)} is the distribution function of the corresponding normal distribution. If \code{mean} or \code{sd} are not specified they assume the default values of \code{0} and \code{1}, respectively. If \code{lower} or \code{upper} are not specified they assume the default values of \code{-Inf} and \code{Inf}, respectively, corresponding to no lower or no upper truncation. Therefore, for example, \code{dtnorm(x)}, with no other arguments, is simply equivalent to \code{dnorm(x)}. Only \code{rtnorm} is used in the \code{msm} package, to simulate from hidden Markov models with truncated normal distributions. This uses the rejection sampling algorithms described by Robert (1995). These functions are merely provided for completion, and are not optimized for numerical stability or speed. To fit a hidden Markov model with a truncated Normal response distribution, use a \code{\link{hmmTNorm}} constructor. See the \code{\link{hmm-dists}} help page for further details. } \examples{ x <- seq(50, 90, by=1) plot(x, dnorm(x, 70, 10), type="l", ylim=c(0,0.06)) ## standard Normal distribution lines(x, dtnorm(x, 70, 10, 60, 80), type="l") ## truncated Normal distribution } \references{ Robert, C. P. Simulation of truncated normal variables. Statistics and Computing (1995) 5, 121--125 } \seealso{ \code{\link{dnorm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{distribution} msm/man/coef.msm.Rd0000644000176200001440000000253414471426252013632 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{coef.msm} \alias{coef.msm} \title{Extract model coefficients} \usage{ \method{coef}{msm}(object, ...) } \arguments{ \item{object}{A fitted multi-state model object, as returned by \code{\link{msm}}.} \item{...}{(unused) further arguments passed to or from other methods.} } \value{ If there is no misclassification, \code{coef.msm} returns a list of matrices. The first component, labelled \code{logbaseline}, is a matrix containing the estimated transition intensities on the log scale with any covariates fixed at their means in the data. Each remaining component is a matrix giving the linear effects of the labelled covariate on the matrix of log intensities. \cr For misclassification models, \code{coef.msm} returns a list of lists. The first component, \code{Qmatrices}, is a list of matrices as described in the previous paragraph. The additional component \code{Ematrices} is a list of similar format containing the logit-misclassification probabilities and any estimated covariate effects. } \description{ Extract the estimated log transition intensities and the corresponding linear effects of each covariate. } \seealso{ \code{\link{msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/sojourn.msm.Rd0000644000176200001440000000614014471426252014412 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{sojourn.msm} \alias{sojourn.msm} \title{Mean sojourn times from a multi-state model} \usage{ sojourn.msm( x, covariates = "mean", ci = c("delta", "normal", "bootstrap", "none"), cl = 0.95, B = 1000 ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{covariates}{The covariate values at which to estimate the mean sojourn times. This can either be:\cr the string \code{"mean"}, denoting the means of the covariates in the data (this is the default),\cr the number \code{0}, indicating that all the covariates should be set to zero,\cr a list of values, with optional names. For example, \code{list(60, 1)}, where the order of the list follows the order of the covariates originally given in the model formula, or a named list, e.g. \code{list (age = 60, sex = 1)}} \item{ci}{If \code{"delta"} (the default) then confidence intervals are calculated by the delta method, or by simple transformation of the Hessian in the very simplest cases. If \code{"normal"}, then calculate a confidence interval by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects, then transforming. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}.} \item{cl}{Width of the symmetric confidence interval to present. Defaults to 0.95.} \item{B}{Number of bootstrap replicates, or number of normal simulations from the distribution of the MLEs} } \value{ A data frame with components: \item{estimates}{Estimated mean sojourn times in the transient states.} \item{SE}{Corresponding standard errors.} \item{L}{Lower confidence limits.} \item{U}{Upper confidence limits.} } \description{ Estimate the mean sojourn times in the transient states of a multi-state model and their confidence limits. } \details{ The mean sojourn time in a transient state \eqn{r} is estimated by \eqn{- 1 / q_{rr}}, where \eqn{q_{rr}} is the \eqn{r}th entry on the diagonal of the estimated transition intensity matrix. A continuous-time Markov model is fully specified by the mean sojourn times and the probability that each state is next (\code{\link{pnext.msm}}). This is a more intuitively meaningful description of a model than the transition intensity matrix (\code{\link{qmatrix.msm}}). Time dependent covariates, or time-inhomogeneous models, are not supported. This would require the mean of a piecewise exponential distribution, and the package author is not aware of any general analytic form for that. } \seealso{ \code{\link{msm}}, \code{\link{qmatrix.msm}}, \code{\link{deltamethod}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/sim.msm.Rd0000644000176200001440000000460314471426252013505 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/simul.R \name{sim.msm} \alias{sim.msm} \title{Simulate one individual trajectory from a continuous-time Markov model} \usage{ sim.msm( qmatrix, maxtime, covs = NULL, beta = NULL, obstimes = 0, start = 1, mintime = 0 ) } \arguments{ \item{qmatrix}{The transition intensity matrix of the Markov process. The diagonal of \code{qmatrix} is ignored, and computed as appropriate so that the rows sum to zero. For example, a possible \code{qmatrix} for a three state illness-death model with recovery is: \code{rbind( c( 0, 0.1, 0.02 ), c( 0.1, 0, 0.01 ), c( 0, 0, 0 ) )}} \item{maxtime}{Maximum time for the simulated process.} \item{covs}{Matrix of time-dependent covariates, with one row for each observation time and one column for each covariate.} \item{beta}{Matrix of linear covariate effects on log transition intensities. The rows correspond to different covariates, and the columns to the transition intensities. The intensities are ordered by reading across rows of the intensity matrix, starting with the first, counting the positive off-diagonal elements of the matrix.} \item{obstimes}{Vector of times at which the covariates are observed.} \item{start}{Starting state of the process. Defaults to 1.} \item{mintime}{Starting time of the process. Defaults to 0.} } \value{ A list with components, \item{states}{Simulated states through which the process moves. This ends with either an absorption before \code{obstime}, or a transient state at \code{obstime}. } \item{times}{Exact times at which the process changes to the corresponding states} \item{qmatrix}{The given transition intensity matrix} } \description{ Simulate one realisation from a continuous-time Markov process up to a given time. } \details{ The effect of time-dependent covariates on the transition intensity matrix for an individual is determined by assuming that the covariate is a step function which remains constant in between the individual's observation times. } \examples{ qmatrix <- rbind( c(-0.2, 0.1, 0.1 ), c(0.5, -0.6, 0.1 ), c(0, 0, 0) ) sim.msm(qmatrix, 30) } \seealso{ \code{\link{simmulti.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{datagen} msm/man/qmodel.object.Rd0000644000176200001440000000520014527611170014637 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/internals_doc.R \name{qmodel.object} \alias{qmodel.object} \title{Developer documentation: transition model structure object} \value{ \item{nstates}{Number of states} \item{iso}{Label for which basic structure the model is isomorphic to in the list of structures for which analytic formulae for the transition probabilities are implemented in the source file \code{src/analyticp.c}. This list is given by the internal object \code{msm:::.msm.graphs} which is defined and documented in the source file \code{R/constants.R}. \code{iso} is 0 if the analytic P matrix is not implemented for this structure, or if analytic P matrix calculations are disabled using \code{use.analyticp=FALSE} in the call to \code{\link{msm}}. } \item{perm}{Permutation required to convert the base isomorphism into the structure of this model. A vector of integers whose \eqn{r}th element is the state number in the base structure representing state \eqn{r} in the current structure. } \item{qperm}{Inverse permutation: vector whose \eqn{r}th element is the state number in the current structure representing the \eqn{r}th state in the base structure.} \item{npars}{Number of allowed instantaneous transitions, equal to \code{sum(imatrix)}.} \item{imatrix}{Indicator matrix for allowed instantaneous transitions. This has \eqn{(r,s)} entry 1 if the transition from \eqn{r} to \eqn{s} is permitted in continuous time, and 0 otherwise. The diagonal entries are arbitrarily set to 0.} \item{qmatrix}{Matrix of initial values for the transition intensities, supplied as the \code{qmatrix} argument of \code{\link{msm}}.} \item{inits}{Vector of these initial values, reading across rows of \code{qmatrix} and excluding the diagonal and disallowed transitions.} \item{constr}{Indicators for equality constraints on baseline intensities, taken from the \code{qconstraint} argument to \code{\link{msm}}, and mapped if necessary to the set (1,2,3,...).} \item{ndpars}{Number of distinct allowed instantaneous transitions, after applying equality constraints.} \item{expm}{Use \pkg{expm} package to calculate matrix exponentials for likelihoods, as supplied to the \code{use.expm} argument of \code{\link{msm}}. \code{TRUE} or \code{FALSE}.} } \description{ A list giving information about the structure of states and allowed transitions in a multi-state model, and options for likelihood calculation. Used in internal computations, and returned in a fitted \code{\link{msm}} model object. } \seealso{ \code{\link{msm.object}},\code{\link{emodel.object}}, \code{\link{hmodel.object}}. } msm/man/model.frame.msm.Rd0000644000176200001440000000612414471426252015106 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/msm.R \name{model.frame.msm} \alias{model.frame.msm} \alias{model.matrix.msm} \title{Extract original data from \code{msm} objects.} \usage{ \method{model.frame}{msm}(formula, agg = FALSE, ...) \method{model.matrix}{msm}(object, model = "intens", state = 1, ...) } \arguments{ \item{formula}{A fitted multi-state model object, as returned by \code{\link{msm}}.} \item{agg}{Return the model frame in the efficient aggregated form used to calculate the likelihood internally for non-hidden Markov models. This has one row for each unique combination of from-state, to-state, time lag, covariate value and observation type. The variable named \code{"(nocc)"} counts how many observations of that combination there are in the original data.} \item{...}{Further arguments (not used).} \item{object}{A fitted multi-state model object, as returned by \code{\link{msm}}.} \item{model}{\code{"intens"} to return the design matrix for covariates on intensities, \code{"misc"} for misclassification probabilities, \code{"hmm"} for a general hidden Markov model, and \code{"inits"} for initial state probabilities in hidden Markov models.} \item{state}{State corresponding to the required covariate design matrix in a hidden Markov model.} } \value{ \code{model.frame} returns a data frame with all the original variables used for the model fit, with any missing data removed (see \code{na.action} in \code{\link{msm}}). The state, time, subject, \code{obstype} and \code{obstrue} variables are named \code{"(state)"}, \code{"(time)"}, \code{"(subject)"}, \code{"(obstype)"} and \code{"(obstrue)"} respectively (note the brackets). A variable called \code{"(obs)"} is the observation number from the original data before any missing data were dropped. The variable \code{"(pcomb)"} is used for computing the likelihood for hidden Markov models, and identifies which distinct time difference, \code{obstype} and covariate values (thus which distinct interval transition probability matrix) each observation corresponds to. The model frame object has some other useful attributes, including \code{"usernames"} giving the user's original names for these variables (used for model refitting, e.g. in bootstrapping or cross validation) and \code{"covnames"} identifying which ones are covariates. \code{model.matrix} returns a design matrix for a part of the model that includes covariates. The required part is indicated by the \code{"model"} argument. For time-inhomogeneous models fitted with \code{"pci"}, these datasets will have imputed observations at each time change point, indicated where the variable \code{"(pci.imp)"} in the model frame is 1. The model matrix for intensities will have factor contrasts for the \code{timeperiod} covariate. } \description{ Extract the data from a multi-state model fitted with \code{msm}. } \seealso{ \code{\link{msm}}, \code{\link{model.frame}}, \code{\link{model.matrix}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/transient.msm.Rd0000644000176200001440000000144314471426252014723 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{transient.msm} \alias{transient.msm} \alias{absorbing.msm} \title{Transient and absorbing states} \usage{ transient.msm(x = NULL, qmatrix = NULL) absorbing.msm(x = NULL, qmatrix = NULL) } \arguments{ \item{x}{A fitted multi-state model as returned by \code{\link{msm}}.} \item{qmatrix}{A transition intensity matrix. The diagonal is ignored and taken to be minus the sum of the rest of the row.} } \value{ A vector of the ordinal indices of the transient or absorbing states. } \description{ Returns the transient and absorbing states of either a fitted model or a transition intensity matrix. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/msm.object.Rd0000644000176200001440000001430014527611167014161 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/internals_doc.R \name{msm.object} \alias{msm.object} \title{Fitted msm model objects} \value{ \item{call}{The original call to \code{\link{msm}}, as returned by \code{\link{match.call}}.} \item{Qmatrices}{A list of matrices. The first component, labelled \code{logbaseline}, is a matrix containing the estimated transition intensities on the log scale with any covariates fixed at their means in the data (or at zero, if \code{center=FALSE}). The component labelled \code{baseline} is the equivalent on the untransformed scale. Each remaining component is a matrix giving the linear effects of the labelled covariate on the matrix of log intensities. To extract an estimated intensity matrix on the natural scale, at an arbitrary combination of covariate values, use the function \code{\link{qmatrix.msm}}. } \item{QmatricesSE}{The standard error matrices corresponding to \code{Qmatrices}. } \item{QmatricesL,QmatricesU}{Corresponding lower and upper symmetric confidence limits, of width 0.95 unless specified otherwise by the \code{cl} argument. } \item{Ematrices}{A list of matrices. The first component, labelled \code{logitbaseline}, is the estimated misclassification probability matrix (expressed as as log odds relative to the probability of the true state) with any covariates fixed at their means in the data (or at zero, if \code{center=FALSE}). The component labelled \code{baseline} is the equivalent on the untransformed scale. Each remaining component is a matrix giving the linear effects of the labelled covariate on the matrix of logit misclassification probabilities. To extract an estimated misclassification probability matrix on the natural scale, at an arbitrary combination of covariate values, use the function \code{\link{ematrix.msm}}.} \item{EmatricesSE}{The standard error matrices corresponding to \code{Ematrices}.} \item{EmatricesL,EmatricesU}{Corresponding lower and upper symmetric confidence limits, of width 0.95 unless specified otherwise by the \code{cl} argument. } \item{minus2loglik}{Minus twice the maximised log-likelihood.} \item{deriv}{Derivatives of the minus twice log-likelihood at its maximum.} \item{estimates}{Vector of untransformed maximum likelihood estimates returned from \code{\link{optim}}. Transition intensities are on the log scale and misclassification probabilities are given as log odds relative to the probability of the true state.} \item{estimates.t}{Vector of transformed maximum likelihood estimates with intensities and probabilities on their natural scales.} \item{fixedpars}{Indices of \code{estimates} which were fixed during the maximum likelihood estimation.} \item{center}{Indicator for whether the estimation was performed with covariates centered on their means in the data.} \item{covmat}{Covariance matrix corresponding to \code{estimates}.} \item{ci}{Matrix of confidence intervals corresponding to \code{estimates.t}} \item{opt}{Return value from the optimisation routine (such as \code{\link{optim}} or \code{\link{nlm}}), giving information about the results of the optimisation.} \item{foundse}{Logical value indicating whether the Hessian was positive-definite at the supposed maximum of the likelihood. If not, the covariance matrix of the parameters is unavailable. In these cases the optimisation has probably not converged to a maximum. } \item{data}{A list giving the data used for the model fit, for use in post-processing. To extract it, use the methods \code{\link{model.frame.msm}} or \code{\link{model.matrix.msm}}. The format of this element changed in version 1.4 of \pkg{msm}, so that it now contains a \code{\link{model.frame}} object \code{mf} with all the variables used in the model. The previous format (an ad-hoc list of vectors and matrices) can be obtained with the function \code{recreate.olddata(msmobject)}, where \code{msmobject} is the object returned by \code{msm}. } \item{qmodel}{A list of objects representing the transition matrix structure and options for likelihood calculation. See \code{\link{qmodel.object}} for documentation of the components.} \item{emodel}{A list of objects representing the misclassification model structure, for models specified using the \code{ematrix} argument to \code{\link{msm}}. See \code{\link{emodel.object}}.} \item{qcmodel}{A list of objects representing the model for covariates on transition intensities. See \code{\link{qcmodel.object}}.} \item{ecmodel}{A list of objects representing the model for covariates on transition intensities. See \code{\link{ecmodel.object}}.} \item{hmodel}{A list of objects representing the hidden Markov model structure. See \code{\link{hmodel.object}}.} \item{cmodel}{A list giving information about censored states. See \code{\link{cmodel.object}}. } \item{pci}{Cut points for time-varying intensities, as supplied to \code{\link{msm}}, but excluding any that are outside the times observed in the data.} \item{paramdata}{A list giving information about the parameters of the multi-state model. See \code{\link{paramdata.object}}.} \item{cl}{Confidence interval width, as supplied to \code{\link{msm}}.} \item{covariates}{Formula for covariates on intensities, as supplied to \code{\link{msm}}.} \item{misccovariates}{Formula for covariates on misclassification probabilities, as supplied to \code{\link{msm}}.} \item{hcovariates}{Formula for covariates on hidden Markov model outcomes, as supplied to \code{\link{msm}}.} \item{initcovariates}{Formula for covariates on initial state occupancy probabilities in hidden Markov models, as supplied to \code{\link{msm}}.} \item{sojourn}{ A list as returned by \code{\link{sojourn.msm}}, with components: \code{mean} = estimated mean sojourn times in the transient states, with covariates fixed at their means (if center=TRUE) or at zero (if center=FALSE). \code{se} = corresponding standard errors. } } \description{ The \code{\link{msm}} function returns a list with the following components. These are intended for developers and confident users. To extract results from fitted model objects, functions such as \code{\link{qmatrix.msm}} or \code{\link{print.msm}} should be used instead. } msm/man/plot.msm.Rd0000644000176200001440000000400314534677441013675 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{plot.msm} \alias{plot.msm} \title{Plots of multi-state models} \usage{ \method{plot}{msm}( x, from = NULL, to = NULL, range = NULL, covariates = "mean", legend.pos = NULL, xlab = "Time", ylab = "Fitted survival probability", lwd = 1, ... ) } \arguments{ \item{x}{Output from \code{\link{msm}}, representing a fitted multi-state model object.} \item{from}{States from which to consider survival. Defaults to the complete set of transient states.} \item{to}{Absorbing state to consider. Defaults to the highest-labelled absorbing state.} \item{range}{Vector of two elements, giving the range of times to plot for.} \item{covariates}{Covariate values for which to evaluate the expected probabilities. This can either be:\cr the string \code{"mean"}, denoting the means of the covariates in the data (this is the default),\cr the number \code{0}, indicating that all the covariates should be set to zero,\cr or a list of values, with optional names. For example \code{list (60, 1)} where the order of the list follows the order of the covariates originally given in the model formula, or a named list, \code{list (age = 60, sex = 1)}} \item{legend.pos}{Vector of the \eqn{x} and \eqn{y} position, respectively, of the legend.} \item{xlab}{x axis label.} \item{ylab}{y axis label.} \item{lwd}{Line width. See \code{\link{par}}.} \item{...}{Other arguments to be passed to the generic \code{\link{plot}} and \code{\link{lines}} functions.} } \description{ This produces a plot of the expected probability of survival against time, from each transient state. Survival is defined as not entering an absorbing state. } \details{ Note that while this function is only relevant to models with absorbing states, models in \pkg{msm} can have any transition structure and do not necessarily have to have an absorbing state. } \seealso{ \code{\link{msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/hazard.msm.Rd0000644000176200001440000000245014471426252014164 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/outputs.R \name{hazard.msm} \alias{hazard.msm} \title{Calculate tables of hazard ratios for covariates on transition intensities} \usage{ hazard.msm(x, hazard.scale = 1, cl = 0.95) } \arguments{ \item{x}{Output from \code{\link{msm}} representing a fitted multi-state model.} \item{hazard.scale}{Vector with same elements as number of covariates on transition rates. Corresponds to the increase in each covariate used to calculate its hazard ratio. Defaults to all 1.} \item{cl}{Width of the symmetric confidence interval to present. Defaults to 0.95.} } \value{ A list of tables containing hazard ratio estimates, one table for each covariate. Each table has three columns, containing the hazard ratio, and an approximate upper and lower confidence limit respectively (assuming normality on the log scale), for each Markov chain transition intensity. } \description{ Hazard ratios are computed by exponentiating the estimated covariate effects on the log-transition intensities. This function is called by \code{\link{summary.msm}}. } \seealso{ \code{\link{msm}}, \code{\link{summary.msm}}, \code{\link{odds.msm}} } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/pearson.msm.Rd0000644000176200001440000003054114654465714014375 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pearson.R \name{pearson.msm} \alias{pearson.msm} \title{Pearson-type goodness-of-fit test} \usage{ pearson.msm( x, transitions = NULL, timegroups = 3, intervalgroups = 3, covgroups = 3, groups = NULL, boot = FALSE, B = 500, next.obstime = NULL, N = 100, indep.cens = TRUE, maxtimes = NULL, pval = TRUE ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{transitions}{This should be an integer vector indicating which interval transitions should be grouped together in the contingency table. Its length should be the number of allowed interval transitions, excluding transitions from absorbing states to absorbing states. The allowed interval transitions are the set of pairs of states \eqn{(a,b)} for which it is possible to observe \eqn{a} at one time and \eqn{b} at any later time. For example, in a "well-disease-death" model with allowed \emph{instantaneous} 1-2, 2-3 transitions, there are 5 allowed \emph{interval} transitions. In numerical order, these are 1-1, 1-2, 1-3, 2-2 and 2-3, excluding absorbing-absorbing transitions. Then, to group transitions 1-1,1-2 together, and transitions 2-2,2-3 together, specify \code{transitions = c(1,1,2,3,3)}. Only transitions from the same state may be grouped. By default, each interval transition forms a separate group.} \item{timegroups}{Number of groups based on quantiles of the time since the start of the process.} \item{intervalgroups}{Number of groups based on quantiles of the time interval between observations, within time groups} \item{covgroups}{Number of groups based on quantiles of \eqn{\sum_r q_{irr}}{sum_r q_{irr}}, where \eqn{q_{irr}} are the diagonal entries of the transition intensity matrix for the \emph{i}th transition. These are a function of the covariate effects and the covariate values at the \emph{i}th transition: \eqn{q_{irr}} is minus the sum of the off-diagonal entries \eqn{q_{rs}^{(0)} exp (\beta_{rs}^T z_i)} on the \emph{r}th row. Thus \code{covgroups} summarises the impact of covariates at each observation, by calculating the overall rate of progression through states at that observation. For time-inhomogeneous models specified using the \code{pci} argument to \code{\link{msm}}, if the only covariate is the time period, \code{covgroups} is set to 1, since \code{timegroups} ensures that transitions are grouped by time.} \item{groups}{A vector of arbitrary groups in which to categorise each transition. This can be an integer vector or a factor. This can be used to diagnose specific areas of poor fit. For example, the contingency table might be grouped by arbitrary combinations of covariates to detect types of individual for whom the model fits poorly. The length of \code{groups} should be \code{x$data$n}, the number of observations used in the model fit, which is the number of observations in the original dataset with any missing values excluded. The value of \code{groups} at observation \eqn{i} is used to categorise the transition which \emph{ends} at observation i. Values of \code{groups} at the first observation for each subject are ignored.} \item{boot}{Estimate an "exact" p-value using a parametric bootstrap. All objects used in the original call to \code{\link{msm}} which produced \code{x}, such as the \code{qmatrix}, should be in the working environment, or else an \dQuote{object not found} error will be given. This enables the original model to be refitted to the replicate datasets. Note that \code{groups} cannot be used with bootstrapping, as the simulated observations will not be in the same categories as the original observations.} \item{B}{Number of bootstrap replicates.} \item{next.obstime}{This is a vector of length \code{x$data$n} (the number of observations used in the model fit) giving the time to the next \emph{scheduled} observation following each time point. This is only used when times to death are known exactly. For individuals who died (entered an absorbing state) before the next scheduled observation, and the time of death is known exactly, \code{next.obstime} would be \emph{greater} than the observed death time. If the individual did not die, and a scheduled observation did follow that time point, \code{next.obstime} should just be the same as the time to that observation. \code{next.obstime} is used to determine a grouping of the time interval between observations, which should be based on scheduled observations. If exact times to death were used in the grouping, then shorter intervals would contain excess deaths, and the goodness-of-fit statistic would be biased. If \code{next.obstime} is unknown, it is multiply-imputed using a product-limit estimate based on the intervals to observations other than deaths. The resulting tables of transitions are averaged over these imputations. This may be slow.} \item{N}{Number of imputations for the estimation of the distribution of the next scheduled observation time, when there are exact death times.} \item{indep.cens}{If \code{TRUE}, then times to censoring are included in the estimation of the distribution to the next scheduled observation time. If \code{FALSE}, times to censoring are assumed to be systematically different from other observation times.} \item{maxtimes}{A vector of length \code{x$data$n}, or a common scalar, giving an upper bound for the next scheduled observation time. Used in the multiple imputation when times to death are known exactly. If a value greater than \code{maxtimes} is simulated, then the next scheduled observation is taken as censored. This should be supplied, if known. If not supplied, this is taken to be the maximum interval occurring in the data, plus one time unit. For observations which are not exact death times, this should be the time since the previous observation.} \item{pval}{Calculate a p-value using the improved approximation of Titman (2009). This is optional since it is not needed during bootstrapping, and it is computationally non-trivial. Only available currently for non-hidden Markov models for panel data without exact death times. Also not available for models with censoring, including time-homogeneous models fitted with the \code{pci} option to \code{\link{msm}}.} } \value{ A list whose first two elements are contingency tables of observed transitions \eqn{O} and expected transitions \eqn{E}, respectively, for each combination of groups. The third element is a table of the deviances \eqn{(O - E)^2 / E} multiplied by the sign of \eqn{O - E}. If the expected number of transitions is zero then the deviance is zero. Entries in the third matrix will be bigger in magnitude for groups for which the model fits poorly. \cr \item{list("\"test\"")}{the fourth element of the list, is a data frame with one row containing the Pearson-type goodness-of-fit test statistic \code{stat}. The test statistic is the sum of the deviances. For panel-observed data without exact death times, misclassification or censored observations, \code{p} is the p-value for the test statistic calculated using the improved approximation of Titman (2009). For these models, for comparison with older versions of the package, \code{test} also presents \code{p.lower} and \code{p.upper}, which are theoretical lower and upper limits for the p-value of the test statistic, based on \ifelse{latex}{\eqn{\chi^2}}{chi-squared} distributions with \code{df.lower} and \code{df.upper} degrees of freedom, respectively. \code{df.upper} is the number of independent cells in the contingency table, and \code{df.lower} is \code{df.upper} minus the number of estimated parameters in the model.} \item{list("\"intervalq\"")}{(not printed by default) contains the definition of the grouping of the intervals between observations. These groups are defined by quantiles within the groups corresponding to the time since the start of the process.} \item{list("\"sim\"")}{If there are exact death times, this contains simulations of the contingency tables and test statistics for each imputation of the next scheduled sampling time. These are averaged over to produce the presented tables and test statistic. This element is not printed by default. With exact death times, the null variance of the test statistic (formed by taking mean of simulated test statistics) is less than twice the mean (Titman, 2008), and the null distribution is not \ifelse{latex}{\eqn{\chi^2}}{chi-squared}. In this case, \code{p.upper} is an upper limit for the true asymptotic p-value, but \code{p.lower} is not a lower limit, and is not presented.} \item{list("\"boot\"")}{If the bootstrap has been used, the element will contain the bootstrap replicates of the test statistics (not printed by default).} \item{list("\"lambda\"")}{If the Titman (2009) p-value has been calculated, this contains the weights defining the null distribution of the test statistic as a weighted sum of \ifelse{latex}{\eqn{\chi^2_1}}{chi-squared(1)} random variables (not printed by default).} } \description{ Pearson-type goodness-of-fit test for multi-state models fitted to panel-observed data. } \details{ This method (Aguirre-Hernandez and Farewell, 2002) is intended for data which represent observations of the process at arbitrary times ("snapshots", or "panel-observed" data). For data which represent the exact transition times of the process, \code{\link{prevalence.msm}} can be used to assess fit, though without a formal test. When times of death are known exactly, states are misclassified, or an individual's final observation is a censored state, the modification by Titman and Sharples (2008) is used. The only form of censoring supported is a state at the end of an individual's series which represents an unknown transient state (i.e. the individual is only known to be alive at this time). Other types of censoring are omitted from the data before performing the test. See the references for further details of the methods. The method used for censored states is a modification of the method in the appendix to Titman and Sharples (2008), described at \url{https://chjackson.github.io/msm/misc/robustcensoring.pdf} (Titman, 2007). Groupings of the time since initiation, the time interval and the impact of covariates are based on equally-spaced quantiles. The number of groups should be chosen that there are not many cells with small expected numbers of transitions, since the deviance statistic will be unstable for sparse contingency tables. Ideally, the expected numbers of transitions in each cell of the table should be no less than about 5. Conversely, the power of the test is reduced if there are too few groups. Therefore, some sensitivity analysis of the test results to the grouping is advisable. Saved model objects fitted with previous versions of R (versions less than 1.2) will need to be refitted under the current R for use with \code{pearson.msm}. } \examples{ psor.q <- rbind(c(0,0.1,0,0),c(0,0,0.1,0),c(0,0,0,0.1),c(0,0,0,0)) psor.msm <- msm(state ~ months, subject=ptnum, data=psor, qmatrix = psor.q, covariates = ~ollwsdrt+hieffusn, constraint = list(hieffusn=c(1,1,1),ollwsdrt=c(1,1,2))) pearson.msm(psor.msm, timegroups=2, intervalgroups=2, covgroups=2) # More 1-2, 1-3 and 1-4 observations than expected in shorter time # intervals - the model fits poorly. # A random effects model might accommodate such fast progressors. } \references{ Aguirre-Hernandez, R. and Farewell, V. (2002) A Pearson-type goodness-of-fit test for stationary and time-continuous Markov regression models. \emph{Statistics in Medicine} 21:1899-1911. Titman, A. and Sharples, L. (2008) A general goodness-of-fit test for Markov and hidden Markov models. \emph{Statistics in Medicine} 27(12):2177-2195 Titman, A. (2009) Computation of the asymptotic null distribution of goodness-of-fit tests for multi-state models. \emph{Lifetime Data Analysis} 15(4):519-533. Titman, A. (2008) Model diagnostics in multi-state models of biological systems. PhD thesis, University of Cambridge. } \seealso{ \code{\link{msm}}, \code{\link{prevalence.msm}}, \code{\link{scoreresid.msm}}, } \author{ Andrew Titman \email{a.titman@lancaster.ac.uk}, Chris Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} } \keyword{models} msm/man/paramdata.object.Rd0000644000176200001440000000754014527611170015321 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/internals_doc.R \name{paramdata.object} \alias{paramdata.object} \title{Developer documentation: internal msm parameters object} \value{ \item{inits}{Vector of initial values for distinct parameters which are being estimated. These have been transformed to the real line (e.g. by log), and exclude parameters being fixed at their initial values, parameters defined to be always fixed (e.g. binomial denominators) and parameters constrained to equal previous ones.} \item{plabs}{Names of parameters in \code{allinits}.} \item{allinits}{Vector of parameter values before estimation, including those which are fixed or constrained to equal other parameters, and transformed to the real line.} \item{hmmpars}{Indices of \code{allinits} which represent baseline parameters of hidden Markov outcome models (thus excluding covariate effects in HMMs and initial state occupancy probabilities). } \item{fixed}{\code{TRUE} if all parameters are fixed, \code{FALSE} otherwise.} \item{fixedpars}{Indices of parameters in \code{allinits} which are fixed, either by definition or as requested by the user in the \code{fixedpars} argument to \code{\link{msm}}. Excludes parameters fixed by constraining to equal other parameters.} \item{notfixed}{Indices of parameters which are not fixed by the definition of \code{fixedpars}.} \item{optpars}{Indices of parameters in \code{allinits} being estimated, thus those included in \code{inits}.} \item{auxpars}{Indices of "auxiliary" parameters which are always fixed, for example, binomial denominators (\code{\link{hmmBinom}}) and the \code{which} parameter in \code{\link{hmmIdent}}.} \item{constr}{Vector of integers, of length \code{npars}, indicating which sets of parameters are constrained to be equal to each other. If two of these integers are equal the corresponding parameters are equal. A negative element indicates that parameter is defined to be minus some other parameter (this is used for covariate effects on transition intensities).} \item{npars}{Total number of parameters, equal to \code{length(allinits)}.} \item{nfix}{Number of fixed parameters, equal to \code{length(fixedpars)}. } \item{nopt}{Number of parameters being estimated, equal to \code{length(inits)} and \code{length(optpars)}.} \item{ndup}{Number of parameters defined as duplicates of previous parameters by equality constraints (currently unused).} \item{ranges}{Matrix of defined ranges for each parameter on the natural scale (e.g. 0 to infinity for rate parameters). } \item{opt}{Object returned by the optimisation routine (such as \code{\link{optim}}).} \item{foundse}{\code{TRUE} if standard errors are available after optimisation. If \code{FALSE} the optimisation probably hasn't converged. } \item{lik}{Minus twice the log likelihood at the parameter estimates.} \item{deriv}{Derivatives of the minus twice log likelihood at the parameter estimates, if available. } \item{information}{Corresponding expected information matrix at the parameter estimates, if available.} \item{params}{Vector of parameter values after maximum likelihood estimation, corresponding to \code{allinits}, still on the real-line transformed scale.} \item{covmat}{Covariance matrix corresponding to \code{params}.} \item{ci}{Matrix of confidence intervals corresponding to \code{params}, with nominal coverage (default 0.95) defined by the \code{cl} argument of \code{\link{msm}}. } \item{estimates.t}{Vector of parameter estimates, as \code{params} but with parameters on their natural scales.} } \description{ An object giving information about the parameters of the multi-state model. Used internally during maximum likelihood estimation and arranging results. Returned as the \code{paramdata} component of a fitted \code{\link{msm}} model object. } \seealso{ \code{\link{msm.object}} } msm/man/ppass.msm.Rd0000644000176200001440000001302414535072006014033 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ppass.R \name{ppass.msm} \alias{ppass.msm} \title{Passage probabilities} \usage{ ppass.msm( x = NULL, qmatrix = NULL, tot, start = "all", covariates = "mean", piecewise.times = NULL, piecewise.covariates = NULL, ci = c("none", "normal", "bootstrap"), cl = 0.95, B = 1000, cores = NULL, ... ) } \arguments{ \item{x}{A fitted multi-state model, as returned by \code{\link{msm}}.} \item{qmatrix}{Instead of \code{x}, you can simply supply a transition intensity matrix in \code{qmatrix}.} \item{tot}{Finite time to forecast the passage probabilites for.} \item{start}{Starting state (integer). By default (\code{start="all"}), this will return a matrix one row for each starting state. Alternatively, this can be used to obtain passage probabilities from a \emph{set} of states, rather than single states. To achieve this, \code{state} is set to a vector of weights, with length equal to the number of states in the model. These weights should be proportional to the probability of starting in each of the states in the desired set, so that weights of zero are supplied for other states. The function will calculate the weighted average of the passage probabilities from each of the corresponding states.} \item{covariates}{Covariate values defining the intensity matrix for the fitted model \code{x}, as supplied to \code{\link{qmatrix.msm}}.} \item{piecewise.times}{For models with time-dependent covariates, this defines the cut points in time at which the transition intensity matrix changes. This is not required for models fitted with the \code{pci} option to \code{\link{msm}}, which are handled automatically.} \item{piecewise.covariates}{For models with time-dependent covariates, this is the list of covariates for each time period defined by \code{piecewise.times}, in the format documented for the \code{covariates} argument to \code{\link{pmatrix.piecewise.msm}}. This is not required for models fitted with the \code{pci} option to \code{\link{msm}}, which are handled automatically.} \item{ci}{If \code{"normal"}, then calculate a confidence interval by simulating \code{B} random vectors from the asymptotic multivariate normal distribution implied by the maximum likelihood estimates (and covariance matrix) of the log transition intensities and covariate effects. If \code{"bootstrap"} then calculate a confidence interval by non-parametric bootstrap refitting. This is 1-2 orders of magnitude slower than the \code{"normal"} method, but is expected to be more accurate. See \code{\link{boot.msm}} for more details of bootstrapping in \pkg{msm}. If \code{"none"} (the default) then no confidence interval is calculated.} \item{cl}{Width of the symmetric confidence interval, relative to 1.} \item{B}{Number of bootstrap replicates.} \item{cores}{Number of cores to use for bootstrapping using parallel processing. See \code{\link{boot.msm}} for more details.} \item{...}{Arguments to pass to \code{\link{MatrixExp}}.} } \value{ A matrix whose \eqn{r, s} entry is the probability of having visited state \eqn{s} at least once before time \eqn{t}, given the state at time \eqn{0} is \eqn{r}. The diagonal entries should all be 1. } \description{ Probabilities of having visited each state by a particular time in a continuous time Markov model. } \details{ The passage probabilities to state \eqn{s} are computed by setting the \eqn{s}th row of the transition intensity matrix \eqn{Q} to zero, giving an intensity matrix \eqn{Q^*}{Q*} for a simplified model structure where state \eqn{s} is absorbing. The probabilities of passage are then equivalent to row \eqn{s} of the transition probability matrix \eqn{Exp(tQ^*)}{Exp(tQ*)} (\code{\link{pmatrix.msm}}) under this simplified model for \eqn{t=}\code{tot}. For time-inhomogenous models, this process is generalised by calculating an intensity matrix for each time period, zeroing the appropriate row of each, and calculating and multiplying transition probability matrices as in \code{\link{pmatrix.piecewise.msm}}. Note this is different from the probability of occupying each state at exactly time \eqn{t}, given by \code{\link{pmatrix.msm}}. The passage probability allows for the possibility of having visited the state before \eqn{t}, but then occupying a different state at \eqn{t}. The mean of the passage distribution is the expected first passage time, \code{\link{efpt.msm}}. } \examples{ Q <- rbind(c(-0.5, 0.25, 0, 0.25), c(0.166, -0.498, 0.166, 0.166), c(0, 0.25, -0.5, 0.25), c(0, 0, 0, 0)) ## ppass[1,2](t) converges to 0.5 with t, since given in state 1, the ## probability of going to the absorbing state 4 before visiting state ## 2 is 0.5, and the chance of still being in state 1 at t decreases. ppass.msm(qmatrix=Q, tot=2) ppass.msm(qmatrix=Q, tot=20) ppass.msm(qmatrix=Q, tot=100) Q <- Q[1:3,1:3]; diag(Q) <- 0; diag(Q) <- -rowSums(Q) ## Probability of about 1/2 of visiting state 3 by time 10.5, the ## median first passage time ppass.msm(qmatrix=Q, tot=10.5) ## Mean first passage time from state 2 to state 3 is 10.02: similar ## to the median efpt.msm(qmatrix=Q, tostate=3) } \references{ Norris, J. R. (1997) Markov Chains. Cambridge University Press. } \seealso{ \code{\link{efpt.msm}}, \code{\link{totlos.msm}}, \code{\link{boot.msm}}. } \author{ C. H. Jackson \email{chris.jackson@mrc-bsu.cam.ac.uk} with contributions from Jon Fintzi. } \keyword{models} msm/man/plotprog.msm.Rd0000644000176200001440000000404714654456157014577 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{plotprog.msm} \alias{plotprog.msm} \title{Kaplan Meier estimates of incidence} \usage{ plotprog.msm( formula, subject, data, legend.pos = NULL, xlab = "Time", ylab = "1 - incidence probability", lwd = 1, xlim = NULL, mark.time = TRUE, ... ) } \arguments{ \item{formula}{A formula giving the vectors containing the observed states and the corresponding observation times. For example, \code{state ~ time} Observed states should be in the set \code{1, \dots{}, n}, where \code{n} is the number of states.} \item{subject}{Vector of subject identification numbers for the data specified by \code{formula}. If missing, then all observations are assumed to be on the same subject. These must be sorted so that all observations on the same subject are adjacent.} \item{data}{An optional data frame in which the variables represented by \code{state}, \code{time} and \code{subject} can be found.} \item{legend.pos}{Vector of the \eqn{x} and \eqn{y} position, respectively, of the legend.} \item{xlab}{x axis label.} \item{ylab}{y axis label.} \item{lwd}{Line width. See \code{\link{par}}.} \item{xlim}{x axis limits, e.g. c(0,10) for an axis ranging from 0 to 10. Default is the range of observation times.} \item{mark.time}{Mark the empirical survival curve at each censoring point, see \code{\link[survival]{lines.survfit}}.} \item{...}{Other arguments to be passed to the \code{\link{plot}} and \code{\link[survival]{lines.survfit}} functions.} } \description{ Compute and plot Kaplan-Meier estimates of the probability that each successive state has not occurred yet. } \details{ If the data represent observations of the process at arbitrary times, then the first occurrence of the state in the data will usually be greater than the actual first transition time to that state. Therefore the probabilities plotted by \code{\link{plotprog.msm}} will be overestimates. } \seealso{ \code{\link[survival]{survfit}}, \code{\link[survival]{plot.survfit}} } \keyword{models} msm/man/tidy.msm.est.Rd0000644000176200001440000000151214534654576014470 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidy.R \name{tidy.msm.est} \alias{tidy.msm.est} \title{Tidy the output of pmatrix.msm and similar functions} \usage{ \method{tidy}{msm.est}(x, ...) } \arguments{ \item{x}{Output of \code{\link{qmatrix.msm}}, \code{\link{pmatrix.msm}}, \code{\link{ematrix.msm}}, \code{\link{pnext.msm}} or \code{\link{ppass.msm}}, which all return objects of class \code{"msm.est"}.} \item{...}{Further arguments (unused).} } \description{ This is the method for the generic `tidy` function that is used for tidying the output of \code{\link{qmatrix.msm}}, \code{\link{pmatrix.msm}}, \code{\link{ematrix.msm}}, \code{\link{pnext.msm}} or \code{\link{ppass.msm}}. This should be called as \code{tidy()}, not \code{tidy.msm.est()} or \code{tidy.qmatrix()} or anything else. } msm/DESCRIPTION0000644000176200001440000000232714713226252012564 0ustar liggesusersPackage: msm Version: 1.8.2 Date: 2024-11-07 Title: Multi-State Markov and Hidden Markov Models in Continuous Time Authors@R: c(person("Christopher", "Jackson", email="chris.jackson@mrc-bsu.cam.ac.uk", role=c("aut", "cre"))) Description: Functions for fitting continuous-time Markov and hidden Markov multi-state models to longitudinal data. Designed for processes observed at arbitrary times in continuous time (panel data) but some other observation schemes are supported. Both Markov transition rates and the hidden Markov output process can be modelled in terms of covariates, which may be constant or piecewise-constant in time. License: GPL (>= 2) Imports: survival, mvtnorm, expm, generics, tibble Suggests: mstate, minqa, doParallel, foreach, numDeriv, testthat, flexsurv, covr URL: https://github.com/chjackson/msm, https://chjackson.github.io/msm/ BugReports: https://github.com/chjackson/msm/issues LazyData: yes Encoding: UTF-8 RoxygenNote: 7.3.2 NeedsCompilation: yes Packaged: 2024-11-07 14:19:05 UTC; Chris J Author: Christopher Jackson [aut, cre] Maintainer: Christopher Jackson Repository: CRAN Date/Publication: 2024-11-07 21:10:01 UTC