我不是数学家,请保持谦虚...
我正在寻找一种简单的方法来找到对应的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
第二个公式:
您可以使用一个d的卡方与 由其他人提供的标准法线,然后近似该标准 正常。有不同的方法可以做到这一点:我去挖了 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]])
我测试过,但是结果不好。。。但是我确定在链接的讨论中,表达式是正确的(这是我的“翻译”错误)。 错误在哪里?
答案 0 :(得分:0)
我不确定为什么前两个公式没有成功;我没有检查它们。
第三个公式证明有效,但是您不小心从讨论中复制了错误的公式。在那篇文章中,他们提到了正态分布的公式,但是提到了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附近。看起来还不错...