测试数据是否遵循 T 分布

机器算法验证 假设检验 分布 数据转换 kolmogorov-smirnov 测试
2022-03-01 12:15:39

我参与了一个项目,我需要检查我的数据对于给定的 N 值是否遵循具有 N 个自由度的 T 分布。

我知道可以使用 Kolmogorov-Smirnoff,但是有没有专门为测试 T 分布而专门定制的测试。如果没有专门针对 T 的任何测试,那么任何适用于对称/单峰分布的测试都会有所帮助。

提前致谢。

2个回答

这是在分布上运行 KS-test 的方法。t

  1. 假设您有一个您怀疑来自分布的样本,并且其大小 =tn
  2. 从样本中估计 t 分布参数。
  3. 从估计的分布中生成个样本。Mn
  4. 对于每个样本,使用估计的分布作为理论获得 KS 统计量
  5. 从获得的统计数据构建经验非参数分布,例如使用核密度估计器
  6. 获取原始样本和估计分布的 KS 统计量
  7. 使用统计的经验分布获得p
  8. 根据置信水平做出决定

在您的情况下 df 是给定的,因此您可以使用给定的分布,而不是像我在 MATLAB 中的示例中那样估计它('nu' 变量是 df)。tN

% True T-distribution
true_pd = makedist('tlocationscale','mu',0,'sigma',1,'nu',2);

% plot true distribution
x=0:0.01:1;
plot(icdf(true_pd,x),x);
hold on;
plot(norminv(x),x);
legend({'t' 'normal'},'Location','Best')
title 'CDF'

在此处输入图像描述

rng(0)
% obtain a sample
n=100;
sample = random(true_pd,n,1);

subplot(2,1,1)
histfit(sample,20,'normal');
title 'Sample from t(2,1,0) fit with Nromal'
subplot(2,1,2)
qqplot(sample);

在此处输入图像描述

% estimate H_0: T-distribution from this sample
disp 'H_0:'
null_pd = fitdist(sample,'tlocationscale')
[~,~,ksstat] = kstest(sample,'CDF',null_pd);

% get KS-test critical values by parametric bootstrapping from estimated
m=999;
r=random(null_pd,n,m);

stats = zeros(m,1); % store test statistics
est_pd = makedist('tlocationscale');
opts = statset(statset('tlsfit'),'MaxIter',1000);
opts = statset(opts,'MaxFun',2000);

for i=1:m
    bsample = r(:,i);
    [~,~,stats(i)] = kstest(bsample,'CDF',est_pd.fit(bsample,'options',opts));
end

p = (sum(stats>ksstat)+1) / (m+1);
mcErr = sqrt(p*(1-p)/m);
fprintf('KS stat: %f, p-value: %f, Monte Carlo error: %f\n',ksstat, p , mcErr);

% get the empirical distribution of KS test statistics
epd = ProbDistUnivKernel(stats);

% popular critical values
disp 'Crit. values for \alpha= 0.1, 0.05 and 0.01'
icdf(epd,[ 0.9 0.95 0.99])

figure
plot(icdf(epd,x),x)
grid on
title 'KS-test statistics simulated distribution'

在此处输入图像描述

输出:

H_0:

null_pd = 

  tLocationScaleDistribution

  t Location-Scale distribution
       mu = 0.161093   [-0.117585, 0.439771]
    sigma =  1.06958   [0.799248, 1.43136]
       nu =  1.58744   [1.02505, 2.45837]

KS stat: 0.041646, p-value: 0.865000, Monte Carlo error: 0.010812
Crit. values for \alpha= 0.1, 0.05 and 0.01

ans =

    0.0720    0.0791    0.0931

在这种情况下,基于值,我们不能拒绝样本来自 t 分布。p

您可以在此处将临界值与标准临界值进行比较您可以用标准正态分布替换我定义和估计t

如果你不喜欢我的方法,你可以关注这篇论文,它详细描述了自举:Jogesh Babu, G. 和 CR Rao。“估计参数时的拟合优度检验。” Sankhya:印度统计杂志 66(2004 年):63-74。

如果您想了解@Glen_b 在说必须知道分布而不是估计分布时所说的内容,请参阅NIST 手册中的第3 项。

如果您的样本是正态的并且您必须估计 df,这不是一个非常强大的测试。在小样本量中很难区分正态分布和分布,因为当 df N分布会收敛到正态分布。在您的情况下,给出了 N,因此测试应该可以正常工作。tt

除非您在查看数据之前预先指定了均值和方差,否则直接 Kolmogorov-Smirnov 检验不适合 - 事实上,一旦您估计参数,它就不再是无分布的。

您的 p 值将是完全错误的 - 您的实际显着性水平将远低于您的名义比率,并且功率将相应地低。

如果要进行类似 Kolmogorov-Smirnov 的检验,则需要 Lilliefors 检验的 t 分布版本(本质上是具有拟合参数的 KS 检验)。

根据观察值之间的平方相关性和分布的近似预期阶数统计数据,使用 Shapiro-Francia 类型检验的改编版本可能会做得更好。这将直接对应于合适的 QQ 图中的相关性。tN

对于上述任一测试,都可以模拟零下的分布。

如果样本量不小,另一种选择是 Anderson-Darling 检验。它与 KS 有同样的问题,但随着样本量的增加,影响似乎下降得相对较快。请参阅 D'Agostino 和 Stephens “拟合优度技术”中的讨论

[如果您有一个特定的替代方案,(其中可能是一种特殊情况,例如使用不同的 df 对 at 进行测试),您可能能够进行似然比统计。]tN

也有单峰性和对称性的测试。