ฉันจะคำนวณช่วงความมั่นใจสำหรับค่าเฉลี่ยของชุดข้อมูลบันทึกปกติได้อย่างไร


19

ฉันเคยได้ยิน / เห็นในหลาย ๆ สถานที่ที่คุณสามารถแปลงข้อมูลที่ตั้งเป็นสิ่งที่กระจายปกติโดยการลอการิทึมของแต่ละตัวอย่างคำนวณช่วงความมั่นใจสำหรับข้อมูลที่ถูกแปลงและแปลงช่วงความเชื่อมั่นกลับมาโดยใช้การดำเนินการแบบผกผัน (เช่นเพิ่ม 10 ถึงพลังของขอบเขตล่างและบนตามลำดับสำหรับ )log10

อย่างไรก็ตามฉันสงสัยวิธีนี้เล็กน้อยเนื่องจากวิธีนี้ใช้ไม่ได้กับค่าเฉลี่ย:10mean(log10(X))mean(X)

วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร? ถ้ามันไม่ทำงานสำหรับค่าเฉลี่ยตัวเองมันจะทำงานได้อย่างไรในช่วงความมั่นใจสำหรับค่าเฉลี่ย


3
คุณพูดถูก วิธีนี้ไม่ได้ผลและมักจะให้ช่วงความมั่นใจที่ไม่รวมค่าเฉลี่ยประชากรหรือแม้แต่ค่าเฉลี่ยตัวอย่าง นี่คือการสนทนาบางอย่างเกี่ยวกับมัน: amstat.org/publications/jse/v13n1/olsson.htmlนี่ไม่ใช่คำตอบเนื่องจากฉันไม่ได้มองเรื่องนี้มากพอที่จะแสดงความคิดเห็นในลิงก์อย่างละเอียด
Erik

3
ปัญหานี้มีวิธีการแก้ปัญหาคลาสสิก: projecteuclid.org/... โซลูชันอื่น ๆ บางอย่างรวมถึงรหัสมีให้ที่epa.gov/oswer/riskassessment/pdf/ucl.pdf-- แต่อ่านเรื่องนี้ด้วยเกลือเม็ดหนักเพราะอย่างน้อยหนึ่งวิธีที่อธิบายไว้ที่นั่น ("วิธีการไม่เท่าเทียมกัน Chebyshev") มันผิดธรรมดา
whuber

คำตอบ:


11

มีหลายวิธีในการคำนวณช่วงความเชื่อมั่นสำหรับค่าเฉลี่ยของการแจกแจงแบบปกติ ฉันจะนำเสนอสองวิธี: โอกาสในการ Bootstrap และ Profile ฉันจะนำเสนอการอภิปรายเกี่ยวกับ Jeffreys ก่อน

เงินทุน

สำหรับ MLE

ในกรณีนี้ MLE ของสำหรับตัวอย่างมี(μ,σ)(x1,...,xn)

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

จากนั้น MLE ของค่าเฉลี่ยเป็น2/2) โดยการ resampling เราสามารถรับตัวอย่าง bootstrapของและการใช้สิ่งนี้เราสามารถคำนวณช่วงความเชื่อมั่นbootstrap ได้หลายอย่าง รหัสต่อไปนี้แสดงวิธีรับสิ่งเหล่านี้δ^=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")

สำหรับค่าเฉลี่ยตัวอย่าง

ตอนนี้พิจารณาตัวประมาณแทนที่จะเป็น MLE ตัวประมาณประเภทอื่น ๆ อาจได้รับการพิจารณาเช่นกันδ~=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")

ความเป็นไปได้ของโปรไฟล์

สำหรับความหมายของความน่าจะเป็นและความน่าจะเป็นรายละเอียดฟังก์ชั่นที่เห็น การใช้คุณสมบัติค่าคงที่ของความน่าจะเป็นเราสามารถแก้ไขพารามิเตอร์ดังต่อไปนี้โดยที่จากนั้นคำนวณตัวเลข ความน่าจะเป็นรายละเอียดของ\(μ,σ)(δ,σ)δ=exp(μ+σ2/2)δ

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

ฟังก์ชั่นนี้รับค่าเป็นช่วงเวลาของระดับมีความมั่นใจโดยประมาณเราจะใช้คุณสมบัตินี้เพื่อสร้างช่วงความเชื่อมั่นสำหรับรหัสต่อไปนี้แสดงวิธีรับช่วงเวลานี้ .(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)

เบย์

ในส่วนนี้ขั้นตอนวิธีทางเลือกบนพื้นฐานของมหานคร-เฮสติ้งส์สุ่มตัวอย่างและการใช้ฟรีย์ก่อนหน้านี้สำหรับการคำนวณช่วงเวลาที่น่าเชื่อถือสำหรับจะนำเสนอδ

โปรดจำไว้ว่าJeffreys ก่อนหน้าสำหรับในรูปแบบ lognormal คือ(μ,σ)

π(μ,σ)σ2,

และสิ่งนี้ก่อนหน้านี้ไม่แปรเปลี่ยนภายใต้ reparameterisations ก่อนนี้เป็นที่ไม่เหมาะสม แต่หลังของพารามิเตอร์ที่เหมาะสมคือถ้าขนาดของกลุ่มตัวอย่าง2 รหัสต่อไปนี้แสดงวิธีรับช่วงความน่าเชื่อถือ 95% โดยใช้แบบจำลอง Bayesian นี้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))

โปรดทราบว่าพวกเขามีความคล้ายคลึงกันมาก


1
(+1) ฉันคิดว่าคุณสามารถได้รับช่วงความมั่นใจตามทฤษฎีความน่าจะเป็นสูงสุดด้วยแพ็คเกจ distrMod R
Stéphane Laurent

