为给定的峰度或偏度生成数字(分布)



我是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

最新更新