2014-12-02 1150 views
3

我想这是一个简单的问题,但我无法整理出来。我有一个载体,其中所述第一元件是这样的: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调用不正确?

+0

只是一个猜测:也许是数据向量太小 – 2014-12-02 22:03:25

+1

对不起忘了,更不用说是一个示例。原来是36个元素。应该没问题...... thx! – 2014-12-02 22:05:44

回答

2

在36个值处,您有一个非常小的样本集。从(强调)维基百科上关于该chi-squared test文章的第二句话:

它适用于从大样本不成对的数据。

在这种情况下通常意味着至少在100左右。阅读更多关于assumptions of this test here


替代

您可以尝试kstest在Matlab,这是基于Kolmogorov-Smirnov test

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

或者尝试lillietest,这是基于Lilliefors test并有一个选项专为指数分布数据:

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

如果你可以增加你的样本量,你正在做一件错误的事情chi2gofhelp'cdf'选项:

完全指定的累积分布函数。此 可以是ProbabilityDistribution对象,函数 句柄或函数。名称。该函数必须以X 值作为唯一参数。或者,您可以提供一个单元阵列,其第一个元素是函数名称或 句柄,其后面元素是参数值,每个单元格有一个参数值,每个单元格为 。该函数必须以X值作为其第一个参数,其他参数作为后面的参数。

您不提供任何附加参数,因此expcdf使用的默认平均参数为mu = 1。您的数据值非常大,并且完全不符合exponential distribution的平均值。您还需要估计参数。您的expfit功能,这是在maximum likelihood expectation痛打,你可以尝试这样的事:

[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) 
+0

神奇的解释。非常感谢。你能否提供一些额外的文献来支持Chi2的大样本大概是100? – 2014-12-03 11:21:21

+0

此外,如果lilliefors接受零假设,KS拒绝呢?这似乎是发生在我身上,除非我在命令中犯了错误。 – 2014-12-03 11:26:08

+0

这是卡方测试的一个众所周知的属性,可以在任何好的文本中找到。 100是一条经验法则。关键是你需要大量的测试才能正常工作,而且你需要在测试中将每个单元/单元分成几块。我已经用更多资源更新了我的答案。请记住,StackOverflow适用于编程;而不是数学/统计学,本身。如果您对在哪种情况下使用哪种测试有疑问,它可能更适合[交叉验证](http://stats.stackexchange.com)或[Math.StackExchange](http://数学。 stackexchange.com)。 – horchler 2014-12-03 17:51:52