我想这是一个简单的问题,但我无法理清它。我有一个向量,其第一个元素看起来像:
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)