Skip to content

Commit f7bd33c

Browse files
author
Carole Sudre
committed
Using figure 2.9 as illustrative example for many tests
1 parent 09d63ad commit f7bd33c

1 file changed

Lines changed: 88 additions & 46 deletions

File tree

test/test_metrics/test_pairwise_measures.py

Lines changed: 88 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
ref29_1 = np.concatenate([np.ones([50]),np.zeros([50])])
1919
pred29_2 = np.concatenate([np.ones([81]),np.zeros([9]),np.ones([2]),np.zeros([8])])
2020
ref29_2 = np.concatenate([np.ones([90]),np.zeros([10])])
21+
ppm29_1 = PM(pred29_1, ref29_1)
22+
ppm29_2 = PM(pred29_2, ref29_2)
2123

2224
### Small size of structures relative to pixel/voxel size (DSC)
2325
## Larger structure
@@ -274,6 +276,17 @@ def test_voldiff():
274276
expected_vdiff = 0
275277
assert_allclose(value_test, expected_vdiff)
276278

279+
def test_matthews_correlation_coefficient_29():
280+
"""
281+
Taking SN 3.9 as figure illustration for MCC p49 Pitfalls
282+
"""
283+
expected_mcc1 = 0.70
284+
expected_mcc2 = 0.56
285+
value_test1 = ppm29_1.matthews_correlation_coefficient()
286+
value_test2 = ppm29_2.matthews_correlation_coefficient()
287+
assert_allclose(value_test1, expected_mcc1, atol=0.01)
288+
assert_allclose(value_test2, expected_mcc2, atol=0.02)
289+
277290

278291
def test_matthews_correlation_coefficient():
279292
bpm = PM(f38_pred, f38_ref)
@@ -365,15 +378,16 @@ def test_cohenskappa2():
365378

366379

367380
def test_negative_predictive_value():
368-
f17_ref = np.concatenate([np.ones([50]), np.zeros([50])])
369-
f17_pred = np.concatenate(
370-
[np.ones([45]), np.zeros([5]), np.ones([10]), np.zeros(40)]
371-
)
372-
bpm = PM(f17_pred, f17_ref)
373-
value_test = bpm.negative_predictive_values()
374-
expected_npv = 0.889
375-
assert_allclose(value_test, expected_npv, atol=0.001)
376-
print("NPV", value_test)
381+
"""
382+
Taking figure SN 2.9 as inspiration p49 Pitfalls
383+
"""
384+
value_test1 = ppm29_1.negative_predictive_values()
385+
value_test2 = ppm29_2.negative_predictive_values()
386+
expected_npv1 = 0.889
387+
expected_npv2 = 0.47
388+
assert_allclose(value_test1, expected_npv1, atol=0.001)
389+
assert_allclose(value_test2, expected_npv2, atol=0.01)
390+
377391

378392

379393
def test_expectedcost():
@@ -384,12 +398,27 @@ def test_expectedcost():
384398
assert_allclose(value_test, expected_ec, atol=0.01)
385399

386400

387-
def test_expectedcost2():
388-
mpm = MPM(f27_pred, f27_ref, [0, 1])
389-
value_test = mpm.normalised_expected_cost()
390-
print("ECn", value_test)
401+
def test_normalised_expectedcost2():
402+
"""
403+
TAking SN 3.9 as reference p49 pitfalls
404+
"""
405+
value_test1 = ppm29_1.normalised_expected_cost()
406+
value_test2 = ppm29_2.normalised_expected_cost()
391407
expected_ec = 0.30
392-
assert_allclose(value_test, expected_ec, atol=0.01)
408+
409+
assert_allclose(value_test2, expected_ec, atol=0.01)
410+
assert_allclose(value_test1, expected_ec, atol=0.01)
411+
412+
def test_cohenskappa():
413+
"""
414+
Taking SN 2.9 p49 Pitfalls as reference
415+
"""
416+
value_test1 = ppm29_1.cohens_kappa()
417+
value_test2 = ppm29_2.cohens_kappa()
418+
expected_ck1 = 0.70
419+
expected_ck2 = 0.53
420+
assert_allclose(value_test1, expected_ck1, atol=0.01)
421+
assert_allclose(value_test2, expected_ck2, atol=0.01)
393422

394423

395424
def test_cohenskappa3():
@@ -401,20 +430,27 @@ def test_cohenskappa3():
401430

402431

