我在很多地方都听说过/可以通过获取每个样本的对数来将数据集转换为正态分布的东西,计算转换后的数据的置信区间,并使用逆运算将其转换回(例如,将分别提高10到下限和上限的幂)。
但是,我对此方法有点怀疑,仅仅是因为它不适用于平均值:
正确的方法是什么?如果它对均值本身不起作用,那么如何在均值的置信区间内起作用?
我在很多地方都听说过/可以通过获取每个样本的对数来将数据集转换为正态分布的东西,计算转换后的数据的置信区间,并使用逆运算将其转换回(例如,将分别提高10到下限和上限的幂)。
但是,我对此方法有点怀疑,仅仅是因为它不适用于平均值:
正确的方法是什么?如果它对均值本身不起作用,那么如何在均值的置信区间内起作用?
Answers:
有几种计算对数正态分布平均值的置信区间的方法。我将介绍两种方法:引导程序和概要文件可能性。我还将介绍有关杰弗里斯事前的讨论。
引导程序
对于MLE
在这种情况下,的MLE对样品是
然后,平均值的MLE为。通过重新采样,我们可以获得的引导样本,并使用此样本,可以计算出多个引导置信区间。以下代码显示了如何获取它们。R
rm(list=ls())
library(boot)
set.seed(1)
# Simulated data
data0 = exp(rnorm(100))
# Statistic (MLE)
mle = function(dat){
m = mean(log(dat))
s = mean((log(dat)-m)^2)
return(exp(m+s/2))
}
# Bootstrap
boots.out = boot(data=data0, statistic=function(d, ind){mle(d[ind])}, R = 10000)
plot(density(boots.out$t))
# 4 types of Bootstrap confidence intervals
boot.ci(boots.out, conf = 0.95, type = "all")
对于样本均值
现在,考虑到估计代替MLE。也可以考虑其他类型的估计量。
rm(list=ls())
library(boot)
set.seed(1)
# Simulated data
data0 = exp(rnorm(100))
# Statistic (MLE)
samp.mean = function(dat) return(mean(dat))
# Bootstrap
boots.out = boot(data=data0, statistic=function(d, ind){samp.mean(d[ind])}, R = 10000)
plot(density(boots.out$t))
# 4 types of Bootstrap confidence intervals
boot.ci(boots.out, conf = 0.95, type = "all")
轮廓可能性
有关似然和轮廓似然函数的定义,请参见。使用我们可以reparameterise的可能性的不变性性质如下,其中,,然后计算数值的简档的可能性。
该函数取值;级别为的间隔的置信度约为。我们将使用此属性为构造置信度间隔。以下代码显示如何获取此间隔。 95 %δR
set.seed(1)
# Simulated data
data0 = exp(rnorm(100))
# Log likelihood
ll = function(mu,sigma) return( sum(log(dlnorm(data0,mu,sigma))))
# Profile likelihood
Rp = function(delta){
temp = function(sigma) return( sum(log(dlnorm(data0,log(delta)-0.5*sigma^2,sigma)) ))
max=exp(optimize(temp,c(0.25,1.5),maximum=TRUE)$objective -ll(mean(log(data0)),sqrt(mean((log(data0)-mean(log(data0)))^2))))
return(max)
}
vec = seq(1.2,2.5,0.001)
rvec = lapply(vec,Rp)
plot(vec,rvec,type="l")
# Profile confidence intervals
tr = function(delta) return(Rp(delta)-0.147)
c(uniroot(tr,c(1.2,1.6))$root,uniroot(tr,c(2,2.3))$root)
贝叶斯
在本节中,提出了一种基于Metropolis-Hastings采样和使用Jeffreys Prior的替代算法,用于计算的可信区间。
回想一下,现有杰弗瑞斯为在对数正态模型是
并且该先验在重新参数化下是不变的。该先验是不适当的,但是如果样本大小为,则参数的后验是正确的。以下代码显示了如何使用此贝叶斯模型获得95%的可信区间。R
library(mcmc)
set.seed(1)
# Simulated data
data0 = exp(rnorm(100))
# Log posterior
lp = function(par){
if(par[2]>0) return( sum(log(dlnorm(data0,par[1],par[2]))) - 2*log(par[2]))
else return(-Inf)
}
# Metropolis-Hastings
NMH = 260000
out = metrop(lp, scale = 0.175, initial = c(0.1,0.8), nbatch = NMH)
#Acceptance rate
out$acc
deltap = exp( out$batch[,1][seq(10000,NMH,25)] + 0.5*(out$batch[,2][seq(10000,NMH,25)])^2 )
plot(density(deltap))
# 95% credibility interval
c(quantile(deltap,0.025),quantile(deltap,0.975))
请注意,它们非常相似。
您可以尝试用杰弗里斯(Jeffreys)的贝叶斯方法。它应产生具有正确的频繁匹配属性的可信区间:可信区间的置信度接近其可信度。
# required package
library(bayesm)
# simulated data
mu <- 0
sdv <- 1
y <- exp(rnorm(1000, mean=mu, sd=sdv))
# model matrix
X <- model.matrix(log(y)~1)
# prior parameters
Theta0 <- c(0)
A0 <- 0.0001*diag(1)
nu0 <- 0 # Jeffreys prior for the normal model; set nu0 to 1 for the lognormal model
sigam0sq <- 0
# number of simulations
n.sims <- 5000
# run posterior simulations
Data <- list(y=log(y),X=X)
Prior <- list(betabar=Theta0, A=A0, nu=nu0, ssq=sigam0sq)
Mcmc <- list(R=n.sims)
bayesian.reg <- runireg(Data, Prior, Mcmc)
mu.sims <- t(bayesian.reg$betadraw) # transpose of bayesian.reg$betadraw
sigmasq.sims <- bayesian.reg$sigmasqdraw
# posterior simulations of the mean of y: exp(mu+sigma²/2)
lmean.sims <- exp(mu.sims+sigmasq.sims/2)
# credibility interval about lmean:
quantile(lmean.sims, probs = c(0.025, 0.975))