我有兴趣在python 3x中应用Henze-Zirkler的多变量常态测试,我想知道我是否可以在Jupyter笔记本中使用python。
我已经使用我的数据拟合VAR模型,然后我想测试这个拟合VAR模型的残差是否正态分布。
如何使用python在Jupyter笔记本中这样做?
答案 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)