令(X,Y)是具有0均值和协方差矩阵S的二维正态随机变量。进一步让Q = [0,1] x [0,1]为单位平方并让我们网格它,均匀地每边有N个网格点。结果我们得到Q是N×N平方的并集。我需要在MATLAB中计算每个这样的平方上的(X,Y)的边际,即我需要计算一个矩阵,其中元素是N×N形式的积分
其中是分区的元素。贪婪的方法是运行两个循环:在i和j之上,并以数字方式计算每个积分。然而,在S是对角线的情况下,可以做更有效的技巧:首先计算X的分布(即一个行向量),然后计算Y(列向量)中的一个,最后得到它们的Kronecker乘积,其中将产生正确的矩阵I.
然而,在存在相关性的情况下,即S不是对角矩阵,这种技巧不起作用。在这种情况下是否有必要运行2个循环,或者有更好的方法?
答案 0 :(得分:0)
不,通常没有简单的方法来计算多变量正态分布的CDF - 请参阅:
http://en.wikipedia.org/wiki/Multivariate_normal_distribution#Cumulative_distribution_function
如果您有MATLAB统计工具箱,则可以使用mvncdf:
http://www.mathworks.com/help/stats/mvncdf.html
有些可用的C / C ++版本可能是MEX:
multivariate normal cdf in C, C++, or Fortran
或者,如果你想在MATLAB中做所有事情,请尝试使用integral2,它有很多优化。
答案 1 :(得分:0)
多变量正常CDF不易计算。然而,使用您在上面提到的内容,双变量情况比单变量情况更容易和更准确。 FORTRAN(见下文)和纯Java库:http://www.iro.umontreal.ca/~simardr/ssj/indexe.html
更一般地说,自20世纪80年代以来,WSU教授(Alan Genz)一直在研究如何以数字方式进行此项和其他多元积分。其他人已经实现的所有代码都来自他的算法和研究。他的代码可以计算CDF以及多变量法线和T分布的预期,最大可达1000维。
http://www.math.wsu.edu/faculty/genz/software/software.html
我还编写了从Java调用这些子例程的代码:Compute the multivariate normal CDF in Java