【问题标题】:scipy kstest, used on scipy lognormal distrubtionscipy kstest,用于 scipy 对数正态分布
【发布时间】:2018-08-18 05:57:11
【问题描述】:

我正在尝试对一些数据和一些不同的分布使用 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 时,这些实际上并没有传递给kstest 中的lognorm 中的sscale。如何将我的两个参数传递给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]

但这也不起作用。

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 2011-08-18
      • 2018-08-21
      • 2019-05-18
      • 2017-05-10
      相关资源
      最近更新 更多