From d161615a68a8cb1f3713332515b0a879c495895f Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Mon, 12 Apr 2021 17:01:53 +0200
Subject: [PATCH] [projection snowfall] fix error in one fold fit for the
temperature covariate & for the significance. modify number of parameters for
the spline, and only counts the number of coefficients and not the number of
knots.
---
extreme_fit/function/param_function/spline_coef.py | 3 ++-
.../result_from_extremes/result_from_evgam.py | 3 ++-
.../ensemble_fit/visualizer_for_projection_ensemble.py | 4 +++-
extreme_trend/one_fold_fit/one_fold_fit.py | 8 ++++++--
.../results/main_projections_ensemble.py | 7 +++----
.../results/plot_relative_change_in_return_level.py | 5 ++++-
.../test_temporal_estimator/test_gev_temporal_spline.py | 1 -
7 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/extreme_fit/function/param_function/spline_coef.py b/extreme_fit/function/param_function/spline_coef.py
index 0c62b8be..2552b5d7 100644
--- a/extreme_fit/function/param_function/spline_coef.py
+++ b/extreme_fit/function/param_function/spline_coef.py
@@ -29,7 +29,8 @@ class SplineCoef(AbstractCoef):
@property
def nb_params(self):
- return self.nb_knots + self.nb_coefficients
+ # return self.nb_knots + self.nb_coefficients
+ return self.nb_coefficients
class SplineAllCoef(LinearCoef):
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_evgam.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_evgam.py
index 70238d0f..9589e190 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_evgam.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_evgam.py
@@ -53,7 +53,8 @@ class ResultFromEvgam(AbstractResultFromExtremes):
@property
def nb_parameters(self):
- return len(np.array(self.name_to_value['coefficients'])) + self.nb_knots
+ # return len(np.array(self.name_to_value['coefficients'])) + self.nb_knots
+ return len(np.array(self.name_to_value['coefficients']))
@property
def aic(self):
diff --git a/extreme_trend/ensemble_fit/visualizer_for_projection_ensemble.py b/extreme_trend/ensemble_fit/visualizer_for_projection_ensemble.py
index 0a91aee9..60c8fba7 100644
--- a/extreme_trend/ensemble_fit/visualizer_for_projection_ensemble.py
+++ b/extreme_trend/ensemble_fit/visualizer_for_projection_ensemble.py
@@ -6,6 +6,8 @@ from extreme_data.meteo_france_data.adamont_data.adamont_gcm_rcm_couples import
from extreme_data.meteo_france_data.adamont_data.adamont_scenario import gcm_rcm_couple_to_str
from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy
from extreme_fit.distribution.gev.gev_params import GevParams
+from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
+ AbstractTemporalLinearMarginModel
from extreme_fit.model.margin_model.polynomial_margin_model.spatio_temporal_polynomial_model import \
AbstractSpatioTemporalPolynomialModel
from extreme_fit.model.margin_model.utils import MarginFitMethod
@@ -25,7 +27,7 @@ from projects.projected_extreme_snowfall.results.plot_relative_change_in_return_
class VisualizerForProjectionEnsemble(object):
def __init__(self, altitudes_list, gcm_rcm_couples, study_class, season, scenario,
- model_classes: List[AbstractSpatioTemporalPolynomialModel],
+ model_classes: List[AbstractTemporalLinearMarginModel],
ensemble_fit_classes=None,
massif_names=None,
fit_method=MarginFitMethod.extremes_fevd_mle,
diff --git a/extreme_trend/one_fold_fit/one_fold_fit.py b/extreme_trend/one_fold_fit/one_fold_fit.py
index 19396a19..57a523f5 100644
--- a/extreme_trend/one_fold_fit/one_fold_fit.py
+++ b/extreme_trend/one_fold_fit/one_fold_fit.py
@@ -13,6 +13,7 @@ from extreme_fit.distribution.gev.gev_params import GevParams
from extreme_fit.distribution.gumbel.gumbel_gof import goodness_of_fit_anderson
from extreme_fit.estimator.margin_estimator.utils import fitted_linear_margin_estimator_short
from extreme_fit.function.param_function.polynomial_coef import PolynomialAllCoef, PolynomialCoef
+from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel
from extreme_fit.model.margin_model.polynomial_margin_model.gev_altitudinal_models import StationaryAltitudinal
from extreme_fit.model.margin_model.polynomial_margin_model.gev_altitudinal_models_only_altitude_and_scale import \
AltitudinalOnlyScale, StationaryAltitudinalOnlyScale
@@ -209,7 +210,7 @@ class OneFoldFit(object):
return coordinate
def _compute_shape_for_reference_altitude(self, estimator):
- coordinate = self.get_coordinate(self.altitude_plot, self.last_year)
+ coordinate = self.get_coordinate(self.altitude_plot, self.covariate_after)
gev_params = estimator.function_from_fit.get_params(coordinate, is_transformed=False)
shape = gev_params.shape
return shape
@@ -296,7 +297,10 @@ class OneFoldFit(object):
elif isinstance(self.best_estimator.margin_model, AltitudinalShapeLinearTimeStationary):
return self.model_class_to_estimator_with_finite_aic[AltitudinalShapeLinearTimeStationary]
else:
- return self.model_class_to_estimator_with_finite_aic[StationaryAltitudinal]
+ if isinstance(self.altitude_group, DefaultAltitudeGroup):
+ return self.model_class_to_estimator_with_finite_aic[StationaryTemporalModel]
+ else:
+ return self.model_class_to_estimator_with_finite_aic[StationaryAltitudinal]
@property
def likelihood_ratio(self):
diff --git a/projects/projected_extreme_snowfall/results/main_projections_ensemble.py b/projects/projected_extreme_snowfall/results/main_projections_ensemble.py
index 79cf3832..7b68fbc9 100644
--- a/projects/projected_extreme_snowfall/results/main_projections_ensemble.py
+++ b/projects/projected_extreme_snowfall/results/main_projections_ensemble.py
@@ -50,13 +50,13 @@ def main():
AbstractExtractEurocodeReturnLevel.ALPHA_CONFIDENCE_INTERVAL_UNCERTAINTY = 0.2
scenarios = [AdamontScenario.rcp85_extended]
- fast = True
+ fast = None
for scenario in scenarios:
gcm_rcm_couples = get_gcm_rcm_couples(scenario)
if fast is None:
- gcm_rcm_couples = gcm_rcm_couples[:2]
+ gcm_rcm_couples = gcm_rcm_couples[:]
AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10
- altitudes_list = [1800, 2100]
+ altitudes_list = [900, 1800, 2700, 3600]
elif fast:
gcm_rcm_couples = gcm_rcm_couples[:2]
AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10
@@ -81,7 +81,6 @@ def main():
massif_names = ['Vanoise']
model_classes = SPLINE_MODELS_FOR_PROJECTION_ONE_ALTITUDE
-
visualizer = VisualizerForProjectionEnsemble(
altitudes_list, gcm_rcm_couples, study_class, Season.annual, scenario,
model_classes=model_classes,
diff --git a/projects/projected_extreme_snowfall/results/plot_relative_change_in_return_level.py b/projects/projected_extreme_snowfall/results/plot_relative_change_in_return_level.py
index 34a9db8d..8a132222 100644
--- a/projects/projected_extreme_snowfall/results/plot_relative_change_in_return_level.py
+++ b/projects/projected_extreme_snowfall/results/plot_relative_change_in_return_level.py
@@ -5,6 +5,7 @@ import numpy as np
from extreme_trend.one_fold_fit.altitudes_studies_visualizer_for_non_stationary_models import \
AltitudesStudiesVisualizerForNonStationaryModels
+from root_utils import get_display_name_from_object_type
from spatio_temporal_dataset.coordinates.temporal_coordinates.temperature_covariate import \
AnomalyTemperatureWithSplineTemporalCovariate
@@ -31,8 +32,10 @@ def plot_relative_dynamic_in_return_level(massif_names, visualizer_list: List[
def plot_curve(ax, massif_name, visualizer: AltitudesStudiesVisualizerForNonStationaryModels):
- temperatures_list = np.linspace(1, 4, num=4)
+ temperatures_list = np.linspace(1, 5, num=40)
one_fold_fit = visualizer.massif_name_to_one_fold_fit[massif_name]
+ print(get_display_name_from_object_type(type(one_fold_fit.best_margin_model)),
+ "significant={}".format(one_fold_fit.is_significant))
return_levels = [one_fold_fit.relative_changes_of_moment([None], order=None,
covariate_before=1,
covariate_after=t)[0] for t in temperatures_list]
diff --git a/test/test_extreme_fit/test_estimator/test_temporal_estimator/test_gev_temporal_spline.py b/test/test_extreme_fit/test_estimator/test_temporal_estimator/test_gev_temporal_spline.py
index ee0c2b99..4d1dfdd7 100644
--- a/test/test_extreme_fit/test_estimator/test_temporal_estimator/test_gev_temporal_spline.py
+++ b/test/test_extreme_fit/test_estimator/test_temporal_estimator/test_gev_temporal_spline.py
@@ -52,7 +52,6 @@ class TestGevTemporalSpline(unittest.TestCase):
starting_year=None,
fit_method=self.fit_method)
# Checks that parameters returned are indeed different
- print(self.start_year, self.middle_year, self.last_year)
mle_params_estimated_year_first = estimator.function_from_fit.get_params(np.array([self.start_year])).to_dict()
mle_params_estimated_year_middle = estimator.function_from_fit.get_params(np.array([self.middle_year])).to_dict()
mle_params_estimated_year_last = estimator.function_from_fit.get_params(np.array([self.last_year])).to_dict()
--
GitLab