| from __future__ import annotations |
|
|
| import importlib.util |
| import math |
| from pathlib import Path |
| import unittest |
|
|
|
|
| SCRIPT = Path(__file__).resolve().parents[1] / "scripts" / "analyze_study2.py" |
| SPEC = importlib.util.spec_from_file_location("study2_analysis", SCRIPT) |
| assert SPEC is not None and SPEC.loader is not None |
| analysis = importlib.util.module_from_spec(SPEC) |
| SPEC.loader.exec_module(analysis) |
|
|
|
|
| class Study2AnalysisTests(unittest.TestCase): |
| def test_exact_mcnemar_uses_only_discordant_pairs(self) -> None: |
| n10, n01, p_value = analysis.exact_mcnemar([1, 1, 1, 0], [0, 0, 1, 1]) |
| self.assertEqual((n10, n01), (2, 1)) |
| self.assertEqual(p_value, 1.0) |
|
|
| def test_holm_is_monotone_in_raw_p_order(self) -> None: |
| raw = [0.04, 0.001, 0.02, 0.5] |
| adjusted = analysis.holm_adjust(raw) |
| ordered = sorted(range(len(raw)), key=raw.__getitem__) |
| values = [adjusted[index] for index in ordered] |
| self.assertEqual(values, sorted(values)) |
| self.assertTrue(all(0 <= value <= 1 for value in values)) |
|
|
| def test_perfect_reliability_statistics(self) -> None: |
| ratings = [[0, 0, 0], [1, 1, 1], [0, 0, 0], [1, 1, 1]] |
| counts = [[3, 0], [0, 3], [3, 0], [0, 3]] |
| self.assertAlmostEqual(analysis.fleiss_kappa(counts), 1.0) |
| self.assertAlmostEqual(analysis.krippendorff_alpha_nominal(ratings), 1.0) |
| self.assertAlmostEqual(analysis.icc_one_way(ratings), 1.0) |
|
|
| def test_nonagreement_can_produce_negative_reliability(self) -> None: |
| ratings = [[0, 0, 1], [1, 1, 0], [0, 1, 0], [1, 0, 1]] |
| counts = [[2, 1], [1, 2], [2, 1], [1, 2]] |
| self.assertLess(analysis.fleiss_kappa(counts), 0.0) |
| self.assertLess(analysis.krippendorff_alpha_nominal(ratings), 0.0) |
|
|
| def test_chance_corrected_agreement_is_undefined_without_variance(self) -> None: |
| ratings = [[0, 0, 0], [0, 0, 0]] |
| counts = [[3, 0], [3, 0]] |
| self.assertTrue(math.isnan(analysis.fleiss_kappa(counts))) |
| self.assertTrue(math.isnan(analysis.krippendorff_alpha_nominal(ratings))) |
| self.assertTrue(math.isnan(analysis.icc_one_way(ratings))) |
|
|
| def test_secondary_family_is_model_stratified(self) -> None: |
| self.assertEqual(len(analysis.SECONDARY_CONTRASTS), 13) |
| self.assertEqual({spec[1] for spec in analysis.SECONDARY_CONTRASTS}, {"M002", "M003"}) |
|
|
|
|
| if __name__ == "__main__": |
| unittest.main() |
|
|