MathGroup Archive 1998

[Date Index] [Thread Index] [Author Index]

Search the Archive

RE: Bivariate InverseErf funct




Albert Maydeu-Olivares  wrote:
|
|I need to perform an inverse interpolation of the bivariate normal
|distribution function.
|In other words, I want to estimate a tetrachoric correlation, so I need
|a bivariate version of the InverseErf function.  A glance at the
|standard references for this problem make me believe that programming
|this from scratch may be rather time consuming. I'm interested in
|knowing whether anyone has done it before, or whether I can use some
of |the built-in Mathematica functions to do the job. |
|In a nutshell, this is the problem
|
|
|Consider a bivariate normal distribution with mean {0,0} and
correlation |matrix {{1,r},{r,1}} that has been dichotomized at m1 and
m2. Suppose |m1,m2 & r are known,
|
|m1 = 1; m2 =-1; r=.5;
|
|then we can compute
|
|p1 = N[1 - CDF[NormalDistribution[0, 1], m1]];  p2 = N[1 -
|CDF[NormalDistribution[0, 1], m2]];
|p21=NIntegrate[PDF[MultinormalDistribution[{0,0},{{1,r},{r,1}}],{x1,x2}],{x1
|,m1,\[Infinity]},{x2,m2,\[Infinity]}]; |
|int = NIntegrate[1/(E^((m1^2 + m2^2 - 2*m1*m2*x)/(2*(1 - x^2)))*Sqrt[1
|-x^2]), {x, 0, r}]/  (2*Pi);
|
|What I am interested in is the inverse problem, given numerical
|estimates of p1,p2 and p21 to estimate m1, m2 and r. |
|m1 and m2 can be estimated using the built-in InverseErf function. To
|estimate r from p21 for given m1 and m2 I would need something like a
|bivariate InverseErf function.
|
|
|Without it, this is something I've tried: An anternative expression for
|p21 is
|
|int = NIntegrate[1/(E^((m1^2 + m2^2 - 2*m1*m2*x)/(2*(1 - x^2)))*Sqrt[1
|-x^2]), {x, 0, r}]/  (2*Pi);
|p21= int + p1*p2;
|

Albert,
I think it will work very well if you use FindRoot. I start with what
you did.

In[1]:=
<<Statistics`MultinormalDistribution`

In[2]:=
m1 = 1;
m2 =-1;

In[3]:=
p1 =N[1 - CDF[NormalDistribution[0, 1], m1]]

Out[3]=
0.158655

In[4]:=
  p2 = N[1 -CDF[NormalDistribution[0, 1], m2]]

Out[4]=
0.841345

In[5]:=
distr=1/(E^((m1^2 + m2^2 - 2*m1*m2*x)/(2*(1 - x^2)))*Sqrt[1
 -x^2])/(2 Pi);

In[6]:=
int[r_]:=NIntegrate[Evaluate[distr], {x, 0,r}]

__________________________________
Then I use FindRoot to define the inverse function.

In[7]:=
InverseMultiNormal[p21_]:=
      FindRoot[int[r]+p1*p2==p21,
{r,0.000001,0.9999999},Compiled->False]

Lets see how it works.
Now I find r for (p12=0.15) and the values given above for (p1), (p2),
(m1),  (m2).

In[8]:=
soln=InverseMultiNormal[0.15]

Out[8]=
{r\[Rule]0.343179}


Now I make sure it works.

In[9]:=
int[r/.soln]+p1*p2

Out[9]=
0.15

Hope it helps.
Ted Ersek




  • Prev by Date: RE: defining precision (Q:)
  • Next by Date: Bug in Product
  • Prev by thread: RE: [Q] how to use simple nota
  • Next by thread: Bug in Product