You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:06:50