簡體   English   中英

Python中的多變量普通CDF

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM