On 07-04-2012, at 19:48, jeka12386 wrote: > Dear All > > I am trying to find a uniroot of a function within another function (see > example) but I am getting an error message (f()values at end points not of > opposite sign). I was wondering if you would be able to advise how redefine > my function so that I can find the solution. In short my first function > calculates the intergrale which is function of "t" , I need to find the > uniroot of n defined in the second function. > > y <- function(t){ > (dnorm(t,mean=(diff*sqrt(n/2)),sd=sqrt(rho)))*(pnorm((qnorm((1-alpha),mean=0,sd=1)-t)/(sqrt(1-rho))))^2 > } > > inter <- function(n){ > integrate(y,lower=-Inf,upper=Inf)$value-0.8 > } > > rho <- 0.5 > alpha <- 0.0125 > diff <- 0.5 > > n1 <- uniroot(inter,lower=1,upper=100000)$root >
When I run your example as presented by you, R issues an error message: Error in dnorm(t, mean = (diff * sqrt(n/2)), sd = sqrt(rho)) object 'n' not found Calls: uniroot -> f -> integrate -> <Anonymous> -> f -> dnorm Execution halted Indeed, the argument n of function inter is not passed to function y, which is using n (and is not global). Your example I changed to this: y <- function(t, n) { (dnorm(t, mean=(diff*sqrt(n/2)), sd=sqrt(rho)))*(pnorm((qnorm((1-alpha),mean=0,sd=1)-t)/(sqrt(1-rho))))^2 } inter <- function(n) { integrate(y,lower=-Inf,upper=Inf, n=n)$value-0.8 } rho <- 0.5 alpha <- 0.0125 diff <- 0.5 n1 <- uniroot(inter,lower=1,upper=100000) n1 Changes: n added to arguments of y and argument n of function inter passed to y. Output: $root [1] 9.210123 $f.root [1] -6.86966e-11 $iter [1] 9 $estim.prec [1] 6.103516e-05 Finally: do realize that argument t of function y will be a vector (that's what integrate does). Berend ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.