我想在Matlab中为小值(例如1e-18)评估逆学生t-分布函数.自由度是2.
不幸的是,Matlab回归NaN:
tinv(1e-18,2)
NaN
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用R的内置函数:
qt(1e-18,2)
-707106781
Run Code Online (Sandbox Code Playgroud)
结果是明智的.为什么Matlab不能评估这个小值的函数?Matlab和R的结果与1e-15非常相似,但对于较小的值,差异相当大:
tinv(1e-16,2)/qt(1e-16,2) = 1.05
Run Code Online (Sandbox Code Playgroud)
有谁知道Matlab和R的实现算法有什么不同,如果R给出正确的结果,我怎么能在Matlab中有效地计算较小值的逆t-分布?
我是否遗漏了一些明显的东西,或者Matlab kstest2给出了非常差的p值?在非常贫困的情况下,我是说我怀疑它甚至被错误地实施。
kstest2状态的帮助页面,该函数计算渐近p值,尽管我没有找到有关确切使用哪种方法的任何参考。无论如何,该描述进一步指出:
对于大样本量,渐近p值变得非常精确,并且对于样本量n1和n2被认为是合理准确的,因此(n1 * n2)/(n1 + n2)?4
例子1
让我们以雷曼兄弟(Lehman and D'Abrera)(1975)的例子6为例:
sampleA = [6.8, 3.1, 5.8, 4.5, 3.3, 4.7, 4.2, 4.9];
sampleB = [4.4, 2.5, 2.8, 2.1, 6.6, 0.0, 4.8, 2.3];
[h,p,ks2stat] = kstest2(sampleA, sampleB, 'Tail', 'unequal');
Run Code Online (Sandbox Code Playgroud)
(n1*n2)/(n1 + n2) = 4在这种情况下,p值应合理准确。
Matlab p = 0.0497给出了结果,而书中给出的解决方案是0.0870。为了验证该解决方案,我使用了R,我比Matlab更信任R,尤其是在统计方面。
使用ks.testfrom stats软件包和ks.bootfrom Matching软件包:
ks.test(sampleA, sampleB, alternative = "two.sided")
ks.boot(sampleA, sampleB, alternative = "two.sided") …Run Code Online (Sandbox Code Playgroud)