scipy kstest,用于scipy对数正态分布

时间:2018-08-17 21:18:02

标签: python scipy

我正在尝试对某些数据和一些不同的分布使用scipy的kstest。我必须按照对数正态分布对数据进行测试,并且感到困惑,所以进行了测试。

我正在通过对数法线自身的均值和标准差进行参数化(而不是scipys版本,其中loc是相应法线平均值的指数,而s是相应法线的标准偏差。) 在这里解释: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.lognorm.html

我编写了一个函数,该函数接收我的参数,将其转换为scipys参数,然后进行采样。在这里:

def lognormal_samples(M_y, Sig_y):

    m_x = (2*math.log(M_y)) - (.5)*(math.log(math.pow(Sig_y,2) + math.pow(M_y,2)))
    scale = math.exp(m_x)

    sigma2 = -2 * math.log(M_y) + math.log(math.pow(Sig_y,2) + math.pow(M_y,2))
    s = math.sqrt(sigma2)

    result = stats.lognorm(s, scale=scale).rvs(size=10000)

    return result, s, scale

要测试,如果我将这些样本拟合为scipy.stats.lognormal,我想看看ks统计量是否接近0。在这里,我尝试这样做:

def lognormal_test_of_ks_test():

samples, my_s, my_scale = lognormal_samples(1, .25)
ks = stats.kstest(samples, 'lognorm', args=[my_s, my_scale])[0]
print('ks: ', ks)

运行此命令时,我得到ks: 0.958038612187,这太高了。我认为我的问题是,当我将[my_s,my_scale]传递给args时,这些实际上并没有传递给sscale中的lognormkstest 。如何将两个参数传递到kstest中,以便它们实际上对lognorm进行参数设置?我会想像成这样:

my_s = 's=' + str(my_s)
my_scale = 'scale=' + str(my_scale)
my_args = [my_s, my_scale]
ks = stats.kstest(samples, 'lognorm', args=my_args)[0]

但这也不起作用。

1 个答案:

答案 0 :(得分:0)

kstest最终调用lognorm.cdf并根据doc接受以下参数:

cdf(x, s, loc=0, scale=1)

因此您需要通过:

my_args = [my_s, 0, my_scale]
ks = stats.kstest(samples, 'lognorm', args=my_args)[0]

输出:

ks:  0.007790356168134116