g01af performs the analysis of a twoway $r\times c$ contingency table or classification. If $r=c=2$, and the total number of objects classified is $40$ or fewer, then the probabilities for Fisher's exact test are computed. Otherwise, a test statistic is computed (with Yates' correction when $r=c=2$), which under the assumption of no association between the classifications has approximately a chisquare distribution with $\left(r1\right)\times \left(c1\right)$ degrees of freedom.
Syntax
C# 

public static void g01af( int m, int n, int[,] nobs, ref int num, double[,] pred, out double chis, double[] p, out int npos, out int ndf, out int m1, out int n1, out int ifail ) 
Visual Basic 

Public Shared Sub g01af ( _ m As Integer, _ n As Integer, _ nobs As Integer(,), _ ByRef num As Integer, _ pred As Double(,), _ <OutAttribute> ByRef chis As Double, _ p As Double(), _ <OutAttribute> ByRef npos As Integer, _ <OutAttribute> ByRef ndf As Integer, _ <OutAttribute> ByRef m1 As Integer, _ <OutAttribute> ByRef n1 As Integer, _ <OutAttribute> ByRef ifail As Integer _ ) 
Visual C++ 

public: static void g01af( int m, int n, array<int,2>^ nobs, int% num, array<double,2>^ pred, [OutAttribute] double% chis, array<double>^ p, [OutAttribute] int% npos, [OutAttribute] int% ndf, [OutAttribute] int% m1, [OutAttribute] int% n1, [OutAttribute] int% ifail ) 
F# 

static member g01af : m : int * n : int * nobs : int[,] * num : int byref * pred : float[,] * chis : float byref * p : float[] * npos : int byref * ndf : int byref * m1 : int byref * n1 : int byref * ifail : int byref > unit 
Parameters
 m
 Type: System..::..Int32On entry: $m+1$, one more than the number of rows of the frequency matrix.Constraint: ${\mathbf{m}}>2$.
 n
 Type: System..::..Int32On entry: $n+1$, one more than the number of columns of the frequency matrix.Constraint: ${\mathbf{n}}>2$.
 nobs
 Type: array<System..::..Int32,2>[,](,)[,][,]An array of size [dim1, n]Note: dim1 must satisfy the constraint: $\mathrm{dim1}\ge {\mathbf{m}}$On entry: the elements ${\mathbf{nobs}}[\mathit{i}1,\mathit{j}1]$, for $\mathit{i}=1,2,\dots ,m$ and $\mathit{j}=1,2,\dots ,n$, must contain the frequencies for the twoway classification. The $\left(m+1\right)$th row and the $\left(n+1\right)$th column of nobs need not be set.On exit: contains the following information:
 ${\mathbf{nobs}}[\mathit{i}1,\mathit{j}1]$, for $\mathit{i}=1,2,\dots ,{m}_{1}$ and $\mathit{j}=1,2,\dots ,{n}_{1}$, contain the frequencies for the twoway classification after ‘shrinkage’ has taken place (see [Description]).
 ${\mathbf{nobs}}[\mathit{i}1,n]$, for $\mathit{i}=1,2,\dots ,{m}_{1}$, contain the total frequencies in the remaining rows, ${R}_{i}$.
 ${\mathbf{nobs}}[m,\mathit{j}1]$, for $\mathit{j}=1,2,\dots ,{n}_{1}$, contain the total frequencies in the remaining columns, ${C}_{j}$.
 ${\mathbf{nobs}}[m,n]$, contains the total frequency, $\mathrm{T}$.
If any ‘shrinkage’ has occurred, then all other cells contain no useful information.Constraint: ${\mathbf{nobs}}[\mathit{i}1,\mathit{j}1]\ge 0$, for $\mathit{i}=1,2,\dots ,{\mathbf{m}}1$ and $\mathit{j}=1,2,\dots ,{\mathbf{n}}1$.
 num
 Type: System..::..Int32%On entry: the value assigned to num must determine whether automatic ‘shrinkage’ is required when any ${r}_{ij}<1$, as outlined in [Description](i).If ${\mathbf{num}}=1$, shrinkage is required, otherwise shrinkage is not required.
 pred
 Type: array<System..::..Double,2>[,](,)[,][,]An array of size [dim1, n]Note: dim1 must satisfy the constraint: $\mathrm{dim1}\ge {\mathbf{m}}$On exit: the elements ${\mathbf{pred}}[i1,j1]$, where $i=1,2,\dots ,{\mathbf{m1}}$ and $j=1,2,\dots ,{\mathbf{n1}}$ contain the expected frequencies, ${r}_{ij}$ corresponding to the observed frequencies ${\mathbf{nobs}}[i1,j1]$, except in the case when Fisher's exact test for a $2\times 2$ classification is to be used, when pred is not used. No other elements are utilized.
 chis
 Type: System..::..Double%On exit: the value of the test statistic, ${\chi}^{2}$, except when Fisher's exact test for a $2\times 2$ classification is used in which case it is unspecified.
 p
 Type: array<System..::..Double>[]()[][]An array of size [$21$]p is used only when Fisher's exact test for a $2\times 2$ classification is to be used.On exit: the first num elements contain the probabilities associated with the various possible frequency tables, ${P}_{\mathit{r}}$, for $\mathit{r}=0,1,\dots ,{R}_{1}$, the remainder are unspecified.
 npos
 Type: System..::..Int32%npos is used only when Fisher's exact test for a $2\times 2$ classification is to be used.On exit: ${\mathbf{p}}\left[{\mathbf{npos}}1\right]$ holds the probability associated with the given table of frequencies.
 ndf
 Type: System..::..Int32%On exit: the value of ndf gives the number of degrees of freedom for the chisquare distribution, $\left({m}_{1}1\right)\times \left({n}_{1}1\right)$; when Fisher's exact test is used ${\mathbf{ndf}}=1$.
 m1
 Type: System..::..Int32%On exit: the number of rows of the twoway classification, after any ‘shrinkage’, ${m}_{1}$.
 n1
 Type: System..::..Int32%On exit: the number of columns of the twoway classification, after any ‘shrinkage’, ${n}_{1}$.
 ifail
 Type: System..::..Int32%On exit: ${\mathbf{ifail}}={0}$ unless the method detects an error or a warning has been flagged (see [Error Indicators and Warnings]).
