如何在带有rpy2的Jupyter笔记本中应用Henze-Zirkler的多变量正态性检验

时间:2017-09-17 16:17:33

标签: python-3.x statistics jupyter-notebook multivariate-testing

我有兴趣在python 3x中应用Henze-Zirkler的多变量常态测试,我想知道我是否可以在Jupyter笔记本中使用python。

我已经使用我的数据拟合VAR模型,然后我想测试这个拟合VAR模型的残差是否正态分布。

如何使用python在Jupyter笔记本中这样做?

3 个答案:

答案 0 :(得分:2)

这是另一个答案,因为我后来发现了这种方法。如果您不想将R库导入Python。可以将R的输出调用为python。即一个能够通过python激活R函数,如下所示:

import rpy2.robjects as robjects
from rpy2.robjects import r
from rpy2.robjects.numpy2ri import numpy2ri
from rpy2.robjects.packages import importr
import numpy as np

假设resi是python中的Dataframe说

# Create data
resi = pd.DataFrame(np.random.random((108, 2)), columns=['Number1','Number2'])

然后代码如下

#Converting the dataframe from python to R

# firt take the values of the dataframe to numpy
resi1=np.array(resi, dtype=float)

# Taking the variable from Python to R
r_resi = numpy2ri(resi1)

# Creating this variable in R (from python)
r.assign("resi", r_resi)

# Calling libraries in R 
r('library("MVN")')

# Calling a function in R (from python)
r("res <- hzTest(resi, qqplot = F)")

# Retrieving information from R to Python
r_result = r("res")

# Printing the output in python
print(r_result)

这将生成输出:

 Henze-Zirkler's Multivariate Normality Test 

--------------------------------------------- 

  data : resi 



  HZ      : 2.841424 

  p-value : 1.032563e-06 



  Result  : Data are not multivariate normal. 

---------------------------------------------

答案 1 :(得分:1)

R中有一个已经完成此测试的包,它被称为MVN

您要做的第一件事就是按照here

中的描述将MVN导入python

然后转到你的jupyter笔记本并将VAR(1)模型装到你的数据中

# Fit VAR(1) Model

results = Model.fit(1)
results.summary()

将残差存储为resi

resi=results.resid

然后

# Call function from R
import os
os.environ['R_USER'] = '...\Lib\site-packages\rpy2'
import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()

from rpy2.robjects.packages import importr

MVN = importr("MVN", lib_loc = "C:/.../R/win-library/3.3")

导入MVN后,你可以简单地进行常态测试

MVNresult =MVN.hzTest(resi, qqplot = 0)

如果按

type(MVNresult)

你会发现它是

rpy2.robjects.methods.RS4

因此,在这种情况下,你会发现这个link非常强大,可以解释细节

之后

tuple(MVNresult.slotnames())

这将显示观察结果

('HZ', 'p.value', 'dname', 'dataframe')

然后你可以得到这样的值

np.array(MVNresult.slots[tuple(MVNresult.slotnames())[i]])[0]

其中i代表0, 1, 2, 3为&#39; HZ', 'p-value',...

因此,在p值即i=1小于0.05的情况下,残差(resi)在5%置信水平下不是多变量正态。

答案 2 :(得分:1)

有一个名为 Pingouin 的开源 Python 包,它提供 Henze-Zirkler 多元正态性测试并针对 R 的 MVM 进行测试。

https://pingouin-stats.org/generated/pingouin.multivariate_normality.html

从文档中提取的示例:

import pingouin as pg
data = pg.read_dataset('multivariate')
X = data[['Fever', 'Pressure', 'Aches']]
pg.multivariate_normality(X, alpha=.05)
>>> HZResults(hz=0.5400861018514641, pval=0.7173686509624891, normal=True)