BUGS,JAGS中的加权广义回归


10

R我们可以“前重”一glm经回归权重参数。例如:

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

如何在JAGSBUGS模型中完成此操作?

我找到了一些讨论此问题的论文,但没有一个提供示例。我主要对泊松和逻辑回归示例感兴趣。


+1很好的问题!我问过一些贝叶斯专家,他们只是说在某些情况下(权重根据类别协变量),您可以计算每个类别的参数的后验分布,然后将它们组合成加权平均值。他们没有给我一个一般的解决方案,所以如果有的话我会很感兴趣!
2013年

Answers:


7

可能已经晚了...但是,

请注意两件事:

  • 不建议添加数据点,因为这会改变自由度。固定效应的均值估计可以很好地估计,但是使用此类模型应避免所有推断。如果您进行更改,则很难“让数据说话”。
  • 当然,它仅适用于整数值的权重(您不能复制0.5个数据点),这不是大多数加权(lm)回归中所做的。通常,权重是根据重复计算(例如,给定“ x”处为1 / s或1 / s ^ 2)或通过响应高度(例如1 / Y或1 / Y ^ 2,在给定的“ x”)。

在Jags,Bugs,Stan,proc MCMC或一般在贝叶斯中,可能性与常客lm或glm(或任何模型)相同,只是一样!只需为您的响应创建一个新的“权重”列,并将可能性写为

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

或加权泊松:

y [i]〜dpois(lambda [i] * weight [i])

这些Bug / Jags代码很简单。您将获得正确的一切。不要忘了继续将tau的后乘以权重,例如在进行预测和置信/预测间隔时。


如果按照说明进行操作,则会更改均值和方差。为什么不是y [i] * weight [i]〜dpois(lambda [i] * weight [i])?那只会调整方差。这里的问题是y [i] * weight [i]可能是实数类型。
user28937

实际上,加权回归确实会改变均值(因为加权使回归更接近具有大量权重的点!),而方差现在是权重的函数(因此它不是同方差模型)。方差(或精度)tau不再具有意义,但是tau / weight [i]可以完全解释为模型的精度(对于给定的“ x”)。我不建议将数据(y)与权重相乘...期望如果这正是您想要做的事,但在这种情况下我不理解您的模型...
Pierre Lebrun

我同意您的看法,它不会改变一般示例中的均值:y [i]〜dnorm(mu [i],tau / weight [i]),但第二个却会改变,因为lambda [i] * weight [ i]成为dpois的“新” lambda,它将不再与y [i]相匹配。我必须纠正自己,应该是:ty [i] * exp(weight [i])〜dpois(lambda [i] * weight [i])。在泊松情况下,乘积的想法是我们要调整方差,但还要调整均值,所以我们不需要校正均值吗?
user28937

如果您需要独立调整方差,也许负二项式模型可能会派上用场而不是泊松?它向Poisson添加了方差膨胀/收缩参数。只是非常相似。
皮埃尔·勒布朗

皮埃尔的好主意。我还考虑了幻灯片6/12中所定义的泊松分布的连续表示,链接位置为
user28937

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
这将行不通,权重通常是实数,而不是整数
好奇

这并不排除您将它们近似为整数。我的解决方案并不完美,但是可以正常工作。例如,在给定权重(1 / 3、2 / 3、1)的情况下,您可以对第二类进行2倍的上采样,对第三类进行3倍的上采样。
大卫·马克思

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 '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.