การถดถอยทั่วไปแบบถ่วงน้ำหนักใน BUGS, JAGS


10

ในRเราสามารถ "น้ำหนักก่อนหน้า" การglmถดถอยผ่านพารามิเตอร์น้ำหนัก ตัวอย่างเช่น:

glm.D93 <- glm(counts ~ outcome + treatment, family = poisson(), weights=w)

วิธีนี้สามารถทำได้ในJAGSหรือBUGSรูปแบบ?

ฉันพบบทความบางส่วนเกี่ยวกับเรื่องนี้ แต่ไม่มีบทความใดแสดงให้เห็น ฉันสนใจตัวอย่างปัวซองและการถดถอยโลจิสติกเป็นส่วนใหญ่


+1 คำถามที่ดีมาก! ฉันถามผู้เชี่ยวชาญ Bayesian นี้และพวกเขาบอกว่าในบางกรณี (น้ำหนักตาม covariate ที่จัดหมวดหมู่) คุณสามารถคำนวณการกระจายพารามิเตอร์ด้านหลังของแต่ละประเภทแล้วรวมเข้าด้วยกันในค่าเฉลี่ยถ่วงน้ำหนัก พวกเขาไม่ได้ให้วิธีการแก้ปัญหาทั่วไปแก่ฉันดังนั้นฉันจะสนใจจริงๆถ้ามันมีอยู่หรือไม่!
อยากรู้อยากเห็น

คำตอบ:


7

มันอาจจะสาย ... แต่

โปรดทราบ 2 สิ่ง:

  • ไม่แนะนำให้เพิ่มจุดข้อมูลเพราะมันจะเปลี่ยนองศาอิสระ การประมาณค่าเฉลี่ยของผลกระทบคงที่สามารถประมาณได้ดี แต่การอนุมานทั้งหมดควรหลีกเลี่ยงกับโมเดลดังกล่าว มันยากที่จะ "ให้ข้อมูลพูด" ถ้าคุณเปลี่ยนแปลง
  • แน่นอนว่าใช้งานได้กับน้ำหนักที่มีค่าจำนวนเต็มเท่านั้น (คุณไม่สามารถทำซ้ำจุดข้อมูล 0.5) ซึ่งไม่ใช่สิ่งที่ทำในการถดถอยแบบถ่วงน้ำหนัก (lm) ส่วนใหญ่ โดยทั่วไปแล้วการชั่งน้ำหนักจะถูกสร้างขึ้นตามความแปรปรวนของท้องถิ่นโดยประมาณจากการทำซ้ำ (เช่น 1 / s หรือ 1 / s ^ 2 ที่ 'x' ที่กำหนด) หรือขึ้นอยู่กับความสูงของการตอบสนอง (เช่น 1 / Y หรือ 1 / Y ^ 2 ที่ a 'x' ที่ได้รับ)

ใน Jags, Bugs, Stan, proc MCMC หรือใน Bayesian โดยทั่วไปความเป็นไปได้ไม่แตกต่างจาก lm หรือ glm ที่ใช้บ่อย (หรือรุ่นใด ๆ ) มันเหมือนกัน !! เพียงสร้างคอลัมน์ "น้ำหนัก" ใหม่สำหรับการตอบกลับของคุณและเขียนความเป็นไปได้ดังนี้

y [i] ~ dnorm (mu [i], tau / weight [i])

หรือปัวซองถ่วงน้ำหนัก:

y [i] ~ dpois (แลมบ์ดา [i] * น้ำหนัก [i])

รหัส Bugs / Jags นี้เป็นการหลอกลวง คุณจะได้รับทุกสิ่งที่ถูกต้อง อย่าลืมที่จะเพิ่มน้ำหนักตัวหลังของเอกภาพต่อไปเช่นเมื่อทำการทำนายและความมั่นใจ / ช่วงเวลาการทำนาย


หากเราทำตามที่ระบุไว้เราจะเปลี่ยนค่าเฉลี่ยและความแปรปรวน ทำไมมันไม่ใช่ y [i] * น้ำหนัก [i] ~ dpois (แลมบ์ดา [i] * น้ำหนัก [i]) นั่นจะปรับความแปรปรวนเท่านั้น ปัญหานี่คือ y [i] * น้ำหนัก [i] อาจเป็นของจริง
28937

จริง ๆ แล้วการถดถอยแบบถ่วงน้ำหนักนั้นเปลี่ยนไปหมายความว่า (เพราะการชั่งนำไปสู่การถดถอยเพื่อเข้าใกล้จุดที่มีน้ำหนักมาก!) และความแปรปรวนตอนนี้กลายเป็นฟังก์ชั่นของตุ้มน้ำหนัก ความแปรปรวน (หรือความแม่นยำ) เอกภาพไม่มีความหมายอีกต่อไป แต่เอกภาพ / น้ำหนัก [i] สามารถตีความได้อย่างแม่นยำตามความแม่นยำของแบบจำลอง (สำหรับ "x" ที่ให้มา) ฉันจะไม่แนะนำคูณของข้อมูล (y) โดยน้ำหนักที่ ... คาดหวังที่ว่านี้เป็นเพราะสิ่งที่คุณต้องการจะทำ แต่ผมไม่เข้าใจว่าคุณสร้างแบบจำลองในกรณีนี้ ...
ปิแอร์ Lebrun

