[R] 2-parameter MLE problems

Ben Bolker bbolker at gmail.com
Wed Apr 13 02:45:19 CEST 2011


Tyler Schartel <tes164 <at> msstate.edu> writes:

> 
> Hi all,
> 
> Sorry for the re-post, I sent my previous e-mail before it was complete. I
> am trying to model seroprevalence using the differential equation: 
> dP/dt = beta*seronegative*.001*(seropositive)-0.35*(0.999)*(seropositive)-
>     r*seropositive.
> I would like to estimate my two parameters, beta and r, using maximum
> likelihood methods. I have included my code below:
> 
> summary=read.delim('summary.txt',header=T)
> summary
>   Year   N SeroPos SeroNeg
> 1    1  75       1      74
> 2    2  12       3       9
> 3    3 139      11     128
> 4    4 178      22     156
> 5    5 203      18     185
> 6    6 244      37     207
> attach(summary)
> poisNLL=function(P){
> lambda=P[1]*SeroNeg*0.001*SeroPos-0.35*0.999*SeroPos-P[2]*SeroPos
> v=-sum(dpois(SeroNeg,lambda=lambda,log=TRUE))
> if (!is.finite(v)) v<- -2000000
> v
> }

 Your basic problem here is that you have switched the order
of the parameters/neglected to tell R which was which.

opt1=optim(fn=poisNLL,par=c(10,.1),method='BFGS')

would have done what you were aiming for ...

  but I think you've got bigger problems than that.
The analysis below shows pretty thoroughly that the answer
wants to converge on beta=52, r=0.  Are you sure your
equations make sense?

dat <- data.frame(year=1:6,N=c(75,12,139,178,203,244),
                  SeroPos=c(1,3,11,22,18,37))
dat <- transform(dat,SeroNeg=N-SeroPos)

calclambda <- function(beta,r,SeroPos,SeroNeg) {
  beta*0.001*SeroPos*SeroNeg-0.35*0.999*SeroPos-r*SeroPos
}
poisNLL <- function(P,cdat=dat) {
  lambda <- calclambda(beta=P[1],r=P[2],
                       SeroPos=cdat$SeroPos,SeroNeg=cdat$SeroNeg)
  lambda <- pmax(lambda,0.001)
  -sum(dpois(dat$SeroNeg,lambda=lambda,log=TRUE))
}

poisNLL(c(beta=10,r=0.1),dat)
calclambda(beta=10,r=0.1,dat$SeroPos,dat$SeroNeg)
library(bbmle)
parnames(poisNLL) <- c("beta","r")
mle2(poisNLL,vecpar=TRUE,
     start=list(beta=10,r=0.1),data=dat,
     method="L-BFGS-B",lower=c(0,0))

with(dat,plot(year,SeroNeg,las=1,bty="l",ylim=c(0,300)))
lines(1:6,calclambda(beta=41,r=0,dat$SeroPos,dat$SeroNeg))

library(emdbook)
par(las=1)
cc <- curve3d(poisNLL(c(beta=x,r=y)),xlim=c(40,60),ylim=c(0,0.2),
   xlab="beta",ylab="r",sys3d="image")
contour(cc$x,cc$y,cc$z,add=TRUE)

cc2 <- curve3d(poisNLL(c(beta=x,r=y)),xlim=c(50,55),ylim=c(0,0.02),
   xlab="beta",ylab="r",sys3d="image")
contour(cc2$x,cc2$y,cc2$z,add=TRUE)


> opt1=optim(poisNLL,start=c(10,.1),method='BFGS')
> 
> I receive the following error from this code: "Error in optim(poisNLL, start
> = c(10, 0.1), method = "BFGS") :
>   cannot coerce type 'closure' to vector of type 'double'"
> 
> Any assistance provided would be greatly appreciated!



More information about the R-help mailing list