在 scipy chisquare 中获取 p 值的 nan:不知道为什么?
Getting nan for p values in scipy chisquare: Don't know why?
非常感谢您对此问题的帮助。看起来应该是直截了当的。
我在名为 Totals 的 pandas 数据框中有两列:Totals['Connections'] 和 Totals['Expected']。 Totals['Connections'] 包含观察到的相关变量的发生次数; Totals['Expected'] 包含预期的观察数。我想使用 scipy chisquare 函数比较两者。我通过以下方式执行此操作:
sp.stats.chisquare([Totals.Connections], f_exp=[Totals.Expected])
然而,当我这样做时,我得到了一个有效的测试统计数据,但是我的 p 值是 'nan',如下所示(见下文)。另外,结果开头的 'Power_divergence' 文本是什么意思?谁能解释一下我在这里做错了什么?
Power_divergenceResult(statistic=array([ 1.05408049e+03, 6.30832196e+02, 7.02987722e+01,
9.17326057e+00, 1.56193724e+01, 3.36275580e+01,
6.16076398e+02, 1.50373806e+02, 2.94802183e+01,
2.65321965e+02, 1.00900409e+01, 3.06515689e+02,
1.38828104e+02, 3.68894952e+02, 1.92873124e+02,
5.67564802e+02, 2.36092769e+02, 1.77298772e+03,
3.55388267e+03, 6.42013643e+02, 1.55858117e+02,
1.22783083e+02, 1.36425648e-03, 2.47579809e+02,
2.36092769e+02, 7.02987722e+01, 1.23124147e+01,
6.10587995e+02, 2.75088677e+01, 2.76261937e+02,
2.00121419e+02, 4.97702592e+02, 2.01167804e+02,
1.26909959e+02, 2.60530696e+02, 6.66316508e+01,
2.15019100e+02]), pvalue=array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan]))
您的预期频率中可能有一些 0,这会扰乱计算。
关于问题的第二部分:Power_divergenceResult
是结果的预期类型,没有错。
您似乎希望每个参数都是一维的,但是参数周围有额外的括号,这为每个参数增加了一个额外的维度。删除那些多余的括号:
sp.stats.chisquare(Totals.Connections, f_exp=Totals.Expected)
例如,下面是 chisquare
的典型用法:
In [49]: chisquare([4, 4, 5, 5], [4, 3, 7, 4])
Out[49]: Power_divergenceResult(statistic=1.1547619047619047, pvalue=0.76387343970439647)
如果将参数包裹在额外的括号中,它们将变成二维的,并且 chisquare 应用于每个(平凡的)列(因为默认值为 axis=0
):
In [50]: chisquare([[4, 4, 5, 5]], [[4, 3, 7, 4]])
Out[50]: Power_divergenceResult(statistic=array([ 0. , 0.33333333, 0.57142857, 0.25 ]), pvalue=array([ nan, nan, nan, nan]))
该计算与调用 chisquare
四次相同,每列参数一次。当参数的长度仅为 1 时,p 值为 nan
:
In [59]: chisquare([4], [4])
Out[59]: Power_divergenceResult(statistic=0.0, pvalue=nan)
In [60]: chisquare([4], [3])
Out[60]: Power_divergenceResult(statistic=0.33333333333333331, pvalue=nan)
In [61]: chisquare([5], [7])
Out[61]: Power_divergenceResult(statistic=0.5714285714285714, pvalue=nan)
In [62]: chisquare([5], [4])
Out[62]: Power_divergenceResult(statistic=0.25, pvalue=nan)
要在保留额外括号的同时获得预期结果,您必须使用 axis=1
:
In [63]: chisquare([[4, 4, 5, 5]], [[4, 3, 7, 4]], axis=1)
Out[63]: Power_divergenceResult(statistic=array([ 1.1547619]), pvalue=array([ 0.76387344]))
非常感谢您对此问题的帮助。看起来应该是直截了当的。
我在名为 Totals 的 pandas 数据框中有两列:Totals['Connections'] 和 Totals['Expected']。 Totals['Connections'] 包含观察到的相关变量的发生次数; Totals['Expected'] 包含预期的观察数。我想使用 scipy chisquare 函数比较两者。我通过以下方式执行此操作:
sp.stats.chisquare([Totals.Connections], f_exp=[Totals.Expected])
然而,当我这样做时,我得到了一个有效的测试统计数据,但是我的 p 值是 'nan',如下所示(见下文)。另外,结果开头的 'Power_divergence' 文本是什么意思?谁能解释一下我在这里做错了什么?
Power_divergenceResult(statistic=array([ 1.05408049e+03, 6.30832196e+02, 7.02987722e+01,
9.17326057e+00, 1.56193724e+01, 3.36275580e+01,
6.16076398e+02, 1.50373806e+02, 2.94802183e+01,
2.65321965e+02, 1.00900409e+01, 3.06515689e+02,
1.38828104e+02, 3.68894952e+02, 1.92873124e+02,
5.67564802e+02, 2.36092769e+02, 1.77298772e+03,
3.55388267e+03, 6.42013643e+02, 1.55858117e+02,
1.22783083e+02, 1.36425648e-03, 2.47579809e+02,
2.36092769e+02, 7.02987722e+01, 1.23124147e+01,
6.10587995e+02, 2.75088677e+01, 2.76261937e+02,
2.00121419e+02, 4.97702592e+02, 2.01167804e+02,
1.26909959e+02, 2.60530696e+02, 6.66316508e+01,
2.15019100e+02]), pvalue=array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan]))
您的预期频率中可能有一些 0,这会扰乱计算。
关于问题的第二部分:Power_divergenceResult
是结果的预期类型,没有错。
您似乎希望每个参数都是一维的,但是参数周围有额外的括号,这为每个参数增加了一个额外的维度。删除那些多余的括号:
sp.stats.chisquare(Totals.Connections, f_exp=Totals.Expected)
例如,下面是 chisquare
的典型用法:
In [49]: chisquare([4, 4, 5, 5], [4, 3, 7, 4])
Out[49]: Power_divergenceResult(statistic=1.1547619047619047, pvalue=0.76387343970439647)
如果将参数包裹在额外的括号中,它们将变成二维的,并且 chisquare 应用于每个(平凡的)列(因为默认值为 axis=0
):
In [50]: chisquare([[4, 4, 5, 5]], [[4, 3, 7, 4]])
Out[50]: Power_divergenceResult(statistic=array([ 0. , 0.33333333, 0.57142857, 0.25 ]), pvalue=array([ nan, nan, nan, nan]))
该计算与调用 chisquare
四次相同,每列参数一次。当参数的长度仅为 1 时,p 值为 nan
:
In [59]: chisquare([4], [4])
Out[59]: Power_divergenceResult(statistic=0.0, pvalue=nan)
In [60]: chisquare([4], [3])
Out[60]: Power_divergenceResult(statistic=0.33333333333333331, pvalue=nan)
In [61]: chisquare([5], [7])
Out[61]: Power_divergenceResult(statistic=0.5714285714285714, pvalue=nan)
In [62]: chisquare([5], [4])
Out[62]: Power_divergenceResult(statistic=0.25, pvalue=nan)
要在保留额外括号的同时获得预期结果,您必须使用 axis=1
:
In [63]: chisquare([[4, 4, 5, 5]], [[4, 3, 7, 4]], axis=1)
Out[63]: Power_divergenceResult(statistic=array([ 1.1547619]), pvalue=array([ 0.76387344]))