[R] problem using uniroot with integrate

Tony Plate tplate at acm.org
Wed Mar 9 19:10:48 CET 2005

At Wednesday 09:27 AM 3/9/2005, Ken Knoblauch wrote:
>I'm trying to calculate the value of the variable, dp, below, in the
>argument to the integral of dnorm(x-dp) * pnorm(x)^(m-1).  This
>corresponds to the estimate of the sensitivity of an observer in an
>m-alternative forced choice experiment, given the probability of
>a correct response, Pc, a Gaussian assumption for the noise and
>no bias.  The function that I wrote below gives me an error:
>Error in f(x, ...) : recursive default argument reference
>The problem seems to be at the statement using uniroot,
>because the furntion est.dp works fine outside of the main function.
>I've been using R for awhile but there are still many nuances
>about the scoping and the use of environments that I'm weak on
>and would like to understand better.  I would appreciate any
>suggestions or solutions that anyone might offer for fixing
>my error.  Thank you.
>dprime.mAFC <- function(Pc, m) {
>                 est.dp <- function(dp, Pc = Pc, m = m) {
>                   pr <- function(x, dpt = dp, m0 = m) {
>                         dnorm(x - dpt) * pnorm(x)^(m0 - 1)
>                             }
>                   Pc - integrate(pr, lower = -Inf, upper = Inf,
>                   dpt = dp, m0 = m)$value
>                 }
>         dp.res <- uniroot(est.dp, interval = c(0,5), Pc = Pc, m = m)
>         dp.res$root
>         }

You've got several problems here
* recursive argument defaults: these are unnecessary but result in the 
particular error message you are seeing (e.g., in the def of est.dp, the 
default value for the argument 'm' is the value of the argument 'm' itself 
-- default values for arguments are interpreted in the frame of the 
function itself)
* the argument m=m you supply to uniroot() is being interpreted as 
specifying the 'maxiter' argument to uniroot()

I think you can fix it by changing the 'm' argument of function est.dp to 
be named 'm0', and specifying 'm0' in the call to uniroot.  (but I can't 
tell for sure because you didn't supply a working example -- when I just 
guess at values to pass in I get numerical errors.)
Also, it would be best to remove the incorrect recursive default arguments 
for the functions est.dp and pr.

-- Tony Plate

More information about the R-help mailing list