Làm cách nào để tính khoảng tin cậy cho giá trị trung bình của tập dữ liệu thông thường log?


19

Tôi đã nghe / thấy ở một số nơi mà bạn có thể chuyển đổi tập dữ liệu thành một thứ được phân phối bình thường bằng cách lấy logarit của từng mẫu, tính khoảng tin cậy cho dữ liệu được chuyển đổi và chuyển đổi khoảng tin cậy trở lại bằng thao tác nghịch đảo (ví dụ: tăng 10 đến sức mạnh của giới hạn dưới và trên, tương ứng, cho ).log10

Tuy nhiên, tôi hơi nghi ngờ về phương pháp này, đơn giản vì nó không hoạt động với chính nghĩa của nó:10mean(log10(X))mean(X)

cách chính xác để làm điều này là gì? Nếu nó không hoạt động cho chính trung bình, làm thế nào nó có thể hoạt động cho khoảng tin cậy cho trung bình?


3
Bạn hoàn toàn đúng. Cách tiếp cận này thường không hiệu quả và thường mang lại khoảng tin cậy không bao gồm trung bình dân số hoặc thậm chí trung bình mẫu. Đây là một số thảo luận về nó: amstat.org/publications/jse/v13n1/olsson.html Đây không phải là một câu trả lời, vì tôi đã không xem xét vấn đề đủ để thực sự nhận xét chi tiết về liên kết.
Erik

3
Vấn đề này có một giải pháp cổ điển: projecteuclid.org/ . Một số giải pháp khác, bao gồm mã, được cung cấp tại epa.gov/oswer/riskassessment/pdf/ucl.pdf-- nhưng đọc phần này với một hạt muối nặng, bởi vì ít nhất một phương pháp được mô tả ở đó ("Phương pháp bất bình đẳng Ch Quashev ") chỉ đơn giản là sai.
whuber

Câu trả lời:


11

Có một số cách để tính khoảng tin cậy cho giá trị trung bình của phân phối logic. Tôi sẽ trình bày hai phương pháp: Khả năng Bootstrap và Hồ sơ. Tôi cũng sẽ trình bày một cuộc thảo luận về Jeffreys trước.

Bootstrap

Dành cho MLE

Trong trường hợp này, MLE của cho một mẫu(μ,σ)(x1,...,xn)

μ^=1nj=1nlog(xj);σ^2=1nj=1n(log(xj)μ^)2.

Sau đó, MLE của giá trị trung bình là . Bằng cách lấy mẫu lại, chúng ta có thể lấy được mẫu bootstrap của và, bằng cách này, chúng ta có thể tính toán một số khoảng tin cậy của bootstrap . Các mã sau đây cho thấy làm thế nào để có được những.δ^=exp(μ^+σ^2/2) δδ^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")

Đối với trung bình mẫu

Bây giờ, hãy xem xét công cụ ước tính thay vì MLE. Loại dự toán khác có thể được coi là tốt.δ~=x¯

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")

Hồ sơ khả năng

Để biết định nghĩa về khả năng và chức năng khả năng hồ sơ, xem . Sử dụng thuộc tính bất biến của khả năng chúng ta có thể xác định lại tham số như sau , trong đó và sau đó tính toán số khả năng hồ sơ của .(μ,σ)(δ,σ)δ=exp(μ+σ2/2)δ

Rp(δ)=supσL(δ,σ)supδ,σL(δ,σ).

Hàm này lấy các giá trị trong ; một khoảng mức độ tin cậy xấp xỉ . Chúng tôi sẽ sử dụng thuộc tính này để xây dựng khoảng tin cậy cho . Các mã sau đây cho biết cách lấy khoảng này .(0,1]0.147 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)

Bayes

Trong phần này, một thuật toán thay thế, dựa trên việc lấy mẫu của Metropolis-Hastings và việc sử dụng Jeffreys trước đó, để tính toán khoảng tin cậy cho được trình bày.δ

Hãy nhớ lại rằng Jeffreys trước cho trong một mô hình logic(μ,σ)

π(μ,σ)σ2,

và rằng điều này trước là bất biến dưới các tham số lại. Điều này trước là không đúng, nhưng sau của các tham số là phù hợp nếu cỡ mẫu . Đoạn mã sau cho thấy cách đạt được khoảng tin cậy 95% bằng mô hình Bayes này.n2R

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))

Lưu ý rằng chúng rất giống nhau.


