diff --git a/extreme_fit/function/param_function/polynomial_coef.py b/extreme_fit/function/param_function/polynomial_coef.py index 6a81f2249b289cd37d6367ef74bc322e1404a4e1..5a1da889739a90209275061632746e96f90e10cd 100644 --- a/extreme_fit/function/param_function/polynomial_coef.py +++ b/extreme_fit/function/param_function/polynomial_coef.py @@ -52,7 +52,6 @@ class PolynomialAllCoef(LinearCoef): coordinates: AbstractCoordinates): degree0 = coef_dict[cls.coef_template_str(param_name, coefficient_name=cls.INTERCEPT_NAME).format(1)] list_dim_and_max_degree = dims - j = 2 if len(list_dim_and_max_degree) == 0: dim_to_polynomial_coef = None intercept = degree0 @@ -61,8 +60,7 @@ class PolynomialAllCoef(LinearCoef): dim_to_polynomial_coef = {} for dim, max_degree in list_dim_and_max_degree: coefficient_name = coordinates.coordinates_names[dim] - if coefficient_name == AbstractCoordinates.COORDINATE_T: - j = 1 + j = 1 if coefficient_name == AbstractCoordinates.COORDINATE_T else 2 degree_to_coef = {0: degree0} for degree in range(1, max_degree + 1): coef_value = coef_dict[cls.coef_template_str(param_name, coefficient_name).format(j)] diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/altitudinal_models.py b/extreme_fit/model/margin_model/polynomial_margin_model/altitudinal_models.py new file mode 100644 index 0000000000000000000000000000000000000000..7b2c68d1b906516b53989f1ab2cb1c44b8205906 --- /dev/null +++ b/extreme_fit/model/margin_model/polynomial_margin_model/altitudinal_models.py @@ -0,0 +1,48 @@ +from extreme_fit.distribution.gev.gev_params import GevParams +from extreme_fit.model.margin_model.polynomial_margin_model.spatio_temporal_polynomial_model import \ + AbstractSpatioTemporalPolynomialModel + + +class StationaryAltitudinal(AbstractSpatioTemporalPolynomialModel): + + def load_margin_function(self, param_name_to_dims=None): + return super().load_margin_function({ + GevParams.LOC: [(self.coordinates.idx_x_coordinates, 1)], + GevParams.SCALE: [(self.coordinates.idx_x_coordinates, 1)] + }) + + +class NonStationaryAltitudinalLocationLinear(AbstractSpatioTemporalPolynomialModel): + + def load_margin_function(self, param_name_to_dims=None): + return super().load_margin_function({ + GevParams.LOC: [(self.coordinates.idx_x_coordinates, 1), (self.coordinates.idx_temporal_coordinates, 1)], + GevParams.SCALE: [(self.coordinates.idx_x_coordinates, 1)] + }) + + +class NonStationaryAltitudinalLocationQuadratic(AbstractSpatioTemporalPolynomialModel): + + def load_margin_function(self, param_name_to_dims=None): + return super().load_margin_function({ + GevParams.LOC: [(self.coordinates.idx_x_coordinates, 1), (self.coordinates.idx_temporal_coordinates, 2)], + GevParams.SCALE: [(self.coordinates.idx_x_coordinates, 1)] + }) + + +class NonStationaryAltitudinalLocationLinearScaleLinear(AbstractSpatioTemporalPolynomialModel): + + def load_margin_function(self, param_name_to_dims=None): + return super().load_margin_function({ + GevParams.LOC: [(self.coordinates.idx_x_coordinates, 1), (self.coordinates.idx_temporal_coordinates, 1)], + GevParams.SCALE: [(self.coordinates.idx_x_coordinates, 1), (self.coordinates.idx_temporal_coordinates, 1)], + }) + + +class NonStationaryAltitudinalLocationQuadraticScaleLinear(AbstractSpatioTemporalPolynomialModel): + + def load_margin_function(self, param_name_to_dims=None): + return super().load_margin_function({ + GevParams.LOC: [(self.coordinates.idx_x_coordinates, 1), (self.coordinates.idx_temporal_coordinates, 2)], + GevParams.SCALE: [(self.coordinates.idx_x_coordinates, 1), (self.coordinates.idx_temporal_coordinates, 1)], + }) diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/spatio_temporal_polynomial_model.py b/extreme_fit/model/margin_model/polynomial_margin_model/spatio_temporal_polynomial_model.py index 4f9cde3d24d1b35d0030f7542b5b02757d44e81f..b862e2abf8d70f3cc8d9cd6ad32931f783fa6a2e 100644 --- a/extreme_fit/model/margin_model/polynomial_margin_model/spatio_temporal_polynomial_model.py +++ b/extreme_fit/model/margin_model/polynomial_margin_model/spatio_temporal_polynomial_model.py @@ -21,3 +21,12 @@ class NonStationaryLocationSpatioTemporalLinearityModel(AbstractSpatioTemporalPo (self.coordinates.idx_temporal_coordinates, 1), (self.coordinates.idx_x_coordinates, 1), ]}) + + +class NonStationaryLocationSpatioTemporalLinearityModel2(AbstractSpatioTemporalPolynomialModel): + + def load_margin_function(self, param_name_to_dims=None): + return super().load_margin_function({GevParams.LOC: [ + (self.coordinates.idx_temporal_coordinates, 2), + (self.coordinates.idx_x_coordinates, 1), + ]}) diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/utils.py b/extreme_fit/model/margin_model/polynomial_margin_model/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..acd15190a3f0f7a81ce9bbfa296b1043180b0d49 --- /dev/null +++ b/extreme_fit/model/margin_model/polynomial_margin_model/utils.py @@ -0,0 +1,11 @@ +from extreme_fit.model.margin_model.polynomial_margin_model.altitudinal_models import StationaryAltitudinal, \ + NonStationaryAltitudinalLocationLinear, NonStationaryAltitudinalLocationQuadratic, \ + NonStationaryAltitudinalLocationLinearScaleLinear, NonStationaryAltitudinalLocationQuadraticScaleLinear + +ALTITUDINAL_MODELS = [ + StationaryAltitudinal, + NonStationaryAltitudinalLocationLinear, + NonStationaryAltitudinalLocationQuadratic, + NonStationaryAltitudinalLocationLinearScaleLinear, + NonStationaryAltitudinalLocationQuadraticScaleLinear +][:] diff --git a/extreme_fit/model/result_from_model_fit/utils.py b/extreme_fit/model/result_from_model_fit/utils.py index 844639a5ece8bd899ce61fddd88a90e413ec7132..35c0dada51ecd79401d54709810c133fbab01764 100644 --- a/extreme_fit/model/result_from_model_fit/utils.py +++ b/extreme_fit/model/result_from_model_fit/utils.py @@ -33,8 +33,9 @@ def get_margin_coef_ordered_dict(param_name_to_dims, mle_values, type_for_mle="G coef_dict[coef_name] = mle_values[i] i += 1 else: - # We assume that time was the first parameter - inverted_dims = dims[::-1] + # We found (thanks to the test) that time was the first parameter when len(param_name_to_dims) == 1 + # otherwise time is the second parameter in the order of the mle parameters + inverted_dims = dims[::-1] if len(param_name_to_dims) == 1 else dims for dim, max_degree in inverted_dims: coordinate_name = dim_to_coordinate_name[dim] coef_template = LinearCoef.coef_template_str(param_name, coordinate_name) diff --git a/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py b/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py index cba6e6f96298736bc55b8d9c99ec0daa2b46ff4c..7d336ecdaee4f749876fb1e1dd99718fe1ce9fa9 100644 --- a/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py +++ b/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py @@ -9,7 +9,8 @@ from extreme_fit.model.margin_model.polynomial_margin_model.polynomial_margin_mo NonStationaryQuadraticLocationModel, \ NonStationaryQuadraticScaleModel, NonStationaryQuadraticLocationGumbelModel, NonStationaryQuadraticScaleGumbelModel from extreme_fit.model.margin_model.polynomial_margin_model.spatio_temporal_polynomial_model import \ - NonStationaryLocationSpatioTemporalLinearityModel + NonStationaryLocationSpatioTemporalLinearityModel, NonStationaryLocationSpatioTemporalLinearityModel2 +from extreme_fit.model.margin_model.polynomial_margin_model.utils import ALTITUDINAL_MODELS from extreme_trend.abstract_gev_trend_test import fitted_linear_margin_estimator from extreme_fit.model.margin_model.utils import \ MarginFitMethod @@ -44,13 +45,22 @@ class TestGevTemporalQuadraticExtremesMle(unittest.TestCase): estimator = model_fit.estimator_fold_1 return estimator - def test_location_spatio_temporal_linearity(self): - estimator = self.get_estimator_fitted(NonStationaryLocationSpatioTemporalLinearityModel) + def common_test(self, model_class): + estimator = self.get_estimator_fitted(model_class) # Assert that indicators are correctly computed self.assertAlmostEqual(estimator.result_from_model_fit.nllh, estimator.nllh(split=estimator.train_split)) self.assertAlmostEqual(estimator.result_from_model_fit.aic, estimator.aic(split=estimator.train_split)) self.assertAlmostEqual(estimator.result_from_model_fit.bic, estimator.bic(split=estimator.train_split)) + def test_location_spatio_temporal_models(self): + for model_class in [NonStationaryLocationSpatioTemporalLinearityModel, + NonStationaryLocationSpatioTemporalLinearityModel2]: + self.common_test(model_class) + + def test_altitudinal_models(self): + for model_class in ALTITUDINAL_MODELS: + self.common_test(model_class) + if __name__ == '__main__': unittest.main()