[R] Problem with Numerical derivatives (numDeriv) and mvtnorm
Ravi Varadhan
rvaradhan at jhmi.edu
Sat Nov 21 15:43:59 CET 2009
This is not a problem of numDerv. The problem is that the function PP1 is stochastic, i.e. it gives different values for the same argument p. This is due to the function pmvnorm(), which I presume uses some kind of Monte Carlo sampling to compute the integral of a multivariate normal. Therefore, you cannot evaluate the derivative of a stochastic function.
Ravi.
____________________________________________________________________
Ravi Varadhan, Ph.D.
Assistant Professor,
Division of Geriatric Medicine and Gerontology
School of Medicine
Johns Hopkins University
Ph. (410) 502-2619
email: rvaradhan at jhmi.edu
----- Original Message -----
From: Stephane LUCHINI <stephane.luchini at univmed.fr>
Date: Friday, November 20, 2009 6:56 am
Subject: [R] Problem with Numerical derivatives (numDeriv) and mvtnorm
To: r-help at r-project.org
> I'm trying to obtain numerical derivative of a probability computed
> with mvtnorm with respect to its parameters using grad() and
> jacobian() from NumDeriv.
>
> To simplify the matter, here is an example:
>
> PP1 <- function(p){
> thetac <- p
> thetae <- 0.323340333
> thetab <- -0.280970036
> thetao <- 0.770768082
> ssigma <- diag(4)
> ssigma[1,2] <- 0.229502120
> ssigma[1,3] <- 0.677949335
> ssigma[1,4] <- 0.552907745
> ssigma[2,3] <- 0.784263100
> ssigma[2,4] <- 0.374065025
> ssigma[3,4] <- 0.799238700
> ssigma[2,1] <- ssigma[1,2]
> ssigma[3,1] <- ssigma[1,3]
> ssigma[4,1] <- ssigma[1,4]
> ssigma[3,2] <- ssigma[2,3]
> ssigma[4,2] <- ssigma[2,4]
> ssigma[4,3] <- ssigma[3,4]
> pp1 <-
> pmvnorm(lower=c(-Inf,-Inf,-Inf,-Inf),upper=c(thetac,thetae,thetab,thetao),corr=ssigma)
> return(pp1)}
>
> xx <- -0.6675762
>
> If I compute several times the probability PP1, i obtain some
> slightly
> different numbers but I suppose this is ok:
>
> > PP1(xx)
> [1] 0.1697787
> attr(,"error")
> [1] 0.000840748
> attr(,"msg")
> [1] "Normal Completion"
> > PP1(xx)
> [1] 0.1697337
> attr(,"error")
> [1] 0.0009363715
> attr(,"msg")
> [1] "Normal Completion"
> > PP1(xx)
> [1] 0.1691539
> attr(,"error")
> [1] 0.0006682577
> attr(,"msg")
> [1] "Normal Completion"
>
> When I now turn to the numerical derivatives of the probability, I
> obtain large discrepencies if I repeat the instruction "grad":
>
> > grad(PP1,xx)
> [1] -42.58016
> > grad(PP1,xx)
> [1] 9.297055
> > grad(PP1,xx)
> [1] -6.736725
> > grad(PP1,xx)
> [1] -20.71176
> > grad(PP1,xx)
> [1] 18.51968
>
> The "problem" is the same if I turn to the jacobian function (when I
>
> want to compute all partial derivatives in one shot)
>
> Someone can help?
>
> Stephane
>
> ______________________________________________
> R-help at r-project.org mailing list
>
> PLEASE do read the posting guide
> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list