1818ref29_1 = np .concatenate ([np .ones ([50 ]),np .zeros ([50 ])])
1919pred29_2 = np .concatenate ([np .ones ([81 ]),np .zeros ([9 ]),np .ones ([2 ]),np .zeros ([8 ])])
2020ref29_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
278291def test_matthews_correlation_coefficient ():
279292 bpm = PM (f38_pred , f38_ref )
@@ -365,15 +378,16 @@ def test_cohenskappa2():
365378
366379
367380def 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
379393def 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
395424def test_cohenskappa3 ():
@@ -401,20 +430,27 @@ def test_cohenskappa3():
401430
402431
403432def 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
411444def 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
419455def test_mcc ():
420456 list_values = [0 , 1 , 2 , 3 ]
@@ -425,13 +461,26 @@ def test_mcc():
425461
426462
427463def 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
436485def 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
530570def 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
541583def test_hd ():
542584 f20_ref = np .zeros ([14 , 14 ])
0 commit comments