calc_kappa.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include <stdlib.h>
  2. #include <grass/gis.h>
  3. #include <grass/glocale.h>
  4. #include "kappa.h"
  5. #include "local_proto.h"
  6. void calc_kappa(void)
  7. {
  8. int i, j;
  9. int s, l;
  10. int nl;
  11. size_t ns;
  12. double *pi, *pj, *pii, p0, pC;
  13. double kp, vkp, *kpp;
  14. double obs, inter1, inter2;
  15. long total;
  16. FILE *fd;
  17. /* initialize */
  18. s = 0;
  19. l = -1;
  20. nl = nlayers;
  21. ns = nstats;
  22. obs = 0;
  23. inter1 = inter2 = 0;
  24. p0 = pC = 0;
  25. if (output == NULL)
  26. fd = stdout;
  27. else if ((fd = fopen(output, "a")) == NULL) {
  28. G_fatal_error(_("Cannot open file <%s> to write kappa and relevant parameters"),
  29. output);
  30. return;
  31. }
  32. total = count_sum(&s, l);
  33. /* calculate the parameters of the kappa-calculation */
  34. pi = (double *)G_calloc(ns, sizeof(double));
  35. pj = (double *)G_calloc(ns, sizeof(double));
  36. pii = (double *)G_calloc(ns, sizeof(double));
  37. kpp = (double *)G_calloc(ns, sizeof(double));
  38. for (i = 0; i < ncat; i++) {
  39. for (j = 0; j < ns; j++) {
  40. if (Gstats[j].cats[0] == rlst[i])
  41. pi[i] += Gstats[j].count;
  42. if (Gstats[j].cats[1] == rlst[i])
  43. pj[i] += Gstats[j].count;
  44. if ((Gstats[j].cats[0] == Gstats[j].cats[1]) &&
  45. (Gstats[j].cats[0] == rlst[i]))
  46. pii[i] += Gstats[j].count;
  47. }
  48. obs += pii[i];
  49. }
  50. for (i = 0; i < ncat; i++) {
  51. pi[i] = pi[i] / total;
  52. pj[i] = pj[i] / total;
  53. pii[i] = pii[i] / total;
  54. p0 += pii[i];
  55. pC += pi[i] * pj[i];
  56. }
  57. for (i = 0; i < ncat; i++)
  58. if ((pi[i] == 0) || (pj[i] == 0))
  59. kpp[i] = -999;
  60. else
  61. kpp[i] = (pii[i] - pi[i] * pj[i]) / (pi[i] - pi[i] * pj[i]);
  62. /* print out the commission and ommission accuracy, and conditional kappa */
  63. fprintf(fd, "\nCats\t%% Commission\t%% Ommission\tEstimated Kappa\n");
  64. for (i = 0; i < ncat; i++)
  65. if ((kpp[i] == -999) && (i != 0))
  66. fprintf(fd, "%ld\tNA\t\tNA\t\tNA\n", rlst[i]);
  67. else
  68. fprintf(fd, "%ld\t%f\t%f\t%f\n",
  69. rlst[i], 100 * (1 - pii[i] / pi[i]),
  70. 100 * (1 - pii[i] / pj[i]), kpp[i]);
  71. fprintf(fd, "\n");
  72. for (i = 0; i < ncat; i++) {
  73. inter1 += pii[i] * pow(((1 - pC) - (1 - p0) * (pi[i] + pj[i])), 2.);
  74. }
  75. for (j = 0; j < ns; j++) {
  76. if (Gstats[j].cats[0] != Gstats[j].cats[1])
  77. inter2 += Gstats[j].count *
  78. pow((pi[Gstats[j].cats[0] - 1] + pj[Gstats[j].cats[1] - 1]),
  79. 2.) / total;
  80. }
  81. kp = (p0 - pC) / (1 - pC);
  82. vkp = (inter1 + pow((1 - p0), 2.) * inter2 -
  83. pow((p0 * pC - 2 * pC + p0), 2.)) / pow((1 - pC), 4.) / total;
  84. fprintf(fd, "Kappa\t\tKappa Variance\n");
  85. fprintf(fd, "%f\t%f\n", kp, vkp);
  86. fprintf(fd, "\nObs Correct\tTotal Obs\t%% Observed Correct\n");
  87. fprintf(fd, "%ld\t\t%ld\t\t%f\n", (long)obs, total, (100. * obs / total));
  88. if (output != NULL)
  89. fclose(fd);
  90. G_free(pi);
  91. G_free(pj);
  92. G_free(pii);
  93. G_free(kpp);
  94. /* print labels for categories of maps */
  95. prt_label();
  96. }