From b1eddf667d133a02950fed8925dc389346393634 Mon Sep 17 00:00:00 2001 From: Otto Date: Sat, 12 Sep 2026 11:48:34 -0400 Subject: [PATCH] Added test cases for independent filtering variance with various scenarios --- .../tests/invalid_parameters/input.csv | 3 ++ .../tests/invalid_parameters/test.yaml | 16 ++++++++ .../tests/mean_columns/input.csv | 5 +++ .../tests/mean_columns/test.yaml | 32 ++++++++++++++++ .../tests/mean_nondefault_theta/input.csv | 6 +++ .../tests/mean_nondefault_theta/retained.csv | 4 ++ .../tests/mean_nondefault_theta/test.yaml | 25 ++++++++++++ .../tests/mean_rows/input.csv | 5 +++ .../tests/mean_rows/retained.csv | 3 ++ .../tests/mean_rows/test.yaml | 24 ++++++++++++ .../tests/mean_zero_removal/input.csv | 5 +++ .../tests/mean_zero_removal/retained.csv | 5 +++ .../tests/mean_zero_removal/test.yaml | 24 ++++++++++++ .../tests/variance_columns/input.csv | 5 +++ .../tests/variance_columns/test.yaml | 38 +++++++++++++++++++ .../tests/variance_missing_values/input.csv | 5 +++ .../variance_missing_values/retained.csv | 3 ++ .../tests/variance_missing_values/test.yaml | 31 +++++++++++++++ .../tests/variance_rows/input.csv | 6 +++ .../tests/variance_rows/retained.csv | 4 ++ .../tests/variance_rows/test.yaml | 32 ++++++++++++++++ 21 files changed, 281 insertions(+) create mode 100644 protocols/independent-filtering-variance/tests/invalid_parameters/input.csv create mode 100644 protocols/independent-filtering-variance/tests/invalid_parameters/test.yaml create mode 100644 protocols/independent-filtering-variance/tests/mean_columns/input.csv create mode 100644 protocols/independent-filtering-variance/tests/mean_columns/test.yaml create mode 100644 protocols/independent-filtering-variance/tests/mean_nondefault_theta/input.csv create mode 100644 protocols/independent-filtering-variance/tests/mean_nondefault_theta/retained.csv create mode 100644 protocols/independent-filtering-variance/tests/mean_nondefault_theta/test.yaml create mode 100644 protocols/independent-filtering-variance/tests/mean_rows/input.csv create mode 100644 protocols/independent-filtering-variance/tests/mean_rows/retained.csv create mode 100644 protocols/independent-filtering-variance/tests/mean_rows/test.yaml create mode 100644 protocols/independent-filtering-variance/tests/mean_zero_removal/input.csv create mode 100644 protocols/independent-filtering-variance/tests/mean_zero_removal/retained.csv create mode 100644 protocols/independent-filtering-variance/tests/mean_zero_removal/test.yaml create mode 100644 protocols/independent-filtering-variance/tests/variance_columns/input.csv create mode 100644 protocols/independent-filtering-variance/tests/variance_columns/test.yaml create mode 100644 protocols/independent-filtering-variance/tests/variance_missing_values/input.csv create mode 100644 protocols/independent-filtering-variance/tests/variance_missing_values/retained.csv create mode 100644 protocols/independent-filtering-variance/tests/variance_missing_values/test.yaml create mode 100644 protocols/independent-filtering-variance/tests/variance_rows/input.csv create mode 100644 protocols/independent-filtering-variance/tests/variance_rows/retained.csv create mode 100644 protocols/independent-filtering-variance/tests/variance_rows/test.yaml diff --git a/protocols/independent-filtering-variance/tests/invalid_parameters/input.csv b/protocols/independent-filtering-variance/tests/invalid_parameters/input.csv new file mode 100644 index 0000000..9d79b65 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/invalid_parameters/input.csv @@ -0,0 +1,3 @@ +feature,sample_1,sample_2,sample_3 +A,1,2,3 +B,4,5,6 diff --git a/protocols/independent-filtering-variance/tests/invalid_parameters/test.yaml b/protocols/independent-filtering-variance/tests/invalid_parameters/test.yaml new file mode 100644 index 0000000..8528d40 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/invalid_parameters/test.yaml @@ -0,0 +1,16 @@ +name: invalid_parameters +description: Invalid filter and theta values must be rejected rather than silently corrected. +inputs: + data: input.csv + filter: median + theta: 1.2 + feature_orientation: rows +expected_outputs: + status: refused_invalid_parameters + required_observations: + - filter must be either variance or mean + - theta must be between 0 and 1 +evaluation: + mode: diagnostic + require_invalid_parameter_refusal: true + reject_silent_parameter_correction: true diff --git a/protocols/independent-filtering-variance/tests/mean_columns/input.csv b/protocols/independent-filtering-variance/tests/mean_columns/input.csv new file mode 100644 index 0000000..aff494c --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_columns/input.csv @@ -0,0 +1,5 @@ +sample,A,B,C,D +sample_1,1,2,5,10 +sample_2,1,4,6,10 +sample_3,1,2,7,10 +sample_4,1,4,8,10 diff --git a/protocols/independent-filtering-variance/tests/mean_columns/test.yaml b/protocols/independent-filtering-variance/tests/mean_columns/test.yaml new file mode 100644 index 0000000..859e9b3 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_columns/test.yaml @@ -0,0 +1,32 @@ +name: mean_columns +description: Diagnostic mean case with features in columns, testing correction or refusal. +inputs: + data: input.csv + filter: mean + theta: 0.5 + feature_orientation: columns +expected_outputs: + input_orientation: features_in_columns + protocol_requirement: features_in_rows + accepted_outcomes: + - outcome: orientation_corrected + expected_summary: + A: 1 + B: 3 + C: 6.5 + D: 10 + removed_features: [A, B] + retained_features: [C, D] + - outcome: refused_for_orientation + required_observation: The protocol requires one feature per row and one sample per column; this input has one feature per column. + intended_feature_summaries: + A: 1 + B: 3 + C: 6.5 + D: 10 + intended_removed_features: [A, B] + intended_retained_features: [C, D] +evaluation: + mode: diagnostic + accepted_outcomes: [orientation_corrected, refused_for_orientation] + reject_silent_row_feature_interpretation: true diff --git a/protocols/independent-filtering-variance/tests/mean_nondefault_theta/input.csv b/protocols/independent-filtering-variance/tests/mean_nondefault_theta/input.csv new file mode 100644 index 0000000..5f17500 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_nondefault_theta/input.csv @@ -0,0 +1,6 @@ +feature,sample_1,sample_2,sample_3,sample_4 +A,-4,-2,-4,-2 +B,-2,0,-2,0 +C,-1,1,-1,1 +D,0,4,0,4 +E,5,9,5,9 diff --git a/protocols/independent-filtering-variance/tests/mean_nondefault_theta/retained.csv b/protocols/independent-filtering-variance/tests/mean_nondefault_theta/retained.csv new file mode 100644 index 0000000..94d00c3 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_nondefault_theta/retained.csv @@ -0,0 +1,4 @@ +feature,sample_1,sample_2,sample_3,sample_4 +C,-1,1,-1,1 +D,0,4,0,4 +E,5,9,5,9 diff --git a/protocols/independent-filtering-variance/tests/mean_nondefault_theta/test.yaml b/protocols/independent-filtering-variance/tests/mean_nondefault_theta/test.yaml new file mode 100644 index 0000000..8718377 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_nondefault_theta/test.yaml @@ -0,0 +1,25 @@ +name: mean_nondefault_theta +description: Mean filtering with negative values and a non-default theta. +inputs: + data: input.csv + filter: mean + theta: 0.4 + feature_orientation: rows +expected_outputs: + summary: + A: -3 + B: -1 + C: 0 + D: 2 + E: 7 + n_eligible: 5 + m: 2 + cutoff: -1 + removed_features: [A, B] + retained_features: [C, D, E] + retained_matrix: retained.csv +evaluation: + mode: exact + compare_summary: true + compare_retained_matrix: true + numeric_tolerance: 0 diff --git a/protocols/independent-filtering-variance/tests/mean_rows/input.csv b/protocols/independent-filtering-variance/tests/mean_rows/input.csv new file mode 100644 index 0000000..19db7ef --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_rows/input.csv @@ -0,0 +1,5 @@ +feature,sample_1,sample_2,sample_3,sample_4 +A,1,1,1,1 +B,2,4,2,4 +C,5,6,7,8 +D,10,10,10,10 diff --git a/protocols/independent-filtering-variance/tests/mean_rows/retained.csv b/protocols/independent-filtering-variance/tests/mean_rows/retained.csv new file mode 100644 index 0000000..4cc8d73 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_rows/retained.csv @@ -0,0 +1,3 @@ +feature,sample_1,sample_2,sample_3,sample_4 +C,5,6,7,8 +D,10,10,10,10 diff --git a/protocols/independent-filtering-variance/tests/mean_rows/test.yaml b/protocols/independent-filtering-variance/tests/mean_rows/test.yaml new file mode 100644 index 0000000..116e871 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_rows/test.yaml @@ -0,0 +1,24 @@ +name: mean_rows +description: Mean filtering on a feature-by-sample matrix with features in rows. +inputs: + data: input.csv + filter: mean + theta: 0.5 + feature_orientation: rows +expected_outputs: + summary: + A: 1 + B: 3 + C: 6.5 + D: 10 + n_eligible: 4 + m: 2 + cutoff: 3 + removed_features: [A, B] + retained_features: [C, D] + retained_matrix: retained.csv +evaluation: + mode: exact + compare_summary: true + compare_retained_matrix: true + numeric_tolerance: 0 diff --git a/protocols/independent-filtering-variance/tests/mean_zero_removal/input.csv b/protocols/independent-filtering-variance/tests/mean_zero_removal/input.csv new file mode 100644 index 0000000..8aa227a --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_zero_removal/input.csv @@ -0,0 +1,5 @@ +feature,sample_1,sample_2,sample_3,sample_4 +A,0,2,0,2 +B,2,4,2,4 +C,4,6,4,6 +D,6,8,6,8 diff --git a/protocols/independent-filtering-variance/tests/mean_zero_removal/retained.csv b/protocols/independent-filtering-variance/tests/mean_zero_removal/retained.csv new file mode 100644 index 0000000..8aa227a --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_zero_removal/retained.csv @@ -0,0 +1,5 @@ +feature,sample_1,sample_2,sample_3,sample_4 +A,0,2,0,2 +B,2,4,2,4 +C,4,6,4,6 +D,6,8,6,8 diff --git a/protocols/independent-filtering-variance/tests/mean_zero_removal/test.yaml b/protocols/independent-filtering-variance/tests/mean_zero_removal/test.yaml new file mode 100644 index 0000000..cbe5f43 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/mean_zero_removal/test.yaml @@ -0,0 +1,24 @@ +name: mean_zero_removal +description: Mean filtering where floor(theta times n_eligible) is zero. +inputs: + data: input.csv + filter: mean + theta: 0.1 + feature_orientation: rows +expected_outputs: + summary: + A: 1 + B: 3 + C: 5 + D: 7 + n_eligible: 4 + m: 0 + cutoff: null + removed_features: [] + retained_features: [A, B, C, D] + retained_matrix: retained.csv +evaluation: + mode: exact + compare_summary: true + compare_retained_matrix: true + numeric_tolerance: 0 diff --git a/protocols/independent-filtering-variance/tests/variance_columns/input.csv b/protocols/independent-filtering-variance/tests/variance_columns/input.csv new file mode 100644 index 0000000..4d72307 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/variance_columns/input.csv @@ -0,0 +1,5 @@ +sample,A,B,C,D,E +sample_1,2,1,3,0,0 +sample_2,2,3,1,10,12 +sample_3,2,1,3,0,0 +sample_4,2,3,1,10,12 diff --git a/protocols/independent-filtering-variance/tests/variance_columns/test.yaml b/protocols/independent-filtering-variance/tests/variance_columns/test.yaml new file mode 100644 index 0000000..97dd99a --- /dev/null +++ b/protocols/independent-filtering-variance/tests/variance_columns/test.yaml @@ -0,0 +1,38 @@ +name: variance_columns +description: Diagnostic unbiased variance case with features in columns, testing correction or refusal. +inputs: + data: input.csv + filter: variance + theta: 0.4 + feature_orientation: columns +expected_outputs: + input_orientation: features_in_columns + protocol_requirement: features_in_rows + accepted_outcomes: + - outcome: orientation_corrected + expected_summary: + A: 0 + B: 1.3333333333333333 + C: 1.3333333333333333 + D: 33.333333333333336 + E: 48 + removed_features: [A, B] + retained_features: [C, D, E] + - outcome: refused_for_orientation + required_observation: The protocol requires one feature per row and one sample per column; this input has one feature per column. + intended_feature_summaries: + A: 0 + B: 1.3333333333333333 + C: 1.3333333333333333 + D: 33.333333333333336 + E: 48 + intended_n_eligible: 5 + intended_m: 2 + intended_cutoff: 1.3333333333333333 + intended_tie_breaker: feature_id_ascending + intended_removed_features: [A, B] + intended_retained_features: [C, D, E] +evaluation: + mode: diagnostic + accepted_outcomes: [orientation_corrected, refused_for_orientation] + reject_silent_row_feature_interpretation: true diff --git a/protocols/independent-filtering-variance/tests/variance_missing_values/input.csv b/protocols/independent-filtering-variance/tests/variance_missing_values/input.csv new file mode 100644 index 0000000..621b83e --- /dev/null +++ b/protocols/independent-filtering-variance/tests/variance_missing_values/input.csv @@ -0,0 +1,5 @@ +feature,sample_1,sample_2,sample_3,sample_4 +A,2,2,2,2 +B,1,3,1,3 +C,,2,,6 +D,,5,, diff --git a/protocols/independent-filtering-variance/tests/variance_missing_values/retained.csv b/protocols/independent-filtering-variance/tests/variance_missing_values/retained.csv new file mode 100644 index 0000000..c6ab779 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/variance_missing_values/retained.csv @@ -0,0 +1,3 @@ +feature,sample_1,sample_2,sample_3,sample_4 +B,1,3,1,3 +C,,2,,6 diff --git a/protocols/independent-filtering-variance/tests/variance_missing_values/test.yaml b/protocols/independent-filtering-variance/tests/variance_missing_values/test.yaml new file mode 100644 index 0000000..fb84e52 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/variance_missing_values/test.yaml @@ -0,0 +1,31 @@ +name: variance_missing_values +description: Variance filtering with missing values and an explicitly declared eligibility policy. +inputs: + data: input.csv + filter: variance + theta: 0.5 + feature_orientation: rows + missing_data_policy: exclude_features_with_fewer_than_two_non_missing_values +expected_outputs: + summary: + A: 0 + B: 1.3333333333333333 + C: 8 + non_missing_counts: + A: 4 + B: 4 + C: 2 + D: 1 + excluded_features: [D] + n_eligible: 3 + m: 1 + cutoff: 0 + removed_features: [A] + retained_features: [B, C] + retained_matrix: retained.csv +evaluation: + mode: exact + compare_summary: true + compare_non_missing_counts: true + compare_retained_matrix: true + numeric_tolerance: 1.0e-12 diff --git a/protocols/independent-filtering-variance/tests/variance_rows/input.csv b/protocols/independent-filtering-variance/tests/variance_rows/input.csv new file mode 100644 index 0000000..bd53114 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/variance_rows/input.csv @@ -0,0 +1,6 @@ +feature,sample_1,sample_2,sample_3,sample_4 +A,2,2,2,2 +B,1,3,1,3 +C,3,1,3,1 +D,0,10,0,10 +E,0,12,0,12 diff --git a/protocols/independent-filtering-variance/tests/variance_rows/retained.csv b/protocols/independent-filtering-variance/tests/variance_rows/retained.csv new file mode 100644 index 0000000..51de35a --- /dev/null +++ b/protocols/independent-filtering-variance/tests/variance_rows/retained.csv @@ -0,0 +1,4 @@ +feature,sample_1,sample_2,sample_3,sample_4 +C,3,1,3,1 +D,0,10,0,10 +E,0,12,0,12 diff --git a/protocols/independent-filtering-variance/tests/variance_rows/test.yaml b/protocols/independent-filtering-variance/tests/variance_rows/test.yaml new file mode 100644 index 0000000..5573d78 --- /dev/null +++ b/protocols/independent-filtering-variance/tests/variance_rows/test.yaml @@ -0,0 +1,32 @@ +name: variance_rows +description: Unbiased variance filtering on a feature-by-sample matrix with features in rows. +inputs: + data: input.csv + filter: variance + theta: 0.4 + feature_orientation: rows +expected_outputs: + summary: + A: 0 + B: 1.3333333333333333 + C: 1.3333333333333333 + D: 33.333333333333336 + E: 48 + non_missing_counts: + A: 4 + B: 4 + C: 4 + D: 4 + E: 4 + n_eligible: 5 + m: 2 + cutoff: 1.3333333333333333 + tie_breaker: feature_id_ascending + removed_features: [A, B] + retained_features: [C, D, E] + retained_matrix: retained.csv +evaluation: + mode: exact + compare_summary: true + compare_retained_matrix: true + numeric_tolerance: 1.0e-12