在R中基于L矩估计GEV参数后,如何计算AIC和BIC?
计算L矩法拟合GEV模型的AIC与BIC
由于AIC和BIC是基于似然函数的统计量,而L矩法属于矩估计范畴,并非极大似然估计,因此extRemes包中用method="Lmoments"拟合的fevd对象不会直接输出AIC/BIC值。以下是两种可行的计算方式:
方式1:基于L矩参数手动计算似然值并推导AIC/BIC
GEV分布的对数似然函数可自行定义,代入L矩估计得到的参数后,即可根据公式计算AIC和BIC:
代码实现(衔接你现有代码)
# 提取L矩法得到的GEV参数 gev_params <- coef(fit_lmom_1) loc <- gev_params[["loc"]] scale <- gev_params[["scale"]] shape <- gev_params[["shape"]] # 定义GEV分布的对数似然函数 gev_log_likelihood <- function(loc, scale, shape, data) { n <- length(data) # 处理形状参数接近0的情况(退化为Gumbel分布) if (abs(shape) < 1e-8) { z <- (data - loc) / scale log_lik <- -n * log(scale) - sum(z) - sum(exp(-z)) } else { z <- 1 + shape * (data - loc) / scale # 保证数据符合GEV定义域要求 if (any(z <= 0)) return(-Inf) log_lik <- -n * log(scale) - (1 + 1/shape) * sum(log(z)) - sum(z^(-1/shape)) } return(log_lik) } # 计算对数似然值 data_vec <- as.vector(extrema1$BTC_down) log_lik_value <- gev_log_likelihood(loc, scale, shape, data_vec) # 计算AIC和BIC sample_size <- length(data_vec) param_count <- 3 # GEV分布包含3个参数 aic_value <- -2 * log_lik_value + 2 * param_count bic_value <- -2 * log_lik_value + param_count * log(sample_size) # 输出结果 cat("基于L矩参数的AIC:", aic_value, "\n") cat("基于L矩参数的BIC:", bic_value, "\n")
方式2:以L矩参数为初始值用MLE拟合后提取AIC/BIC
若需要直接调用包内置的AIC/BIC提取函数,可以先将L矩估计的参数作为初始值,用极大似然法重新拟合GEV模型,之后直接提取结果:
代码实现
# 用L矩参数作为初始值,执行MLE拟合 fit_mle <- fevd(data_vec, method = "MLE", type = "GEV", initial = list(loc = loc, scale = scale, shape = shape)) # 直接提取AIC和BIC aic_mle <- AIC(fit_mle) bic_mle <- BIC(fit_mle) cat("MLE拟合的AIC:", aic_mle, "\n") cat("MLE拟合的BIC:", bic_mle, "\n")
注意要点
- 方式1计算的是L矩参数对应的似然值推导的AIC/BIC,并非极大似然估计的准则值,因为L矩参数不一定是似然最大化的结果。
- 方式2得到的是MLE拟合的AIC/BIC,仅用L矩参数作为初始值加速收敛,最终参数是似然最大化的结果。
内容的提问来源于stack exchange,提问作者newtoR
相关产品推荐
相关产品推荐

