では、weightsパラメータを使用しR
てglm
回帰を「事前に重み付け」できます。例えば:
glm.D93 <- glm(counts ~ outcome + treatment, family = poisson(), weights=w)
JAGS
またはBUGS
モデルでこれをどのように達成できますか?
これについて議論している論文を見つけましたが、どれも例を示していません。私は主にポアソンとロジスティック回帰の例に興味があります。
では、weightsパラメータを使用しR
てglm
回帰を「事前に重み付け」できます。例えば:
glm.D93 <- glm(counts ~ outcome + treatment, family = poisson(), weights=w)
JAGS
またはBUGS
モデルでこれをどのように達成できますか?
これについて議論している論文を見つけましたが、どれも例を示していません。私は主にポアソンとロジスティック回帰の例に興味があります。
回答:
遅いかもしれませんが…
2つのことに注意してください。
Jags、Bugs、Stan、proc MCMC、または一般的なベイジアンでは、可能性は、常連のlmまたはglm(または任意のモデル)と同じで、同じです!! 応答用の新しい列「重み」を作成し、次のように可能性を記述します
y [i]〜dnorm(mu [i]、tau / weight [i])
または加重ポアソン:
y [i]〜dpois(lambda [i] * weight [i])
このBugs / Jagsコードは単純にトリックです。すべてが正しくなります。たとえば予測と信頼/予測の間隔を作成するときなど、タウの事後に重みを掛け続けることを忘れないでください。
まず、glm
ベイズ回帰を実行しないことを指摘する価値があります。'weights'パラメータは基本的に「観測の割合」の省略形であり、データセットを適切にアップサンプリングすることで置き換えることができます。例えば:
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のこのメソッドの結果を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