ฉันเห็นด้วยกับคุณว่ามันจะไม่เปลี่ยนค่าเฉลี่ยในตัวอย่างปกติ: y [i] ~ dnorm (mu [i], tau / weight [i]) แต่มันทำได้ในวินาทีเนื่องจาก lambda [i] * น้ำหนัก [ i] กลายเป็นแลมบ์ดา "ใหม่" สำหรับ dpois และสิ่งนี้จะไม่ตรงกับ y [i] อีกต่อไป ฉันต้องแก้ไขตัวเองมันควรจะเป็น: ty [i] * exp (น้ำหนัก [i]) ~ dpois (lambda [i] * น้ำหนัก [i]) แนวคิดที่มีการคูณในกรณีปัวซองคือเราต้องการปรับความแปรปรวน แต่ยังปรับค่าเฉลี่ยด้วยดังนั้นเราไม่จำเป็นต้องแก้ไขค่าเฉลี่ยหรือไม่
28937

หากคุณต้องการปรับความแปรปรวนอย่างอิสระบางทีโมเดลเนกาทีฟบินนามอาจมีประโยชน์แทนปัวซอง? มันจะเพิ่มพารามิเตอร์เงินเฟ้อ / ภาวะเงินฝืดให้กับปัวซอง ยกเว้นว่ามันจะคล้ายกันมาก
Pierre Lebrun

ความคิดที่ดีปิแอร์ ฉันคิดเกี่ยวกับการเป็นตัวแทนอย่างต่อเนื่องของการแจกแจงแบบปัวซองที่กำหนดในสไลด์ 6/12 ที่linkd
28937

4

อย่างแรกคือมันควรค่าแก่การชี้glmว่าไม่ได้ทำการถดถอยแบบเบย์ พารามิเตอร์ 'น้ำหนัก' นั้นเป็นเพียงมือสั้น ๆ สำหรับ "สัดส่วนการสังเกต" ซึ่งสามารถแทนที่ด้วยชุดข้อมูลของคุณได้อย่างเหมาะสม ตัวอย่างเช่น:

x=1:10
y=jitter(10*x)
w=sample(x,10)

augmented.x=NULL
augmented.y=NULL    
for(i in 1:length(x)){
    augmented.x=c(augmented.x, rep(x[i],w[i]))
    augmented.y=c(augmented.y, rep(y[i],w[i]))
}

# These are both basically the same thing
m.1=lm(y~x, weights=w)
m.2=lm(augmented.y~augmented.x)

ดังนั้นเพื่อเพิ่มน้ำหนักให้กับคะแนนใน JAGS หรือ BUGS คุณสามารถเพิ่มชุดข้อมูลของคุณในรูปแบบที่คล้ายกันดังกล่าวข้างต้น


2
วิธีนี้ใช้ไม่ได้น้ำหนักเป็นตัวเลขจริงทั่วไปไม่ใช่จำนวนเต็ม
Curious

สิ่งนี้ไม่ได้ขัดขวางคุณจากการประมาณค่าด้วยจำนวนเต็ม โซลูชันของฉันไม่สมบูรณ์แบบ แต่ใช้งานได้ประมาณ ตัวอย่างเช่นน้ำหนักที่กำหนด (1/3, 2/3, 1) คุณสามารถเพิ่มคลาสที่สองด้วยปัจจัยสองและคลาสที่สามโดยปัจจัยสาม
David Marx

0

พยายามเพิ่มความคิดเห็นด้านบน แต่ตัวแทนของฉันต่ำเกินไป

ควร

y[i] ~ dnorm(mu[i], tau / weight[i])

ไม่เป็น

y[i] ~ dnorm(mu[i], tau * weight[i])

ใน JAGS ฉันใช้การทดสอบบางอย่างเปรียบเทียบผลลัพธ์จากวิธีนี้ใน JAGS กับผลลัพธ์จากการถดถอยแบบถ่วงน้ำหนักผ่าน lm () และสามารถค้นหาได้ตามการใช้แบบหลังเท่านั้น นี่คือตัวอย่างง่ายๆ:

aggregated <- 
  data.frame(x=1:5) %>%
  mutate( y = round(2 * x + 2 + rnorm(length(x)) ),
          freq = as.numeric(table(sample(1:5, 100, 
                 replace=TRUE, prob=c(.3, .4, .5, .4, .3)))))
x <- aggregated$x
y <- aggregated$y
weight <- aggregated$freq
N <- length(y)

# via lm()
lm(y ~ x, data = aggregated, weight = freq)

และเปรียบเทียบกับ

lin_wt_mod <- function() {

  for (i in 1:N) {
    y[i] ~ dnorm(mu[i], tau*weight[i])
    mu[i] <- beta[1] + beta[2] * x[i]
  }

  for(j in 1:2){
    beta[j] ~ dnorm(0,0.0001)
  }

  tau   ~ dgamma(0.001, 0.001)
  sigma     <- 1/sqrt(tau)
}

dat <- list("N","x","y","weight")
params <- c("beta","tau","sigma")

library(R2jags)
fit_wt_lm1 <- jags.parallel(data = dat, parameters.to.save = params,
              model.file = lin_wt_mod, n.iter = 3000, n.burnin = 1000)
fit_wt_lm1$BUGSoutput$summary

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