Un "modello di ostacolo" è davvero un modello? O solo due modelli sequenziali separati?


25

Considera un modello di ostacolo che prevede i dati di conteggio yda un normale predittore x:

set.seed(1839)
# simulate poisson with many zeros
x <- rnorm(100)
e <- rnorm(100)
y <- rpois(100, exp(-1.5 + x + e))

# how many zeroes?
table(y == 0)

FALSE  TRUE 
   31    69 

In questo caso, ho i dati di conteggio con 69 zeri e 31 conteggi positivi. Non pensare per il momento che questo sia, per definizione della procedura di generazione dei dati, un processo di Poisson, perché la mia domanda riguarda i modelli di ostacolo.

Diciamo che voglio gestire questi zeri in eccesso con un modello di ostacolo. Dalla mia lettura su di loro, sembrava che i modelli di ostacolo non fossero veri e propri modelli di per sé - stanno solo facendo due diverse analisi in sequenza. Innanzitutto, una regressione logistica che prevede se il valore è positivo o zero. In secondo luogo, una regressione di Poisson troncata a zero con l' inclusione solo dei casi diversi da zero. Questo secondo passo mi è sembrato sbagliato perché (a) sta eliminando dati perfettamente buoni, il che (b) potrebbe portare a problemi di alimentazione poiché gran parte dei dati sono zeri e (c) praticamente non è un "modello" in sé e per sé , ma eseguendo solo in sequenza due modelli diversi.

