Matlab:卡方拟合(chi2gof),用于测试数据是否呈指数分布



我想这是一个简单的问题,但我无法理清它。我有一个向量,其第一个元素看起来像:

V = [31 52 38 29 29 34 29 24 25 25 32 28 24 28 29 ...];

我想在 Matlab 中执行chi2gof测试,以测试V是否呈指数分布。我做了:

[h,p] = chi2gof(V,'cdf',@expcdf);

但我收到一条警告消息,说:

Warning: After pooling, some bins still have low expected counts.
The chi-square approximation may not be accurate

我是否错误地定义了chi2gof调用?

在 36 个值时,您有一个非常小的样本集。来自维基百科关于卡方检验的文章的第二句话(着重号是加的(:

它适用于来自大样本的未配对数据。

在这种情况下,大通常意味着至少 100 左右。在此处阅读有关此测试的更多假设的信息。


选择

你可以在Matlab中尝试kstest,它基于Kolmogorov-Smirnov测试:

[h,p] = kstest(V,'cdf',[V(:) expcdf(V(:),expfit(V))])

或者尝试lillietest,它基于 Lilliefors 测试,并有一个专门用于指数分布式数据的选项:

[h,p] = lillietest(V,'Distribution','exp')

如果你可以增加样本量,你就做错了一件事 chi2gof .从'cdf'选项的help

完全指定的累积分布函数。 这 可以是概率分布对象,也可以是函数 句柄或函数。名字。 该函数必须采用 X 值作为其唯一参数。或者,您可以提供 第一个元素是函数名称或 句柄,其后面的元素是参数值, 每个单元格一个。该函数必须将 X 值作为其 第一个参数,其他参数作为后面的参数。

您没有提供任何其他参数,因此expcdf使用的是默认平均值参数 mu = 1 。您的数据值非常大,与此均值完全不对应的指数分布。您还需要估计参数。expfit函数基于最大似然期望,您可以尝试如下操作:

[h,p] = chi2gof(V,'cdf',@(x)expcdf(x,expfit(x)),'nparams',1)
但是,只有 36 个样本,您可能无法获得

对此类分布的良好估计,并且即使对于从已知分布中采样的数据,您也可能无法获得预期的结果,例如:

V = exprnd(10,1,36);
[h,p] = chi2gof(V,'cdf',@(x)expcdf(x,expfit(x)),'nparams',1)

最新更新