python - python 中的 stdtr 在进行 t 检验时为 p 值提供 nan

标签 python statistics scipy p-value

我使用以下代码来执行 t 检验:

def t_stat(na,abar,avar,nb,bbar,bvar):
     logger.info("T-test to be performed")
     logger.info("Set A count = %f mean = %f variance = %f" % (na,abar,avar))
     logger.info("Set B count = %f mean = %f variance = %f" % (nb,bbar,bvar))
     adof = na - 1
     bdof = nb - 1
     logger.info("Degrees of Freedom of a=%f" % adof)
     logger.info("Degrees of Freedom of b=%f" % bdof)
     tf = (abar - bbar) / np.sqrt(avar/na + bvar/nb)
     dof = (avar/na + bvar/nb)**2 / (avar**2/(na**2*adof) + bvar**2/(nb**2*bdof))
     logger.info("tf = %f, dof=%f"%(tf,dof))
     pf = 2*stdtr(dof, -np.abs(tf))

我的输出如下:

     Set A count = 3547465.000000 mean = 0.001123 variance = 0.000369
     Set B count = 83759692.000000 mean = 0.001242 variance = 0.000424
     Degrees of Freedom of a=3547464.000000
     Degrees of Freedom of b=83759691.000000
     tf = -11.374250, dof=-2176568.362223
     formula:   t = -11.3743  p = nan

当我传递与数组相同的数据并使用 ttest_ind 函数时,我得到 t = -11.374250 p = 0.000000。

为什么我的函数将 p 指定为 nan ? Afaik,我不能将 nan 视为 0。我如何理解 t_stat 和 ttest_ind 之间的确切区别?任何帮助,将不胜感激。

最佳答案

您传递给公式的自由度为负。

In [6]:

import numpy as np
from scipy.special import stdtr
​
dof = -2176568
tf = -11.374250
2*stdtr(dof, -np.abs(tf))
Out[6]:
nan

如果是积极的:

In [7]:

import numpy as np
from scipy.special import stdtr
​
dof = 2176568
tf = -11.374250
2*stdtr(dof, -np.abs(tf))
Out[7]:
5.6293517178917971e-30

我想知道你的情况是如何发生的,我运行了你的代码试图推断输入参数:

In [13]:

def t_stat(na,abar,avar,nb,bbar,bvar):
     print("T-test to be performed")
     print("Set A count = %f mean = %f variance = %f" % (na,abar,avar))
     print("Set B count = %f mean = %f variance = %f" % (nb,bbar,bvar))
     adof = na - 1
     bdof = nb - 1
     print("Degrees of Freedom of a=%f" % adof)
     print("Degrees of Freedom of b=%f" % bdof)
     tf = (abar - bbar) / np.sqrt(avar/na + bvar/nb)
     dof = (avar/na + bvar/nb)**2 / (avar**2/(na**2*adof) + bvar**2/(nb**2*bdof))
     print("tf = %f, dof=%f"%(tf,dof))
     print(stdtr(dof, -np.abs(tf)))
In [14]:

t_stat(3547465, 0.001123, 0.000369, 83759692, 0.001242, 0.000424)
T-test to be performed
Set A count = 3547465.000000 mean = 0.001123 variance = 0.000369
Set B count = 83759692.000000 mean = 0.001242 variance = 0.000424
Degrees of Freedom of a=3547464.000000
Degrees of Freedom of b=83759691.000000
tf = -11.393950, dof=3900753.641275
2.2434573594e-30

希望它能帮助您找到问题所在。

关于python - python 中的 stdtr 在进行 t 检验时为 p 值提供 nan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685769/

相关文章:

python - 加载自定义 gstreamer 插件会引发 gst.ElementNotFoundError

python - 过滤字符串列表,忽略其他项的子字符串

python - CoInitialize() 未定义 - Python 错误

Python Flask 应用程序 : include HTML that imports xml file with javascript

C++ 计算标准差

python - 我如何为给定的概率分布生成直方图(用于功能测试服务器)?

git - 从 Git 存储库生成统计信息

python - Numpy/Scipy 连接组件

python - 如何在 Python 中关联两个音频事件(检测它们是否相似)

python - 默认情况下,scipy 的 basinhopping 是随机还是自适应地改变步长?