Così ho provato un "modello di ostacolo" rispetto al solo fatto di eseguire separatamente la regressione logistica di Poisson troncata a zero. Mi hanno dato risposte identiche (sto abbreviando l'output, per brevità):

> # hurdle output
> summary(pscl::hurdle(y ~ x))

Count model coefficients (truncated poisson with log link):
            Estimate Std. Error z value Pr(>|z|)  
(Intercept)  -0.5182     0.3597  -1.441   0.1497  
x             0.7180     0.2834   2.533   0.0113 *

Zero hurdle model coefficients (binomial with logit link):
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -0.7772     0.2400  -3.238 0.001204 ** 
x             1.1173     0.2945   3.794 0.000148 ***

> # separate models output
> summary(VGAM::vglm(y[y > 0] ~ x[y > 0], family = pospoisson()))

Coefficients: 
            Estimate Std. Error z value Pr(>|z|)  
(Intercept)  -0.5182     0.3597  -1.441   0.1497  
x[y > 0]      0.7180     0.2834   2.533   0.0113 *

> summary(glm(I(y == 0) ~ x, family = binomial))

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   0.7772     0.2400   3.238 0.001204 ** 
x            -1.1173     0.2945  -3.794 0.000148 ***
---

Questo mi sembra siccome molte diverse rappresentazioni matematiche del modello includono la probabilità che un'osservazione sia diversa da zero nella stima dei casi di conteggio positivo, ma i modelli che ho seguito sopra si ignorano completamente. Ad esempio, questo è tratto dal capitolo 5, pagina 128 dei modelli lineari generalizzati di Smithson & Merkle per variabili dipendenti limitate categoriche e continue :

... In secondo luogo, la probabilità che assuma qualsiasi valore (zero e numeri interi positivi) deve essere uguale a uno. Ciò non è garantito nell'equazione (5.33). Per risolvere questo problema, moltiplichiamo la probabilità di Poisson per la probabilità di successo di Bernoulli .      Questi problemi ci richiedono di esprimere il modello di ostacolo sopra indicato come dove , ,πyπ

(5.34)P(Y=y|x,z,β,γ)={1π^for y=0π^×exp(λ^)λ^y/y!1exp(λ^)for y=1,2,
λ^=exp(xβ)π^=logit1(zγ)xsono le covariate per il modello di Poisson, sono le covariate per il modello di regressione logistica e e sono i rispettivi coefficienti di regressione ... . zβ^γ^

Facendo i due modelli completamente separati l'uno dall'altro - che sembra essere quello che fanno i modelli di ostacolo - non vedo come sia incorporato nella previsione dei casi di conteggio positivo. Ma in base a come sono stato in grado di replicare la funzione semplicemente eseguendo due diversi modelli, non vedo come un ruolo nel Poisson troncato regressione a tutti.π^hurdlelogit1(zγ^)

Comprendo correttamente i modelli di ostacolo? Sembrano che due stiano semplicemente eseguendo due modelli sequenziali: primo, una logistica; In secondo luogo, un Poisson, ignorando completamente i casi in cui . Gradirei se qualcuno potesse chiarire la mia confusione con il business .y=0π^


Se ho ragione, sono i modelli di ostacolo, qual è la definizione di modello di "ostacolo", più in generale? Immagina due diversi scenari:

  • Immagina di modellare la competitività delle gare elettorali osservando i punteggi di competitività (1 - (percentuale di voti del vincitore - percentuale di voti del secondo classificato)). Questo è [0, 1), perché non ci sono legami (ad es. 1). Un modello di ostacolo ha senso qui, perché esiste un processo (a) l'elezione è stata contestata? e (b) se non lo fosse, quale previsione di competitività? Quindi facciamo prima una regressione logistica per analizzare 0 vs. (0, 1). Quindi eseguiamo la regressione beta per analizzare i casi (0, 1).

  • Immagina un tipico studio psicologico. Le risposte sono [1, 7], come una scala Likert tradizionale, con un enorme effetto soffitto a 7. Si potrebbe fare un modello di ostacolo che è la regressione logistica di [1, 7) contro 7, e quindi una regressione Tobit per tutti i casi in cui le risposte osservate sono <7.

Sarebbe sicuro chiamare entrambe queste situazioni "ostacolo" modelli , anche se li stimassi con due modelli sequenziali (logistica e poi beta nel primo caso, logistica e poi Tobit nel secondo)?


5
Credo che i modelli di ostacolo siano equivalenti all'esecuzione dei due modelli separati (binario + zero troncato). La ragione tecnica per cui funziona è che il primo modello usa solo zero / non-zero per stimare ; il secondo modello condiziona una risposta diversa da zero per stimare . πλ
Ben Bolker,

Quindi sarebbe quindi per ogni cui ? π^1iy>0
Mark White il

3
No. Il modello condizionale esclude il termine , ovvero ...π^P(Y=y|Y>0)=exp(λ^)etc.
Ben Bolker

Ah grazie. Quindi suppongo che l'equazione di Smithson e Merkle descriva un modello diverso da quello implementato pscl::hurdle, ma sembra lo stesso nell'equazione 5 qui: cran.r-project.org/web/packages/pscl/vignettes/countreg.pdf O forse io mi manca ancora qualcosa di base che mi farebbe cliccare per me?
Mark White il

4
È lo stesso modello. Mike ed Ed si concentrano sul caso più semplice (logit + Poisson) che è l'impostazione predefinita in hurdle(). Nella nostra coppia / vignetta, tuttavia, cerchiamo di enfatizzare gli elementi più generali.
Achim Zeileis,

Risposte:


35

Separare la verosimiglianza

È corretto che la maggior parte dei modelli di ostacolo possa essere stimata separatamente (direi, anziché in sequenza ). Il motivo è che la probabilità di log può essere scomposta in due parti che possono essere massimizzate separatamente. Questo perché è solo un fattore di ridimensionamento in (5.34) che diventa un termine aggiuntivo nella verosimiglianza.π^

Nella notazione di Smithson & Merkle: dove è la densità della distribuzione (non troncata) di Poisson e è il fattore dal troncamento zero.

(β,γ;y,x,z)=1(γ;y,z)+2(β;y,x)=i:yi=0log{1logit1(ziγ)}+i:yi>0log{logit1(ziγ)}+i:yi>0[log{f(yi;exp(xiβ)}log{1f(0;exp(xiβ)}]
f(y;λ)=exp(λ)λy/y!1f(0;λ)=1exp(λ)

Quindi diventa ovvio che (modello logit) e (modello di Poisson troncato zero) possono essere massimizzati separatamente, portando alle stesse stime di parametri, covarianze, ecc. Come nel caso dove sono massimizzati congiuntamente.1(γ)2(β)

La stessa logica funziona anche se la probabilità di ostacolo zero non è parametrizzata attraverso un modello logit ma qualsiasi altro modello di regressione binaria, ad esempio una distribuzione dei conteggi censurata a destra su 1. E, naturalmente, anche potrebbe essere un'altra distribuzione dei conteggi, ad es. binomio negativo. L'intera separazione si interrompe solo se esistono parametri condivisi tra l'ostacolo zero e la parte di conteggio troncata.πf()

Un esempio importante potrebbe essere se distribuzioni binomiali negative con parametri separati ma comuni sono impiegate nei due componenti del modello. (Questo è disponibile in nel pacchetto da R-Forge, il successore attuazione.)μθhurdle(..., separate = FALSE, dist = "negbin", zero.dist = "negbin")countregpscl

Domande concrete

(a) Gettare via dati perfettamente validi: nel tuo caso sì, in generale no. Hai dati da un singolo modello di Poisson senza zeri in eccesso (anche se molti zeri ). Pertanto, non è necessario stimare modelli separati per zeri e non zeri. Tuttavia, se le due parti sono realmente guidate da parametri diversi, è necessario tenerne conto.

(b) Potrebbe causare problemi di alimentazione poiché gran parte dei dati sono zeri: non necessariamente. Qui, hai un terzo delle osservazioni che sono "successi" (ostacoli). Questo non sarebbe considerato molto estremo in un modello di regressione binaria. (Naturalmente, se non fosse necessario stimare modelli separati, guadagneresti potere.)

(c) Fondamentalmente non è un "modello" in sé e per sé, ma esegue solo sequenzialmente due modelli diversi: questo è più filosofico e non proverò a dare una "risposta". Invece, sottolineerò punti di vista pragmatici. Per la stima dei modelli , può essere utile sottolineare che i modelli sono separati perché, come si vede, potrebbe non essere necessaria una funzione dedicata per la stima. Per l' applicazione del modello , ad es. Per previsioni o residui ecc., Può essere più conveniente vederlo come un singolo modello.

(d) Sarebbe sicuro chiamare entrambe queste situazioni "ostacoli": In linea di principio sì. Tuttavia, il gergo può variare a seconda della comunità. Ad esempio, la regressione beta a ostacoli zero è più comunemente (e in modo molto confuso) chiamata regressione beta a inflazione zero. Personalmente, ritengo che quest'ultimo sia molto fuorviante perché la distribuzione beta non ha zeri che potrebbero essere gonfiati, ma è comunque il termine standard in letteratura. Inoltre, il modello tobit è un modello censurato e quindi non un modello di ostacolo. Potrebbe essere esteso, tuttavia, da un modello probit (o logit) più un modello normale troncato . Nella letteratura di econometria questo è noto come il modello in due parti di Cragg.

Commenti sul software

Il countregpacchetto su R-Forge su https://R-Forge.R-project.org/R/?group_id=522 è l'implementazione successiva a hurdle()/ zeroinfl()da pscl. Il motivo principale per cui non è (ancora) su CRAN è che vogliamo rivedere l' predict()interfaccia, possibilmente in un modo che non sia completamente compatibile con le versioni precedenti. Altrimenti l'implementazione è piuttosto stabile. Rispetto ad psclesso viene fornito con alcune belle funzionalità, ad esempio:

  • Una zerotrunc()funzione che utilizza esattamente lo stesso codice hurdle()della parte troncata zero del modello. Pertanto, offre un'alternativa a VGAM.

  • Inoltre, come d / p / q / r funziona per le distribuzioni di conteggio zero troncato, ostacolo e zero gonfiato. Ciò facilita la loro visione come modello "unico" anziché come modelli separati.

  • Per valutare la bontà dell'adattamento, sono disponibili display grafici come rootogrammi e grafici residui casuali quantistici. (Vedi Kleiber & Zeileis, 2016, The American Statistician , 70 (3), 296-303. Doi: 10.1080 / 00031305.2016.1173590 .)

Dati simulati

I tuoi dati simulati provengono da un singolo processo di Poisson. Se eviene trattato come un regressore noto, sarebbe un GLM di Poisson standard. Se eè un componente di rumore sconosciuto, allora c'è un'eterogeneità inosservata che causa un po 'di sovradispersione che potrebbe essere catturata da un modello binomiale negativo o da qualche altro tipo di miscela continua o effetto casuale ecc. Tuttavia, poiché l'effetto di eè piuttosto piccolo qui , niente di tutto ciò fa una grande differenza. Di seguito, sto trattando ecome un regressore (cioè con un coefficiente reale di 1) ma potresti anche ometterlo e usare binomio negativo o modelli di Poisson. Qualitativamente, tutto ciò porta a intuizioni simili.

## Poisson GLM
p <- glm(y ~ x + e, family = poisson)
## Hurdle Poisson (zero-truncated Poisson + right-censored Poisson)
library("countreg")
hp <- hurdle(y ~ x + e, dist = "poisson", zero.dist = "poisson")
## all coefficients very similar and close to true -1.5, 1, 1
cbind(coef(p), coef(hp, model = "zero"), coef(hp, model = "count"))
##                   [,1]       [,2]      [,3]
## (Intercept) -1.3371364 -1.2691271 -1.741320
## x            0.9118365  0.9791725  1.020992
## e            0.9598940  1.0192031  1.100175

Ciò riflette che tutti e tre i modelli possono costantemente stimare i parametri reali. Osservando i corrispondenti errori standard si evince che in questo scenario (senza la necessità di un ostacolo) il Poisson GLM è più efficiente:

serr <- function(object, ...) sqrt(diag(vcov(object, ...)))
cbind(serr(p), serr(hp, model = "zero"), serr(hp, model = "count"))
##                  [,1]      [,2]      [,3]
## (Intercept) 0.2226027 0.2487211 0.5702826
## x           0.1594961 0.2340700 0.2853921
## e           0.1640422 0.2698122 0.2852902

I criteri di informazione standard selezionerebbero il vero Poisson GLM come modello migliore:

AIC(p, hp)
##    df      AIC
## p   3 141.0473
## hp  6 145.9287

E un test Wald rileverà correttamente che i due componenti del modello di ostacolo non sono significativamente diversi:

hurdletest(hp)
## Wald test for hurdle models
## 
## Restrictions:
## count_((Intercept) - zero_(Intercept) = 0
## count_x - zero_x = 0
## count_e - zero_e = 0
## 
## Model 1: restricted model
## Model 2: y ~ x + e
## 
##   Res.Df Df  Chisq Pr(>Chisq)
## 1     97                     
## 2     94  3 1.0562     0.7877

Infine entrambi rootogram(p)e qqrplot(p)mostrano che il Poisson GLM adatta ai dati molto bene e che non ci siano zeri in eccesso o suggerimenti su ulteriori misspecifications.

rootogram + qqrplot


Qual è la differenza tra zero in eccesso e molti zeri?
tatami,

1
Un esempio: una distribuzione di Poisson con aspettativa ha una probabilità di circa . Questo è sicuramente molti zeri . Tuttavia, se hai una distribuzione che ha la forma di un Poisson (0,5) ma più zeri, allora sono zeri in eccesso . λ=0.5f(0;λ=0.5)60%
Achim Zeileis il

4

Concordo sul fatto che la differenza tra i modelli a gonfiaggio zero e quelli a ostacoli sia difficile da capire. Entrambi sono una specie di modello di miscela. Da quello che posso dire, la differenza importante è che, in un modello a zero inflazione, mescoli una massa a zero con una distribuzione \ textit {che può anche assumere il valore zero}. Per un modello di ostacolo, mescoli una massa a zero con una distribuzione che assume solo valori maggiori di 0. Pertanto, nel modello a gonfia zero puoi distinguere tra "zeri strutturali" (corrispondente alla massa a zero) e "zeri di campionamento 'corrispondente alla probabilità che si verifichi 0 dal modello in cui si sta mescolando. Naturalmente, questa identificazione dipende fortemente dalla scelta della distribuzione corretta! Ma, se hai un Poisson a gonfiamento zero, ad esempio, è possibile distinguere tra zeri che provengono dal componente Poisson (zeri di campionamento) e zeri che provengono dalla massa a zero (zeri strutturali). Se si dispone di un modello a zero zero e la distribuzione in cui si sta miscelando non ha massa pari a zero, potrebbe essere interpretata come un modello di ostacolo.


Mentre la distinzione tra i due tipi di zeri è una necessità che deriva direttamente dalle specifiche del modello, è possibile calcolare lo stesso tipo di quantità per un modello di ostacolo. I cosiddetti zeri strutturali possono anche essere calcolati dalla distribuzione del conteggio non troncato (diciamo Poisson) anche se i suoi parametri erano basati su un campione troncato . Le probabilità di zeri strutturali sono quindi la differenza tra la probabilità di zero (complessivamente, dalla parte di ostacolo zero) e di zeri di campionamento.
Achim Zeileis,

1

Per quanto riguarda l'aspetto filosofico, "quando dovremmo considerare qualcosa come un singolo modello e quando due modelli separati" , potrebbe essere interessante notare che le stime campionarie dei parametri del modello sono correlate.

Nel grafico seguente con una simulazione si vede principalmente la correlazione tra la pendenza e l'intercetta della parte dei conteggi. Ma c'è anche una leggera relazione tra la parte conteggi e la parte ostacolo. Se si modificano i parametri, ad esempio riducendo la lambda nella distribuzione di Poisson o diminuendo la dimensione del campione, la correlazione diventa più forte.

Quindi direi che non dovresti considerarlo come due modelli separati . O almeno c'è qualche relazione anche quando in pratica è possibile calcolare le due stime indipendentemente l'una dall'altra.

correlazioni

set.seed(1839)

Nrep <- 3000
Ns <- 100
pars <- matrix(rep(0,3*Nrep),Nrep)
colnames(pars) <- c("count_intercept","count_slope","hurdle_intercept")

# simulation-loop
# Note that a truncated poisson is used to generate data
# this will make the parameters from the hurdle function easier to interpret and compare
for (i in 1:Nrep) {
  x <- rnorm(Ns,0,1)
  e <- rbinom(Ns,1,exp(-0.7))
  y <- e*truncdist::rtrunc(n=Ns,spec='pois',a=0,b=Inf,lambda=exp(-1.5 + x))
  mod <- pscl::hurdle(y ~ 1+x|1, link="log")
  pars[i,1]<-mod$coefficients$count[1]
  pars[i,2]<-mod$coefficients$count[2]
  pars[i,3]<-mod$coefficients$zero[1]
}  

# viewing data
plotpars <- pars[pars[,1]>-7,] #clipping
pairs(plotpars,cex=0.7,pch=21,
      col= rgb(0,0,0,0.03),
      bg = rgb(0,0,0,0.03))

# demonstrating linear relation / significant correlation
summary(lm(pars[,1] ~ pars[,3]))

Non ha molto senso che ci sia una correlazione tra le due parti. Ma potrebbe essere probabilmente dovuto a livelli discreti delle stime per i parametri nel modello di Poisson e al modo in cui questi si riferiscono al numero di zero.


Non posso replicare questo. Per me: truncdist::rtrunc(n = 100, spec = 'pois', a = 0, b = Inf, lambda = exp(-1.5 + rnorm(100)))produce un errore (utilizzando la versione 1.0.2): Error in if (G.a == G.b) { : the condition has length > 1. In ogni caso, l'utilizzo rhpois()dal pacchetto countregsu R-Forge è più semplice per la simulazione da un modello Poisson di ostacolo con la data probabilità di attraversamento di ostacoli pie l'attesa di Poisson sottostante (non troncata) lambda. Se li uso ottengo solo correlazioni empiriche molto piccole tra l'ostacolo zero e le parti di conteggio troncate.
Achim Zeileis,

Processo di generazione dei dati: dgp <- function(n = 100, b = c(-0.5, 2), g = c(0.5, -2)) { x <- runif(n, -1, 1) ; y <- rhpois(n, lambda = exp(b[1] + b[2] * x), pi = plogis(g[1] + g[2] * x)); data.frame(x = x, y = y) }Simulazione: set.seed(1); cf <- t(replicate(3000, coef(hurdle(y ~ x, data = dgp())))). Valutazione: pairs(cf)e cor(cf). Il controllo colMeans(cf)mostra anche che la stima ha funzionato abbastanza bene.
Achim Zeileis,

@AchimZeileis al momento non ho alcuna possibilità di esaminare il tuo errore e commentarlo. Ma comunque, la correlazione non è altro che molto piccola nell'immagine che ho mostrato. Il punto era più filosofico / teorico. In pratica molto probabilmente avrai piccoli problemi quando tratterai il modello come due passaggi separati, non integrati.
Sesto Empirico
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.