[英]Multivariate normal CDF in Python
我正在尋找一個函數來計算多元正態分布的CDF。 我發現scipy.stats.multivariate_normal
只有一種計算PDF的方法(對於樣本x
)而不是CDF multivariate_normal.pdf(x, mean=mean, cov=cov)
我正在尋找相同的東西,但計算cdf,如: multivariate_normal.cdf(x, mean=mean, cov=cov)
,但不幸的是, multivariate_normal
沒有cdf方法。
我發現的唯一的事情就是: Python中的多變量普通CDF使用scipy,但是所提出的方法scipy.stats.mvn.mvnun(lower, upper, means, covar)
不會將樣本x
作為參數,所以我不喜歡真的看到如何使用它來得到類似於我上面所說的東西。
這只是對@sascha在答案評論中所提出的觀點的澄清。 相關功能可以在這里找到:
例如,在具有對角協方差的多元正態分布中,cfd應該給出(1/4) * Total area = 0.25
(如果您不理解為什么,請查看下面的散點圖)以下示例將允許您使用它:
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 ......
某些發行版的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.