Regressione generalizzata ponderata in BUG, ​​JAGS


10

In R"peso precedente" possiamo glmregredire tramite il parametro pesi . Per esempio:

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

Come può essere realizzato in un JAGSo BUGSmodello?

Ho trovato alcuni articoli che ne discutono, ma nessuno di loro fornisce un esempio. Sono interessato principalmente agli esempi di regressione logistica e di Poisson.


+1 ottima domanda! Lo stavo chiedendo ad alcuni specialisti bayesiani e dicono solo che in alcuni casi (pesi secondo la covariata categorica), è possibile calcolare la distribuzione posteriore dei parametri per ciascuna categoria e poi combinarli in una media ponderata. Non mi hanno dato una soluzione generale, quindi sarei davvero interessato se esiste o no!
Curioso

Risposte:


7

Potrebbe essere tardi ... ma,

Nota 2 cose:

  • L'aggiunta di punti dati non è consigliata in quanto cambierebbe il grado di libertà. Le stime medie dell'effetto fisso potrebbero essere ben stimate, ma ogni inferenza dovrebbe essere evitata con tali modelli. È difficile "lasciare che i dati parlino" se lo si modifica.
  • Ovviamente funziona solo con pesi a valori interi (non è possibile duplicare 0,5 punti dati), che non è ciò che viene fatto nella regressione più ponderata (lm). In generale, viene creata una pesatura basata sulla variabilità locale stimata dai replicati (ad es. 1 / so 1 / s ^ 2 ad una data 'x') o sulla base dell'altezza di risposta (ad es. 1 / Y o 1 / Y ^ 2, a una data 'x').

In Jags, Bugs, Stan, proc MCMC, o in Bayesiano in generale, la probabilità non è diversa da quella del frequentatore lm o glm (o qualsiasi modello), è proprio la stessa !! Basta creare una nuova colonna "peso" per la tua risposta e scrivere la probabilità come

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

O un peso ponderato:

y [i] ~ dpois (lambda [i] * peso [i])

Questo codice Bugs / Jags sarebbe semplicemente il trucco. Otterrai tutto corretto. Non dimenticare di continuare a moltiplicare il posteriore di tau per il peso, ad esempio quando si effettuano intervalli di previsione e confidenza / previsione.


Se lo facciamo come indicato, cambiamo la media e la varianza. Perché non è y [i] * peso [i] ~ dpois (lambda [i] * peso [i])? Ciò regolerebbe solo la varianza. Il problema qui è che y [i] * peso [i] potrebbe essere di tipo reale.
user28937

in effetti, la regressione ponderata cambia media (perché la pesatura porta la regressione ad avvicinarsi ai punti che hanno molti pesi!) e la varianza è ora una funzione dei pesi (quindi non è un modello omoschedastico). La varianza (o la precisione) tau non ha più significato, ma tau / peso [i] può essere interpretato esattamente come la precisione del modello (per una data "x"). Non consiglierei la moltiplicazione dei dati (y) per i pesi ... mi aspetto se questo è esattamente qualcosa che vuoi fare, ma non capisco il tuo modello in questo caso ...
Pierre Lebrun,

Sono d'accordo con te che non cambia la media nell'esempio normale: y [i] ~ dnorm (mu [i], tau / weight [i]), ma lo fa nel secondo, poiché lambda [i] * weight [ i] diventa la "nuova" lambda per dpois e questo non corrisponderà più a y [i]. Devo correggermi che dovrebbe essere: ty [i] * exp (peso [i]) ~ dpois (lambda [i] * peso [i]). L'idea con la moltiplicazione nel caso di Poisson è che vogliamo regolare la varianza, ma anche regolare la media, quindi non dobbiamo correggere la media?
user28937,

Se hai bisogno di regolare la varianza in modo indipendente, forse un modello Binomiale negativo potrebbe tornare utile anziché un Poisson? Aggiunge un parametro di inflazione / deflazione di varianza al Poisson. Solo che è molto simile.
Pierre Lebrun,

Pierre buona idea. Ho pensato anche sulla rappresentazione continua della distribuzione di Poisson definito nella presentazione 6/12 a linkd
user28937

4

Innanzitutto, vale la pena sottolineare che glmnon esegue la regressione bayesiana. Il parametro "pesi" è sostanzialmente una scorciatoia per "proporzione di osservazioni", che può essere sostituita con un up-sampling del set di dati in modo appropriato. Per esempio:

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)

Quindi, per aggiungere peso ai punti in JAGS o BUGS, puoi aumentare il tuo set di dati in un modo simile a quello sopra.


2
questo non funzionerà, i pesi sono di solito numeri reali, non numeri interi
Curioso,

Questo non ti impedisce di approssimarli con numeri interi. La mia soluzione non è perfetta, ma funziona approssimativamente. Ad esempio, dati i pesi (1/3, 2/3, 1), è possibile sottocampionare la seconda classe di un fattore due e la terza classe di un fattore tre.
David Marx,

0

Ho provato ad aggiungere un commento sopra, ma il mio rappresentante è troppo basso.

Dovrebbero

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

non essere

y[i] ~ dnorm(mu[i], tau * weight[i])

in JAGS? Sto eseguendo alcuni test confrontando i risultati di questo metodo in JAGS con i risultati di una regressione ponderata tramite lm () e riesco a trovare la conformità solo usando quest'ultimo. Ecco un semplice esempio:

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)

e confronta con

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

Indipendentemente dalla reputazione, i commenti non devono essere forniti come risposte.
Michael R. Chernick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.