function BiVariateNCDF(a , b , rho ) { aarray=new Array; barray=new Array; rho1=0.0; rho2=0.0; delta=0.0; ap=0.0; bp=0.0; Sum=0; i=0; j=0; Pi=0; denum=0.0; aarray[0]=0.24840615; aarray[1]=0.39233107; aarray[2]=0.21141819; aarray[3]=0.03324666; aarray[4]=0.00082485334; barray[0]=0.10024215; barray[1]=0.48281397; barray[2]=1.0609498; barray[3]=1.7797294; barray[4]=2.6697604; Pi = 3.14159265358979; ap = a / Math.sqrt(2 * (1 - rho * rho)); bp = b / Math.sqrt(2 * (1 - rho * rho )); BivN=0.0; if (a <= 0 && b <= 0 && rho <= 0) { Sum = 0; for (i = 0; i< 5;i++) for (j = 0; j< 5;j++) Sum = Sum + aarray[i] * aarray[j] * f(barray[i], barray[j], ap, bp, rho); BivN = Sum * Math.sqrt(1 - rho * rho) / Pi; } else if( a <= 0 && b >= 0 && rho >= 0) BivN = NCDF2(a) - BiVariateNCDF(a, -b, -rho); else if(a >= 0 && b <= 0 && rho >= 0 ) { BivN = NCDF2(b) - BiVariateNCDF(-a, b, -rho); } else if(a >= 0 && b >= 0 && rho <= 0 ) BivN = NCDF2(a) + NCDF2(b) - 1 + BiVariateNCDF(-a, -b, rho); else if(a * b * rho >= 0) { denum = Math.sqrt(Math.abs(a*a-2*rho*a*b+b*b)); rho1 = (rho * a - b) * Sgn(a) / denum; rho2 = (rho * b - a) * Sgn(b) / denum; delta = (1 - Sgn(a) * Sgn(b)) / 4; BivN = BiVariateNCDF(a, 0, rho1) + BiVariateNCDF(b, 0, rho2) - delta; } return BivN; } function CumulativeBivariateNormal(a, b, rho) { aarray=new Array; aarray[0]= 0.24840615; aarray[1]=0.39233107; aarray[2]=0.21141819; aarray[3]=0.03324666; aarray[4]=0.00082485334; barray=new Array; barray[0]=0.10024215; barray[1]=0.48281397; barray[2]=1.0609498; barray[3]=1.7797294; barray[4]=2.6697604; // static Real aarray[4]= {0.325303, 0.4211071, 0.1334425, 0.006374323}; //static Real barray[4]={0.1337764, 0.6243247, 1.3425378, 2.2626645}; rho1=0; rho2=0; delta =0; ap=0; bp =0; Sum=0; Pi=0; sgnA=0;sgnB=0; i=0; j=0 ; BivN=0; denum=0; sgnA=Sgn(a); sgnB=Sgn(b); Pi = 3.14159265358979; if(Math.pow(rho,2)==1) rho=Sgn(rho)*0.99999; ap = a / Math.sqrt(2 * (1 - Math.pow(rho,2))); bp = b / Math.sqrt(2 * (1 - Math.pow(rho,2))); if( (a <= 0) && (b <= 0) && (rho <= 0) ){ Sum = 0; for (i = 0 ;i< 5;i++) for (j = 0 ;j< 5;j++) Sum += + aarray[i] * aarray[j] * SubFunctionForBivariateNormal(barray[i], barray[j], ap, bp, rho); BivN = Sum * Math.sqrt(1 - Math.pow(rho,2)) / Pi; } else if ((a <= 0 )&& (b >= 0) && (rho >= 0)) BivN = NCDF2(a) - CumulativeBivariateNormal(a, -b, -rho); else if ((a >= 0) && (b <= 0) && (rho >= 0)) BivN = NCDF2(b) - CumulativeBivariateNormal(-a, b, -rho); else if ((a >= 0) && (b >= 0) && (rho <= 0)) BivN = NCDF2(a) + NCDF2(b) - 1 + CumulativeBivariateNormal(-a, -b, rho); else if (a * b * rho >= 0) { denum = Math.sqrt(Math.pow(a,2) - 2 * rho * a * b + Math.pow(b,2)); rho1 = (rho * a - b) * sgnA / denum; rho2 = (rho * b - a) * sgnB / denum; delta = (1 - sgnA*sgnB) / 4; BivN = CumulativeBivariateNormal(a, 0, rho1) + CumulativeBivariateNormal(b, 0, rho2) - delta; } return BivN; } function SubFunctionForBivariateNormal( X, y, ap, bp, rho){ r = ap * (2 * X - ap) + bp * (2 * y - bp) + 2 * rho * (X - ap) * (y - bp); return Math.exp(r); }
Tuesday, June 11, 2013
Bivariate Normal cumulative distribution function
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment