python - scipy kstest,用于 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
为了测试,如果我将这些样本拟合到 a 中,我想看看 ks 统计量是否接近 0 scipy.stats.lognormal
。在这里,我尝试这样做:
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
实际上并没有传递给s
和scale
in lognorm
。kstest
如何将我的两个参数传递给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]
但这也不起作用。
解决方案
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
推荐阅读
- mongodb - Mongodb 模式,保留一个计数字段或从单独的集合中计数文档
- python - 转换“数字”时的Python json scheam验证器问题
- php - 获取给定数组中特定键的总和值,并在特定完成索引后添加计数行
- python - 使用 django 时表单帖子出现 403 禁止错误
- python - Python 中的错误代码 1 尝试使用石头剪刀布
- python - 如何解析:在一周内变成约会?
- javascript - 具有不同时间的 for 循环中的 setTimeout
- html - “货币”字段的 HTML 输入模式
- python - Requests.get = 来自服务器的不完整响应
- android - EventBusException:它的超类没有带有@Subscribe 注解的公共方法