【问题标题】:Getting nan for p values in scipy chisquare: Don't know why?在 scipy chisquare 中获取 p 值的 nan:不知道为什么?
【发布时间】:2023-03-14 10:52:01
【问题描述】:

非常感谢您在此问题上的帮助。看起来应该是直截了当的。

我在名为 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]))

【问题讨论】:

  • 应该[Totals.Connections]Totals['Connections']
  • 只要名称中没有空格,这不重要吗?但以防万一!
  • 这很重要。看我的回答。
  • 重要的是您在Totals.Connection 周围放置的额外括号,而不是您使用Totals.Connection 还是Totals['Connection']

标签: python pandas scipy statistics chi-squared


【解决方案1】:

您的预期频率中可能有一些 0,这会打乱计算。

至于问题的第二部分:Power_divergenceResult 是结果的预期类型,没有错。

【讨论】:

  • 感谢您的回答,但我的观察结果不为零!
  • 来自文档:当每个类别中观察到或预期的频率太小时,此测试无效。一个典型的规则是所有观察到的和预期的频率至少应该是 5。
  • 再一次,我观察到的结果并非如此:不过,所有的结果都超过 5--谢谢。
【解决方案2】:

看起来您希望每个参数都是一维的,但是您在参数周围有额外的括号,这为每个参数添加了额外的维度。删除那些多余的括号:

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)

如果您将参数包装在额外级别的括号中,它们将变为二维,并且卡方应用于每个(平凡的)列(因为默认值为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]))

【讨论】:

  • 感谢您出色且非常耐心的解释!这真的很有用,很好地解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2013-03-20
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多