Commit 8a9c7fcb authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[contrasting] add altitudinal_models.py and fix for utils.py

parent 0bc9188a
No related merge requests found
Showing with 85 additions and 8 deletions
+85 -8
...@@ -52,7 +52,6 @@ class PolynomialAllCoef(LinearCoef): ...@@ -52,7 +52,6 @@ class PolynomialAllCoef(LinearCoef):
coordinates: AbstractCoordinates): coordinates: AbstractCoordinates):
degree0 = coef_dict[cls.coef_template_str(param_name, coefficient_name=cls.INTERCEPT_NAME).format(1)] degree0 = coef_dict[cls.coef_template_str(param_name, coefficient_name=cls.INTERCEPT_NAME).format(1)]
list_dim_and_max_degree = dims list_dim_and_max_degree = dims
j = 2
if len(list_dim_and_max_degree) == 0: if len(list_dim_and_max_degree) == 0:
dim_to_polynomial_coef = None dim_to_polynomial_coef = None
intercept = degree0 intercept = degree0
...@@ -61,8 +60,7 @@ class PolynomialAllCoef(LinearCoef): ...@@ -61,8 +60,7 @@ class PolynomialAllCoef(LinearCoef):
dim_to_polynomial_coef = {} dim_to_polynomial_coef = {}
for dim, max_degree in list_dim_and_max_degree: for dim, max_degree in list_dim_and_max_degree:
coefficient_name = coordinates.coordinates_names[dim] coefficient_name = coordinates.coordinates_names[dim]
if coefficient_name == AbstractCoordinates.COORDINATE_T: j = 1 if coefficient_name == AbstractCoordinates.COORDINATE_T else 2
j = 1
degree_to_coef = {0: degree0} degree_to_coef = {0: degree0}
for degree in range(1, max_degree + 1): for degree in range(1, max_degree + 1):
coef_value = coef_dict[cls.coef_template_str(param_name, coefficient_name).format(j)] coef_value = coef_dict[cls.coef_template_str(param_name, coefficient_name).format(j)]
......
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)],
})
...@@ -21,3 +21,12 @@ class NonStationaryLocationSpatioTemporalLinearityModel(AbstractSpatioTemporalPo ...@@ -21,3 +21,12 @@ class NonStationaryLocationSpatioTemporalLinearityModel(AbstractSpatioTemporalPo
(self.coordinates.idx_temporal_coordinates, 1), (self.coordinates.idx_temporal_coordinates, 1),
(self.coordinates.idx_x_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),
]})
from extreme_fit.model.margin_model.polynomial_margin_model.altitudinal_models import StationaryAltitudinal, \
NonStationaryAltitudinalLocationLinear, NonStationaryAltitudinalLocationQuadratic, \
NonStationaryAltitudinalLocationLinearScaleLinear, NonStationaryAltitudinalLocationQuadraticScaleLinear
ALTITUDINAL_MODELS = [
StationaryAltitudinal,
NonStationaryAltitudinalLocationLinear,
NonStationaryAltitudinalLocationQuadratic,
NonStationaryAltitudinalLocationLinearScaleLinear,
NonStationaryAltitudinalLocationQuadraticScaleLinear
][:]
...@@ -33,8 +33,9 @@ def get_margin_coef_ordered_dict(param_name_to_dims, mle_values, type_for_mle="G ...@@ -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] coef_dict[coef_name] = mle_values[i]
i += 1 i += 1
else: else:
# We assume that time was the first parameter # We found (thanks to the test) that time was the first parameter when len(param_name_to_dims) == 1
inverted_dims = 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: for dim, max_degree in inverted_dims:
coordinate_name = dim_to_coordinate_name[dim] coordinate_name = dim_to_coordinate_name[dim]
coef_template = LinearCoef.coef_template_str(param_name, coordinate_name) coef_template = LinearCoef.coef_template_str(param_name, coordinate_name)
......
...@@ -9,7 +9,8 @@ from extreme_fit.model.margin_model.polynomial_margin_model.polynomial_margin_mo ...@@ -9,7 +9,8 @@ from extreme_fit.model.margin_model.polynomial_margin_model.polynomial_margin_mo
NonStationaryQuadraticLocationModel, \ NonStationaryQuadraticLocationModel, \
NonStationaryQuadraticScaleModel, NonStationaryQuadraticLocationGumbelModel, NonStationaryQuadraticScaleGumbelModel NonStationaryQuadraticScaleModel, NonStationaryQuadraticLocationGumbelModel, NonStationaryQuadraticScaleGumbelModel
from extreme_fit.model.margin_model.polynomial_margin_model.spatio_temporal_polynomial_model import \ 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_trend.abstract_gev_trend_test import fitted_linear_margin_estimator
from extreme_fit.model.margin_model.utils import \ from extreme_fit.model.margin_model.utils import \
MarginFitMethod MarginFitMethod
...@@ -44,13 +45,22 @@ class TestGevTemporalQuadraticExtremesMle(unittest.TestCase): ...@@ -44,13 +45,22 @@ class TestGevTemporalQuadraticExtremesMle(unittest.TestCase):
estimator = model_fit.estimator_fold_1 estimator = model_fit.estimator_fold_1
return estimator return estimator
def test_location_spatio_temporal_linearity(self): def common_test(self, model_class):
estimator = self.get_estimator_fitted(NonStationaryLocationSpatioTemporalLinearityModel) estimator = self.get_estimator_fitted(model_class)
# Assert that indicators are correctly computed # 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.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.aic, estimator.aic(split=estimator.train_split))
self.assertAlmostEqual(estimator.result_from_model_fit.bic, estimator.bic(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__': if __name__ == '__main__':
unittest.main() unittest.main()
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment