Commit aae23816 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[contrasting] add coordinate_name_to_dim, and use it to extract results

parent 7e43b6ce
No related merge requests found
Showing with 37 additions and 19 deletions
+37 -19
...@@ -42,9 +42,8 @@ class LinearMarginFunction(ParametricMarginFunction): ...@@ -42,9 +42,8 @@ class LinearMarginFunction(ParametricMarginFunction):
def idx_to_coefficient_name(cls, coordinates: AbstractCoordinates) -> Dict[int, str]: def idx_to_coefficient_name(cls, coordinates: AbstractCoordinates) -> Dict[int, str]:
# Intercept correspond to the dimension 0 # Intercept correspond to the dimension 0
idx_to_coefficient_name = {-1: LinearCoef.INTERCEPT_NAME} idx_to_coefficient_name = {-1: LinearCoef.INTERCEPT_NAME}
# Coordinates correspond to the dimension starting from 1 # Coordinates correspond to the dimension starting from 0
for idx, coordinate_name in enumerate(coordinates.coordinates_names): idx_to_coefficient_name.update(coordinates.dim_to_coordinate)
idx_to_coefficient_name[idx] = coordinate_name
return idx_to_coefficient_name return idx_to_coefficient_name
@classmethod @classmethod
...@@ -64,25 +63,28 @@ class LinearMarginFunction(ParametricMarginFunction): ...@@ -64,25 +63,28 @@ class LinearMarginFunction(ParametricMarginFunction):
def is_a_stationary_model(self) -> bool: def is_a_stationary_model(self) -> bool:
return all([v == 'NULL' for v in self.form_dict.values()]) return all([v == 'NULL' for v in self.form_dict.values()])
@property
def coordinate_name_to_dim(self):
return self.coordinates.coordinate_name_to_dim
@property @property
def form_dict(self) -> Dict[str, str]: def form_dict(self) -> Dict[str, str]:
coordinate_name_to_dim = self.coefficient_name_to_dim(self.coordinates)
form_dict = {} form_dict = {}
for param_name in self.params_class.PARAM_NAMES: for param_name in self.params_class.PARAM_NAMES:
linear_dims = self.param_name_to_dims.get(param_name, []) linear_dims = self.param_name_to_dims.get(param_name, [])
# Load spatial form_dict (only if we have some spatial coordinates) # Load spatial form_dict (only if we have some spatial coordinates)
if self.coordinates.has_spatial_coordinates: if self.coordinates.has_spatial_coordinates:
spatial_names = [name for name in self.coordinates.spatial_coordinates_names spatial_names = [name for name in self.coordinates.spatial_coordinates_names
if coordinate_name_to_dim[name] in linear_dims] if self.coordinate_name_to_dim[name] in linear_dims]
spatial_dims = [coordinate_name_to_dim[name] for name in spatial_names] spatial_dims = [self.coordinate_name_to_dim[name] for name in spatial_names]
spatial_form = self.param_name_to_coef[param_name].spatial_form_dict(spatial_names, spatial_dims) spatial_form = self.param_name_to_coef[param_name].spatial_form_dict(spatial_names, spatial_dims)
form_dict.update(spatial_form) form_dict.update(spatial_form)
# Load temporal form dict (only if we have some temporal coordinates) # Load temporal form dict (only if we have some temporal coordinates)
if self.coordinates.has_temporal_coordinates: if self.coordinates.has_temporal_coordinates:
temporal_names = [name for name in self.coordinates.temporal_coordinates_names temporal_names = [name for name in self.coordinates.temporal_coordinates_names
if coordinate_name_to_dim[name] in linear_dims] if self.coordinate_name_to_dim[name] in linear_dims]
temporal_dims = [coordinate_name_to_dim[name] for name in temporal_names] temporal_dims = [self.coordinate_name_to_dim[name] for name in temporal_names]
temporal_form = self.param_name_to_coef[param_name].temporal_form_dict(temporal_names, temporal_dims) temporal_form = self.param_name_to_coef[param_name].temporal_form_dict(temporal_names, temporal_dims)
# Specifying a formula '~ 1' creates a bug in fitspatgev of SpatialExtreme R package # Specifying a formula '~ 1' creates a bug in fitspatgev of SpatialExtreme R package
assert not any(['~ 1' in formula for formula in temporal_form.values()]) assert not any(['~ 1' in formula for formula in temporal_form.values()])
......
...@@ -90,6 +90,7 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel): ...@@ -90,6 +90,7 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel):
**r_type_argument_kwargs **r_type_argument_kwargs
) )
return ResultFromMleExtremes(res, self.param_name_to_list_for_result, return ResultFromMleExtremes(res, self.param_name_to_list_for_result,
self.coordinates.dim_to_coordinate,
type_for_mle=self.type_for_mle) type_for_mle=self.type_for_mle)
def extremes_fevd_bayesian_fit(self, x, df_coordinates_temp) -> AbstractResultFromExtremes: def extremes_fevd_bayesian_fit(self, x, df_coordinates_temp) -> AbstractResultFromExtremes:
......
...@@ -14,9 +14,10 @@ from extreme_fit.model.utils import r ...@@ -14,9 +14,10 @@ from extreme_fit.model.utils import r
class AbstractResultFromExtremes(AbstractResultFromModelFit): class AbstractResultFromExtremes(AbstractResultFromModelFit):
def __init__(self, result_from_fit: robjects.ListVector, param_name_to_dim=None) -> None: def __init__(self, result_from_fit: robjects.ListVector, param_name_to_dim=None, dim_to_coordinate=None) -> None:
super().__init__(result_from_fit) super().__init__(result_from_fit)
self.param_name_to_dim = param_name_to_dim self.param_name_to_dim = param_name_to_dim
self.dim_to_coordinate = dim_to_coordinate
@property @property
def summary_name_to_value(self): def summary_name_to_value(self):
......
...@@ -12,8 +12,9 @@ from extreme_fit.model.utils import r ...@@ -12,8 +12,9 @@ from extreme_fit.model.utils import r
class ResultFromMleExtremes(AbstractResultFromExtremes): class ResultFromMleExtremes(AbstractResultFromExtremes):
def __init__(self, result_from_fit: robjects.ListVector, param_name_to_dim=None, def __init__(self, result_from_fit: robjects.ListVector, param_name_to_dim=None,
dim_to_coordinate=None,
type_for_mle="GEV") -> None: type_for_mle="GEV") -> None:
super().__init__(result_from_fit, param_name_to_dim) super().__init__(result_from_fit, param_name_to_dim, dim_to_coordinate)
self.type_for_mle = type_for_mle self.type_for_mle = type_for_mle
@property @property
...@@ -25,7 +26,8 @@ class ResultFromMleExtremes(AbstractResultFromExtremes): ...@@ -25,7 +26,8 @@ class ResultFromMleExtremes(AbstractResultFromExtremes):
values = {i: param for i, param in enumerate(np.array(d['par']))} values = {i: param for i, param in enumerate(np.array(d['par']))}
else: else:
values = {i: np.array(v)[0] for i, v in enumerate(d.values())} values = {i: np.array(v)[0] for i, v in enumerate(d.values())}
return get_margin_coef_ordered_dict(self.param_name_to_dim, values, self.type_for_mle) return get_margin_coef_ordered_dict(self.param_name_to_dim, values, self.type_for_mle,
dim_to_coordinate_name=self.dim_to_coordinate)
def _confidence_interval_method(self, common_kwargs, ci_method, return_period): def _confidence_interval_method(self, common_kwargs, ci_method, return_period):
method_name = ci_method_to_method_name[ci_method] method_name = ci_method_to_method_name[ci_method]
......
...@@ -11,7 +11,7 @@ def convertFloatVector_to_float(f): ...@@ -11,7 +11,7 @@ def convertFloatVector_to_float(f):
return np.array(f)[0] return np.array(f)[0]
def get_margin_coef_ordered_dict(param_name_to_dims, mle_values, type_for_mle="GEV"): def get_margin_coef_ordered_dict(param_name_to_dims, mle_values, type_for_mle="GEV", dim_to_coordinate_name=None):
assert param_name_to_dims is not None assert param_name_to_dims is not None
# Build the Coeff dict from param_name_to_dim # Build the Coeff dict from param_name_to_dim
coef_dict = OrderedDict() coef_dict = OrderedDict()
...@@ -29,12 +29,16 @@ def get_margin_coef_ordered_dict(param_name_to_dims, mle_values, type_for_mle="G ...@@ -29,12 +29,16 @@ def get_margin_coef_ordered_dict(param_name_to_dims, mle_values, type_for_mle="G
if param_name in param_name_to_dims: if param_name in param_name_to_dims:
dims = param_name_to_dims[param_name] dims = param_name_to_dims[param_name]
if isinstance(dims[0], int): if isinstance(dims[0], int):
nb_parameters = 1 coef_name = LinearCoef.coef_template_str(param_name, AbstractCoordinates.COORDINATE_T).format(1)
else: coef_dict[coef_name] = mle_values[i]
nb_parameters = dims[0][1]
for j in range(nb_parameters):
temporal_coef_name = LinearCoef.coef_template_str(param_name,
AbstractCoordinates.COORDINATE_T).format(1 + j)
coef_dict[temporal_coef_name] = mle_values[i]
i += 1 i += 1
else:
for dim, max_degree in dims:
coordinate_name = dim_to_coordinate_name[dim]
coef_template = LinearCoef.coef_template_str(param_name, coordinate_name)
for j in range(1, max_degree + 1):
k = j if coordinate_name == AbstractCoordinates.COORDINATE_T else j + 1
coef_name = coef_template.format(k)
coef_dict[coef_name] = mle_values[i]
i += 1
return coef_dict return coef_dict
...@@ -319,6 +319,14 @@ class AbstractCoordinates(object): ...@@ -319,6 +319,14 @@ class AbstractCoordinates(object):
def ind_of_df_all_coordinates(self, coordinate_name, value): def ind_of_df_all_coordinates(self, coordinate_name, value):
return self.df_all_coordinates.loc[:, coordinate_name] == value return self.df_all_coordinates.loc[:, coordinate_name] == value
@property
def coordinate_name_to_dim(self):
return {v: k for k, v in self.dim_to_coordinate.items()}
@property
def dim_to_coordinate(self):
return dict(enumerate(self.coordinates_names))
# Visualization # Visualization
@property @property
......
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