403432
def test_balanced_accuracy2():
404-
bpm = PM(f38_pred, f38_ref)
405-
value_test = bpm.balanced_accuracy()
406-
print("BA f38 ", value_test)
407-
expected_ba = 0.87
408-
assert_allclose(value_test, expected_ba, atol=0.01)
433+
"""
434+
Taking Figure SN 2.39 as inspiration p49 pitfalls
435+
"""
436+
expected_ba1 = 0.85
437+
expected_ba2 = 0.85
438+
value_test1 = ppm29_1.balanced_accuracy()
439+
value_test2 = ppm29_2.balanced_accuracy()
440+
assert_allclose(value_test1, expected_ba1, atol=0.01)
441+
assert_allclose(value_test2, expected_ba2, atol=0.01)
409442

410443

411444
def test_youden_index2():
412-
bpm = PM(f38_pred, f38_ref)
413-
value_test = bpm.youden_index()
414-
print("J f38 ", value_test)
415-
expected_yi = 0.75
416-
assert_allclose(value_test, expected_yi, atol=0.01)
417-
445+
"""
446+
Taking as inspiration figure SN2.9 p49 Pitfalls
447+
"""
448+
expected_yi1 = 0.70
449+
expected_yi2 = 0.70
450+
value_test1 = ppm29_1.youden_index()
451+
value_test2 = ppm29_2.youden_index()
452+
assert_allclose(value_test1, expected_yi1, atol=0.01)
453+
assert_allclose(value_test2, expected_yi2, atol=0.01)
418454

419455
def test_mcc():
420456
list_values = [0, 1, 2, 3]
@@ -425,13 +461,26 @@ def test_mcc():
425461

426462

427463
def test_distance_empty():
464+
"""
465+
Testing that output is 0 when reference and prediction empty for calculation of distance
466+
"""
428467
pred = np.zeros([14, 14])
429468
ref = np.zeros([14, 14])
430469
bpm = PM(pred, ref)
431470
value_test = bpm.measured_distance()
432471
expected_dist = (0, 0, 0, 0)
433472
assert_allclose(value_test, expected_dist)
434473

474+
def test_fbeta():
475+
"""
476+
Taking inspiration from SN 2.9 - p49 Pitfalls
477+
"""
478+
expected_f11 = 0.86
479+
expected_f12 = 0.94
480+
value_test1 = ppm29_1.fbeta()
481+
value_test2 = ppm29_2.fbeta()
482+
assert_allclose(value_test1, expected_f11, atol=0.01)
483+
assert_allclose(value_test2, expected_f12, atol=0.01)
435484

436485
def test_dsc_fbeta():
437486
bpm = PM(p_pred, p_ref)
@@ -509,34 +558,27 @@ def test_ppv():
509558
"""
510559
Taking as inspiration figure SN2.9 p49 Pitfalls
511560
"""
512-
# print(f27_pred1, f27_ref1)
513-
# pm = PM(f27_pred1, f27_ref1)
514-
# value_test = pm.positive_predictive_values()
515-
# print("PPV ", value_test)
516-
# expected_ppv = 0.975
517-
518-
ppm1 = PM(pred29_1, ref29_1)
519-
ppm2 = PM(pred29_2, ref29_2)
520-
value_test1 = ppm1.positive_predictive_values()
521-
value_test2 = ppm2.positive_predictive_values()
561+
562+
value_test1 = ppm29_1.positive_predictive_values()
563+
value_test2 = ppm29_2.positive_predictive_values()
522564
expected_ppv1 = 0.82
523565
expected_ppv2 = 0.98
524-
525-
526566
assert_allclose(value_test1, expected_ppv1, atol=0.01)
527567
assert_allclose(value_test2, expected_ppv2, atol=0.01)
528568

529569

530570
def test_positive_likelihood_ratio():
531-
f17_ref = np.concatenate([np.ones([50]), np.zeros([50])])
532-
f17_pred = np.concatenate(
533-
[np.ones([45]), np.zeros([5]), np.ones([10]), np.zeros(40)]
534-
)
535-
bpm = PM(f17_pred, f17_ref)
536-
value_test = bpm.positive_likelihood_ratio()
537-
expected_plr = 4.5
538-
assert_allclose(value_test, expected_plr, atol=0.01)
539-
571+
"""
572+
Taking as inspiration figure SN2.9 p49 Pitfalls
573+
"""
574+
ppm1 = PM(pred29_1, ref29_1)
575+
ppm2 = PM(pred29_2, ref29_2)
576+
value_test1 = ppm1.positive_likelihood_ratio()
577+
value_test2 = ppm2.positive_likelihood_ratio()
578+
expected_plr1 = 4.50
579+
expected_plr2 = 4.50
580+
assert_allclose(value_test1, expected_plr1, atol=0.01)
581+
assert_allclose(value_test2, expected_plr2, atol=0.01)
540582

541583
def test_hd():
542584
f20_ref = np.zeros([14, 14])

0 commit comments

Comments
 (0)