您是否需要大量数据来估计极值分布中的参数?

机器算法验证 r 贝叶斯 马尔可夫链蒙特卡罗 极值 帕累托分布
2022-04-14 09:03:39

这可能没有一个硬性答案,但我想知道在尝试很好地估计广义帕累托分布的参数时是否需要收集更多数据?

我问的原因是因为我正在尝试使用贝叶斯估计来估计广义帕累托分布的参数,当我有大量数据(例如,1000 多个数据点)时,我的参数估计似乎非常好,但是当我放弃时数据大小说 100 那么估计可能很差。

例如,如果我有一个具有真实参数的广义帕累托分布μ=0,σ=1.2, 和ξ=0.8, 我采样N=1000然后观察(运行我的贝叶斯算法)我得到估计σ^=1.2795% 置信区间:(1.12,1.46)ξ^=0.8395% 置信区间:(0.72,0.98).

但是,如果我将相同的大小放到N=100我明白了σ^=0.8795% 置信区间:(0.55,1.24)ξ^=0.9495% 置信区间:(0.61,1.38).

如果我继续减少N, 的点估计σξ只会变得更糟。是否有关于极值分布需要多少数据的经验法则?在大多数情况下,100 个数据点足以对没有太极端值(例如,正态、指数、伽马等)的分布进行建模。在我的应用程序中,我将始终处理少于 100 个数据点,因此使用广义帕累托分布是一个坏主意吗?

以下是我试图解释的代码示例:

# log-likelihood
likelihood <- function(x, xi, sigma){
  
  llik <- -log(sigma) - (1 / xi + 1) * log(1 + xi * x / sigma)
  lik  <- sum(llik)
  
  return(lik)
}

# log(prior)
prior <- function(xi, sigma){
  
  prior1 <- dgamma(xi, .01, .01, log = TRUE)
  prior2 <- dgamma(sigma, .01, .01, log = TRUE)
  prior <- (prior1 + prior2)
  
  return(prior)
}

# log(posterior)
posterior <- function(x, xi, sigma){
  
  post <- likelihood(x, xi, sigma) + prior(xi, sigma)
  
  return(post)
}


##############################################################
### Function to simulate data from GPD
##############################################################

gpd <- function(n, mu, sigma, xi){
  
  u <- runif(n)
  x = mu + sigma * (u^-xi - 1) / xi
  
  return(x)
}

set.seed(4)
N = 1000 # Number of data points
x = gpd(N, 0, 1.2, .8)  # Here mu = 0, sigma = 1.2, and xi = 0.8



S <- 10000
xi <- rep(NA, S)
sigma <- rep(NA, S)
xi[1] <- 1
sigma[1] <- 1

for(i in 2:S){
  
  
  # MCMC for xi
  xi.star = xi[i-1] + rnorm(1,0)
  
  if(xi.star < 0){
    alpha = 0
  }else{
    ratio <- exp(posterior(x, xi.star, sigma[i-1]) - posterior(x, xi[i-1], sigma[i-1]))
    alpha <- min(1, ratio)
  }

  if(runif(1) < alpha){
    xi[i] <- xi.star
  }else{
    xi[i] <- xi[i - 1]
  }
  
  
  # MCMC for sigma
  sigma.star = xi[i-1] + rnorm(1,0)
  
  if(sigma.star < 0){
    alpha = 0
  }else{
    ratio <- exp(posterior(x, xi[i-1], sigma.star) - posterior(x, xi[i-1], sigma[i-1]))
    alpha <- min(1, ratio)
  }
  
  if(runif(1) < alpha){
    sigma[i] <- sigma.star
  }else{
    sigma[i] <- sigma[i - 1]
  }  
}


sigma <- sigma[5000:S]
xi <- xi[5000:S]

mean(sigma)
mean(xi)
2个回答

拥有更多数据总是好的 :) 但是,请考虑为什么我们有 EVT:使用更少的数据!如果可以收集无限量的数据,为什么还需要 EVT?您只需拟合基础分布并计算其上的任何指标。因为只有一小部分数据出现在尾部,所以我们需要收集大量数据才能得到尾部数据。这就是 EVT 派上用场的地方:它专注于尾部。因此,它允许我们使用比其他方式所需的更小的数据集来研究尾部

Fisher 信息矩阵告诉您每个观察值中关于您的参数的信息量如果你的观察是独立的,那么n样品是n乘以 Fisher 信息矩阵。Fisher 信息矩阵的逆矩阵是(无偏)估计(Cramer-Rao 界)协方差的下界。因此,如果您知道要测量参数的准确度,您可以将其反转并除以 Fisher 信息的元素以获得粗略估计n. 如果您的估算器效率不高,您可能需要更多。

有一个用于计算 Fisher 信息的 R 包mle.tools - 我没有查看它是否处理广义帕累托分布,但如果没有,它至少应该为您提供一些参考的起点。或者,如果您有对数似然,包 numDeriv 中的 hessian() 函数可能会有所帮助。

通常,极值分布不一定更难估计。相反,它取决于参数的变化如何改变分布的形状。如果改变参数会影响尾部,但中心部分几乎没有变化,那么您需要来自尾部的数据才能获得良好的估计。但如果参数也改变了中心部分的形状,那么大部分信息都来自这里。如果您有兴趣,可以通过考虑进行调查f(x,p)log(f(x,p+ϵ)/f(x,p))在哪里f(x,p)pdf是在x对于参数p, 受到小的扰动ϵ. 期限log(f(x,p+ϵ)/f(x,p))与观察结果的信息成正比x关于参数p,并乘以f(x,p)为您提供每次观察的平均值。它告诉您有关该参数的信息通常来自分布中的哪个位置。