我是xls中使用统计函数的新手。在给定一组数字的情况下,我能够在xls中使用KURT函数计算峰度或偏度。
但是我的要求是以另一种方式来做,比如对于给定的Skewness或Kurtosis,有没有办法生成随机数。关于如何做到这一点的任何指示。
该函数应该将偏度或峰度值作为输入,它应该生成50个随机数,其中1表示最小值,100,000表示最大值。
如果Excel没办法,我正在寻找Python的建议。
您能帮我解决一下如何在Excel或Python中执行此操作吗?
答案 0 :(得分:0)
在尝试了几种分布后,广义Gamma分布似乎足够灵活,可以将偏斜或峰度调整到所需的值,但不能像在question @gabriel在他的评论中提及。
因此,要从具有单个固定矩的g-Gamma分布中抽取样本,您可以使用scipy.optimize
查找具有最小罚函数的分布(我选择了{{ 1}})
(target - value) ** 2
在此之前,我想出了一个匹配偏斜和峰度的功能。但是,即使g-Gamma也不够灵活,无法达到此目的,具体取决于您的病情极端情况
from scipy import stats, optimize
import numpy as np
def random_by_moment(moment, value, size):
""" Draw `size` samples out of a generalised Gamma distribution
where a given moment has a given value """
assert moment in 'mvsk', "'{}' invalid moment. Use 'm' for mean,"\
"'v' for variance, 's' for skew and 'k' for kurtosis".format(moment)
def gengamma_error(a):
m, v, s, k = (stats.gengamma.stats(a[0], a[1], moments="mvsk"))
moments = {'m': m, 'v': v, 's': s, 'k': k}
return (moments[moment] - value) ** 2 # has its minimum at the desired value
a, c = optimize.minimize(gengamma_error, (1, 1)).x
return stats.gengamma.rvs(a, c, size=size)
n = random_by_moment('k', 3, 100000)
# test if result is correct
print("mean={}, var={}, skew={}, kurt={}".format(np.mean(n), np.var(n), stats.skew(n), stats.kurtosis(n)))