You should try to match up values of integrand() instead of the value of its 
integral
on a single integral if you want to see if the function is being computed 
correctly.
integrate(f) calls f(x) where x is a vector of values (typically 21 values).  
It expects
that f() is vectorized: that f(x[i]) == f(x)[i] for i in seq_along(x).  When 
you put max(x)
into your function it messes that up:
   > integrand(0.5)
   [1] -0.07377961
   > integrand(1.0)
   [1] -0.05514443
   > integrand(c(0.5, 1.0)) # expect the above two numbers in output vector
   [1] -0.05106583 -0.05514443

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com

From: Aurélien Philippot [mailto:aurelien.philip...@gmail.com]
Sent: Friday, December 20, 2013 8:59 AM
To: William Dunlap; R-help@r-project.org
Subject: Re: [R] Inconsistent computation of an integral

Thanks William.
I was convinced by pmax, until I played with the following example today. I 
tried to reproduce a computation from a paper. Here is the code:

P<- function(x) {
  ab<-100*exp((0.0435-0.0269-0.5*0.3315^2)*4.3122+x*sqrt(4.3122)*0.3315)
  return(ab)
}

integrand<- function(x){
  cd<- 
-1/2*((0.094+1.1465)*exp(0.0435*4.3122)+0.29/100*exp(0.0269*4.3122)*P(x)+0.89/100*max(P(x)-88.254,0))^(-2)*pnorm(x)
  return(cd)
}

Solution<- integrate(integrand, lower=-Inf, upper=Inf)
Solution

The above code gives: -0.1366377
The paper reports: -0.1349
If I use pmax instead of max, I get: -0.1965606, which is much worse.

It may look like small discrepancies, but it makes a big difference to me. I am 
still very puzzled by these discrepancies.




2013/12/19 William Dunlap <wdun...@tibco.com<mailto:wdun...@tibco.com>>
I think you want to use pmax(x-50, 0), which returns a vector
the length of x, instead of max(x-50,0), which returns a scalar.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com<http://tibco.com>


> -----Original Message-----
> From: r-help-boun...@r-project.org<mailto:r-help-boun...@r-project.org> 
> [mailto:r-help-boun...@r-project.org<mailto:r-help-boun...@r-project.org>] On 
> Behalf
> Of Aurélien Philippot
> Sent: Thursday, December 19, 2013 10:38 AM
> To: R-help@r-project.org<mailto:R-help@r-project.org>
> Subject: [R] Inconsistent computation of an integral
>
> Dear R experts,
> I computed the same integral in two different ways, and find different
> values in R.
> The difference is due to the max function that is part of the integrand. In
> the first case, I keep it as such, in the second case, I split it in two
> depending on the values of the variable of integration.
>
> 1) First computation
>
> # Function g
> g<-
> function(x){1/(x*0.20*sqrt(10)*sqrt(2*pi))*exp(-0.5*((log(x/50)-
> 0.1*10)/(0.20*sqrt(10)))^2)}
>
> ####### Function f1
> f1<- function(x) {1/(5000000+100000*x+10000*max(x-50,0))}
>
> integrand1<- function(x) {
>   out<- f1(x)*g(x)
>   return(out)
> }
>
> i2<- integrate(integrand1, lower=0, upper=Inf )$value
>
> It gives me: i2=  3.819418e-08
>
> 2) Second computation
> I break the max function in two, depending on the values of the variable of
> integration x (and I use the same density g as before):
>
> f11<- function(x) {1/(5000000+100000*x)}
> f12<- function(x) {1/(5000000+100000*x+10000*(x-50))}
>
>
> integrand11<- function(x) {
>   out<- f11(x)*g(x)
>   return(out)
> }
>
> integrand12<- function(x) {
>   out<- f12(x)*g(x)
>   return(out)
> }
>
>
> i21<- integrate(integrand11, lower=0, upper=50 )$value
> +integrate(integrand12, lower=50, upper=Inf)$value
>
> I get i21=5.239735e-08
>
> The difference makes a huge difference for the computations I do. Does
> anyone know where it comes from?
> Thanks in advance!
>
>       [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help@r-project.org<mailto: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.


        [[alternative HTML version deleted]]

______________________________________________
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.

Reply via email to