R 和 SAS 产生相同的检验统计量,但正态性检验的 p 值不同

机器算法验证 r 拟合优度 sas kolmogorov-smirnov 测试 安德森宠儿测试
2022-03-31 03:14:54

我使用 Kolmogorov-Smirnov、Cramer-von Mises 和 Anderson-Darling 检验来检查 OLS 回归残差的正态性。令我感到困惑的是,尽管 R 和 SAS 为所有测试提供了相同的测试统计量,但产生的 p 值却截然不同。以下是我的结果摘要

Test              | Test-Statistic | p-value in R | p-value in SAS
Kolmogorov-Smirnov| 0.12607        | 0.3506       | 0.038
Cramer-von Mises  | 0.14958        | 0.3919       | 0.023
Anderson-Darling  | 0.80307        | 0.4782       | 0.037

我用来生成结果的 R 命令是

ks.test(model$residuals, 'pnorm',mean(model$residuals), sd(model$residuals))
library(goftest)
ad.test(model$residuals, 'pnorm',mean(model$residuals), sd(model$residuals))
cvm.test(model$residuals, 'pnorm',mean(model$residuals), sd(model$residuals))

SAS 中的以下代码是生成结果的宏的一部分

data _ar_norm2_(drop=testlab);
    set _ar_normality_(where=(testlab='D') keep=testlab pvalue;
run;

data _ar_norm3_(drop=testlab);
    set _ar_normality_(where=(testlab='W-Sq') keep=testlab pvalue;
run;

data _ar_norm4_(drop=testlab);
    set _ar_normality_(where=(testlab='A-Sq') keep=testlab pvalue;
run;

这种差异的根本原因是什么?


编辑

非常感谢 Glen_b!你的答案是正确的。

library(nortest)
lillie.test(model$residuals)
ad.test(model$residuals)
cvm.test(model$residuals)

p 值 = 0.0382
p 值 = 0.03513
p 值 = 0.02311

1个回答

实际的 Kolmogorov-Smirnov、Anderson-Darling 和 Cramer-von Mises 检验适用于完全指定的分布。您正在估计代码中残差的均值和方差,因此您没有完全指定的分布,这将使您的 p 值大于应有的值。

还有另一个基于估计参数并使用 Kolmogorov-Smirnov 类型统计量的测试——恰当地称为 Lilliefors 测试;它不再是免费分发的,您需要根据您开始使用的分布和您估计的参数来为测试统计量使用不同的分布。Lilliefors 做了正常和指数案例。具有两个参数估计情况的法线可以在 Rlillie.test中使用nortest包中完成。

对于其他两个测试,相同的注释适用(尽管近似调整更简单一些);您使用的版本goftest再次用于完全指定的发行版。

在我之前提到的同一个包中nortest如果您查看有关这些函数的帮助,它们会指定它们用于normality 的复合假设,这就是您在此处寻求的。

这不一定会使 SAS 和 R 的 p 值相同(例如,它们可能不使用相同的近似值),但如果您使用相应的测试,它们应该更接近。

在您的情况下还有一个问题 - 您似乎正在测试残差(可能在 AR 中,但对于目前而言这并不重要)。即使是 in 中的版本nortest 也没有考虑残差之间的依赖关系它们用于来自具有未指定均值和方差的正态分布的独立、相同分布的值。如果您有正态错误,则您没有残差的独立性,并且您通常没有完全相同的分布。

因此,即使您考虑了估计问题,测试仍然不会完全正确。我不知道 SAS 在做什么,但我的猜测是它可能也没有解决这个非 iid 问题。


作为一般规则,如果您想测试正态性,我不会使用多个测试,(选择一个最能识别您最想拾取的与正态性的偏差类型的测试)事实上,我不会使用这些测试(尽管Anderson Darling 通常是一个相当不错的选择)——我会使用 Shapiro Wilk 或与之相关的测试之一。

另一方面,如果我试图评估某个模型的正态假设的适用性,我根本不会使用正式的假设检验。问题不是“错误真的正常吗?” (在模拟数据之外,它们实际上是否正常?我严重怀疑),它是“它有多大的不同?”。这是一个影响大小的问题,而不是一个假设检验问题。