首页 > 解决方案 > 查找 p 值的简单方法

问题描述

我不是数学的,请温柔...

我正在寻找一种简单的方法来找到对应于给定卡方(一个自由度)的 p 值。我想把它放到一个计算机程序(FileMaker)中;准确性并不重要。

从这个讨论: http://mathforum.org/kb/message.jspa?messageID= 5830281

我已经提取了 3 个公式:


第一个公式:

p(x)=a/x^3 + b/x^2 + c/x + d

其中 x = 卡方,a、b、c 和 d 是常数。

范围从 0,1 到 3,然后:a 0.00350853 / b -0.0623318 / c 0.357489 / d -0.0049905

范围从 3 到 12,则:a -3.1258 / b +2.81657 / c -0.387984 / d 0.0152614


第二个公式:

您可以使用其他人给出的带有一个df的卡方与标准法线之间的关系,然后逼近标准法线。有不同的方法可以做到这一点:我去挖掘 Abramowitz 和 Stegun 发现了这个:

P(x)=概率(X <= x) 约 = 1-0.5(1+c_1 x+c_2 x^2+c_3 x^3+ c_4 x_4)^(-4)

(整个支架提升到幂 -4),

其中 c_1=0,196854 / c_2=0,115194 / c_3=0,000344 / c_4=0,019527

错误声称小于 2.5 x 10^{-4}。


第三个公式:

1/(1 + Exp[-.496937z*Sqrt[z^2 + 10.28]])


我测试了,但结果不好......但我确信在链接的讨论中表达是正确的(这是我的“翻译”是错误的)。错误在哪里?

标签: statisticsfilemakerchi-squaredp-value

解决方案


我不确定为什么前两个公式没有成功。我没有检查他们。

第三个公式原来是有效的,但你不小心从讨论中复制了错误的公式。在那篇文章中,他们提到了您的正态分布公式,但这个公式用于 chi^2 近似值:

2/(1 + Exp[.496937*Sqrt[x(x + 10.28)])

我将其编码到 python 中并与scipy.stats.chi2.cdf.

In [7]: def f(z):
   ...:     return 2.0 / (1.0 + math.exp(0.496937*math.sqrt(z*(z+10.28))))
In [10]: def g(z):
   ...:     return 1.0 - stats.chi2.cdf(z,1)
In [14]: values = [ (f(x), g(x), abs(f(x)-g(x))) for x in range(1,10) ]
In [15]: values
Out[15]:
[(0.317115565250687, 0.31731050786291415, 0.0001949426122271336),
 (0.1570262524187356, 0.15729920705028488, 0.000272954631549277),
 (0.08324399687489754, 0.08326451666355039, 2.051978865284798e-05),
 (0.0456977583763344, 0.04550026389635853, 0.000197494479975871),
 (0.02564668451495894, 0.02534731867746831, 0.0002993658374906283),
 (0.014616925322419972, 0.014305878435429631, 0.00031104688699034114),
 (0.008425622375436589, 0.008150971593502754, 0.00027465078193383494),
 (0.004898868275754985, 0.004677734981047288, 0.0002211332947076967),
 (0.0028675732116189585, 0.002699796063260207, 0.00016777714835875153)]

所以你的错误(每行中的第三个值)大约是 3*10^-4。看起来还不错...


推荐阅读