我正在尝试生成一个随机分布,在其中控制均值、SD、偏度和峰度。
生成分布后,我可以通过一些简单的数学计算来求解平均值和标准差。
峰度 我暂时将其搁置,因为它看起来太难了。
偏斜是今天的问题。
import scipy.stats
def convert_to_alpha(s):
d=(np.pi/2*((abs(s)**(2/3))/(abs(s)**(2/3)+((4-np.pi)/2)**(2/3))))**0.5
a=((d)/((1-d**2)**.5))
return(a)
for skewness_expected in (.5, .9, 1.3):
alpha = convert_to_alpha(skewness_expected)
r = stats.skewnorm.rvs(alpha,size=10000)
print('Skewness expected:',skewness_expected)
print('Skewness obtained:',stats.skew(r))
print()
Skewness expected: 0.5
Skewness obtained: 0.47851348006629035
Skewness expected: 0.9
Skewness obtained: 0.8917020428586827
Skewness expected: 1.3
Skewness obtained: (1.2794406116842627+0.01780402125888404j)
Run Code Online (Sandbox Code Playgroud)
我知道计算出的偏度通常与所需的偏度不匹配 - 毕竟这是一个随机分布。但我很困惑如何获得偏度 > 1 的分布而不陷入复数范围。rvs 方法似乎无法处理它,因为只要偏度 > 1,参数 alpha 就是一个虚数。
我该如何修复它,以便生成偏度 > 1 的分布,但不会出现复数?
[感谢Warren Weckesser为我指明了维基百科,以便我编写 Convert_to_alpha 函数。]