From aeac50d4eccceda568ef37c2c5005c4d9c298bbd Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Tue, 30 Jun 2020 17:03:05 +0200 Subject: [PATCH] [contrasting] add quadratic & cross terms Gumbel altitudinal models & fix a recurrent bug that happenning when checking the AIC value --- .../gev/main_fevd_mle_two_covariates.R | 9 +- .../distribution/gev/summary_fevd_fixed.R | 83 +++++++++++++++++++ .../abstract_result_from_extremes.py | 2 +- extreme_fit/model/utils.py | 4 +- .../altitudes_fit/main_altitudes_studies.py | 11 +-- .../test_gev_spatio_temporal_extremes_mle.py | 3 +- 6 files changed, 99 insertions(+), 13 deletions(-) create mode 100644 extreme_fit/distribution/gev/summary_fevd_fixed.R diff --git a/extreme_fit/distribution/gev/main_fevd_mle_two_covariates.R b/extreme_fit/distribution/gev/main_fevd_mle_two_covariates.R index fb450f26..49fcd28b 100644 --- a/extreme_fit/distribution/gev/main_fevd_mle_two_covariates.R +++ b/extreme_fit/distribution/gev/main_fevd_mle_two_covariates.R @@ -8,6 +8,7 @@ library(stats4) library(SpatialExtremes) source('fevd_fixed.R') source('ci_fevd_fixed.R') +source('summary_fevd_fixed.R') # Sample from a GEV set.seed(42) N <- 50 @@ -27,9 +28,11 @@ coord = data.frame(coord, stringsAsFactors = TRUE) # res = fevd_fixed(x_gev, data=coord, method='MLE', verbose=TRUE, use.phi=FALSE) # res = fevd_fixed(x_gev, data=coord, location.fun= ~T, scale.fun= ~T, method='MLE', type="GEV", verbose=FALSE, use.phi=FALSE) # res = fevd_fixed(x_gev, data=coord, location.fun= ~sin(X) + cos(T), method='MLE', type="GEV", verbose=FALSE, use.phi=FALSE) -res = fevd_fixed(x_gev, data=coord, location.fun= ~poly(X * T, 1, raw = TRUE), method='MLE', type="GEV", verbose=FALSE, use.phi=FALSE) -# res = fevd_fixed(x_gev, data=coord, location.fun= ~poly(X, 1, raw = TRUE) + poly(T, 2, raw = TRUE) , method='MLE', type="GEV", verbose=FALSE, use.phi=FALSE) -print(res) +# res = fevd_fixed(x_gev, data=coord, location.fun= ~poly(X * T, 1, raw = TRUE), method='MLE', type="Gumbel", verbose=FALSE, use.phi=FALSE) +res = fevd_fixed(x_gev, data=coord, location.fun= ~poly(X, 1, raw = TRUE) + poly(T, 2, raw = TRUE) , method='MLE', type="Gumbel", verbose=FALSE, use.phi=FALSE) +# print(res) +print(summary.fevd.mle_fixed(res)) +# print(summary(res)$AIC) # Some display for the results # m = res$results diff --git a/extreme_fit/distribution/gev/summary_fevd_fixed.R b/extreme_fit/distribution/gev/summary_fevd_fixed.R new file mode 100644 index 00000000..0f41a492 --- /dev/null +++ b/extreme_fit/distribution/gev/summary_fevd_fixed.R @@ -0,0 +1,83 @@ +# Title : TODO +# Objective : TODO +# Created by: erwan +# Created on: 30/06/2020 +summary.fevd.mle_fixed <- function (object, ...) +{ + x <- object + a <- list(...) + out <- list() + cov.theta <- se.theta <- NULL + if (!is.null(a$silent)) + silent <- a$silent + else silent <- FALSE + if (!silent) { + cat("\n") + print(x$call) + cat("\n") + print(paste("Estimation Method used: ", x$method, sep = "")) + cat("\n") + } + if (!silent) + cat("\n", "Negative Log-Likelihood Value: ", x$results$value, + "\n\n") + theta.hat <- x$results$par + theta.names <- names(theta.hat) + if (is.element("log.scale", theta.names)) { + theta.hat[theta.names == "log.scale"] <- exp(theta.hat[theta.names == + "log.scale"]) + theta.names[theta.names == "log.scale"] <- "scale" + names(theta.hat) <- theta.names + phiU <- FALSE + } + else phiU <- x$par.models$log.scale + out$par <- theta.hat + np <- length(theta.hat) + designs <- setup.design(x) + if (!is.null(x$data.pointer)) + xdat <- get(x$data.pointer) + else xdat <- x$x + # cov.theta <- parcov.fevd(x) + # out$cov.theta <- cov.theta + # if (!is.null(cov.theta)) { + # se.theta <- sqrt(diag(cov.theta)) + # names(se.theta) <- theta.names + # out$se.theta <- se.theta + # } + if (!silent) { + cat("\n", "Estimated parameters:\n") + print(theta.hat) + } + if (!is.null(se.theta)) { + if (!silent) { + cat("\n", "Standard Error Estimates:\n") + print(se.theta) + } + theta.hat <- rbind(theta.hat, se.theta) + if (is.matrix(theta.hat) && dim(theta.hat)[1] == 2) + rownames(theta.hat) <- c("Estimate", "Std. Error") + if (is.matrix(theta.hat)) + colnames(theta.hat) <- theta.names + else names(theta.hat) <- theta.names + if (!silent && !is.null(cov.theta)) { + cat("\n", "Estimated parameter covariance matrix.\n") + print(cov.theta) + } + } + nllh <- x$results$value + out$nllh <- nllh + if (is.element(x$type, c("GEV", "Gumbel", "Weibull", "Frechet"))) + n <- x$n + else { + y <- c(datagrabber(x, cov.data = FALSE)) + n <- sum(y > x$threshold) + } + out$AIC <- 2 * nllh + 2 * np + out$BIC <- 2 * nllh + np * log(n) + if (!silent) { + cat("\n", "AIC =", out$AIC, "\n") + cat("\n", "BIC =", out$BIC, "\n") + } + invisible(out) +} + 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 8df785c8..ec86cb4a 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 @@ -24,7 +24,7 @@ class AbstractResultFromExtremes(AbstractResultFromModelFit): # Warning print will not work in this part f = io.StringIO() with redirect_stdout(f): - summary = r('summary')(self.result_from_fit) + summary = r('summary.fevd.mle_fixed')(self.result_from_fit) return self.get_python_dictionary(summary) @property diff --git a/extreme_fit/model/utils.py b/extreme_fit/model/utils.py index 3d183036..89a11766 100644 --- a/extreme_fit/model/utils.py +++ b/extreme_fit/model/utils.py @@ -31,8 +31,8 @@ warnings.filterwarnings("ignore") # Load ismev r.library('ismev') # Load fevd fixed -for j, filename in enumerate(['ci_fevd_fixed.R', 'fevd_fixed.R', 'gnfit_fixed.R']): - folder = 'gev' if j <= 1 else "gumbel" +for j, filename in enumerate(['ci_fevd_fixed.R', 'fevd_fixed.R', 'summary_fevd_fixed.R', 'gnfit_fixed.R']): + folder = 'gev' if j <= 2 else "gumbel" fevd_fixed_filepath = op.join(get_root_path(), 'extreme_fit', 'distribution', folder, filename) assert op.exists(fevd_fixed_filepath) r.source(fevd_fixed_filepath) 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 576b2ca2..baa704c6 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py @@ -61,21 +61,22 @@ def plot_moments(studies, massif_names=None): def main(): - altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000][4:7] + # altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000][4:7] # altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000][:] - # altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900] + altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900] study_classes = [SafranSnowfall1Day, SafranSnowfall3Days, SafranSnowfall5Days, SafranSnowfall7Days][:2] study_classes = [SafranPrecipitation1Day, SafranPrecipitation3Days, SafranPrecipitation5Days, SafranPrecipitation7Days][:] - study_classes = [SafranSnowfall1Day, SafranPrecipitation1Day, SafranSnowfall3Days, SafranPrecipitation3Days][:1] + study_classes = [SafranSnowfall1Day, SafranPrecipitation1Day, SafranSnowfall3Days, SafranPrecipitation3Days][:] massif_names = None # massif_names = ['Aravis'] # massif_names = ['Chartreuse', 'Belledonne'] for study_class in study_classes: + print('change study class') studies = AltitudesStudies(study_class, altitudes, season=Season.winter_extended) - # plot_time_series(studies, massif_names) - # plot_moments(studies, massif_names) + plot_time_series(studies, massif_names) + plot_moments(studies, massif_names) plot_altitudinal_fit(studies, massif_names) diff --git a/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py b/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py index 6e147115..eae7fd6a 100644 --- a/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py +++ b/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py @@ -57,8 +57,7 @@ class TestGevTemporalQuadraticExtremesMle(unittest.TestCase): self.common_test(model_class) def test_altitudinal_gumbel_models(self): - for model_class in ALTITUDINAL_GUMBEL_MODELS[:3]: - # print(model_class) + for model_class in ALTITUDINAL_GUMBEL_MODELS[:]: self.common_test(model_class) -- GitLab