[R] goodfit() in vcd package: computation of chi-squared

Achim Zeileis Achim.Zeileis at wu-wien.ac.at
Fri Jul 24 09:37:14 CEST 2009


On Thu, 23 Jul 2009, Boris.Vasiliev at forces.gc.ca wrote:

> I have troubles understanding how goodfit() function in the vcd package
> computes  the Pearson coefficient.

That's because it's conceptually hard to compute. The problem with the 
minimum Chi-squared approach is that for the asymptotics to work you need 
a fixed number of classes (or a number of classes that does not grow to 
fast). For count distributions, you always have an infinite number of 
expected classes so this does not really work. In goodfit() we try to work 
around this by collecting all probability weight in the last expected 
class. But this is only done in computation of the chi-squared statistic, 
not in the summary of fitted/expected for each observed count.

Note that this is still an ad hoc solution. If anyone had a pointer to 
some book/paper that addresses the problem of appropriate cut-offs in the 
goodness-of-fit testing of count distributions, I would be interested.

As we don't know a non-ad-hoc solution at the moment, we've just recently 
put in some more documentation and warnings for the MinChisq method. The 
version should be released soon.

> Can anybody provide more information on the computation?
>
> In particular, for HorseKicks data in vcd package, goodfit() yields
>
>> oo <- goodfit(HorseKicks,type="poisson",method="MinChisq")
>> summary(oo)
>
>         Goodness-of-fit test for poisson distribution
>
>             X^2 df  P(> X^2)
> Pearson 0.594649  3 0.8976563
> Warning message:
> In summary.goodfit(oo) : Chi-squared approximation may be incorrect
>
> However, if I compute the Pearson coefficient by hand, I get a different
> value for chi-squared
>
>> with(oo, sum( (observed-fitted)^2/fitted ))
> [1] 0.694577

The larges observed count is 4 with observed = 1 and fitted = 0.64. But 
for computing the statistic we make the class "4" the class "4+", so that

fitted <- sum(oo$observed) * diff(c(0, ppois(0:3, oo$par$lambda), 1))

which increases the fitted value for the last class to 0.73 (and leaves 
all others unchanged). And then

R> sum((oo$observed - fitted)^2/fitted)
[1] 0.594649

Best,
Z

> I am not sure where I am making a mistake.  Any suggestions?
>
> Regards,
> Boris.
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
>




More information about the R-help mailing list