[R] nlminb( ) : one compartment open PK model
Spencer Graves
spencer.graves at pdf.com
Tue Apr 25 17:15:12 CEST 2006
I've had pretty good luck solving problems like this when the post
included a simple, reproducible example, as suggested in the posting
guide (www.R-project.org/posting-guide.html). Without that, I'm close
to clueless. I've encountered this kind of error myself before, and I
think the way I solved it was just simplifying the example in steps
until the problem went away. By doing this, I could isolate the source
of the problem.
Have you tried "trace=1", as described in the nlminb help page? With
this, nlminb prints "The value of the objective function and the
parameters [at] every trace'th iteration." Also, have you worked all
the examples in the nlminb help page? If that didn't show me how to
solve my problem, I think I'd next try having nlminb estimate the
gradient and hessian, rather than supplying them myself.
hope this helps,
spencer graves
Greg Tarpinian wrote:
> All,
>
> I have been able to successfully use the optim( ) function with
> "L-BFGS-B" to find reasonable parameters for a one-compartment
> open pharmacokinetic model. My loss function in this case was
> squared error, and I made no assumptions about the distribution
> of the plasma values. The model appeared to fit pretty well.
>
> Out of curiosity, I decided to try to use nlminb( ) applied to
> a likelihood function that assumes the plasma values are normally
> distributed on the semilog scale (ie, modeling log(conc) over
> time). nlminb( ) keeps telling me that it has converged, but
> the estimated parameters are always identical to the initial
> values.... I am certain that I have committed "ein dummheit"
> somewhere in the following code, but not sure what... Any help
> would be greatly appreciated.
>
> Kind regards,
>
> Greg
>
>
>
> model2 <- function(parms, dose, time, log.conc)
> {
> exp1 <- exp(-parms[1]*time)
> exp2 <- exp(-parms[2]*time)
> right.hand <- log(exp1 - exp2)
> numerator <- dose*parms[1]*parms[2]
> denominator <- parms[3]*(parms[2] - parms[1])
> left.hand <- log(numerator/(denominator))
> pred <- left.hand + right.hand
>
> # defining the distribution of the values
> const <- 1/(sqrt(2*pi)*parms[4])
> exponent <- (-1/(2*(parms[4]^2)))*(log.conc - pred)^2
> likelihood <- const*exp(exponent)
>
> #defining the merit function
> -sum(log(likelihood))
> }
>
> deriv2
> <- deriv( expr = ~ -log(1/(sqrt(2*pi)*S)*exp((-1/(2*(S^2)))*
> (log.conc-(log(dose*Ke*Ka/(Cl*(Ka-Ke)))
> +log(exp(-Ke*time)-exp(-Ka*time))))^2)),
> namevec = c("Ke","Ka","Cl","S"),
> function.arg = function(Ke, Ka, Cl, S, dose, time, log.conc) NULL )
>
> gradient2.1compart <- function(parms, dose, time, log.conc)
> {
> Ke <- parms[1]; Ka <- parms[2]; Cl <- parms[3]; S <- parms[4]
> colSums(attr(deriv2.1compart(Ke, Ka, Cl, S, dose, time, log.conc), "gradient"))
> }
>
> attach(foo.frame)
> inits <- c(Ke = .5,
> Ka = .5,
> Cl = 1,
> S = 1)
>
> #Trying out the code
> nlminb(start = inits,
> objective = model2,
> gradient = gradient2,
> control = list(eval.max = 5000, iter.max = 5000),
> lower = rep(0,4),
> dose = DOSE,
> time = TIME,
> log.conc = log(RESPONSE))
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
More information about the R-help
mailing list