我是xls中使用统计函数的新手。我能够在 xls 中使用 KURT 函数来计算峰度或偏度,给定一组数字。
但我的要求是以另一种方式来做,比如对于给定的偏度或峰度,有没有办法生成随机数。有关如何执行此操作的任何指示。
该函数应将偏度或峰度值作为输入,并应生成 50 个随机数,其中 1 表示最小值,100,000 表示最大值。
如果Excel没有办法,我正在寻找Python中的建议。
你能帮我如何在Excel或Python中做到这一点吗?
在对几种分布进行实验后,广义伽马分布似乎足够灵活,可以将偏斜或峰度调整到所需的值,但不能同时进行,就像他评论中提到的问题@gabriel中提到的那样。
因此,要从具有单个固定矩的g-Gamma分布中提取样本,您可以使用scipy.optimize
来查找具有最小惩罚函数的分布(我选择了(target - value) ** 2
)
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)))
在此之前,我想出了一个匹配偏斜和峰度的函数。然而,即使是g-Gamma也不够灵活,无法达到这个目的,这取决于你的条件有多极端
。def random_by_sk(skew, kurt, size):
def gengamma_error(a):
s, k = (stats.gengamma.stats(a[0], a[1], moments="sk"))
return (s - skew) ** 2 + (k - kurt) ** 2 # penalty equally weighted for skew and kurtosis
a, c = optimize.minimize(gengamma_error, (1, 1)).x
return stats.gengamma.rvs(a, c, size=size)
n = random_by_sk(3, 3, 100000)
print("mean={}, var={}, skew={}, kurt={}".format(np.mean(n), np.var(n), stats.skew(n), stats.kurtosis(n)))
# will yield skew ~2 and kurtosis ~3 instead of 3, 3