为什么 Johnson-SU 分布在 scipy.stats 中没有给出正偏度?

问题描述

下面的代码映射了由Johnson-SU distribution (a)。

对于我在下面的代码中指定的循环值范围,没有参数配置会导致正偏度,只有负偏度,即使应该可以将 Johnson-SU 分布参数化为正偏度。

b

打印的最小和最大时刻是:

loc

对于 scalejohnsonsuimport numpy as np import pandas as pd from scipy.stats import johnsonsu moments = ['mu','sd','sk','ku'] X = [] for a in np.arange(0.5,5,.5): for b in np.arange(0.5,.5): for c in np.arange(-0.5,0.5,.25): #loc for d in [1]: #scale mvsk = johnsonsu.stats(a,b,c,d,moments='mvsk') mvsk = [mvsk[i].tolist() for i in range(len(mvsk))] X.append([a,d]+mvsk) X = pd.DataFrame(np.asarray(X),columns=['a','b','c','d']+moments) for m in moments: print(m,X[[m]].min().round(3).values[0],X[[m]].max().round(3).values[0]) mu -29937.57 0.136 sd 0.053 48036174150.987 sk -414.36 -0.078 ku 0.221 41173.869 参数,探索哪些范围比我在下面指定的范围更好? documentation 只说明 ab 必须为正数,没有说明 locscale 必须限制为什么。

解决方法

在查看维基百科文章和源代码时,在我看来参数 a 可以改变偏度。尝试 a 的负值。文档说 a 必须大于零,但看了一下公式和代码,这似乎是文档中的一个错误,实际上 a 可以小于或等于零。

我已经尝试了上面的程序,将 a 的范围替换为 np.arange(-2.5,2.5,.5)。它运行没有错误(尽管结果中存在关于不精确的警告,这些警告也存在于原始文件中)并报告:

mu -202.147 548.542
sd 0.052 16114617.207
sk -414.352 402.646
ku 0.213 41173.867

附注。我已将此作为错误报告给 Scipy 项目:https://github.com/scipy/scipy/issues/13353