Besides methodologies developing, modeling and data analysis are important parts of my researches. You can find a few examples at my adviser's website. The following is a case study that I am currently working on.
This will be a malaria with control case study, following closely to
Manojit Roy’s SEIQS model with additional control covariate.
Introduction
Here, we consider the data for Kheda, one district in North West
India with monthly reported malaria cases by Plasmodium vivax and
Plasmodium falciparum, monthly rainfall, control and population.
Adopting the well-established practice, we divide the studied population
of size P(t) into the following distinctive classes: susceptible to infection, S(t), exposure E(t), infected and gametocytemic individuals, I(t), dormant classes H1(t), H2(t), H3(t) and recovered individuals, Q(t).
To allow flexibility in representing losing immunity, both infected and
recovered individuals could be reinfected and three dormant classes Hi(i=1,⋯n) are included. Malaria mortality during each month is tracked with a variable y(t). Complete parameter definitions and units are provided in supplement S-1. Assume P(t) is known from the census data and birth rate for the S class satifies S(t)+E(t)+I(t)+Q(t)+∑iHi(t)=P(t), the state process X(t)=(S(t),E(t),I(t),Q(t),H1(t),H2(t),H3(t),κ1(t),μSE(t)), follows a stochastic differential equation,
We replace last 24 NA rainfall values (for ’09-’10) by 2-month
averages. We use July-Aug rain accumulate rainfall (adding preceding 4
months of rain) # use data from Sep 1986
We build pre-control pomp object (for time segment 1987-1995) and post-control pomp object (for time segment 1996-2010).
pf1.dat<-pf.dat[which(time.dat<=1996)]covar1<-cbind(pop=pop1,dpopdt=dpopdt1,rainfall=acrain1,basis=basis1)pop3<-predict(pop.spline,time2.dat)$yirs.dat<-control$covpop*1000/pop3[which(time2.dat<=2010)]# append 7-yr average, over intervals 1996-2002 and 2003-2009, to 2010 IRS datairs.dat<-c(irs.dat,rep(0,12))nn2<-length(irs.dat)for(iin1:12){avc<-mean(irs.dat[seq(i,nn2-12,84)])irs.dat[(nn2-12+i):nn2]<-avc}irs<-approx(x=time2.dat,y=irs.dat,xout=tbasis2,rule=2)$yirs<-(irs-mean(irs))/sd(irs)irsa.dat<-c(rep(0,length(time1.dat)),irs.dat)irsa<-approx(x=time.dat,y=irsa.dat,xout=tbasis,rule=2)$yirsa<-irsa/sd(irsa)pf2.dat<-pf.dat[which(time.dat>1996)]covar2<-cbind(pop=pop2,dpopdt=dpopdt2,rainfall=acrain2,basis=basis2, irs=irs)covar<-cbind(pop=pop,dpopdt=dpopdt,rainfall=acrain,basis=basis,irs=irsa)
Model
We randomize (and transform where needed) initial parameter values
(“b1…b6” are untransformed, “delta” and “initpop” not estimated).
par.ini.tr<-c(log.muEI=log(24), log.muIQ=log(runif(1,0,10)), log.muIS=log(runif(1,0,10)), log.muQS=log(runif(1,0,10)),
log.sigPRO=log(runif(1,0.02,0.5)), log.sigOBS=log(runif(1,0.02,0.5)), log.tau=log(runif(1,0.02,0.5)),
log.K0=log(runif(1,0,0.9)), log.F0=log(runif(1,0,0.9)),
logit.rho=logit(runif(1,0.02,0.9)), logit.q=logit(0.001), logit.br=logit(0.003), logit.bc=logit(runif(1,0.02,0.9)),
logit.S0=0, logit.E0=0, logit.I0=0, logit.Q0=0,
b1=runif(1,-5,5), b2=runif(1,-5,5), b3=runif(1,-5,5), b4=runif(1,-5,5),
b5=runif(1,-5,5), b6=runif(1,-5,5), delta=0.02, initpop=3261828)# randomize S0,E0,I0,Q0 with constraint S0+E0+I0+Q0=1S0<-runif(1,0,1);
E0<-runif(1,0,1)I0<-runif(1,0,1)Q0<-runif(1,0,1)fac<-sum(c(S0,E0,I0,Q0))S0<-S0/fac; E0<-E0/fac; I0<-I0/fac; Q0<-Q0/facpar.ini.tr[c("logit.S0","logit.E0","logit.I0","logit.Q0")]<-logit(c(S0,E0,I0,Q0))# log-transformed parameterslog.par<-c("log.muEI", "log.muIQ", "log.muIS", "log.muQS", "log.tau",
"log.sigPRO", "log.sigOBS", "log.K0", "log.F0")# logit-transformed parameterslogit.par<-c("logit.rho", "logit.q", "logit.br", "logit.bc","logit.S0", "logit.E0", "logit.I0", "logit.Q0")# untransformed parametersuntr.par<-c("b1", "b2","b3","b4","b5","b6", "delta", "initpop")# untransformed initial parameterspar.ini<-c(exp(par.ini.tr[log.par]),expit(par.ini.tr[logit.par]),par.ini.tr[untr.par])names(par.ini)<-c("muEI", "muIQ", "muIS", "muQS", "tau", "sigPRO", "sigOBS", "K0", "F0", "rho",
"q", "br","bc", "S0", "E0", "I0", "Q0", "b1","b2","b3","b4","b5","b6",
"delta", "initpop")# parameters to be estimatedpar.est<-c("log.muEI", "log.muIQ", "log.muIS", "log.muQS", "log.sigPRO", "log.sigOBS",
"log.tau", "logit.rho", "logit.q", "logit.br", "logit.bc","b1","b2","b3","b4","b5","b6")# initial states to be estimatedivp.est<-c("logit.S0", "logit.E0", "logit.I0", "logit.Q0", "log.K0", "log.F0")# strength of random walksd<-vector(mode='list', length=length(par.ini.tr))#sd <- matrix(rep(0,length(par.ini.tr)*(length(time.dat)+1)), ncol=length(par.ini.tr))names(sd)<-names(par.ini.tr)sd[names(sd)]<-0sd[par.est]<-0.03# for parameterssd[ivp.est]<-0.1# for init-states# parameters to be held fixed at pre-assigned value# vivax incubation period ~= 15 days (=15/365 yr); q takes a low value <<1 #par.ini.tr[c("log.muEI","logit.q","logit.br")] <- c(log(24),logit(0.001),logit(((run%%99)+1)/100))sd[c("log.muEI","logit.q","logit.br")]<-0.000001sd[["logit.bc"]]<-c(rep(0.000001,length(time1.dat)),rep(0.03,length(time2.dat)+1))sd[["logit.bc"]][length(time1.dat)]<-3*0.03