From 58bff8c71f0a24f00fa68589c74739bc606d835a Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Wed, 17 Jul 2019 15:27:01 +0200 Subject: [PATCH] [GEV TREND TEST] add gev trend test two parameters (for Location and scale parameters). IMPORTANT: Now the definition of test sign correspond to the sign of the strength (i.e. the increase with respect to some quantile) --- ...main3_non_stationary_strength_evolution.py | 7 +++--- experiment/paper1_steps/utils.py | 9 ++----- .../abstract_gev_trend_test.py | 11 ++++++-- .../gev_trend_test_one_parameter.py | 16 +++++------- .../gev_trend_test_two_parameters.py | 25 +++++++++++++++++++ .../temporal_linear_margin_model.py | 15 +++++++++++ 6 files changed, 61 insertions(+), 22 deletions(-) diff --git a/experiment/paper1_steps/hard extreme evolution - annual maxima/main3_non_stationary_strength_evolution.py b/experiment/paper1_steps/hard extreme evolution - annual maxima/main3_non_stationary_strength_evolution.py index 7801d504..5ec783b1 100644 --- a/experiment/paper1_steps/hard extreme evolution - annual maxima/main3_non_stationary_strength_evolution.py +++ b/experiment/paper1_steps/hard extreme evolution - annual maxima/main3_non_stationary_strength_evolution.py @@ -4,6 +4,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visual Altitude_Hypercube_Year_Visualizer from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevScaleTrendTest, \ GevLocationTrendTest +from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest """ Visualize the 0.99 quantile initial value and its evolution @@ -15,14 +16,14 @@ def main_fast_spatial_risk_evolution(): for altitude in FULL_ALTITUDES[-1:]: vizualiser = get_full_altitude_visualizer(Altitude_Hypercube_Year_Visualizer, altitude=altitude, exact_starting_year=1958, reduce_strength_array=True, - trend_test_class=GevScaleTrendTest) - # vizualiser.save_to_file = False + trend_test_class=GevLocationAndScaleTrendTest) + vizualiser.save_to_file = False vizualiser.visualize_massif_trend_test_one_altitude() def main_full_spatial_risk_evolution(): for altitude in FULL_ALTITUDES[:]: - for trend_test_class in [GevLocationTrendTest, GevScaleTrendTest][:]: + for trend_test_class in [GevLocationTrendTest, GevScaleTrendTest, GevLocationAndScaleTrendTest][-1:]: vizualiser = get_full_altitude_visualizer(Altitude_Hypercube_Year_Visualizer, altitude=altitude, exact_starting_year=1958, reduce_strength_array=True, trend_test_class=trend_test_class) diff --git a/experiment/paper1_steps/utils.py b/experiment/paper1_steps/utils.py index 290d2b10..615a4b9a 100644 --- a/experiment/paper1_steps/utils.py +++ b/experiment/paper1_steps/utils.py @@ -1,21 +1,16 @@ -import time - from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusRecentSwe -from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_year_hypercube_visualizer import \ - Altitude_Hypercube_Year_Visualizer from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.main_files.main_full_hypercube import \ get_full_parameters from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.utils_hypercube import \ load_altitude_visualizer -from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import GevScaleChangePointTest, \ - GevLocationChangePointTest +from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest FULL_ALTITUDES = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000] def get_full_altitude_visualizer(altitude_hypercube_class, exact_starting_year=None, altitude=900, reduce_strength_array=False, - trend_test_class = GevLocationChangePointTest): + trend_test_class = GevLocationTrendTest): altitudes, first_starting_year, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, _ = get_full_parameters( altitude=altitude) if exact_starting_year is not None: diff --git a/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py b/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py index 24381cc7..e3584e95 100644 --- a/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py +++ b/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py @@ -25,9 +25,8 @@ class AbstractGevTrendTest(AbstractUnivariateTest): quantile_for_strength = 0.98 nb_years_for_quantile_evolution = 10 - def __init__(self, years, maxima, starting_year, non_stationary_model_class, gev_param_name): + def __init__(self, years, maxima, starting_year, non_stationary_model_class): super().__init__(years, maxima, starting_year) - self.gev_param_name = gev_param_name df = pd.DataFrame({AbstractCoordinates.COORDINATE_T: years}) df_maxima_gev = pd.DataFrame(maxima, index=df.index) observations = AbstractSpatioTemporalObservations(df_maxima_gev=df_maxima_gev) @@ -104,6 +103,14 @@ class AbstractGevTrendTest(AbstractUnivariateTest): # Evolution of the GEV parameters and corresponding quantiles + @property + def test_sign(self) -> int: + return np.sign(self.test_trend_slope_strength) + + def get_non_stationary_linear_coef(self, gev_param_name): + return self.non_stationary_estimator.margin_function_fitted.get_coef(gev_param_name, + AbstractCoordinates.COORDINATE_T) + @property def non_stationary_constant_gev_params(self) -> GevParams: return self.non_stationary_estimator.result_from_fit.constant_gev_params diff --git a/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py b/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py index 87967e03..3456aac8 100644 --- a/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py +++ b/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py @@ -1,26 +1,22 @@ from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest -from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import StationaryStationModel, \ +from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import \ NonStationaryLocationStationModel, NonStationaryScaleStationModel, NonStationaryShapeStationModel from extreme_estimator.margin_fits.gev.gev_params import GevParams -import numpy as np - -from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates class GevTrendTestOneParameter(AbstractGevTrendTest): + def __init__(self, years, maxima, starting_year, non_stationary_model_class, gev_param_name): + super().__init__(years, maxima, starting_year, non_stationary_model_class) + self.gev_param_name = gev_param_name + @property def degree_freedom_chi2(self) -> int: return 1 - @property - def test_sign(self) -> int: - return np.sign(self.non_stationary_linear_coef) - @property def non_stationary_linear_coef(self): - return self.non_stationary_estimator.margin_function_fitted.get_coef(self.gev_param_name, - AbstractCoordinates.COORDINATE_T) + return self.get_non_stationary_linear_coef(gev_param_name=self.gev_param_name) class GevLocationTrendTest(GevTrendTestOneParameter): diff --git a/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py b/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py index e69de29b..2cae0378 100644 --- a/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py +++ b/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py @@ -0,0 +1,25 @@ +from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest +from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import \ + NonStationaryLocationAndScaleModel +from extreme_estimator.margin_fits.gev.gev_params import GevParams + + +class GevTrendTestTwoParameters(AbstractGevTrendTest): + + @property + def degree_freedom_chi2(self) -> int: + return 2 + + +class GevLocationAndScaleTrendTest(GevTrendTestTwoParameters): + + def __init__(self, years, maxima, starting_year): + super().__init__(years, maxima, starting_year, + NonStationaryLocationAndScaleModel) + + def _slope_strength(self): + mu1 = self.get_non_stationary_linear_coef(gev_param_name=GevParams.LOC) + sigma1 = self.get_non_stationary_linear_coef(gev_param_name=GevParams.SCALE) + return self.non_stationary_constant_gev_params.quantile_strength_evolution_ratio(p=self.quantile_for_strength, + mu1=mu1, + sigma1=sigma1) diff --git a/extreme_estimator/extreme_models/margin_model/temporal_linear_margin_model.py b/extreme_estimator/extreme_models/margin_model/temporal_linear_margin_model.py index 6c7b064c..90d95ba1 100644 --- a/extreme_estimator/extreme_models/margin_model/temporal_linear_margin_model.py +++ b/extreme_estimator/extreme_models/margin_model/temporal_linear_margin_model.py @@ -72,3 +72,18 @@ class NonStationaryShapeStationModel(TemporalLinearMarginModel): @property def shl(self): return 1 + + +class NonStationaryLocationAndScaleModel(TemporalLinearMarginModel): + + def load_margin_functions(self, gev_param_name_to_dims=None): + super().load_margin_functions({GevParams.LOC: [self.coordinates.idx_temporal_coordinates], + GevParams.SCALE: [self.coordinates.idx_temporal_coordinates]}) + + @property + def mul(self): + return 1 + + @property + def sigl(self): + return 1 -- GitLab