Description
The data consist of the frequencies for the twoway classification, denoted by ${n}_{\mathit{i}\mathit{j}}$, for $\mathit{i}=1,2,\dots ,m$ and $\mathit{j}=1,2,\dots ,n$ with $m,n>1$.
A check is made to see whether any row or column of the matrix of frequencies consists entirely of zeros, and if so, the matrix of frequencies is reduced by omitting that row or column. Suppose the final size of the matrix is ${m}_{1}$ by ${n}_{1}$ (${m}_{1},{n}_{1}>1$), and let
 ${R}_{\mathit{i}}={\displaystyle \sum _{j=1}^{{n}_{1}}}{n}_{\mathit{i}j}$, the total frequency for the $\mathit{i}$th row, for $\mathit{i}=1,2,\dots ,{m}_{1}$,
 ${C}_{\mathit{j}}={\displaystyle \sum _{i=1}^{{m}_{1}}}{n}_{i\mathit{j}}$, the total frequency for the $\mathit{j}$th column, for $\mathit{j}=1,2,\dots ,{n}_{1}$, and
 $T={\displaystyle \sum _{i=1}^{{m}_{1}}}{R}_{i}={\displaystyle \sum _{j=1}^{{n}_{1}}}{C}_{j}$, the total frequency.
There are two situations:
(i)  If ${m}_{1}>2$ and/or ${n}_{1}>2$, or ${m}_{1}={n}_{1}=2$ and $T>40$, then the matrix of expected frequencies, denoted by ${r}_{ij}$, for $i=1,2,\dots ,{m}_{1}$ and $j=1,2,\dots ,{n}_{1}$, and the test statistic, ${\chi}^{2}$, are computed, where
Under the assumption that there is no association between the two classifications, ${\chi}^{2}$ will have approximately a chisquare distribution with $\left({m}_{1}1\right)\times \left({n}_{1}1\right)$ degrees of freedom.
An option exists which allows for further ‘shrinkage’ of the matrix of frequencies in the case where ${r}_{ij}<1$ for the ($i,j$)th cell. If this is the case, then row $i$ or column $j$ will be combined with the adjacent row or column with smaller total. Row $i$ is selected for combination if ${R}_{i}\times {m}_{1}\le {C}_{j}\times {n}_{1}$. This ‘shrinking’ process is continued until ${r}_{ij}\ge 1$ for all cells ($i,j$). 

(ii)  If ${m}_{1}={n}_{1}=2$ and $T\le 40$, the probabilities to enable Fisher's exact test to be made are computed.
The matrix of frequencies may be rearranged so that ${R}_{1}$ is the smallest marginal (i.e., column and row) total, and ${C}_{2}\ge {C}_{1}$. Under the assumption of no association between the classifications, the probability of obtaining $r$ entries in cell $\left(1,1\right)$ is computed where

References
None.
Error Indicators and Warnings
Errors or warnings detected by the method:
Some error messages may refer to parameters that are dropped from this interface
(LDNOB, LDPRED) In these
cases, an error in another parameter has usually caused an incorrect value to be inferred.
 ${\mathbf{ifail}}=1$
 The number of rows or columns of nobs is less than $2$, possibly after shrinkage.
 ${\mathbf{ifail}}=2$
 At least one frequency is negative, or all frequencies are zero.
 ${\mathbf{ifail}}=9000$
 An error occured, see message report.
 ${\mathbf{ifail}}=6000$
 Invalid Parameters $\u2329\mathit{\text{value}}\u232a$
 ${\mathbf{ifail}}=4000$
 Invalid dimension for array $\u2329\mathit{\text{value}}\u232a$
 ${\mathbf{ifail}}=8000$
 Negative dimension for array $\u2329\mathit{\text{value}}\u232a$
 ${\mathbf{ifail}}=6000$
 Invalid Parameters $\u2329\mathit{\text{value}}\u232a$
Accuracy
The method used is believed to be stable.
Parallelism and Performance
None.
Further Comments
The time taken by g01af will increase with m and n, except when Fisher's exact test is to be used, in which case it increases with size of the marginal and total frequencies.
If, on exit, ${\mathbf{num}}>0$, or alternatively ndf is $1$ and ${\mathbf{nobs}}[{\mathbf{m}}1,{\mathbf{n}}1]\le 40$, the probabilities for use in Fisher's exact test for a $2\times 2$ classification will be calculated, and not the test statistic with approximately a chisquare distribution.
Example
In the example program, NPROB determines the number of twoway classifications to be analysed. For each classification the frequencies are read, g01af called, and information given on how much ‘shrinkage’ has taken place. If Fisher's exact test is to be used, the given frequencies and the array of probabilities associated with the possible frequency tables are printed. Otherwise, if the chisquare test is to be used, the given and expected frequencies, and the test statistic with its degrees of freedom are printed. In the example, there is one $2\times 3$ classification, with shrinkage not requested.
Example program (C#): g01afe.cs