Commit 4a24783d authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[EXTREME FIT][MAX STABLE] fix start fit params issue for fitmaxstab. add test

parent 13d6d211
No related merge requests found
Showing with 48 additions and 33 deletions
+48 -33
import rpy2
from enum import Enum from enum import Enum
from rpy2.robjects import ListVector from rpy2.robjects import ListVector
...@@ -15,19 +16,20 @@ class AbstractMaxStableModel(object): ...@@ -15,19 +16,20 @@ class AbstractMaxStableModel(object):
self.user_params_sample = params_sample self.user_params_sample = params_sample
self.r = get_loaded_r() self.r = get_loaded_r()
def fitmaxstab(self, maxima: np.ndarray, coord: np.ndarray, ): def fitmaxstab(self, maxima: np.ndarray, coord: np.ndarray, fit_marge=False):
# todo: find how to specify a startign point, understand how is it set by default # Specify the fit params
# res = None fit_params = {
# tries = 5 'fit.marge': fit_marge,
# nb_tries = 0 'start': self.r.list(**self.params_start_fit),
# while res is None and nb_tries < tries: }
# try: # Run the fitmaxstab in R
# res = self.r.fitmaxstab(maxima, coord, **self.cov_mod_param) # type: ListVector # todo: find how to specify the optim function to use
# except rpy2.rinterface.RRuntimeError: try:
# pass res = self.r.fitmaxstab(np.transpose(maxima), coord, **self.cov_mod_param, **fit_params) # type: ListVector
# nb_tries += 1 except rpy2.rinterface.RRuntimeError as error:
# print(nb_tries) raise Exception('Some R exception have been launched at RunTime: {}'.format(error.__repr__()))
res = self.r.fitmaxstab(np.transpose(maxima), coord, **self.cov_mod_param) # type: ListVector # todo: maybe if the convergence was not successful I could try other starting point several times
# Retrieve the resulting fitted values
fitted_values = res.rx2('fitted.values') fitted_values = res.rx2('fitted.values')
fitted_values = {key: fitted_values.rx2(key)[0] for key in fitted_values.names} fitted_values = {key: fitted_values.rx2(key)[0] for key in fitted_values.names}
return fitted_values return fitted_values
...@@ -36,7 +38,7 @@ class AbstractMaxStableModel(object): ...@@ -36,7 +38,7 @@ class AbstractMaxStableModel(object):
""" """
Return an numpy of maxima. With rows being the stations and columns being the years of maxima Return an numpy of maxima. With rows being the stations and columns being the years of maxima
""" """
maxima = np.array(self.r.rmaxstab(nb_obs, coord, **self.cov_mod_param, **self.params_sample)) maxima = np.array(self.r.rmaxstab(nb_obs, coord, *list(self.cov_mod_param.values()), **self.params_sample))
return np.transpose(maxima) return np.transpose(maxima)
@property @property
...@@ -53,6 +55,7 @@ class AbstractMaxStableModel(object): ...@@ -53,6 +55,7 @@ class AbstractMaxStableModel(object):
@staticmethod @staticmethod
def merge_params(default_params, input_params): def merge_params(default_params, input_params):
assert default_params is not None, 'some default_params need to be specified'
merged_params = default_params.copy() merged_params = default_params.copy()
if input_params is not None: if input_params is not None:
assert isinstance(default_params, dict) and isinstance(input_params, dict) assert isinstance(default_params, dict) and isinstance(input_params, dict)
......
...@@ -10,22 +10,26 @@ if (call_main) { ...@@ -10,22 +10,26 @@ if (call_main) {
n.site = 2 n.site = 2
coord <- matrix(rnorm(2*n.site, sd = sqrt(.2)), ncol = 2) coord <- matrix(rnorm(2*n.site, sd = sqrt(.2)), ncol = 2)
print(coord)
# Generate the data # Generate the data
# data <- rmaxstab(n.obs, coord, "gauss", cov11 = 100, cov12 = 25, cov22 = 220) data <- rmaxstab(n.obs, coord, "gauss", cov11 = 100, cov12 = 25, cov22 = 220)
# data <- rmaxstab(n.obs, coord, "brown", range = 3, smooth = 0.5) # data <- rmaxstab(n.obs, coord, "brown", range = 3, smooth = 0.5)
# data <- rmaxstab(n.obs, coord, "whitmat", nugget = 0.0, range = 3, smooth = 0.5) # data <- rmaxstab(n.obs, coord, "whitmat", nugget = 0.0, range = 3, smooth = 0.5)
data <- rmaxstab(n.obs, coord, "cauchy", )
# Fit back the data # Fit back the data
print(data) # print(data)
# res = fitmaxstab(data, coord, "gauss", fit.marge=FALSE, ) # res = fitmaxstab(data, coord, "gauss", fit.marge=FALSE, )
# res = fitmaxstab(data, coord, "brown") # res = fitmaxstab(data, coord, "brown")
res = fitmaxstab(data, coord, "cauchy") # res = fitmaxstab(data, coord, "whitmat", start=)
# res = fitmaxstab(data, coord, "gauss", start=list(0,0,0)) namedlist = list(cov11 = 1.0, cov12 = 1.2, cov22 = 2.2)
print(res) res = fitmaxstab(data=data, coord=coord, cov.mod="gauss", start=namedlist)
print(class(res)) # res = fitmaxstab(data, coord, "whitmat", par())
print(names(res)) # print(res)
# print(class(res))
# print(names(res))
for (name in names(res)){
print(name)
print(res[name])
}
print(res['fitted.values']) print(res['fitted.values'])
print(res['convergence']) # print(res['convergence'])
} }
...@@ -9,12 +9,12 @@ class Smith(AbstractMaxStableModel): ...@@ -9,12 +9,12 @@ class Smith(AbstractMaxStableModel):
def __init__(self, params_start_fit=None, params_sample=None): def __init__(self, params_start_fit=None, params_sample=None):
super().__init__(params_start_fit=params_start_fit, params_sample=params_sample) super().__init__(params_start_fit=params_start_fit, params_sample=params_sample)
self.cov_mod = 'gauss' self.cov_mod = 'gauss'
self.default_params_start_fit = {} self.default_params_start_fit = {
self.default_params_sample = { 'cov11': 1,
'cov11': 100, 'cov12': 0,
'cov12': 25, 'cov22': 1
'cov22': 220,
} }
self.default_params_sample = self.default_params_start_fit.copy()
class BrownResnick(AbstractMaxStableModel): class BrownResnick(AbstractMaxStableModel):
...@@ -22,7 +22,10 @@ class BrownResnick(AbstractMaxStableModel): ...@@ -22,7 +22,10 @@ class BrownResnick(AbstractMaxStableModel):
def __init__(self, params_start_fit=None, params_sample=None): def __init__(self, params_start_fit=None, params_sample=None):
super().__init__(params_start_fit=params_start_fit, params_sample=params_sample) super().__init__(params_start_fit=params_start_fit, params_sample=params_sample)
self.cov_mod = 'brown' self.cov_mod = 'brown'
self.default_params_start_fit = {} self.default_params_start_fit = {
'range': 3,
'smooth': 0.5,
}
self.default_params_sample = { self.default_params_sample = {
'range': 3, 'range': 3,
'smooth': 0.5, 'smooth': 0.5,
...@@ -35,6 +38,7 @@ class Schlather(AbstractMaxStableModelWithCovarianceFunction): ...@@ -35,6 +38,7 @@ class Schlather(AbstractMaxStableModelWithCovarianceFunction):
super().__init__(params_start_fit, params_sample, covariance_function) super().__init__(params_start_fit, params_sample, covariance_function)
self.cov_mod = self.covariance_function.name self.cov_mod = self.covariance_function.name
self.default_params_sample.update({}) self.default_params_sample.update({})
self.default_params_start_fit = self.default_params_sample.copy()
class Geometric(AbstractMaxStableModelWithCovarianceFunction): class Geometric(AbstractMaxStableModelWithCovarianceFunction):
...@@ -43,6 +47,7 @@ class Geometric(AbstractMaxStableModelWithCovarianceFunction): ...@@ -43,6 +47,7 @@ class Geometric(AbstractMaxStableModelWithCovarianceFunction):
super().__init__(params_start_fit, params_sample, covariance_function) super().__init__(params_start_fit, params_sample, covariance_function)
self.cov_mod = 'g' + self.covariance_function.name self.cov_mod = 'g' + self.covariance_function.name
self.default_params_sample .update({'sigma2': 0.5}) self.default_params_sample .update({'sigma2': 0.5})
self.default_params_start_fit = self.default_params_sample.copy()
class ExtremalT(AbstractMaxStableModelWithCovarianceFunction): class ExtremalT(AbstractMaxStableModelWithCovarianceFunction):
...@@ -51,6 +56,7 @@ class ExtremalT(AbstractMaxStableModelWithCovarianceFunction): ...@@ -51,6 +56,7 @@ class ExtremalT(AbstractMaxStableModelWithCovarianceFunction):
super().__init__(params_start_fit, params_sample, covariance_function) super().__init__(params_start_fit, params_sample, covariance_function)
self.cov_mod = 't' + self.covariance_function.name self.cov_mod = 't' + self.covariance_function.name
self.default_params_sample .update({'DoF': 2}) self.default_params_sample .update({'DoF': 2})
self.default_params_start_fit = self.default_params_sample.copy()
class ISchlather(AbstractMaxStableModelWithCovarianceFunction): class ISchlather(AbstractMaxStableModelWithCovarianceFunction):
...@@ -59,3 +65,4 @@ class ISchlather(AbstractMaxStableModelWithCovarianceFunction): ...@@ -59,3 +65,4 @@ class ISchlather(AbstractMaxStableModelWithCovarianceFunction):
super().__init__(params_start_fit, params_sample, covariance_function) super().__init__(params_start_fit, params_sample, covariance_function)
self.cov_mod = 'i' + self.covariance_function.name self.cov_mod = 'i' + self.covariance_function.name
self.default_params_sample .update({'alpha': 0.5}) self.default_params_sample .update({'alpha': 0.5})
self.default_params_start_fit = self.default_params_sample.copy()
...@@ -16,7 +16,6 @@ class TestMaxStableFit(unittest.TestCase): ...@@ -16,7 +16,6 @@ class TestMaxStableFit(unittest.TestCase):
self.spatial_coord = CircleCoordinates.from_nb_points(nb_points=5, max_radius=1) self.spatial_coord = CircleCoordinates.from_nb_points(nb_points=5, max_radius=1)
self.max_stable_models = [] self.max_stable_models = []
for max_stable_class in self.MAX_STABLE_CLASSES: for max_stable_class in self.MAX_STABLE_CLASSES:
print(max_stable_class)
if issubclass(max_stable_class, AbstractMaxStableModelWithCovarianceFunction): if issubclass(max_stable_class, AbstractMaxStableModelWithCovarianceFunction):
self.max_stable_models.extend([max_stable_class(covariance_function=covariance_function) self.max_stable_models.extend([max_stable_class(covariance_function=covariance_function)
for covariance_function in CovarianceFunction]) for covariance_function in CovarianceFunction])
...@@ -27,9 +26,11 @@ class TestMaxStableFit(unittest.TestCase): ...@@ -27,9 +26,11 @@ class TestMaxStableFit(unittest.TestCase):
for max_stable_model in self.max_stable_models: for max_stable_model in self.max_stable_models:
dataset = SimulatedDataset.from_max_stable_sampling(nb_obs=10, max_stable_model=max_stable_model, dataset = SimulatedDataset.from_max_stable_sampling(nb_obs=10, max_stable_model=max_stable_model,
spatial_coordinates=self.spatial_coord) spatial_coordinates=self.spatial_coord)
fitted_values = max_stable_model.fitmaxstab(maxima=dataset.maxima, coord=dataset.coord)
if display: if display:
print(dataset.head()) print(type(max_stable_model))
max_stable_model.fitmaxstab(maxima=dataset.maxima, coord=dataset.coord) print(dataset.df_dataset.head())
print(fitted_values)
self.assertTrue(True) self.assertTrue(True)
......
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