【问题标题】:Matlab: Chi-squared fit (chi2gof) to test if data is exponentially distributedMatlab:卡方拟合(chi2gof)来测试数据是否呈指数分布
【发布时间】:2015-01-31 07:29:07
【问题描述】:

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

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个元素。应该没问题...谢谢!

标签: matlab statistics goodness-of-fit exponential-distribution


【解决方案1】:

在 36 个值时,您的样本集非常小。来自维基百科关于chi-squared test的文章的第二句(强调添加):

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

在这种情况下,大通常意味着至少 100 个左右。阅读更多信息assumptions of this test here


替代方案

您可以在 Matlab 中尝试kstest,它基于Kolmogorov-Smirnov test

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

或者试试lillietest,它基于Lilliefors test,并且有一个专门针对指数分布数据的选项:

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

如果您可以增加样本量,那么您在 chi2gof 上做错了一件事。来自help'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)

【讨论】:

  • 很棒的解释。非常感谢。您能否建议其他文献来支持 Chi2 的大样本约为 100?
  • 此外,如果 lilliefors 接受原假设,而 KS 拒绝它怎么办?这似乎发生在我身上,除非我在命令中犯了错误。
  • 这是卡方检验的一个众所周知的属性,可以在任何好的文本中找到。 100 是经验法则。关键是您需要很多它们才能使测试正常工作,并且在测试将它们分成的每个箱/单元中都需要一些。我已经用其他资源更新了我的答案。请记住,StackOverflow 是面向编程的;不是数学/统计本身。如果您对在哪种情况下使用哪种测试有疑问,它可能更适合Cross ValidatedMath.StackExchange
  • 感谢您的帮助!
猜你喜欢
  • 2010-12-25
  • 2012-05-17
  • 2018-07-25
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多