File Exchange

image thumbnail

MyFisher

version 2.0.0.0 (16.3 KB) by Giuseppe Cardillo
the definitive function for the Fisher's exact and conditional test for any RxC matrix

5 Downloads

Updated 07 Apr 2018

GitHub view license on GitHub

Fisher's Exact Probability Test for a RxC matrix.
Fisher's exact test permits calculation of precise probabilities in situation where, as a consequence of small cell frequencies, the much more rapid normal approximation and chi-square calculations are liable to be inaccurate. The Fisher's exact test involves the computations of several factorials to obtain the probability of the observed and each of the more extreme tables. Factorials growth quickly, so it's necessary use logarithms of factorials. This computations is very easy in Matlab because: x!=gamma(x+1) and log(x!)=gammaln(x+1). Moreover, when the matrix has many Rows and Columns, the computation of all the set of possible matrices is very time expensive. This function uses this strategy:
if the input is a 2x2, 2x3, 2x4 or 3x3 matrix it uses (or download) ad hoc, previously written by me, function;

else it uses a Monte Carlo approach. Finally, this function uses the Peter J. Acklam rldecode function, and so I want to acknowledge him.

Created by Giuseppe Cardillo
giuseppe.cardillo-edta@poste.it

To cite this file, this would be an appropriate format: Cardillo G. (2010) MyFisher: the definitive function for the Fisher's exact and conditional test for any RxC matrix http://www.mathworks.com/matlabcentral/fileexchange/26883

Comments and Ratings (5)

I guess if-else sentences l.53-l.63 need modification to consider 2xN (N>=5) properly.

Alexander

On the matrix
x=[6 4 0; 0 1 1; 11 1 3; 1 0 0]
all other programs I've tried (R included) give the answer of p=0.06045. This program was consistently producing values around 0.053, so I went to investigate.
Changing the line
if gpv<=op
to
if gpv<=op+eps
produced p-values more consistent with other programs. This is a classical floating-point computations issue.

p-value=1-chi2cdf(chi2,df)

Considering that chi square is an approximation of Fisher's test, in my opinion it is completely useless to have chi square p-value. Anyway, if you want, you can simply set up it using this code:
C=sum(x,1);
R=sum(x,2);
N=sum(x(:));
[r c]=size(x);
df=(r-1)*(c-1);
Ex=R*C/N;
chi2=sum(sum(((x-Ex-0.5).^2)./Ex));
p-value=1-chi2cdf(chi2,gl)

Ged Ridgway

Seems very useful! Might be worth (if not too much trouble) also returning the p-value from the approximate Chi-square test for comparison, since it seems that neither the Statistics toolbox nor fileexchange have this for general NxM tables.

Updates

2.0.0.0

inputparser; table implementation; github link

1.1.0.0

change in help section for citation

MATLAB Release Compatibility
Created with R2014b
Compatible with any release
Platform Compatibility
Windows macOS Linux