버그, JAGS의 가중 일반화 회귀


10

에서 R우리가 할 수있는 "이전에 무게"는 glm바이어 회귀 가중치 매개 변수입니다. 예를 들면 다음과 같습니다.

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

JAGS또는 BUGS모델 에서 어떻게이 작업을 수행 할 수 있습니까?

나는 이것에 대해 논의한 논문을 찾았지만 그 중 어느 것도 예를 제공하지 않았다. 나는 주로 포아송과 로지스틱 회귀 예제에 관심이 있습니다.


+1 아주 좋은 질문입니다! 나는 이것을 베이지안 전문가들에게 묻고 있었으며 어떤 경우에는 (범주 공변량에 따른 가중치) 각 범주에 대한 사후 매개 변수의 사후 분포를 계산 한 다음 가중치 평균으로 결합 할 수 있다고 말합니다. 그들은 나에게 일반적인 해결책을주지 않았으므로 그것이 존재하는지 아닌지 정말로 관심이있을 것입니다!
호기심

답변:


7

늦었을지도 모르지만 ...

2 가지 사항에 유의하십시오.

  • 자유도를 변경할 수 있으므로 데이터 점을 추가하지 않는 것이 좋습니다. 고정 효과의 평균 추정치는 잘 추정 할 수 있지만 이러한 모델에서는 모든 추론을 피해야합니다. 데이터를 변경하면 "데이터를 말하게"하기가 어렵습니다.
  • 물론 그것은 대부분의 가중 (lm) 회귀에서 수행되지 않은 정수 값 가중치 (0.5 데이터 포인트를 복제 할 수 없음)에서만 작동합니다. 일반적으로 계량은 반복 실험 (예 : 주어진 '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 (람다 [i] * 무게 [i])

이 버그 / 재그 코드는 단순히 속임수입니다. 당신은 모든 것을 올바르게 얻을 것입니다. 예를 들어 예측 및 신뢰 / 예측 간격을 만들 때 타우의 후부에 가중치를 계속 곱하는 것을 잊지 마십시오.


명시된대로하면 평균과 분산이 변경됩니다. 왜 y [i] * weight [i] ~ dpois (lambda [i] * weight [i])가 아닌가? 분산 만 조정합니다. 여기서 문제는 y [i] * weight [i]가 실수 유형일 수 있다는 것입니다.
28937

실제로 가중 회귀는 평균이 변하기 때문에 (계량으로 인해 회귀가 많은 가중치가있는 지점에 가까워지기 때문입니다!) 분산은 이제 가중치의 함수입니다 (따라서 동 분산 모델이 아닙니다). 분산 (또는 정밀도) 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

분산을 독립적으로 조정해야하는 경우 포이 슨 대신 음 이항 모델이 유용 할 수 있습니다. 포아송에 분산 인플레이션 / 수축 파라미터를 추가합니다. 그것을 제외하고는 매우 비슷합니다.
Pierre Lebrun 님이

피에르 좋은 생각입니다. 슬라이드 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
이것은 작동하지 않습니다. 가중치는 보통 정수가 아닌 실수입니다
Curious

이것은 정수로 근사하는 것을 방해하지 않습니다. 내 솔루션은 완벽하지는 않지만 대략적으로 작동합니다. 예를 들어 가중치 (1/3, 2/3, 1)가 주어지면 두 번째 클래스는 2 배, 세 번째 클래스는 3 배로 업 샘플링 할 수 있습니다.
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.