You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2022/11/24 17:57:10 UTC

[commons-statistics] branch master updated: Added additional log density tests for Nakagami distribution

This is an automated email from the ASF dual-hosted git repository.

aherbert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-statistics.git


The following commit(s) were added to refs/heads/master by this push:
     new 19d6f8a  Added additional log density tests for Nakagami distribution
19d6f8a is described below

commit 19d6f8a97d6d8e06e3de158d6a3a2f0e1c77c25c
Author: aherbert <ah...@apache.org>
AuthorDate: Thu Nov 24 17:56:03 2022 +0000

    Added additional log density tests for Nakagami distribution
---
 .../distribution/NakagamiDistributionTest.java     | 56 ++++++++++++++++++----
 .../distribution/test.nakagami.1.properties        |  6 +--
 .../distribution/test.nakagami.2.properties        |  6 +--
 .../distribution/test.nakagami.3.properties        |  6 +--
 4 files changed, 56 insertions(+), 18 deletions(-)

diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/NakagamiDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/NakagamiDistributionTest.java
index 7cb1978..41f1101 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/NakagamiDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/NakagamiDistributionTest.java
@@ -16,10 +16,11 @@
  */
 package org.apache.commons.statistics.distribution;
 
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
+import java.util.stream.Stream;
 import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.CsvSource;
+import org.junit.jupiter.params.provider.MethodSource;
 
 /**
  * Test cases for {@link NakagamiDistribution}.
@@ -124,12 +125,49 @@ class NakagamiDistributionTest extends BaseContinuousDistributionTest {
         testMoments(dist, mean, variance, tolerance);
     }
 
-    @Test
-    void testExtremeLogDensity() {
-        // XXX: Verify with more test data from a reference distribution
-        final NakagamiDistribution dist = NakagamiDistribution.of(0.5, 1);
-        final double x = 50;
-        Assertions.assertEquals(0.0, dist.density(x));
-        Assertions.assertEquals(-1250.22579, dist.logDensity(x), 1e-4);
+    /**
+     * Test log density where the density is zero.
+     */
+    @ParameterizedTest
+    @MethodSource
+    void testAdditionalLogDensity(double mu, double omega, double[] x, double[] expected) {
+        final NakagamiDistribution dist = NakagamiDistribution.of(mu, omega);
+        testLogDensity(dist, x, expected, DoubleTolerances.relative(1e-15));
+    }
+
+    static Stream<Arguments> testAdditionalLogDensity() {
+        final double[] x = {50, 55, 60, 80, 120};
+        return Stream.of(
+            // scipy.stats 1.9.3  (no support for omega):
+            // nakagami.logpdf(x, 0.5)
+            Arguments.of(0.5, 1, x,
+                new double[]{-1250.2257913526448, -1512.7257913526448, -1800.2257913526448,
+                    -3200.2257913526446, -7200.225791352645}),
+            // nakagami.logpdf(x, 1.5)   (no support for omega)
+            Arguments.of(1.5, 1, x,
+                new double[]{-3740.7538269087863, -4528.063206549177, -5390.389183795199,
+                    -9589.813819650295, -21589.00288943408}),
+            // R nakagami 1.1.0 package:
+            // print(dnaka(x, 0.5, 2, log=TRUE), digits=17)
+            Arguments.of(0.5, 2, x,
+                new double[]{-625.57236494292476, -756.82236494292465, -900.57236494292465,
+                    -1600.57236494292442, -3600.57236494292420}),
+            // print(dnaka(x, 0.5, 0.75, log=TRUE), digits=17)
+            Arguments.of(0.5, 0.75, x,
+                new double[]{-1666.7486169830854, -2016.7486169830854, -2400.0819503164184,
+                    -4266.7486169830854, -9600.0819503164203}),
+            // print(dnaka(x, 1.5, 0.75, log=TRUE), digits=17)
+            Arguments.of(1.5, 0.75, x,
+                new double[]{-4990.3223038001088, -6040.1316834404988, -7189.9576606865212,
+                    -12789.3822965416184, -28788.5713663254028}),
+            // print(dnaka(x, 1.5, 1.75, log=TRUE), digits=17)
+            Arguments.of(1.5, 1.75, x,
+                new double[]{-2134.4503934478316, -2584.2597730882230, -3076.9428931913867,
+                    -5476.3675290464835, -12332.6994559731247}),
+            // print(dnaka(x, 1.5, 7.75, log=TRUE), digits=17)
+            Arguments.of(1.5, 7.75, x,
+                new double[]{-477.69633391576963, -579.11861678196749, -690.23491660863317,
+                    -1231.59503633469740, -2779.17120289267450})
+        );
     }
 }
diff --git a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.1.properties b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.1.properties
index d86c34c..16d2178 100644
--- a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.1.properties
+++ b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.1.properties
@@ -28,9 +28,9 @@ cdf.values = \
   6.82689492137085852e-01, 7.69860659556583560e-01,\
   8.38486681532458089e-01, 8.90401416600884343e-01,\
   9.28139361774148575e-01, 9.54499736103641472e-01
-# pdf adjusted to return 0 for x=0.
-# scioy and matlab compute a value.
-# WolframAlpha returns zero.
+# pdf adjusted to return 0 for x=0 (value is undefined at x=0).
+# scipy and matlab compute a value.
+# WolframAlpha returns zero. R nakagami NaN.
 pdf.values = \
   0.0,                 0.79788416186068489, 0.78208538795091187,\
   0.73654028060664678, 0.66644920578359934, 0.57938310552296557,\
diff --git a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.2.properties b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.2.properties
index bcb8dd9..9718e7b 100644
--- a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.2.properties
+++ b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.2.properties
@@ -25,9 +25,9 @@ cdf.values = \
   0.0899803073877229  0.189070530913232 0.317729669663787 \
   0.460129965238200 0.599031192110653 0.720732382881390 \
   0.817659600745483 0.888389774905288
-# pdf adjusted to return 0 for x=0.
-# scioy and matlab compute a value.
-# WolframAlpha returns zero.
+# pdf adjusted to return 0 for x=0 (value is undefined at x=0).
+# scipy and matlab compute a value.
+# WolframAlpha returns zero. R nakagami NaN.
 pdf.values = \
   0 1.46580643635352e-06  0.0568994550428125  0.208008745554258 \
   0.402828269545621 0.580491109555755 0.692398452624549 \
diff --git a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.3.properties b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.3.properties
index 3506fbc..ba9d8ab 100644
--- a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.3.properties
+++ b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.3.properties
@@ -26,9 +26,9 @@ cdf.values = \
   0.41599060641445568, 0.53633771818837206, 0.63551561797542433,\
   0.71746556659624028, 0.7845448997061909,  0.83861986211366601,\
   0.88141004735798412, 0.91458032800205946, 0.93973541101651015
-# pdf adjusted to return 0 for x=0.
-# scioy and matlab compute a value.
-# WolframAlpha returns zero.
+# pdf adjusted to return 0 for x=0 (value is undefined at x=0).
+# scipy and matlab compute a value.
+# WolframAlpha returns zero. R nakagami NaN.
 pdf.values = \
   0.0,                 5.17638635039373352, 0.8734262427029803,\
   0.66605658341650675, 0.54432849968092045, 0.45048535438453824,\