Answers:
可能已经晚了...但是,
请注意两件事:
在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的后乘以权重,例如在进行预测和置信/预测间隔时。
首先,值得指出的是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中的点增加权重,您可以采用与上述类似的方式来扩充数据集。
试图在上面添加评论,但是我的代表太低了。
应该
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