diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/gev_altitudinal_models.py b/extreme_fit/model/margin_model/polynomial_margin_model/gev_altitudinal_models.py index f5612e2b6928d7fe23d7b28c2d9e59526914232e..dadc236f55c180066251165a99bfe93797bb3881 100644 --- a/extreme_fit/model/margin_model/polynomial_margin_model/gev_altitudinal_models.py +++ b/extreme_fit/model/margin_model/polynomial_margin_model/gev_altitudinal_models.py @@ -43,7 +43,11 @@ class AbstractAltitudinalModel(AbstractSpatioTemporalPolynomialModel): s += '^2' if self.dim_to_str_number(GevParams.SCALE, self.coordinates.idx_temporal_coordinates) in ['1', '2']: s += '\\sigma_t' - if self.dim_to_str_number(GevParams.LOC, self.coordinates.idx_temporal_coordinates) == '2': + if self.dim_to_str_number(GevParams.SCALE, self.coordinates.idx_temporal_coordinates) == '2': + s += '^2' + if self.dim_to_str_number(GevParams.SHAPE, self.coordinates.idx_temporal_coordinates) in ['1', '2']: + s += '\\zeta_t' + if self.dim_to_str_number(GevParams.SHAPE, self.coordinates.idx_temporal_coordinates) == '2': s += '^2' if len(s) == 0: s = '0' diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/utils.py b/extreme_fit/model/margin_model/polynomial_margin_model/utils.py index 3675b84d8d20e11a685858721cbc50d11aafa693..f6e37ed3c7b31d53208b0a2ecb5a4447d19d237b 100644 --- a/extreme_fit/model/margin_model/polynomial_margin_model/utils.py +++ b/extreme_fit/model/margin_model/polynomial_margin_model/utils.py @@ -105,18 +105,22 @@ ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS = [ StationaryAltitudinal, AltitudinalShapeConstantTimeLocationLinear, AltitudinalShapeConstantTimeScaleLinear, - # AltitudinalShapeConstantTimeShapeLinear, - # AltitudinalShapeConstantTimeLocShapeLinear, + AltitudinalShapeConstantTimeLocScaleLinear, - # AltitudinalShapeConstantTimeScaleShapeLinear, - # AltitudinalShapeConstantTimeLocScaleShapeLinear, + # With a linear shape for the altitude (8 models) AltitudinalShapeLinearTimeStationary, AltitudinalShapeLinearTimeLocationLinear, AltitudinalShapeLinearTimeScaleLinear, + + AltitudinalShapeLinearTimeLocScaleLinear, + + # AltitudinalShapeConstantTimeShapeLinear, + # AltitudinalShapeConstantTimeLocShapeLinear, + # AltitudinalShapeConstantTimeScaleShapeLinear, + # AltitudinalShapeConstantTimeLocScaleShapeLinear, # AltitudinalShapeLinearTimeShapeLinear, # AltitudinalShapeLinearTimeLocShapeLinear, - AltitudinalShapeLinearTimeLocScaleLinear, # AltitudinalShapeLinearTimeScaleShapeLinear, # AltitudinalShapeLinearTimeLocScaleShapeLinear, diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py index ec86cb4ae69b294a789f727ced9bd03280e359c0..4870914970d9502bd0266d3d6967617ea5653f02 100644 --- a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py +++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py @@ -62,6 +62,7 @@ class AbstractResultFromExtremes(AbstractResultFromModelFit): if self.param_name_to_dim: d = {GevParams.greek_letter_from_param_name(param_name) + '1': r.c(transformed_temporal_covariate) for param_name in self.param_name_to_dim.keys()} + print(d) kwargs = { "vals": r.list(**d ) diff --git a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py index fff0c98828714a37e5c6693898d021b31485ace7..6221655315816d1c053a51adf8f16a65839d174c 100644 --- a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py @@ -139,9 +139,11 @@ class AltitudesStudies(object): plot_name = 'Annual maxima of {} in {}'.format(SCM_STUDY_CLASS_TO_ABBREVIATION[self.study_class], massif_name.replace('_', ' ')) ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15) + plot_name = 'time series/' + plot_name ax.set_xlabel('years', fontsize=15) self.show_or_save_to_file(plot_name=plot_name, show=show, no_title=True) ax.clear() + plt.close() def plot_mean_maxima_against_altitude(self, massif_names=None, show=False, std=False, change=False): ax = plt.gca() diff --git a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py index 2f8106d0599e0f973943c8f7ef7f0725de9fecc0..af7bb0a0fdfc2c17bb0ffc03fa5db447886a1a1e 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py @@ -47,7 +47,7 @@ def main(): # massif_names = ['Mercantour', 'Vercors', 'Ubaye'] seasons = [Season.annual, Season.winter, Season.spring, Season.automn][:1] - main_loop(altitudes_for_groups[:1], massif_names, seasons, study_classes) + main_loop(altitudes_for_groups[:], massif_names, seasons, study_classes) def main_loop(altitudes_list, massif_names, seasons, study_classes): @@ -68,6 +68,7 @@ def main_loop(altitudes_list, massif_names, seasons, study_classes): time.sleep(2) + def load_visualizer_list(season, study_class, altitudes_list, massif_names): model_classes = ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS visualizer_list = [] @@ -107,7 +108,7 @@ def plots(massif_names, season, visualizer): print('inner loop', season, type(studies.study)) # Plot time series - # studies.plot_maxima_time_series(massif_names=massif_names) + studies.plot_maxima_time_series(massif_names=massif_names) # Plot moments # for std in [True, False][:]: diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py index 9092fac1a0adae1351204cb87dc8962104682034..786a8684223d0bf7ec0c78c69edc405dff4508e5 100644 --- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py @@ -5,8 +5,10 @@ altitudes_for_groups = [ [300, 600, 900], [1200, 1500, 1800], [2100, 2400, 2700], - [3000, 3300, 3600] + [3000, 3300, 3600, 3900] ] + + # altitudes_for_groups = [ # [900, 1200, 1500], # [1800, 2100, 2400], @@ -63,6 +65,7 @@ class HighAltitudeGroup(AbstractAltitudeGroup): def reference_altitude(self): return 2400 + class VeyHighAltitudeGroup(AbstractAltitudeGroup): @property diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py index 2674d546dd1879ee9898b874dc385c802e765149..a963c82d82ee661e6d05ab1eab49715828cd6f16 100644 --- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py @@ -21,7 +21,7 @@ from extreme_fit.model.margin_model.polynomial_margin_model.spatio_temporal_poly from extreme_fit.model.margin_model.utils import MarginFitMethod from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitude_group import \ - get_altitude_group_from_altitudes, HighAltitudeGroup + get_altitude_group_from_altitudes, HighAltitudeGroup, VeyHighAltitudeGroup from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.one_fold_fit import \ OneFoldFit from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates @@ -50,12 +50,12 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): # Load one fold fit self._massif_name_to_one_fold_fit = {} for massif_name in self.massif_names: - if any([massif_name in study.study_massif_names for study in self.studies.altitude_to_study.values()]): + if self.load_condition(massif_name): # Load dataset dataset = studies.spatio_temporal_dataset(massif_name=massif_name) - # dataset_without_zero = AbstractDataset.remove_zeros(dataset.observations, - # dataset.coordinates) - old_fold_fit = OneFoldFit(massif_name, dataset, model_classes, self.fit_method, + dataset_without_zero = AbstractDataset.remove_zeros(dataset.observations, + dataset.coordinates) + old_fold_fit = OneFoldFit(massif_name, dataset_without_zero, model_classes, self.fit_method, self.temporal_covariate_for_fit, type(self.altitude_group), self.display_only_model_that_pass_anderson_test) @@ -66,7 +66,12 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): self._max_abs_for_shape = None moment_names = ['moment', 'changes_for_moment', 'relative_changes_for_moment'][:] - orders = [1, 2, None][:] + orders = [1, 2, None][2:] + + def load_condition(self, massif_name): + altitudes_for_massif = [altitude for altitude, study in self.studies.altitude_to_study.items() + if massif_name in study.study_massif_names] + return (self.altitude_group.reference_altitude in altitudes_for_massif) and (len(altitudes_for_massif) >= 2) @property def massif_name_to_one_fold_fit(self) -> Dict[str, OneFoldFit]: @@ -132,7 +137,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): @property def add_colorbar(self): - return isinstance(self.altitude_group, HighAltitudeGroup) + return isinstance(self.altitude_group, VeyHighAltitudeGroup) def plot_against_years(self, method_name, order): ax = plt.gca() diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py index 11cfef9587ec541da2d83309dac3194d40be604d..cb2d665122942023f1029fca96ef092f9732e7e8 100644 --- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py @@ -15,6 +15,10 @@ from extreme_fit.model.margin_model.polynomial_margin_model.gumbel_altitudinal_m from extreme_fit.model.margin_model.polynomial_margin_model.models_based_on_pariwise_analysis.gev_with_linear_shape_wrt_altitude import \ AltitudinalShapeLinearTimeStationary from extreme_fit.model.margin_model.utils import MarginFitMethod +from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_interval_method import \ + ConfidenceIntervalMethodFromExtremes +from extreme_fit.model.result_from_model_fit.result_from_extremes.eurocode_return_level_uncertainties import \ + EurocodeConfidenceIntervalFromExtremes from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitude_group import AbstractAltitudeGroup, \ DefaultAltitudeGroup from root_utils import classproperty @@ -110,6 +114,17 @@ class OneFoldFit(object): sorted_estimators = sorted([estimator for estimator in estimators], key=lambda e: e.aic()) return sorted_estimators + @cached_property + def sorted_estimators_with_stationary(self): + if self.only_models_that_pass_anderson_test: + return [e for e in self.sorted_estimators if self.goodness_of_fit_test(e)] + else: + return self._sorted_estimators_without_stationary + + @property + def has_at_least_one_valid_model(self): + return len(self.sorted_estimators_with_stationary) > 0 + @cached_property def _sorted_estimators_without_stationary(self): return [e for e in self.sorted_estimators if not isinstance(e.margin_model, StationaryAltitudinal)] @@ -134,8 +149,13 @@ class OneFoldFit(object): if self.best_estimator_minimizes_total_aic and self.best_estimator_class_for_total_aic is not None: return self.model_class_to_estimator[self.best_estimator_class_for_total_aic] else: - if self.has_at_least_one_valid_non_stationary_model: - best_estimator = self.sorted_estimators_without_stationary[0] + # Without stationary + # if self.has_at_least_one_valid_non_stationary_model: + # best_estimator = self.sorted_estimators_without_stationary[0] + # return best_estimator + # With stationary + if self.has_at_least_one_valid_model: + best_estimator = self.sorted_estimators_with_stationary[0] return best_estimator else: raise ValueError('This should not happen') @@ -169,7 +189,10 @@ class OneFoldFit(object): def best_name(self): name = self.best_estimator.margin_model.name_str latex_command = 'textbf' if self.is_significant else 'textrm' - return '$\\' + latex_command + '{' + name + '}$' + best_name = '$\\' + latex_command + '{' + name + '}$' + if self.is_significant: + best_name = '\\underline{' + best_name + '}' + return best_name # Significant @@ -181,6 +204,8 @@ class OneFoldFit(object): return self.model_class_to_estimator_with_finite_aic[StationaryAltitudinalOnlyScale] elif isinstance(self.best_estimator.margin_model, AltitudinalShapeLinearTimeStationary): return self.model_class_to_estimator_with_finite_aic[AltitudinalShapeLinearTimeStationary] + 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] @@ -194,7 +219,7 @@ class OneFoldFit(object): @property def is_significant(self) -> bool: - stationary_model_classes = [StationaryAltitudinal, StationaryGumbelAltitudinal] + stationary_model_classes = [StationaryAltitudinal, StationaryGumbelAltitudinal, AltitudinalShapeLinearTimeStationary] if any([isinstance(self.best_estimator.margin_model, c) for c in stationary_model_classes]): return False @@ -233,3 +258,8 @@ class OneFoldFit(object): empirical_quantiles.append(maximum_standardized) empirical_quantiles = sorted(empirical_quantiles) return empirical_quantiles + + # def best_confidence_interval(self): + # EurocodeConfidenceIntervalFromExtremes.from_estimator_extremes(self.best_estimator, + # ci_method=ConfidenceIntervalMethodFromExtremes.ci_mle, + # temporal_covariate=np.array([2019, self.altitude_plot]),) \ No newline at end of file