我需要从数据中估计一个 Gamma 分布的参数,但是我只有 0.05 到 3 的样本(大部分样本都集中在这里)。
我尝试了 MLE,但由于截断,它不太准确。
我一直在做一些研究,但我还没有发现任何真正有效的东西。
我需要从数据中估计一个 Gamma 分布的参数,但是我只有 0.05 到 3 的样本(大部分样本都集中在这里)。
我尝试了 MLE,但由于截断,它不太准确。
我一直在做一些研究,但我还没有发现任何真正有效的东西。
最大似然估计 (MLE) 效果非常好,即使对于相当小的数据集也是如此。 对于的上限和的下限处的截断,只需将任何数据值的总概率即可获得截断分布的似然。
以下是数据集的示例(显示为直方图)、生成它们的基础分布(彩色线),以及截断时可能遇到的一系列形状参数“alpha”和尺度参数“sigma”的 MLE(黑线)到区间。拟合和分布之间的一致性非常好。
详细信息出现在以下R
代码中。
#
# Log likelihood.
# `theta` is shape, log scale.
#
log.Lambda <- function(theta, x, limits) {
#
# Extract the parameters from the arguments.
#
alpha <- theta[1]
log.sigma <- theta[2]
sigma <- exp(log.sigma)
n <- length(x)
#
# Compute Gamma probabilities for the truncation limits. Keep them as logs
# for numerical accuracy and to avoid overflow.
#
p.lower <- pgamma(limits[1], alpha, scale=sigma, log.p=TRUE)
p.upper <- pgamma(limits[2], alpha, scale=sigma, log.p=TRUE)
#
# Compute the variable and constant portions of the log likelihood.
#
l <- (alpha-1) * log(x) - x/sigma
const <- alpha * log.sigma + lgamma(alpha) + p.lower + log(exp(p.upper - p.lower) - 1)
#
# Return the negative log likelihood.
#
return(-(sum(l) - n*const))
}
#
# Truncated Gamma distribution (for plotting).
#
dgammatrunc <- function(x, shape, scale, lower, upper) {
dgamma(x, shape, scale=scale) / diff(pgamma(c(lower,upper), shape, scale=scale))
}
#
# Test.
#
library(ggplot2)
library(data.table)
upper <- 3
lower <- 0.05
n <- 32 # Sample size
set.seed(17)
#
# Test for a range of shapes and scales.
#
parameters <- expand.grid(alpha=c(1/2, 2, 5), sigma=c(1/2, 6))
x0 <- seq(lower, upper, length.out=101) # Prediction points, for plotting
X <- apply(parameters, 1, function(theta) {
alpha <- theta[1]
sigma <- theta[2]
#
# Generate data.
#
q <- runif(n, pgamma(lower, alpha, scale=sigma), pgamma(upper, alpha, scale=sigma))
x <- qgamma(q, alpha, scale=sigma)
# hist(x, freq=FALSE)
#
# ML fitting.
#
theta.0 <- c(mean(x), 0)
fit <- nlm(log.Lambda, p=theta.0, x=x, limits=c(lower, upper))
beta.hat <- fit$estimate
alpha.hat <- beta.hat[1]
sigma.hat <- exp(beta.hat[2])
#
# Return the data and fits in a form convenient for plotting.
#
list(data.table(x=x, alpha=alpha, sigma=sigma),
data.table(x=x0, alpha=alpha, sigma=sigma,
y=dgammatrunc(x0, alpha, sigma, lower, upper),
y.hat=dgammatrunc(x0, alpha.hat, sigma.hat, lower, upper))
)
})
Y <- rbindlist(lapply(X, function(x) x[[2]])) # Data for the graphs
X <- rbindlist(lapply(X, function(x) x[[1]])) # The samples themselves
#
# Plot the results.
#
binwidth <- (upper - lower)/ceiling(n^(0.6))
ggplot(X, aes(x)) +
geom_histogram(binwidth=binwidth, aes(fill=ordered(alpha)), alpha=1/2,
color="Black", show.legend=FALSE) +
geom_path(aes(x, n*y*binwidth, color=ordered(alpha)), size=2, data=Y,
show.legend=FALSE) +
geom_path(aes(x, n*y.hat*binwidth), size=1.5, data=Y, show.legend=FALSE) +
facet_grid(sigma ~ alpha, scales="free_y", labeller = label_both) +
ggtitle(paste("MLEs for Samples of Size", n),
"Fitted Distributions Shown in Black")
首先,截断伽马分布更方便,利用截断的直接方法
G(x) = (F(x,a,b) - F(zmin, a,b))/ (F(zmax,a,b) - F(zmin, a,b))。F 是伽马累积函数,而不是 (x-zmin).((b-zmin) 以 zmin 截断它是左边界 ary zmax 右边界因此,对数字等的转换可能是线性方式
当我们执行 g(x) x^k 时,截断的 gamma 分布保持其形式。我们可以得到另一个伽马函数;这更容易管理 g(x) 是 pdf 伽马分布(截断)此外,使用截断伽马,我们避免了破坏转换的长尾
例如 k 矩是 b^k * GAMMA(a+k)/Gamma(a)/( F(a,zmax/b)-F(z, zmin/b) 很容易管理