stats.chisquare 错误地返回 p_value = 0

Posted

技术标签:

【中文标题】stats.chisquare 错误地返回 p_value = 0【英文标题】:stats.chisquare wrongly returns p_value = 0 【发布时间】:2018-05-21 19:13:01 【问题描述】:

我在每个类别中都有这样的预期和频率,如下所示:

它们看起来很相似,但卡方检验却不这么认为:

stats.chisquare(city_ans.answered, city_ans.sent)
# Power_divergenceResult(statistic=893005.32003277098, pvalue=0.0)

过滤小于 10 的值变化不大:

stats.chisquare(city_ans[city_ans.answered > 10].answered, city_ans[city_ans.answered > 10].sent)

# Power_divergenceResult(statistic=892917.3023088905, pvalue=0.0)

我做错了什么? 我如何在这里申请 F 测试?

附言。使用与 obs 和 exp 相同的值的测试 - return p_val = 1

stats.chisquare(city_ans.sent, city_ans.sent)
# Power_divergenceResult(statistic=0.0, pvalue=1.0)

但是这样的代码也应该返回 p_val = 1,但它不会:

stats.chisquare(0.9*city_ans.sent, city_ans.sent)
# Power_divergenceResult(statistic=10591.249999999995, pvalue=0.0)

UPD:

f_obs = weeks_ans.answered / np.sum(weeks_ans.answered)
f_exp = weeks_ans.sent / np.sum(weeks_ans.sent)
stats.chisquare(f_obs, f_exp)

# Power_divergenceResult(statistic=0.064491479990141154, pvalue=1.0)

这似乎是一个不错的结果,但我认为有些东西不在这里。

例如看看下面的分布,同样的方法:

# Power_divergenceResult(statistic=0.064491479990141154, pvalue=1.0)

使用分布相同的测试是否公平

【问题讨论】:

你的数据集有多大? @WarrenWeckesser 仅 54 个类别(x 轴)和频率 - 从非常低的值到高达数千个 大尖峰是否出现在相同的 x 值上?否则,它们会导致频率出现巨大差异。 @WarrenWeckesser 不,他们匹配 “但是这样的代码也应该返回 p_val = 1,但它不会:...” 这是不正确的。 p 值不是相关系数。值的任何差异都会导致正的卡方统计量,并导致 p 值小于 1(尽管如果差异很小,数值计算的 p 值可能仍为 1)。 【参考方案1】:

正如@Crasy Ivan 所指出的,卡方检验需要在观察到的计数和预期计数中具有相同数量的观察或计数。

在这种情况下,数据似乎来自两个不同的样本。这本质上是一个 2×K 列联表,在计算预期频率计数时,每行具有相同分布的假设将通过行总数进行校正。

所以直接使用卡方检验是对两个样例的错误检验。 scipy.stats 对列联表的独立性进行卡方检验。

关于非常大的计数的一般性评论,这里似乎就是这种情况:

随着样本量的增加,原假设将被拒绝,并且对于任何与原假设的小但非零偏差,pvalue 都会变为零。当计数(即观察总数)超过 50,000 时,适当的假设检验很可能会拒绝即使是在统计上显着但在应用中不相关的微小差异。

另一种方法是使用等价检验来检验两个分布的差异不会超过某个小幅度的假设。困难在于很难根据一些拟合优度统计量来指定等价阈值。

【讨论】:

你说得对。我从统计数据中应用了列联表——它拒绝了这两种情况,但它更确定的是第二种情况。第一种情况 p_value = 10^-182,第二种情况为零 我们可以在这里应用二项式检验吗? @Rocketq 不,二项式不合适,因为数据是多项式的,即超过两个频率或比例。二项式用于二元选择的计数。 @Rocketq 您的类别是有序的还是 x 标签 1, ... 50 只是任意标签?基于情节有小的差异,例如在 1 和 33 中,考虑到数以千计,它们的绝对值很大。如果可以将相邻值视为计数中的小变化,则可以将它们合并。 1, ... 50 - 标记为商店。这些已经统计了每个标签的观察次数

以上是关于stats.chisquare 错误地返回 p_value = 0的主要内容,如果未能解决你的问题,请参考以下文章

继承覆盖问题

为啥 aws lambda 调用客户端错误地返回 ClientExecutionTimeoutException?

MongoJS 节点 findOne 错误地返回无结果

如何最好地从 Worklight 过程中“返回错误”?

EventKit 中的 EKParticipant 错误地为 isCurrentUser 属性返回 NO

如何可靠地返回地址数组?