private void computeKappaVariance()
        {
            // References: Statistical Methods for Rates and Proportions

            int[,] m = matrix;
            double k = Kappa;

            double[] colMarginal = ColumnTotals.Divide((double)samples);
            double[] rowMarginal = RowTotals.Divide((double)samples);


            double directionSum = 0;

            for (int i = 0; i < classes; i++)
            {
                directionSum += rowMarginal[i] * colMarginal[i];
            }

            double pe = directionSum;


            // Compute A (eq. 18.16)
            double A = 0;

            for (int i = 0; i < classes; i++)
            {
                double u = 1 - (rowMarginal[i] + colMarginal[i]) * (1 - k);
                A += (m[i, i] / (double)samples) * u * u;
            }

            // Compute B (eq. 18.17)
            double sum = 0;

            for (int i = 0; i < rowMarginal.Length; i++)
            {
                for (int j = 0; j < colMarginal.Length; j++)
                {
                    if (i != j)
                    {
                        sum += (m[i, j] / (double)samples) * (colMarginal[i] + rowMarginal[j]);
                    }
                }
            }

            double B = (1 - k) * (1 - k) * sum;

            // Compute C
            double v = k - pe * (1 - k);
            double C = v * v;

            // Compute variance using A, B and C
            kappaVariance = (A + B - C) / ((1 - pe) * (1 - pe) * samples);

            // Compute standard error directly
            kappaStdError = Math.Sqrt(A + B - C) / ((1 - pe) * Math.Sqrt(samples));
        }