From dbe4a717e11c937419c9a80e7fbf294d1f2a03be Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Fri, 9 Apr 2021 20:04:34 +0200 Subject: [PATCH] [projection snowfall] refactor nb_params. so that is it associated to the margin_function rather than to the margin_model. --- .../margin_estimator/abstract_margin_estimator.py | 13 +++++++++++-- .../margin_function/abstract_margin_function.py | 4 ++++ .../margin_function/linear_margin_function.py | 4 ++++ .../margin_function/polynomial_margin_function.py | 4 ++++ .../margin_function/spline_margin_function.py | 4 ++++ .../abstract_temporal_linear_margin_model.py | 4 ++++ .../linear_margin_model/linear_margin_model.py | 2 +- .../temporal_linear_margin_models.py | 5 ----- .../gumbel_altitudinal_models.py | 5 ----- .../polynomial_margin_model.py | 4 ---- .../spline_margin_model/spline_margin_model.py | 4 ---- 11 files changed, 32 insertions(+), 21 deletions(-) diff --git a/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py b/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py index 47aa7b4f..463778f8 100644 --- a/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py +++ b/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py @@ -7,6 +7,8 @@ from cached_property import cached_property from extreme_fit.estimator.abstract_estimator import AbstractEstimator from extreme_fit.estimator.utils import load_margin_function +from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ + AbstractTemporalLinearMarginModel from extreme_fit.model.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel from extreme_fit.function.margin_function.linear_margin_function import LinearMarginFunction from extreme_fit.model.margin_model.utils import MarginFitMethod @@ -103,15 +105,22 @@ class LinearMarginEstimator(AbstractMarginEstimator): return 2 * self.nllh(split=split) def aic(self, split=Split.all): - aic = 2 * self.margin_model.nb_params + 2 * self.nllh(split=split) + aic = 2 * self.nb_params + 2 * self.nllh(split=split) npt.assert_almost_equal(self.result_from_model_fit.aic, aic, decimal=0) return aic def n(self, split=Split.all): return len(self.dataset.maxima_gev(split=split)) + @property + def nb_params(self): + nb_params = self.function_from_fit.nb_params + if isinstance(self.margin_model, AbstractTemporalLinearMarginModel) and self.margin_model.is_gumbel_model: + nb_params -= 1 + return nb_params + def bic(self, split=Split.all): - return np.log(self.n(split=split)) * self.margin_model.nb_params + 2 * self.nllh(split=split) + return np.log(self.n(split=split)) * self.nb_params + 2 * self.nllh(split=split) def compute_nllh(coordinate_values, maxima_values, function_from_fit, maximum_from_obs=True, assertion_for_inf=True): diff --git a/extreme_fit/function/margin_function/abstract_margin_function.py b/extreme_fit/function/margin_function/abstract_margin_function.py index 8f3a7b14..e3e70aa1 100644 --- a/extreme_fit/function/margin_function/abstract_margin_function.py +++ b/extreme_fit/function/margin_function/abstract_margin_function.py @@ -57,6 +57,10 @@ class AbstractMarginFunction(AbstractFunction): """Main method that maps each coordinate to its distribution parameters""" raise NotImplementedError + @property + def nb_params(self): + raise NotImplementedError + @property def gev_value_name_to_serie(self) -> Dict[str, pd.Series]: # Load the gev_params diff --git a/extreme_fit/function/margin_function/linear_margin_function.py b/extreme_fit/function/margin_function/linear_margin_function.py index d387341f..59065da1 100644 --- a/extreme_fit/function/margin_function/linear_margin_function.py +++ b/extreme_fit/function/margin_function/linear_margin_function.py @@ -49,6 +49,10 @@ class LinearMarginFunction(ParametricMarginFunction): def coefficient_name_to_dim(cls, coordinates: AbstractCoordinates) -> Dict[int, str]: return {v: k for k, v in cls.idx_to_coefficient_name(coordinates).items()} + @property + def nb_params(self): + return len(self.coef_dict) + @property def coef_dict(self) -> Dict[str, float]: coef_dict = {} diff --git a/extreme_fit/function/margin_function/polynomial_margin_function.py b/extreme_fit/function/margin_function/polynomial_margin_function.py index e7814ed7..5863802a 100644 --- a/extreme_fit/function/margin_function/polynomial_margin_function.py +++ b/extreme_fit/function/margin_function/polynomial_margin_function.py @@ -31,6 +31,10 @@ class PolynomialMarginFunction(LinearMarginFunction): def get_params(self, coordinate: np.ndarray, is_transformed: bool = True) -> GevParams: return super().get_params(coordinate, is_transformed) + @property + def nb_params(self): + return sum([c.nb_params for c in self.param_name_to_coef.values()]) + @classmethod def from_coef_dict(cls, coordinates: AbstractCoordinates, param_name_to_dims: Dict[str, List[Tuple[int, int]]], coef_dict: Dict[str, float], starting_point: Union[None, int] = None, log_scale=None): diff --git a/extreme_fit/function/margin_function/spline_margin_function.py b/extreme_fit/function/margin_function/spline_margin_function.py index 5ac8a21e..7b6755bd 100644 --- a/extreme_fit/function/margin_function/spline_margin_function.py +++ b/extreme_fit/function/margin_function/spline_margin_function.py @@ -39,6 +39,10 @@ class SplineMarginFunction(LinearMarginFunction): def get_params(self, coordinate: np.ndarray, is_transformed: bool = True) -> GevParams: return super().get_params(coordinate, is_transformed) + @property + def nb_params(self): + return sum([c.nb_params for c in self.param_name_to_coef.values()]) + @classmethod def from_coef_dict(cls, coordinates: AbstractCoordinates, param_name_to_dims: Dict[str, List[Tuple[int, int]]], coef_dict: Dict[str, float], starting_point: Union[None, int] = None, log_scale=None): diff --git a/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py b/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py index 85506f5b..337073bf 100644 --- a/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py +++ b/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py @@ -169,3 +169,7 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel): @property def siglink(self): return r('identity') + + @property + def is_gumbel_model(self): + return self.type_for_mle == "Gumbel" \ No newline at end of file diff --git a/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py b/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py index a8f5af99..90fb6963 100644 --- a/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py +++ b/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py @@ -37,7 +37,7 @@ class LinearMarginModel(ParametricMarginModel): @property def nb_params(self): - return len(self.margin_function.coef_dict) + return self.margin_function.nb_params def param_name_to_linear_coef(self, param_name_and_dim_to_coef): param_name_to_linear_coef = {} diff --git a/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py b/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py index fde5b9c6..08e3cdff 100644 --- a/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py +++ b/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py @@ -126,11 +126,6 @@ class GumbelTemporalModel(StationaryTemporalModel): super().__init__(coordinates, params_user, starting_point, fit_method, nb_iterations_for_bayesian_fit, params_initial_fit_bayesian, type_for_MLE="Gumbel") - @property - def nb_params(self): - return super().nb_params - 1 - - class NonStationaryLocationGumbelModel(GumbelTemporalModel, NonStationaryLocationTemporalModel): pass diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/gumbel_altitudinal_models.py b/extreme_fit/model/margin_model/polynomial_margin_model/gumbel_altitudinal_models.py index e95056a3..0b2753d6 100644 --- a/extreme_fit/model/margin_model/polynomial_margin_model/gumbel_altitudinal_models.py +++ b/extreme_fit/model/margin_model/polynomial_margin_model/gumbel_altitudinal_models.py @@ -24,11 +24,6 @@ class AbstractGumbelAltitudinalModel(AbstractAltitudinalModel): super().__init__(coordinates, params_user, starting_point, fit_method, nb_iterations_for_bayesian_fit, params_initial_fit_bayesian, "Gumbel", params_class, max_degree) - @property - def nb_params(self): - return super().nb_params - 1 - - class StationaryGumbelAltitudinal(AbstractGumbelAltitudinalModel, StationaryAltitudinal): pass diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/polynomial_margin_model.py b/extreme_fit/model/margin_model/polynomial_margin_model/polynomial_margin_model.py index 7357cf84..a4567548 100644 --- a/extreme_fit/model/margin_model/polynomial_margin_model/polynomial_margin_model.py +++ b/extreme_fit/model/margin_model/polynomial_margin_model/polynomial_margin_model.py @@ -23,10 +23,6 @@ class PolynomialMarginModel(AbstractTemporalLinearMarginModel): params_initial_fit_bayesian, type_for_MLE, params_class, temporal_covariate_for_fit) self.max_degree = max_degree - @property - def nb_params(self): - return sum([c.nb_params for c in self.margin_function.param_name_to_coef.values()]) - @cached_property def margin_function(self) -> PolynomialMarginFunction: return super().margin_function diff --git a/extreme_fit/model/margin_model/spline_margin_model/spline_margin_model.py b/extreme_fit/model/margin_model/spline_margin_model/spline_margin_model.py index d13e746e..15c439b6 100644 --- a/extreme_fit/model/margin_model/spline_margin_model/spline_margin_model.py +++ b/extreme_fit/model/margin_model/spline_margin_model/spline_margin_model.py @@ -23,10 +23,6 @@ class SplineMarginModel(AbstractTemporalLinearMarginModel): params_initial_fit_bayesian, type_for_MLE, params_class, temporal_covariate_for_fit) self.max_degree = max_degree - @property - def nb_params(self): - return sum([c.nb_params for c in self.margin_function.param_name_to_coef.values()]) - @cached_property def margin_function(self) -> SplineMarginFunction: return super().margin_function -- GitLab