Il documento di O'Hara e Kotze (Methods in Ecology and Evolution 1: 118–122) non è un buon punto di partenza per la discussione. La mia preoccupazione più seria è l'affermazione di cui al punto 4 del riassunto:
Abbiamo scoperto che le trasformazioni hanno funzionato male, tranne. . .. I modelli binomiali quasi-Poisson e negativi ... [mostravano] poca propensione.
La media per un Poisson o una distribuzione binomiale negativa è per una distribuzione che, per i valori di <= 2 e per l'intervallo di valori della media che è stato studiato, è fortemente distorta. I mezzi delle distribuzioni normali adattate sono su una scala di log (y + c) (c è l'offset) e stimano E (log (y + c)]. Questa distribuzione è molto più vicina alla simmetria di quanto non sia la distribuzione di y .θ λλθλ
Le simulazioni di O'Hara e Kotze confrontano E (log (y + c)], come stimato dalla media (log (y + c)), con log (E [y + c]). Possono essere, e nei casi annotati sono molto diversi. I loro grafici non confrontano un binomio negativo con un adattamento log (y + c), ma piuttosto confrontano la media (log (y + c)] con log (E [y + c]). ) mostrati nei loro grafici, in realtà sono gli adattamenti binomiali negativi che sono più distorti! λ
Il seguente codice R illustra il punto:
x <- rnbinom(10000, 0.5, mu=2)
## NB: Above, this 'mu' was our lambda. Confusing, is'nt it?
log(mean(x+1))
[1] 1.09631
log(2+1) ## Check that this is about right
[1] 1.098612
mean(log(x+1))
[1] 0.7317908
Oppure prova
log(mean(x+.5))
[1] 0.9135269
mean(log(x+.5))
[1] 0.3270837
La scala su cui sono stimati i parametri conta molto!
Se si preleva un campione da un Poisson, ovviamente ci si aspetta che il Poisson faccia meglio, se giudicato dai criteri utilizzati per adattarsi al Poisson. Idem per un binomio negativo. La differenza potrebbe non essere così grande, se il confronto è giusto. I dati reali (ad esempio, forse, in alcuni contesti genetici) possono talvolta essere molto vicini a Poisson. Quando partono da Poisson, il binomio negativo può o meno funzionare bene. Allo stesso modo, specialmente se è dell'ordine di forse 10 o più, per il log di modellazione (y + 1) usando la teoria normale standard.λ
Si noti che la diagnostica standard funziona meglio su una scala di log (x + c). La scelta di c potrebbe non importare troppo; spesso 0,5 o 1,0 hanno senso. Inoltre è un punto di partenza migliore per studiare le trasformazioni Box-Cox o la variante Yeo-Johnson di Box-Cox. [Yeo, I. e Johnson, R. (2000)]. Vedi più avanti la pagina di aiuto per powerTransform () nel pacchetto auto di R. Il pacchetto gamlss di R consente di adattare i tipi binomiali negativi I (la varietà comune) o II, o altre distribuzioni che modellano la dispersione e la media, con collegamenti di trasformazione di potenza pari a 0 (= log, ovvero log link) o più . Gli adattamenti potrebbero non convergere sempre.
Esempio: i dati sui decessi contro i danni di base si
riferiscono agli uragani atlantici nominati che hanno raggiunto la terraferma statunitense. I dati sono disponibili (nome hurricNamed ) da una recente versione del pacchetto DAAG per R. La pagina di aiuto per i dati contiene dettagli.
Il grafico confronta una linea adattata ottenuta utilizzando un robusto adattamento lineare del modello, con la curva ottenuta trasformando un adattamento binomiale negativo con collegamento log sulla scala log (conteggio + 1) utilizzata per l'asse y sul grafico. (Si noti che si deve usare qualcosa di simile a una scala log (count + c), con c positiva, per mostrare i punti e la "linea" adattata dall'adattamento binomiale negativo sullo stesso grafico.) Notare il grande pregiudizio che è evidente per l'adattamento binomiale negativo sulla scala del log. Il robusto adattamento del modello lineare è molto meno distorto su questa scala, se si assume una distribuzione binomiale negativa per i conteggi. Un adattamento lineare del modello sarebbe imparziale sotto le ipotesi della teoria normale classica. Ho trovato sorprendente il pregiudizio quando ho creato per la prima volta quello che era essenzialmente il grafico sopra! Una curva si adatterebbe meglio ai dati, ma la differenza è nei limiti dei soliti standard di variabilità statistica. La robusta vestibilità del modello lineare fa un cattivo lavoro per i conteggi nella parte bassa della scala.
Nota --- Studi con dati RNA-Seq: il confronto tra i due stili del modello è stato interessante per l'analisi dei dati di conteggio da esperimenti di espressione genica. Il seguente documento confronta l'uso di un modello lineare robusto, che lavora con log (conteggio + 1), con l'uso di accoppiamenti binomiali negativi (come nel bordo del pacchetto Bioconduttore R ). La maggior parte dei conteggi, nell'applicazione RNA-Seq che è principalmente in mente, sono abbastanza grandi da adattarsi perfettamente a un modello log-lineare opportunamente pesato.
Law, CW, Chen, Y, Shi, W, Smyth, GK (2014). Voom: pesi di precisione sbloccano strumenti di analisi del modello lineare per conteggi di lettura RNA-seq. Genome Biology 15, R29. http://genomebiology.com/2014/15/2/R29
NB anche il recente documento:
Schurch NJ, Schofield P, Gierliński M, Cole C, Sherstnev A, Singh V, Wrobel N, Gharbi K, Simpson GG, Owen-Hughes T, Blaxter M, Barton GJ (2016). Quanti replicati biologici sono necessari in un esperimento RNA-seq e quale strumento di espressione differenziale dovresti usare? RNA
http://www.rnajournal.org/cgi/doi/10.1261/rna.053959.115
È interessante notare che il modello lineare si adatta usando il pacchetto limma (come edgeR , del gruppo WEHI) stare in piedi estremamente bene (nel senso di mostrare poca evidenza di bias), rispetto ai risultati con molti replicati, poiché il numero di replicati è ridotto.
Codice R per il grafico sopra:
library(latticeExtra, quietly=TRUE)
hurricNamed <- DAAG::hurricNamed
ytxt <- c(0, 1, 3, 10, 30, 100, 300, 1000)
xtxt <- c(1,10, 100, 1000, 10000, 100000, 1000000 )
funy <- function(y)log(y+1)
gph <- xyplot(funy(deaths) ~ log(BaseDam2014), groups= mf, data=hurricNamed,
scales=list(y=list(at=funy(ytxt), labels=paste(ytxt)),
x=list(at=log(xtxt), labels=paste(xtxt))),
xlab = "Base Damage (millions of 2014 US$); log transformed scale",
ylab="Deaths; log transformed; offset=1",
auto.key=list(columns=2),
par.settings=simpleTheme(col=c("red","blue"), pch=16))
gph2 <- gph + layer(panel.text(x[c(13,84)], y[c(13,84)],
labels=hurricNamed[c(13,84), "Name"], pos=3,
col="gray30", cex=0.8),
panel.text(x[c(13,84)], y[c(13,84)],
labels=hurricNamed[c(13,84), "Year"], pos=1,
col="gray30", cex=0.8))
ab <- coef(MASS::rlm(funy(deaths) ~ log(BaseDam2014), data=hurricNamed))
gph3 <- gph2+layer(panel.abline(ab[1], b=ab[2], col="gray30", alpha=0.4))
## 100 points that are evenly spread on a log(BaseDam2014) scale
x <- with(hurricNamed, pretty(log(BaseDam2014),100))
df <- data.frame(BaseDam2014=exp(x[x>0]))
hurr.nb <- MASS::glm.nb(deaths~log(BaseDam2014), data=hurricNamed[-c(13,84),])
df[,'hatnb'] <- funy(predict(hurr.nb, newdata=df, type='response'))
gph3 + latticeExtra::layer(data=df,
panel.lines(log(BaseDam2014), hatnb, lwd=2, lty=2,
alpha=0.5, col="gray30"))