Python均匀分布卡方检验结果异常及输出格式调整问题
问题解答
1 相同代码卡方检验统计量结果变化的原因
可能的原因有三类:
- 交互式环境变量污染:如果使用Jupyter这类交互式编辑器运行代码,若单独重复执行过随机数生成的代码块,会修改全局种子变量
i的取值,后续生成的随机序列会完全改变,卡方检验结果自然不同。你用的固定种子LCG生成器仅在完整从头运行全量代码时,才会输出完全一致的随机序列。 - 代码逻辑误差:你初始化
list1时已放入初始种子i,后续循环n次追加新值,最终list1的长度为n+1,但你计算期望频数f_exp时用的是n/bins1,观测频数总和与期望频数总和不一致,scipy的chisquare函数会自动重缩放期望频数,不同版本scipy的缩放逻辑差异可能导致结果变化。同时你做直方图统计时用的是完整的list1,但绘图时只取了前n个值,两者不匹配也会带来统计误差。 - 运行环境差异:不同版本的Numpy对无符号整数溢出的处理逻辑、不同版本Scipy的卡方检验实现、不同操作系统的数值计算精度差异,都可能导致最终结果出现小幅波动。
如果要提高结果可复现性,可以把随机数生成逻辑封装为函数,避免全局变量污染,同时修正样本长度问题:
def generate_lcg(seed, sample_count): i = np.uintc(seed) samples = [] for _ in range(sample_count): i = np.uintc(i * 663608941) samples.append(i) return np.divide(samples, (2**32) - 1)
调用时直接传入种子和需要的样本量即可,不会出现样本长度多1的问题。
2 单独打印统计量和p值的方法
scipy.stats.chisquare返回的Power_divergenceResult是支持属性访问的类元组对象,直接调用对应属性即可单独打印,将你的打印代码修改为以下形式即可得到整洁输出:
print("卡方统计量:%.4f" % chisquareval.statistic) print("p值:%.4f" % chisquareval.pvalue)
你也可以根据需要调整格式字符串,修改数值保留的小数位数。
内容的提问来源于stack exchange,提问作者J.Snowden
相关产品推荐
相关产品推荐

