diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py index f308053b5c5f5a0125ee377639b62b964f2aeb5a..a07ed9faa22f1e9eca1a68005ddf7a473890ceeb 100644 --- a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py +++ b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py @@ -10,6 +10,8 @@ from extreme_fit.function.abstract_quantile_function import AbstractQuantileFunc from extreme_fit.function.margin_function.abstract_margin_function import AbstractMarginFunction from extreme_fit.function.param_function.linear_coef import LinearCoef from extreme_fit.function.param_function.param_function import LinearParamFunction +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.model.quantile_model.quantile_regression_model import AbstractQuantileRegressionModel from extreme_fit.model.result_from_model_fit.abstract_result_from_model_fit import AbstractResultFromModelFit @@ -31,7 +33,7 @@ class AbstractQuantileEstimator(AbstractEstimator, ABC): class QuantileEstimatorFromMargin(LinearMarginEstimator, AbstractQuantileEstimator): - def __init__(self, dataset: AbstractDataset, margin_model: LinearMarginModel, quantile): + def __init__(self, dataset: AbstractDataset, margin_model: AbstractTemporalLinearMarginModel, quantile): super().__init__(dataset=dataset, quantile=quantile, margin_model=margin_model) @cached_property @@ -53,8 +55,10 @@ class QuantileRegressionEstimator(AbstractQuantileEstimator): def function_from_fit(self) -> AbstractQuantileFunction: result_from_model_fit = self.result_from_model_fit # type: ResultFromQuantreg coefs = result_from_model_fit.coefficients - dims = list(np.arange(len(coefs)) - 1) - linear_coef = LinearCoef('quantile', idx_to_coef=dict(zip(dims, coefs))) + nb_coefs = len(coefs) + dims = list(range(nb_coefs-1)) + idx_to_coef = dict(zip([-1] + dims, coefs)) + linear_coef = LinearCoef(idx_to_coef=idx_to_coef) param_function = LinearParamFunction(dims=dims, coordinates=self.dataset.coordinates.coordinates_values(), linear_coef=linear_coef) return QuantileFunctionFromParamFunction(coordinates=self.dataset.coordinates, diff --git a/extreme_fit/model/quantile_model/quantile_regression_model.py b/extreme_fit/model/quantile_model/quantile_regression_model.py index 66c99e29ea5e55111d5b49791a25e06a0f9a0638..88459f77fdb2e62006d6f9ca34f0b2cb51ec5792 100644 --- a/extreme_fit/model/quantile_model/quantile_regression_model.py +++ b/extreme_fit/model/quantile_model/quantile_regression_model.py @@ -4,6 +4,7 @@ from rpy2 import robjects from extreme_fit.model.abstract_model import AbstractModel from extreme_fit.model.result_from_model_fit.result_from_quantilreg import ResultFromQuantreg from extreme_fit.model.utils import r, safe_run_r_estimator, get_coord_df +from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset @@ -47,8 +48,10 @@ class ConstantQuantileRegressionModel(AbstractQuantileRegressionModel): return '1' -class AllCoordinatesQuantileRegressionModel(AbstractQuantileRegressionModel): +class TemporalCoordinatesQuantileRegressionModel(AbstractQuantileRegressionModel): @property def formula_str(self): - return '+'.join(self.dataset.coordinates.coordinates_names[-1:]) + assert self.dataset.coordinates.has_temporal_coordinates \ + and not self.dataset.coordinates.has_spatial_coordinates + return AbstractCoordinates.COORDINATE_T diff --git a/extreme_fit/model/result_from_model_fit/result_from_quantilreg.py b/extreme_fit/model/result_from_model_fit/result_from_quantilreg.py index d04af9289bbd7f29b0a2b8a5e68f90d1847b888c..4e72695211c3d2eadb1bac61f2b8307795710607 100644 --- a/extreme_fit/model/result_from_model_fit/result_from_quantilreg.py +++ b/extreme_fit/model/result_from_model_fit/result_from_quantilreg.py @@ -1,3 +1,4 @@ +import numpy as np from cached_property import cached_property from extreme_fit.function.param_function.param_function import LinearParamFunction @@ -8,4 +9,4 @@ class ResultFromQuantreg(AbstractResultFromModelFit): @property def coefficients(self): - return self.name_to_value['coefficients'] + return np.array(self.name_to_value['coefficients']) diff --git a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py index eea9482c13622fd4dc9e9c5501f368e6a3208a37..44840c15b830821ecb916fc2125c494855249851 100644 --- a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py +++ b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py @@ -2,29 +2,23 @@ import unittest from extreme_fit.estimator.quantile_estimator.abstract_quantile_estimator import QuantileEstimatorFromMargin, \ QuantileRegressionEstimator +from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel from spatio_temporal_dataset.dataset.simulation_dataset import MarginDataset from test.test_utils import load_test_1D_and_2D_spatial_coordinates, load_test_spatiotemporal_coordinates, \ - load_smooth_margin_models, load_smooth_quantile_model_classes + load_smooth_margin_models, load_smooth_quantile_model_classes, load_test_temporal_coordinates class TestQuantileEstimator(unittest.TestCase): DISPLAY = False - def test_smooth_margin_estimator_spatial(self): + def test_quantile_estimator_temporal(self): self.nb_points = 20 self.nb_obs = 1 - self.coordinates = load_test_1D_and_2D_spatial_coordinates(nb_points=self.nb_points)[:1] + self.coordinates = load_test_temporal_coordinates(nb_steps=self.nb_points) - def test_smooth_margin_estimator_spatio_temporal(self): - self.nb_points = 2 - self.nb_steps = 2 - self.nb_obs = 1 - self.coordinates = load_test_spatiotemporal_coordinates(nb_steps=self.nb_steps, nb_points=self.nb_points) - - def tearDown(self) -> None: quantile = 0.5 for coordinates in self.coordinates: - constant_margin_model = load_smooth_margin_models(coordinates=coordinates)[0] + constant_margin_model = StationaryTemporalModel(coordinates) dataset = MarginDataset.from_sampling(nb_obs=self.nb_obs, margin_model=constant_margin_model, coordinates=coordinates) @@ -32,7 +26,7 @@ class TestQuantileEstimator(unittest.TestCase): quantile_estimators = [ QuantileEstimatorFromMargin(dataset, constant_margin_model, quantile), ] - for quantile_model_class in load_smooth_quantile_model_classes()[:1]: + for quantile_model_class in load_smooth_quantile_model_classes()[:]: quantile_estimator = QuantileRegressionEstimator(dataset, quantile, quantile_model_class) quantile_estimators.append(quantile_estimator) diff --git a/test/test_utils.py b/test/test_utils.py index cb7e9e4175517c412d939ba9b1f248ccd1d5e934..169983c9d6c286e3be058298e3aac0c915460e73 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -18,7 +18,7 @@ from extreme_fit.model.max_stable_model.max_stable_models import Smith, BrownRes from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall, Safran, SafranRainfall, \ SafranTemperature, SafranPrecipitation from extreme_fit.model.quantile_model.quantile_regression_model import ConstantQuantileRegressionModel, \ - AllCoordinatesQuantileRegressionModel + TemporalCoordinatesQuantileRegressionModel from spatio_temporal_dataset.coordinates.spatial_coordinates.abstract_spatial_coordinates import \ AbstractSpatialCoordinates from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_3D_coordinates import \ @@ -43,7 +43,7 @@ TEST_3D_SPATIAL_COORDINATES = [AlpsStation3DCoordinatesWithAnisotropy] TEST_TEMPORAL_COORDINATES = [ConsecutiveTemporalCoordinates] TEST_SPATIO_TEMPORAL_COORDINATES = [UniformSpatioTemporalCoordinates, LinSpaceSpatial2DSpatioTemporalCoordinates] TEST_MARGIN_TYPES = [ConstantMarginModel, LinearAllParametersAllDimsMarginModel][:] -TEST_QUANTILES_TYPES = [ConstantQuantileRegressionModel, AllCoordinatesQuantileRegressionModel][:] +TEST_QUANTILES_TYPES = [ConstantQuantileRegressionModel, TemporalCoordinatesQuantileRegressionModel][:] TEST_NON_STATIONARY_TEMPORAL_MARGIN_TYPES = [NonStationaryLocationTemporalModel, NonStationaryScaleTemporalModel, NonStationaryShapeTemporalModel] TEST_MAX_STABLE_ESTIMATOR = [MaxStableEstimator]