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.