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)); }