バグ、JAGSの加重一般化回帰


10

では、weightsパラメータを使用しRglm回帰を「事前に重み付け」できます。例えば:

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

JAGSまたはBUGSモデルでこれをどのように達成できますか?

これについて議論している論文を見つけましたが、どれも例を示していません。私は主にポアソンとロジスティック回帰の例に興味があります。


+1非常に良い質問です!私はいくつかのベイズの専門家に尋ねていましたが、彼らはいくつかの場合(カテゴリー共変量による重み付け)、各カテゴリーのパラメーターの事後分布を計算し、それらを重み付け平均に組み合わせることができるとだけ言っています。彼らは私に一般的な解決策を与えなかったので、それが存在するかどうか本当に興味があります!
好奇心が

回答:


7

遅いかもしれませんが…

2つのことに注意してください。

  • データポイントを追加すると、自由度が変わるためお勧めしません。固定効果の平均推定は十分に推定できますが、そのようなモデルではすべての推論を回避する必要があります。変更した場合、「データに語らせる」ことは困難です。
  • もちろん、これは整数値の重みでのみ機能します(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])

このBugs / Jagsコードは単純にトリックです。すべてが正しくなります。たとえば予測と信頼/予測の間隔を作成するときなど、タウの事後に重みを掛け続けることを忘れないでください。


述べたようにそれを行うと、平均と分散を変更します。なぜ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の「新しい」ラムダになり、これはy [i]と一致しなくなります。自分で修正する必要があります:ty [i] * exp(weight [i])〜dpois(lambda [i] * weight [i])。ポアソンケースでの乗算の考え方は、分散を調整するだけでなく、平均も調整することです。したがって、平均を修正する必要はありませんか。
user28937 2015年

分散を個別に調整する必要がある場合は、ポアソンの代わりに負の二項モデルが役立つでしょう。ポアソンに分散インフレ/デフレーションパラメーターを追加します。それは非常に似ていることを除いて。
Pierre Lebrun、2015年

ピエール良いアイデア。私はでスライド6/12に定義されたポアソン分布の連続表現についても考えlinkd
user28937

4

まず、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のポイントに重みを追加するには、上記と同様の方法でデータセットを拡張できます。


2
これは機能しません。重みは通常、整数ではなく実数です
好奇心

これは、それらを整数で近似することを妨げるものではありません。私の解決策は完璧ではありませんが、おおよそ機能します。たとえば、重み(1 / 3、2 / 3、1)を指定すると、2番目のクラスを2倍に、3番目のクラスを3倍にアップサンプリングできます。
デビッドマルクス

0

上記のコメントに追加しようとしましたが、担当者が低すぎます。

すべき

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

評判に関係なく、コメントは回答として与えられるべきではありません。
マイケルR.チェニック2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.