c_reg.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include <math.h>
  2. #include <grass/gis.h>
  3. #include <grass/raster.h>
  4. enum {
  5. REGRESSION_SLOPE = 0,
  6. REGRESSION_OFFSET = 1,
  7. REGRESSION_COEFF_DET = 2,
  8. REGRESSION_T = 3,
  9. REGRESSION_P = 4
  10. };
  11. static void regression(DCELL * result, DCELL * values, int n, int which)
  12. {
  13. DCELL xsum, ysum;
  14. DCELL xbar, ybar;
  15. DCELL numer, denom, denom2;
  16. DCELL Rsq;
  17. int count;
  18. int i;
  19. xsum = ysum = 0.0;
  20. count = 0;
  21. for (i = 0; i < n; i++) {
  22. if (Rast_is_d_null_value(&values[i]))
  23. continue;
  24. xsum += i;
  25. ysum += values[i];
  26. count++;
  27. }
  28. if (count < 2) {
  29. Rast_set_d_null_value(result, 1);
  30. return;
  31. }
  32. xbar = xsum / count;
  33. ybar = ysum / count;
  34. numer = 0.0;
  35. for (i = 0; i < n; i++)
  36. if (!Rast_is_d_null_value(&values[i]))
  37. numer += i * values[i];
  38. numer -= count * xbar * ybar;
  39. denom = 0.0;
  40. for (i = 0; i < n; i++)
  41. if (!Rast_is_d_null_value(&values[i]))
  42. denom += (DCELL) i * i;
  43. denom -= count * xbar * xbar;
  44. if (which >= REGRESSION_COEFF_DET) {
  45. denom2 = 0.0;
  46. for (i = 0; i < n; i++)
  47. if (!Rast_is_d_null_value(&values[i]))
  48. denom2 += values[i] * values[i];
  49. denom2 -= count * ybar * ybar;
  50. Rsq = (numer * numer) / (denom * denom2);
  51. }
  52. switch (which) {
  53. case REGRESSION_SLOPE:
  54. *result = numer / denom;
  55. break;
  56. case REGRESSION_OFFSET:
  57. *result = ybar - xbar * numer / denom;
  58. break;
  59. case REGRESSION_COEFF_DET:
  60. *result = Rsq;
  61. break;
  62. case REGRESSION_T:
  63. *result = sqrt(Rsq * (count - 2) / (1 - Rsq));
  64. break;
  65. default:
  66. Rast_set_d_null_value(result, 1);
  67. break;
  68. }
  69. /* Check for NaN */
  70. if (*result != *result)
  71. Rast_set_d_null_value(result, 1);
  72. }
  73. void c_reg_m(DCELL * result, DCELL * values, int n, const void *closure)
  74. {
  75. regression(result, values, n, REGRESSION_SLOPE);
  76. }
  77. void c_reg_c(DCELL * result, DCELL * values, int n, const void *closure)
  78. {
  79. regression(result, values, n, REGRESSION_OFFSET);
  80. }
  81. void c_reg_r2(DCELL * result, DCELL * values, int n, const void *closure)
  82. {
  83. regression(result, values, n, REGRESSION_COEFF_DET);
  84. }
  85. void c_reg_t(DCELL * result, DCELL * values, int n, const void *closure)
  86. {
  87. regression(result, values, n, REGRESSION_T);
  88. }
  89. static void regression_w(DCELL * result, DCELL(*values)[2], int n, int which)
  90. {
  91. DCELL xsum, ysum;
  92. DCELL xbar, ybar;
  93. DCELL numer, denom, denom2;
  94. DCELL Rsq;
  95. int count;
  96. int i;
  97. xsum = ysum = 0.0;
  98. count = 0;
  99. for (i = 0; i < n; i++) {
  100. if (Rast_is_d_null_value(&values[i][0]))
  101. continue;
  102. xsum += i * values[i][1];
  103. ysum += values[i][0] * values[i][1];
  104. count += values[i][1];
  105. }
  106. if (count < 2) {
  107. Rast_set_d_null_value(result, 1);
  108. return;
  109. }
  110. xbar = xsum / count;
  111. ybar = ysum / count;
  112. numer = 0.0;
  113. for (i = 0; i < n; i++)
  114. if (!Rast_is_d_null_value(&values[i][0]))
  115. numer += i * values[i][0] * values[i][1];
  116. numer -= count * xbar * ybar;
  117. denom = 0.0;
  118. for (i = 0; i < n; i++)
  119. if (!Rast_is_d_null_value(&values[i][0]))
  120. denom += (DCELL) i *i * values[i][1];
  121. denom -= count * xbar * xbar;
  122. if (which == REGRESSION_COEFF_DET) {
  123. denom2 = 0.0;
  124. for (i = 0; i < n; i++)
  125. if (!Rast_is_d_null_value(&values[i][0]))
  126. denom2 += values[i][0] * values[i][0] * values[i][1];
  127. denom2 -= count * ybar * ybar;
  128. Rsq = (numer * numer) / (denom * denom2);
  129. }
  130. switch (which) {
  131. case REGRESSION_SLOPE:
  132. *result = numer / denom;
  133. break;
  134. case REGRESSION_OFFSET:
  135. *result = ybar - xbar * numer / denom;
  136. break;
  137. case REGRESSION_COEFF_DET:
  138. *result = Rsq;
  139. break;
  140. case REGRESSION_T:
  141. *result = sqrt(Rsq * (count - 2) / (1 - Rsq));
  142. break;
  143. default:
  144. Rast_set_d_null_value(result, 1);
  145. break;
  146. }
  147. /* Check for NaN */
  148. if (*result != *result)
  149. Rast_set_d_null_value(result, 1);
  150. }
  151. void w_reg_m(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  152. {
  153. regression_w(result, values, n, REGRESSION_SLOPE);
  154. }
  155. void w_reg_c(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  156. {
  157. regression_w(result, values, n, REGRESSION_OFFSET);
  158. }
  159. void w_reg_r2(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  160. {
  161. regression_w(result, values, n, REGRESSION_COEFF_DET);
  162. }
  163. void w_reg_t(DCELL * result, DCELL(*values)[2], int n, const void *closure)
  164. {
  165. regression_w(result, values, n, REGRESSION_T);
  166. }