You can put print statements into your integrand to see
what is happening:
> integrand<-function(x){
+ on.exit(print(cbind(x, fx))) ;
+ fx <-
(e*pnorm((qnorm(p)+sqrt(R)*x)/sqrt(1-R))*dnorm(x))^2/dnorm(x+mu)
+ fx
+ }> mu<-c(-1)
> output<-optim(par=mu, fx2, method="BFGS")
x fx
[1,] 4.090232 3.923504e-05
[2,] 236.155401 NaN
[3,] 3.094523 8.917953e-04
[4,] 41.389072 NaN
[5,] 3.116343 8.462806e-04
[6,] 16.890184 4.150785e-68
[7,] 3.162696 7.553260e-04
[8,] 9.828110 4.534241e-24
[9,] 3.238647 6.225113e-04
[10,] 6.922168 2.484860e-12
[11,] 3.351197 4.599135e-04
[12,] 5.456358 5.109337e-08
[13,] 3.512864 2.878964e-04
[14,] 4.614799 4.190869e-06
[15,] 3.746156 1.366194e-04
Error in integrate(integrand, lower = qnorm(0.999), upper = Inf) :
non-finite function value> integrand(20:41)
x fx
[1,] 20 2.270161e-94
[2,] 21 1.044060e-103
[3,] 22 1.766442e-113
[4,] 23 1.099459e-123
[5,] 24 2.517470e-134
[6,] 25 2.120582e-145
[7,] 26 6.571300e-157
[8,] 27 7.491228e-169
[9,] 28 0.000000e+00
[10,] 29 0.000000e+00
[11,] 30 0.000000e+00
[12,] 31 0.000000e+00
[13,] 32 0.000000e+00
[14,] 33 0.000000e+00
[15,] 34 0.000000e+00
[16,] 35 0.000000e+00
[17,] 36 0.000000e+00
[18,] 37 0.000000e+00
[19,] 38 0.000000e+00
[20,] 39 0.000000e+00
[21,] 40 NaN
[22,] 41 NaN
...
For x>=40 you are overflowing and/or underflowing (making a value bigger
than 10^308 or smaller than 10^-308), leading to a 0/0 or Inf/Inf
situation, which leads to a NaN (not a number). For x>=28 you get
exactly 0.
You can
(a) modify your integrand to return the appropriate limit (0?)
when x is so large that you are calculating 0/0
(b) do some algebra to choose an upper limit that avoids
the NaN problem (if the NaN's really represent limits of 0)
(c) do some algebra to reparameterize things so you don't
try to compute 0/0 for large x.
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
> -----Original Message-----
> From: r-help-bounces at r-project.org
> [mailto:r-help-bounces at r-project.org] On Behalf Of ch_dinesh
> Sent: Monday, May 30, 2011 10:31 AM
> To: r-help at r-project.org
> Subject: [R] Error in minimizing an integrand using optim
>
> Hi,
>
> Am not sure if my code itself is correct. Here's what am trying to do:
> Minimize integration of a function of gaussian distributed
> variable 'x' over
> the interval qnorm(0.999) to Inf by changing value of
> parameter 'mu'. mu is
> the shift in mean of 'x'.
>
> Code:
> # x follows gaussian distribution
> # fx2 to be minimized by changing values of mu
> # integration to be done over the interval (qnorm(0.999),Inf)
>
> p<-0.009 #constant
> R<-0.25 # constant
> e<-11 #constant
>
> integrand<-function(x){
>
> (e*pnorm((qnorm(p)+sqrt(R)*x)/sqrt(1-R))*dnorm(x))^2/dnorm(x+mu)}
>
> fx2<-function(mu) {
> integrate(integrand, lower = qnorm(0.999), upper=Inf)$value}
>
> mu<-c(-1) #initial value for mu, which needs to be optimized
> such that fx2
> is minimized
> output<-optim(par=mu, fx2, method="BFGS")
>
> I get the following error message:
> Error in integrate(integrand, lower = qnorm(0.999), upper = Inf) :
> non-finite function value
>
> If upper is changed to 10, error doesn't appear. However, mu
> retains its
> value and is not optimized.
>
> Pls. help.
> Thanks
> Dinesh
>
> --
> View this message in context:
> http://r.789695.n4.nabble.com/Error-in-minimizing-an-integrand
-using-optim-tp3561226p3561226.html> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help at 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.
>