我正在寻找一个函数来计算多元正态分布的CDF。我发现x
只有一种计算PDF的方法(对于样本multivariate_normal.pdf(x, mean=mean, cov=cov)
)而不是CDF multivariate_normal.cdf(x, mean=mean, cov=cov)
我正在寻找同样的东西,但要计算cdf,例如:multivariate_normal
,但不幸的是scipy.stats.mvn.mvnun(lower, upper, means, covar)
没有cdf方法。
我发现的唯一一件事是:Multivariate Normal CDF in Python using scipy
但是所提出的方法x
并没有将样本data: function () {
return {
someObject:{
cars: true,
}
}
作为参数,所以我真的不知道如何使用它来获得类似于我上面所说的内容。< / p>
答案 0 :(得分:1)
某些发行版的CDF实际上是该发行版PDF的一个组成部分。既然如此,您需要为函数提供积分的边界。
大多数人在询问与某些发行版相关的某个点的p值时的意思是:
根据此分布获得这些值或更高值的可能性是多少?
注意标记为红色的区域 - 它不是一个点,而是从某点开始的积分:
因此,您需要将您的点设置为下边界,+ inf(或一些任意足够高的值)作为上边界,并提供您已有的均值和协方差矩阵:
from sys import maxsize
def mvn_p_value(x, mu, cov_matrix):
upper_bounds = np.array([maxsize] * x.size) # make an upper bound the size of your vector
p_value = scipy.stats.mvn.mvnun(x, upper_bounds, mu, cov_matrix)[1]
if 0.5 < p_value: # this inversion is used for two-sided statistical testing
p_value = 1 - p_value
return p_value
答案 1 :(得分:1)
这只是对@sascha上面评论答案的观点的澄清。相关功能可以在here中找到:
例如,在具有对角协方差的多元正态分布中,cfd应该给出(1/4) * Total area = 0.25
(如果您不明白为什么,请查看下面的散点图)以下示例将允许您使用它: / p>
from statsmodels.sandbox.distributions.extras import mvnormcdf
from scipy.stats import mvn
for i in range(1, 20, 2):
cov_example = np.array(((i, 0), (0, i)))
mean_example = np.array((0, 0))
print(mvnormcdf(upper=upper, mu=mean_example, cov=cov_example))
它的输出是0.25、0.25、0.25、0.25 ...