@ StéphaneLaurentขอบคุณสำหรับข้อมูล ฉันต้องการดูผลลัพธ์ของรหัสของคุณด้วยรหัสใหม่ก่อน ฉันไม่ทราบคำสั่งและแพ็คเกจที่คุณใช้งานอยู่

4
การตอบสนองที่สวยงาม @Procrastinator วิธีการหนึ่งที่อื่น ๆ ที่เป็นประมาณการทาซึ่งใช้เหลือทั้งหมดออกจากค่าเฉลี่ยโยล็อกจะได้รับค่าคาดการณ์โยเดิมและเพียงแค่ค่าเฉลี่ยพวกเขา ฉันยังทันสมัยกับช่วงความมั่นใจน้อยกว่าโดยใช้วิธีนี้ยกเว้นการใช้วิธีเปอร์เซนต์บูตสแตรปมาตรฐาน n
Frank Harrell

การตอบสนองที่ยอดเยี่ยม! แนวทางที่แนะนำในที่นี้ถือว่าข้อผิดพลาดของโมเดลแบบ homoscedastic - ฉันได้ทำงานในโครงการที่สมมติฐานนี้ไม่สามารถใช้การได้ ฉันขอแนะนำให้ใช้แกมมาถดถอยเป็นทางเลือกซึ่งจะหลีกเลี่ยงความจำเป็นในการแก้ไขอคติ
Isabella Ghement

4

คุณอาจลองใช้วิธี Bayesian กับ 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))

นี่ฟังดูน่าสนใจมากและเนื่องจากฉันมักชอบวิธีแบบเบย์ฉันจึงยกมันขึ้น มันยังสามารถปรับปรุงได้โดยการเพิ่มการอ้างอิงบางอย่างหรือโดยเฉพาะอย่างยิ่งแม้คำอธิบายที่เข้าใจได้ว่าทำไมมันทำงาน
Erik

เป็นที่รู้จักกันว่า "มัน" (ความที่ frequentist จับคู่ทรัพย์สิน) ทำงานให้กับและ 2 สำหรับคุณสมบัติการจับคู่เป็นประจำนั้นสมบูรณ์แบบ: ช่วงเวลาความน่าเชื่อถือเท่ากับช่วงความเชื่อมั่นปกติ สำหรับฉันไม่รู้ว่ามันถูกต้องหรือไม่ แต่มันง่ายในการตรวจสอบเพราะการกระจายหลังเป็นแกมม่า ความจริงที่ว่ามันเหมาะกับและไม่จำเป็นต้องแสดงให้เห็นว่าการทำงานสำหรับฟังก์ชั่นของและ 2 ฉันไม่รู้ว่ามีการอ้างอิงบางส่วนหรือไม่ แต่คุณสามารถตรวจสอบด้วยแบบจำลองได้ σ 2 μ σ 2 μ σ 2( μ , σ 2 ) μ σ 2μσ2μσ2μσ2f(μ,σ2)μσ2
Stéphane Laurent

ขอบคุณมากสำหรับการอภิปราย ฉันลบความคิดเห็นทั้งหมดเพื่อความชัดเจนและเพื่อหลีกเลี่ยงความสับสน (+1)

1
@Procrastinator ขอบคุณเช่นกัน ฉันได้ลบความคิดเห็นของฉันและเพิ่มประเด็นเกี่ยวกับ Jeffreys ก่อนหน้าในรหัสของฉัน
Stéphane Laurent

มีคนช่วยอธิบายให้ฉันฟังได้ไหมว่า boots.out = boot (data = data0, statistic = function (d, ind) {mle (d [ind])}, R = 10000) ฉันเห็นว่า "ind" เป็นดัชนี แต่ฉันไม่เข้าใจวิธีการค้นหา "ind" การอ้างอิงอาร์กิวเมนต์ที่สองอยู่ที่ไหน ฉันได้ลองใช้ฟังก์ชั่นทางเลือกแล้ว แต่มันไม่ทำงาน ดูการบูตฟังก์ชั่นจริงฉันไม่เห็นการอ้างอิงถึง Ind
Andor kesselman

0

อย่างไรก็ตามฉันสงสัยวิธีนี้เพียงเล็กน้อยเพราะวิธีนี้ใช้ไม่ได้กับค่าเฉลี่ย: 10mean (log10 (X)) ≠ mean (X)

คุณพูดถูก - นั่นเป็นสูตรสำหรับค่าเฉลี่ยเรขาคณิตไม่ใช่ค่าเฉลี่ยเลขคณิต ค่าเฉลี่ยเลขคณิตเป็นพารามิเตอร์จากการแจกแจงแบบปกติและมักไม่มีความหมายมากสำหรับข้อมูล lognormal ค่าเฉลี่ยเรขาคณิตคือพารามิเตอร์ที่สอดคล้องกันจากการแจกแจงล็อกนอร์มอลถ้าคุณต้องการพูดอย่างมีความหมายมากขึ้นเกี่ยวกับแนวโน้มที่เป็นศูนย์กลางสำหรับข้อมูลของคุณ

และคุณจะคำนวณ CIs เกี่ยวกับค่าเฉลี่ยเรขาคณิตโดยการหาค่าลอการิทึมของข้อมูล, คำนวณค่าเฉลี่ยและ CIs ตามปกติและเปลี่ยนกลับ คุณพูดถูกที่คุณไม่ต้องการผสมผสานการกระจายของคุณโดยการใส่ CIs สำหรับค่าเฉลี่ยทางเรขาคณิตรอบค่าเฉลี่ยเลขคณิต .... yeowch!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.