2

我是在 xls 中使用统计函数的新手。给定一组数字,我可以使用 xls 中的 KURT 函数来计算峰度或偏度。

但我的要求是以另一种方式来做,比如对于给定的偏度或峰度,有没有办法生成随机数。关于如何做到这一点的任何指示。

该函数应以偏度或峰度值作为输入,并应生成 50 个随机数,其中 1 为最小值,100,000 为最大值。

如果 Excel 没有办法,我正在寻找 Python 中的建议。

你能帮我在Excel或Python中如何做到这一点吗?

4

1 回答 1

0

在尝试了几种分布之后,广义 Gamma 分布似乎足够灵活,可以将偏斜或峰度调整到所需值,但不能像@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)))

在此之前,我想出了一个匹配 skewkurtosis的函数。然而,即使是 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
于 2019-03-04T16:02:47.613 回答