考虑[0,1]中给定评级集合的beta分布。计算均值后:
有没有办法提供围绕此均值的置信区间?
考虑[0,1]中给定评级集合的beta分布。计算均值后:
有没有办法提供围绕此均值的置信区间?
Answers:
虽然有一些特定的方法可以计算Beta分布中参数的置信区间,但我将介绍一些通用方法,这些方法可以用于(几乎)所有类型的分布,包括beta分布,并且可以在R中轻松实现。
让我们从具有相应轮廓似然置信区间的最大似然估计开始。首先,我们需要一些样本数据:
# Sample size
n = 10
# Parameters of the beta distribution
alpha = 10
beta = 1.4
# Simulate some data
set.seed(1)
x = rbeta(n, alpha, beta)
# Note that the distribution is not symmetrical
curve(dbeta(x,alpha,beta))
实际/理论均值为
> alpha/(alpha+beta)
0.877193
现在,我们必须创建一个函数,用于根据beta分布计算样本的负对数似然函数,并将均值作为参数之一。我们可以使用该dbeta()
函数,但是由于它不使用涉及均值的参数设置,因此必须根据均值和其他一些参数(例如标准差)来表达其参数(α和β):
# Negative log likelihood for the beta distribution
nloglikbeta = function(mu, sig) {
alpha = mu^2*(1-mu)/sig^2-mu
beta = alpha*(1/mu-1)
-sum(dbeta(x, alpha, beta, log=TRUE))
}
要找到最大似然估计,我们可以使用库mle()
中的stats4
函数:
library(stats4)
est = mle(nloglikbeta, start=list(mu=mean(x), sig=sd(x)))
现在暂时忽略警告。它们是由优化算法尝试为参数设置无效值而导致的,它们为α和/或β给出了负值。(为避免警告,您可以添加lower
参数并更改使用的优化method
。)
现在我们有了两个参数的估计值和置信区间:
> est
Call:
mle(minuslogl = nloglikbeta, start = list(mu = mean(x), sig = sd(x)))
Coefficients:
mu sig
0.87304148 0.07129112
> confint(est)
Profiling...
2.5 % 97.5 %
mu 0.81336555 0.9120350
sig 0.04679421 0.1276783
请注意,正如预期的那样,置信区间不是对称的:
par(mfrow=c(1,2))
plot(profile(est)) # Profile likelihood plot
(第二外洋红色线显示95%的置信区间。)
还要注意,即使只有10个观察值,我们也可以获得很好的估计(狭窄的置信区间)。
作为替代mle()
,您可以使用软件包中的fitdistr()
函数MASS
。这也可以计算最大似然估计器,并且具有的优点是,您仅需要提供密度,而不是负对数似然,而无需提供轮廓似然置信区间,而仅提供渐近(对称)置信区间。
包中有一个更好的选择mle2()
(及相关功能)bbmle
,它比更具灵活性和强大功能mle()
,并提供了更好的绘图。
另一种选择是使用引导程序。在R中使用它非常容易,您甚至不必提供密度函数:
> library(simpleboot)
> x.boot = one.boot(x, mean, R=10^4)
> hist(x.boot) # Looks good
> boot.ci(x.boot, type="bca") # Confidence interval
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 10000 bootstrap replicates
CALL :
boot.ci(boot.out = x.boot, type = "bca")
Intervals :
Level BCa
95% ( 0.8246, 0.9132 )
Calculations and Intervals on Original Scale
引导程序具有额外的优势,即使您的数据不是来自Beta发行版,它也可以工作。
对于均值的置信区间,我们不要忘记基于中心极限定理(和t分布)的旧的渐近置信区间。只要我们拥有较大的样本量(因此适用CLT并且样本均值的分布近似正态)或α和β的值都大(因此β分布本身近似于正态),就可以很好地工作。这里我们都没有,但是置信区间还算不错:
> t.test(x)$conf.int
[1] 0.8190565 0.9268349
对于仅稍大的n值(而不是两个参数的极端值),渐近置信区间的工作效果非常好。
查看Beta回归。可以在这里找到如何使用R进行很好的介绍:
http://cran.r-project.org/web/packages/betareg/vignettes/betareg.pdf
构造置信区间的另一种(非常容易)的方法是使用非参数Boostrap方法。维基百科有很好的信息:
http://en.wikipedia.org/wiki/Bootstrapping_%28statistics%29
这里的视频也不错: