From 8938b42f6ea2b5c7b5f89b13a45d594bac4b2624 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Fri, 17 Apr 2020 18:55:12 +0200
Subject: [PATCH] [contrasting project] add aic and bic as results of extremes

---
 .../abstract_result_from_model_fit.py                |  9 +++++++++
 .../abstract_result_from_extremes.py                 | 12 ++++++++++++
 .../altitudes_fit/utils.py                           |  3 +++
 .../test_gev/test_gev_temporal_extremes_mle.py       |  8 ++++++++
 4 files changed, 32 insertions(+)

diff --git a/extreme_fit/model/result_from_model_fit/abstract_result_from_model_fit.py b/extreme_fit/model/result_from_model_fit/abstract_result_from_model_fit.py
index c82898e0..c22ed796 100644
--- a/extreme_fit/model/result_from_model_fit/abstract_result_from_model_fit.py
+++ b/extreme_fit/model/result_from_model_fit/abstract_result_from_model_fit.py
@@ -1,6 +1,7 @@
 import numpy as np
 from rpy2 import robjects
 
+from extreme_fit.model.utils import r
 
 
 class AbstractResultFromModelFit(object):
@@ -44,6 +45,14 @@ class AbstractResultFromModelFit(object):
     def deviance(self):
         return - 2 * self.nllh
 
+    @property
+    def bic(self):
+        raise NotImplementedError
+
+    @property
+    def aic(self):
+        raise NotImplementedError
+
     @property
     def convergence(self) -> str:
         raise NotImplementedError
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py
index 10c67292..1c0233d1 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py
@@ -15,10 +15,22 @@ class AbstractResultFromExtremes(AbstractResultFromModelFit):
         super().__init__(result_from_fit)
         self.gev_param_name_to_dim = gev_param_name_to_dim
 
+    @property
+    def summary_name_to_value(self):
+        return self.get_python_dictionary(r('summary')(self.result_from_fit))
+
     @property
     def results(self):
         return self.get_python_dictionary(self.name_to_value['results'])
 
+    @property
+    def bic(self):
+        return np.array(self.summary_name_to_value['BIC'])[0]
+
+    @property
+    def aic(self):
+        return np.array(self.summary_name_to_value['AIC'])[0]
+
     @property
     def nllh(self):
         return np.array(self.results['value'])[0]
diff --git a/projects/contrasting_trends_in_snow_loads/altitudes_fit/utils.py b/projects/contrasting_trends_in_snow_loads/altitudes_fit/utils.py
index 86372c5c..45f31c7d 100644
--- a/projects/contrasting_trends_in_snow_loads/altitudes_fit/utils.py
+++ b/projects/contrasting_trends_in_snow_loads/altitudes_fit/utils.py
@@ -4,6 +4,9 @@ from enum import Enum
 
 class Score(Enum):
     NLLH_TEST = 1
+    AIC_TRAIN = 2
+    BIC_TRAIN = 3
+    SPAN_30_RETURN_LEVEL_2019_AT_1000M = 4
 
 
 class Grouping(Enum):
diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py
index 6066ff4a..5f4b227e 100644
--- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py
+++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py
@@ -70,6 +70,14 @@ class TestGevTemporalExtremesMle(unittest.TestCase):
         mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
         self.assertAlmostEqual(estimator.result_from_model_fit.nllh, estimator.nllh())
+        # self.assertAlmostEqual(estimator.result_from_model_fit.aic, estimator.aic())
+        # self.assertAlmostEqual(estimator.result_from_model_fit.bic, estimator.bic())
+        # print(estimator.result_from_model_fit.summary_name_to_value)
+        # for k, v in estimator.result_from_model_fit.results.items():
+        #     print(k, np.array(v)[0])
+        self.assertAlmostEqual(estimator.result_from_model_fit.aic, 215.59675857481045)
+        self.assertAlmostEqual(estimator.result_from_model_fit.bic, 225.1568736019512)
+
 
 
 if __name__ == '__main__':
-- 
GitLab