Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mathematica: NExpectation vs Expectation - inconsistent results

Following code returns different values for NExpectation and Expectation. If I try the same for NormalDistribution[] I get convergence erors for NExpectation (but the final result is still 0 for all of them). What is causing the problem?

U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]]

N[Expectation[U[x], x \[Distributed] NormalDistribution[1, 1]]]

NExpectation[U[x], x \[Distributed] NormalDistribution[1, 1]]

Output:

    -0.104154
     0.796449
like image 751
Michal Avatar asked Dec 19 '11 13:12

Michal


2 Answers

I think it might actually be an Integrate bug.

Let's define your

U[x_] := If[x >= 0, Sqrt[x], -Sqrt[-x]]

and the equivalent

V[x_] := Piecewise[{{Sqrt[x], x >= 0}, {-Sqrt[-x], x < 0}}]

which are equivalent over the reals

FullSimplify[U[x] - V[x], x \[Element] Reals] (* Returns 0 *)

For both U and V, the analytic Expectation command uses the Method option "Integrate" this can be seen by running

Table[Expectation[U[x], x \[Distributed] NormalDistribution[1, 1], 
  Method -> m], {m, {"Integrate", "Moment", "Sum", "Quantile"}}]

Thus, what it's really doing is the integral

Integrate[U[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]

which returns

(Sqrt[Pi] (BesselI[-(1/4), 1/4] - 3 BesselI[1/4, 1/4] + 
   BesselI[3/4, 1/4] - BesselI[5/4, 1/4]))/(4 Sqrt[2] E^(1/4))

The integral for V

Integrate[V[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]

gives the same answer but multiplied by a factor of 1 + I. This is clearly a bug.

The numerical integral using U or V returns the expected value of 0.796449:

NIntegrate[U[x] PDF[NormalDistribution[1, 1], x], {x, -Infinity, Infinity}]

This is presumably the correct solution.


Edit: The reason that kguler's answer returns the same value for all versions is because the u[x_?NumericQ] definition prevents the analytic integrals from being performed so Expectation is unevaluated and reverts to using NExpectation when asked for its numerical value..


Edit 2: Breaking down the problem a little bit more, you find

In[1]:= N@Integrate[E^(-(1/2) (-1 + x)^2) Sqrt[x] , {x, 0, Infinity}]
         NIntegrate[E^(-(1/2) (-1 + x)^2) Sqrt[x] , {x, 0, Infinity}]

Out[1]= 0. - 0.261075 I   
Out[2]= 2.25748

In[3]:= N@Integrate[Sqrt[-x] E^(-(1/2) (-1 + x)^2) , {x, -Infinity, 0}]
         NIntegrate[Sqrt[-x] E^(-(1/2) (-1 + x)^2) , {x, -Infinity, 0}]

Out[3]= 0.261075    
Out[4]= 0.261075

Over both the ranges, the integrand is real, non-oscillatory with an exponential decay. There should not be any need for imaginary/complex results.

Finally note that the above results hold for Mathematica version 8.0.3. In version 7, the integrals return 1F1 hypergeometric functions and the analytic result matches the numeric result. So this bug (which is also currently present in Wolfram|Alpha) is a regression.

like image 180
Simon Avatar answered Nov 17 '22 06:11

Simon


If you change the argument of your function u to avoid evaluation for non-numeric values all three methods gives the same result:

u[x_?NumericQ] := If[x >= 0, Sqrt[x], -Sqrt[-x]] ;
Expectation[u[x], x \[Distributed] NormalDistribution[1, 1]] // N;
N[Expectation[u[x], x \[Distributed] NormalDistribution[1, 1]]] ;
NExpectation[u[x], x \[Distributed] NormalDistribution[1, 1]];
{% === %% === %%%, %}

with the result {True, 0.796449}

like image 35
kglr Avatar answered Nov 17 '22 08:11

kglr