我们如何在 MATLAB 中找到 gamma 分布的百分位数或分位数?
How can we find percentile or quantile of gamma distribution in MATLAB?
假设我们在 MATLAB 中有这个伽马分布:
我想要这部分分布具有更高的密度(x 轴范围)。我如何在 MATLAB 中提取它?我使用 histfit
函数拟合此分布。
PS。我的代码:
figure;
histfit(Data,20,'gamma');
[phat, pci] = gamfit(Data);
phat =
11.3360 4.2276
pci =
8.4434 3.1281
15.2196 5.7136
当您使用 [phat, pci] = gamfit(Data);
为数据拟合伽玛分布时,phat
包含 MLE 参数。
您可以将其插入 gaminv
:
x = gaminv(p, phat(1), phat(2));
其中 p
是百分比向量,例如p = [.2, .8]
.
我的代码总是基于以下内容。这是曾经制定的代码,现在我会在必要时进行更改。也许你会发现它也很有用。
table2.10 <- cbind(lower=c(0,2.5,7.5,12.5,17.5,22.5,32.5,
47.5,67.5,87.5,125,225,300),upper=c(2.5,7.5,12.5,17.5,22.5,32.5,
47.5,67.5,87.5,125,225,300,Inf),freq=c(41,48,24,18,15,14,16,12,6,11,5,4,3))
loglik <-function(p,d){
upper <- d[,2]
lower <- d[,1]
n <- d[,3]
ll<-n*log(ifelse(upper<Inf,pgamma(upper,p[1],p[2]),1)-
pgamma(lower,p[1],p[2]))
sum( (ll) )
}
p0 <- c(alpha=0.47,beta=0.014)
m <- optim(p0,loglik,hessian=T,control=list(fnscale=-1),
d=table2.10)
theta <- qgamma(0.95,m$par[1],m$par[2])
theta
还可以使用 Delta 方法创建 95% 的置信区间。为此,我们需要区分
索赔的分布函数 F^(−1)_{X} (0.95; α, β) 关于 α 和 β.
p <- m$par
eps <- c(1e-5,1e-6,1e-7)
d.alpha <- 0*eps
d.beta <- 0*eps
for (i in 1:3){
d.alpha[i] <- (qgamma(0.95,p[1]+eps[i],p[2])-qgamma(0.95,p[1]-eps[i],p[2]))/(2*eps[i])
d.beta[i] <- (qgamma(0.95,p[1],p[2]+eps[i])-qgamma(0.95,p[1],p[2]-eps[i]))/(2*eps[i])
}
d.alpha
d.beta
var.p <- solve(-m$hessian)
var.q95 <- t(c(d.alpha[2],d.beta[2])) %*% var.p %*% c(d.alpha[2],d.beta[2])
qgamma(0.95,p[1],p[2]) + qnorm(c(0.025,0.975))*sqrt(c(var.q95))
甚至可以在 α 和 β 的估计值上使用参数 bootstrap 以获得 B = 1000 个不同的估计值
损失分布的第 95 个百分位数。并使用这些估计值构建一个 95% 的置信区间
library(mvtnorm)
B <- 10000
q.b <- rep(NA,B)
for (b in 1:B){
p.b <- rmvnorm(1,p,var.p)
if (!any(p.b<0)) q.b[b] <- qgamma(0.95,p.b[1],p.b[2])
}
quantile(q.b,c(0.025,0.975))
为了进行非参数化 bootstrap,我们首先“扩展”数据以反映每个单独的观察结果。然后
我们从行号中进行替换抽样,计算频率 table,估计模型及其
95% 百分位数。
line.numbers <- rep(1:13,table2.10[,"freq"])
q.b <- rep(NA,B)
table2.10b <- table2.10
for (b in 1:B){
line.numbers.b <- sample(line.numbers,size=217,replace=TRUE)
table2.10b[,"freq"] <- table(factor(line.numbers.b,levels=1:13))
m.b <- optim(m$par,loglik,hessian=T,control=list(fnscale=-1),
d=table2.10b)
q.b[b] <- qgamma(0.95,m.b$par[1],m.b$par[2])
}
q.npb <- q.b
quantile(q.b,c(0.025,0.975))
假设我们在 MATLAB 中有这个伽马分布:
我想要这部分分布具有更高的密度(x 轴范围)。我如何在 MATLAB 中提取它?我使用 histfit
函数拟合此分布。
PS。我的代码:
figure;
histfit(Data,20,'gamma');
[phat, pci] = gamfit(Data);
phat =
11.3360 4.2276
pci =
8.4434 3.1281
15.2196 5.7136
当您使用 [phat, pci] = gamfit(Data);
为数据拟合伽玛分布时,phat
包含 MLE 参数。
您可以将其插入 gaminv
:
x = gaminv(p, phat(1), phat(2));
其中 p
是百分比向量,例如p = [.2, .8]
.
我的代码总是基于以下内容。这是曾经制定的代码,现在我会在必要时进行更改。也许你会发现它也很有用。
table2.10 <- cbind(lower=c(0,2.5,7.5,12.5,17.5,22.5,32.5,
47.5,67.5,87.5,125,225,300),upper=c(2.5,7.5,12.5,17.5,22.5,32.5,
47.5,67.5,87.5,125,225,300,Inf),freq=c(41,48,24,18,15,14,16,12,6,11,5,4,3))
loglik <-function(p,d){
upper <- d[,2]
lower <- d[,1]
n <- d[,3]
ll<-n*log(ifelse(upper<Inf,pgamma(upper,p[1],p[2]),1)-
pgamma(lower,p[1],p[2]))
sum( (ll) )
}
p0 <- c(alpha=0.47,beta=0.014)
m <- optim(p0,loglik,hessian=T,control=list(fnscale=-1),
d=table2.10)
theta <- qgamma(0.95,m$par[1],m$par[2])
theta
还可以使用 Delta 方法创建 95% 的置信区间。为此,我们需要区分 索赔的分布函数 F^(−1)_{X} (0.95; α, β) 关于 α 和 β.
p <- m$par
eps <- c(1e-5,1e-6,1e-7)
d.alpha <- 0*eps
d.beta <- 0*eps
for (i in 1:3){
d.alpha[i] <- (qgamma(0.95,p[1]+eps[i],p[2])-qgamma(0.95,p[1]-eps[i],p[2]))/(2*eps[i])
d.beta[i] <- (qgamma(0.95,p[1],p[2]+eps[i])-qgamma(0.95,p[1],p[2]-eps[i]))/(2*eps[i])
}
d.alpha
d.beta
var.p <- solve(-m$hessian)
var.q95 <- t(c(d.alpha[2],d.beta[2])) %*% var.p %*% c(d.alpha[2],d.beta[2])
qgamma(0.95,p[1],p[2]) + qnorm(c(0.025,0.975))*sqrt(c(var.q95))
甚至可以在 α 和 β 的估计值上使用参数 bootstrap 以获得 B = 1000 个不同的估计值 损失分布的第 95 个百分位数。并使用这些估计值构建一个 95% 的置信区间
library(mvtnorm)
B <- 10000
q.b <- rep(NA,B)
for (b in 1:B){
p.b <- rmvnorm(1,p,var.p)
if (!any(p.b<0)) q.b[b] <- qgamma(0.95,p.b[1],p.b[2])
}
quantile(q.b,c(0.025,0.975))
为了进行非参数化 bootstrap,我们首先“扩展”数据以反映每个单独的观察结果。然后 我们从行号中进行替换抽样,计算频率 table,估计模型及其 95% 百分位数。
line.numbers <- rep(1:13,table2.10[,"freq"])
q.b <- rep(NA,B)
table2.10b <- table2.10
for (b in 1:B){
line.numbers.b <- sample(line.numbers,size=217,replace=TRUE)
table2.10b[,"freq"] <- table(factor(line.numbers.b,levels=1:13))
m.b <- optim(m$par,loglik,hessian=T,control=list(fnscale=-1),
d=table2.10b)
q.b[b] <- qgamma(0.95,m.b$par[1],m.b$par[2])
}
q.npb <- q.b
quantile(q.b,c(0.025,0.975))