From bc5661119b8d927f5d681892826855ad6c0d2549 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 06:32:52 +0000 Subject: [PATCH] test: migrate `stats/padjust` to ULP-based assertions Replace relative tolerance comparisons with ULP difference testing using `@stdlib/assert/is-almost-same-value`. The JS implementation reproduces the R reference fixtures bit-for-bit, so the minimum required ULP bound is `0` for all eight fixture loops. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Dj57ZWsJPp7hjbZT2Lv2Lr --- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: skipped - task: lint_markdown_pkg_readmes status: na - task: lint_markdown_docs status: na - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: na - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: na - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: passed - task: lint_typescript_tests status: na - task: lint_license_headers status: passed --- --- .../@stdlib/stats/padjust/test/test.js | 83 ++----------------- 1 file changed, 9 insertions(+), 74 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/padjust/test/test.js b/lib/node_modules/@stdlib/stats/padjust/test/test.js index c0466365a0e3..094b2c4e1de0 100644 --- a/lib/node_modules/@stdlib/stats/padjust/test/test.js +++ b/lib/node_modules/@stdlib/stats/padjust/test/test.js @@ -21,8 +21,7 @@ // MODULES // var tape = require( 'tape' ); -var EPS = require( '@stdlib/constants/float64/eps' ); -var abs = require( '@stdlib/math/base/special/abs' ); +var isAlmostSameValue = require( '@stdlib/assert/is-almost-same-value' ); var padjust = require( './../lib' ); @@ -197,9 +196,7 @@ tape( 'the function throws an error if the third argument is smaller than the nu tape( 'the function returns adjusted p-values (using Bonferroni correction)', function test( t ) { var expected; - var delta; var pvals; - var tol; var out; var i; @@ -207,22 +204,14 @@ tape( 'the function returns adjusted p-values (using Bonferroni correction)', fu expected = BONFERRONI.expected; out = padjust( pvals, 'bonferroni' ); for ( i = 0; i < pvals.length; i++ ) { - if ( out[ i ] === expected[ i ] ) { - t.strictEqual( out[ i ], expected[ i ], 'p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'.' ); - } else { - delta = abs( out[ i ] - expected[i] ); - tol = 15.0 * EPS * abs( expected[i] ); - t.ok( delta <= tol, 'within tolerance. p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'. tol: '+tol+'. Δ: '+delta+'.' ); - } + t.strictEqual( isAlmostSameValue( out[ i ], expected[ i ], 0 ), true, 'returns expected value' ); } t.end(); }); tape( 'the function returns adjusted p-values (using Benjamini & Yekutieli correction)', function test( t ) { var expected; - var delta; var pvals; - var tol; var out; var i; @@ -230,22 +219,14 @@ tape( 'the function returns adjusted p-values (using Benjamini & Yekutieli corre expected = BY.expected; out = padjust( pvals, 'by' ); for ( i = 0; i < pvals.length; i++ ) { - if ( out[ i ] === expected[ i ] ) { - t.strictEqual( out[ i ], expected[ i ], 'p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'.' ); - } else { - delta = abs( out[ i ] - expected[i] ); - tol = 20.0 * EPS * abs( expected[i] ); - t.ok( delta <= tol, 'within tolerance. p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'. tol: '+tol+'. Δ: '+delta+'.' ); - } + t.strictEqual( isAlmostSameValue( out[ i ], expected[ i ], 0 ), true, 'returns expected value' ); } t.end(); }); tape( 'the function returns adjusted p-values (using False Discovery Rate control)', function test( t ) { var expected; - var delta; var pvals; - var tol; var out; var i; @@ -253,22 +234,14 @@ tape( 'the function returns adjusted p-values (using False Discovery Rate contro expected = BH.expected; out = padjust( pvals, 'bh' ); for ( i = 0; i < pvals.length; i++ ) { - if ( out[ i ] === expected[ i ] ) { - t.strictEqual( out[ i ], expected[ i ], 'p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'.' ); - } else { - delta = abs( out[ i ] - expected[i] ); - tol = 20.0 * EPS * abs( expected[i] ); - t.ok( delta <= tol, 'within tolerance. p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'. tol: '+tol+'. Δ: '+delta+'.' ); - } + t.strictEqual( isAlmostSameValue( out[ i ], expected[ i ], 0 ), true, 'returns expected value' ); } t.end(); }); tape( 'the function returns adjusted p-values (using Holm\'s correction)', function test( t ) { var expected; - var delta; var pvals; - var tol; var out; var i; @@ -276,22 +249,14 @@ tape( 'the function returns adjusted p-values (using Holm\'s correction)', funct expected = HOLM.expected; out = padjust( pvals, 'holm' ); for ( i = 0; i < pvals.length; i++ ) { - if ( out[ i ] === expected[ i ] ) { - t.strictEqual( out[ i ], expected[ i ], 'p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'.' ); - } else { - delta = abs( out[ i ] - expected[i] ); - tol = 20.0 * EPS * abs( expected[i] ); - t.ok( delta <= tol, 'within tolerance. p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'. tol: '+tol+'. Δ: '+delta+'.' ); - } + t.strictEqual( isAlmostSameValue( out[ i ], expected[ i ], 0 ), true, 'returns expected value' ); } t.end(); }); tape( 'the function returns adjusted p-values (using Hommel\'s method)', function test( t ) { var expected; - var delta; var pvals; - var tol; var out; var i; @@ -299,22 +264,14 @@ tape( 'the function returns adjusted p-values (using Hommel\'s method)', functio expected = HOMMEL.expected; out = padjust( pvals, 'hommel' ); for ( i = 0; i < pvals.length; i++ ) { - if ( out[ i ] === expected[ i ] ) { - t.strictEqual( out[ i ], expected[ i ], 'p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'.' ); - } else { - delta = abs( out[ i ] - expected[i] ); - tol = 10.0 * EPS * abs( expected[i] ); - t.ok( delta <= tol, 'within tolerance. p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'. tol: '+tol+'. Δ: '+delta+'.' ); - } + t.strictEqual( isAlmostSameValue( out[ i ], expected[ i ], 0 ), true, 'returns expected value' ); } t.end(); }); tape( 'the function returns adjusted p-values (custom number of comparisons)', function test( t ) { var expected; - var delta; var pvals; - var tol; var out; var i; @@ -322,22 +279,14 @@ tape( 'the function returns adjusted p-values (custom number of comparisons)', f expected = CUSTOM.expected; out = padjust( pvals, 'bh', CUSTOM.n ); for ( i = 0; i < pvals.length; i++ ) { - if ( out[ i ] === expected[ i ] ) { - t.strictEqual( out[ i ], expected[ i ], 'p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'.' ); - } else { - delta = abs( out[ i ] - expected[i] ); - tol = 10.0 * EPS * abs( expected[i] ); - t.ok( delta <= tol, 'within tolerance. p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'. tol: '+tol+'. Δ: '+delta+'.' ); - } + t.strictEqual( isAlmostSameValue( out[ i ], expected[ i ], 0 ), true, 'returns expected value' ); } t.end(); }); tape( 'the function returns adjusted p-values using Hommel\'s method (custom number of comparisons)', function test( t ) { var expected; - var delta; var pvals; - var tol; var out; var i; @@ -345,22 +294,14 @@ tape( 'the function returns adjusted p-values using Hommel\'s method (custom num expected = CUSTOM_HOMMEL.expected; out = padjust( pvals, 'hommel', CUSTOM_HOMMEL.n ); for ( i = 0; i < pvals.length; i++ ) { - if ( out[ i ] === expected[ i ] ) { - t.strictEqual( out[ i ], expected[ i ], 'p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'.' ); - } else { - delta = abs( out[ i ] - expected[i] ); - tol = 10.0 * EPS * abs( expected[i] ); - t.ok( delta <= tol, 'within tolerance. p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'. tol: '+tol+'. Δ: '+delta+'.' ); - } + t.strictEqual( isAlmostSameValue( out[ i ], expected[ i ], 0 ), true, 'returns expected value' ); } t.end(); }); tape( 'the function returns adjusted p-values using the Benjamini & Yekutieli correction (custom number of comparisons)', function test( t ) { var expected; - var delta; var pvals; - var tol; var out; var i; @@ -368,13 +309,7 @@ tape( 'the function returns adjusted p-values using the Benjamini & Yekutieli co expected = CUSTOM_BY.expected; out = padjust( pvals, 'by', CUSTOM_BY.n ); for ( i = 0; i < pvals.length; i++ ) { - if ( out[ i ] === expected[ i ] ) { - t.strictEqual( out[ i ], expected[ i ], 'p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'.' ); - } else { - delta = abs( out[ i ] - expected[i] ); - tol = 10.0 * EPS * abs( expected[i] ); - t.ok( delta <= tol, 'within tolerance. p: '+pvals[i]+'. adj: '+out[ i ]+'. E: '+expected[i]+'. tol: '+tol+'. Δ: '+delta+'.' ); - } + t.strictEqual( isAlmostSameValue( out[ i ], expected[ i ], 0 ), true, 'returns expected value' ); } t.end(); });