1
(+1) Tôi nghĩ rằng bạn cũng có thể có được khoảng tin cậy dựa trên lý thuyết khả năng tối đa với gói distrMod R
Stéphane Laurent

@ StéphaneLaurent Cảm ơn thông tin. Tôi muốn xem kết quả của mã của bạn với cái mới trước. Tôi đã không nhận thức được các lệnh và gói mà bạn đang sử dụng.

4
Phản hồi đẹp @Procrastinator. Một cách tiếp cận khác là công cụ ước tính bôi nhọ, sử dụng tất cả các phần dư của giá trị trung bình trên thang đo log để lấy giá trị dự đoán trên thang đo ban đầu và chỉ cần tính trung bình cho chúng. Mặc dù vậy, tôi ít cập nhật hơn về các khoảng tin cậy khi sử dụng phương pháp này, ngoại trừ việc sử dụng phương pháp phần trăm bootstrap tiêu chuẩn. n
Frank Harrell

Phản ứng tuyệt vời! Các cách tiếp cận được đề xuất ở đây giả định lỗi mô hình homoscedastic - Tôi đã làm việc trên các dự án mà giả định này không thể thực hiện được. Tôi cũng sẽ đề nghị sử dụng hồi quy gamma như một phương án thay thế, điều này sẽ bỏ qua sự cần thiết phải điều chỉnh sai lệch.
Isabella Ghement

4

Bạn có thể thử cách tiếp cận Bayes với trước của Jeffreys. Nó sẽ mang lại khoảng tin cậy với một thuộc tính phù hợp thường xuyên chính xác: mức độ tin cậy của khoảng tin cậy gần với mức độ tin cậy của nó.

 # 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))

Điều này nghe có vẻ rất thú vị và vì tôi có xu hướng thích các phương pháp Bayes, tôi đã nâng cấp nó. Nó vẫn có thể được cải thiện bằng cách thêm một số tài liệu tham khảo hoặc tốt nhất là một lời giải thích dễ hiểu về lý do tại sao nó hoạt động.
Erik

It is known that "it" (the frequentist-matching property) works for σ 2 μ σ 2 μ σ 2 f ( μ , σ 2 ) μ σ 2μ and σ2. For μ the frequentist-matching property is perfect: the credibility interval is exactly the same as the usual confidence interval. For σ2 I don't know whether it is exact but it is easy to check because the posterior distribution is an inverse-Gamma. The fact that it works for μ and σ2 does not necessarily implies that it works for a function f(μ,σ2) of μ and σ2. I don't know whether there are some references but otherwise you can check with simulations.
Stéphane Laurent

Rất cám ơn cho cuộc thảo luận. Tôi đã xóa tất cả các bình luận của tôi cho rõ ràng và để tránh bất kỳ sự nhầm lẫn. (+1)

1
@Procrastinator Cảm ơn quá. Tôi cũng đã xóa các bình luận của mình và thêm quan điểm về Jeffreys trước trong mã của tôi.
Stéphane Laurent

Ai đó có thể vui lòng giải thích cho tôi cách khởi động.out = boot (data = data0, statistic = function (d, ind) {mle (d [ind])}, R = 10000) hoạt động. Tôi thấy rằng "ind" là một chỉ mục, nhưng tôi không hiểu cách tìm "ind". Đâu là tham chiếu thứ hai này? Tôi đã thử nó với các chức năng thay thế và nó không hoạt động. Nhìn vào chức năng khởi động thực tế, tôi cũng không thấy một tài liệu tham khảo nào về Ind.
andor kesselman

0

Tuy nhiên, tôi hơi nghi ngờ về phương pháp này, đơn giản vì nó không hoạt động với nghĩa trung bình: 10mean (log10 (X)) mean (X)

Bạn nói đúng - đó là công thức cho trung bình hình học, không phải là trung bình số học. Giá trị trung bình số học là một tham số từ phân phối bình thường và thường không có ý nghĩa lắm đối với dữ liệu logic. Giá trị trung bình hình học là tham số tương ứng từ phân phối lognatural nếu bạn muốn nói một cách có ý nghĩa hơn về xu hướng trung tâm cho dữ liệu của bạn.

Và bạn thực sự sẽ tính toán các TCTD về giá trị trung bình hình học bằng cách lấy logarit của dữ liệu, tính giá trị trung bình và các TCTD như bình thường và biến đổi ngược. Bạn đúng rằng bạn thực sự không muốn trộn lẫn các bản phân phối của mình bằng cách đặt các TCTD cho ý nghĩa hình học xung quanh ý nghĩa số học .... yeowch!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.