Come testare se la mia distribuzione è multimodale?


21

Quando tracciamo un istogramma dei miei dati, ha due picchi:

istogramma

Significa una potenziale distribuzione multimodale? Ho eseguito in dip.testin R ( library(diptest)) e l'output è:

D = 0.0275, p-value = 0.7913

Posso concludere che i miei dati hanno una distribuzione multimodale?

DATI

10346 13698 13894 19854 28066 26620 27066 16658  9221 13578 11483 10390 11126 13487 
15851 16116 24102 30892 25081 14067 10433 15591  8639 10345 10639 15796 14507 21289 
25444 26149 23612 19671 12447 13535 10667 11255  8442 11546 15958 21058 28088 23827 
30707 19653 12791 13463 11465 12326 12277 12769 18341 19140 24590 28277 22694 15489 
11070 11002 11579  9834  9364 15128 15147 18499 25134 32116 24475 21952 10272 15404 
13079 10633 10761 13714 16073 23335 29822 26800 31489 19780 12238 15318  9646 11786 
10906 13056 17599 22524 25057 28809 27880 19912 12319 18240 11934 10290 11304 16092 
15911 24671 31081 27716 25388 22665 10603 14409 10736  9651 12533 17546 16863 23598 
25867 31774 24216 20448 12548 15129 11687 11581

3
Usa più bin nel tuo istogramma. Ne suggerisco circa il doppio
Glen_b -Reinstate Monica,

1
In questa risposta sono menzionati nove diversi test , alcuni dei quali potrebbero essere rilevanti per la tua situazione.
Glen_b -Restinata Monica,

1
Questo documento ti sarà probabilmente utile, se non l'hai già visto (anche questo follow-up )
Eoin

Risposte:


15

@NickCox ha presentato un'interessante strategia (+1). Potrei considerarlo più esplorativo in natura, tuttavia, a causa della preoccupazione che @whuber sottolinea .

Permettimi di suggerire un'altra strategia: potresti adattare un modello di miscela finita gaussiana. Tieni presente che ciò presuppone fortemente che i tuoi dati siano tratti da una o più normali normali. Come sottolineano sia @whuber che @NickCox nei commenti, senza una interpretazione sostanziale di questi dati - supportati da una teoria consolidata - a supporto di questa ipotesi, anche questa strategia dovrebbe essere considerata esplorativa.

Innanzitutto, seguiamo il suggerimento di @ Glen_b e esaminiamo i tuoi dati utilizzando il doppio dei bin:

inserisci qui la descrizione dell'immagine

Vediamo ancora due modalità; semmai, arrivano più chiaramente qui. (Notare anche che la linea di densità del kernel dovrebbe essere identica, ma appare più estesa a causa del maggior numero di bin.)

Ora consente di adattare un modello di miscela finita gaussiana. In R, è possibile utilizzare il Mclustpacchetto per fare ciò:

library(mclust)
x.gmm = Mclust(x)
summary(x.gmm)
# ----------------------------------------------------
# Gaussian finite mixture model fitted by EM algorithm 
# ----------------------------------------------------
#   
# Mclust V (univariate, unequal variance) model with 2 components:
#   
#   log.likelihood   n df       BIC       ICL
#        -1200.874 120  5 -2425.686 -2442.719
# 
# Clustering table:
#  1  2 
# 68 52 

Due componenti normali ottimizzano il BIC. Per fare un confronto, possiamo forzare un adattamento di un componente ed eseguire un test del rapporto di verosimiglianza:

x.gmm.1 = Mclust(x, G=1)
logLik(x.gmm.1)
# 'log Lik.' -1226.241 (df=2)
logLik(x.gmm)-logLik(x.gmm.1)
# 'log Lik.' 25.36657 (df=5)
1-pchisq(25.36657, df=3)  # [1] 1.294187e-05

Ciò suggerisce che è estremamente improbabile che tu possa trovare dati tutt'altro che unimodali come i tuoi se provenissero da un'unica vera distribuzione normale.

Alcune persone non si sentono a proprio agio usando un test parametrico qui (anche se se i presupposti sono validi, non conosco alcun problema). Una tecnica ampiamente applicabile è quella di utilizzare il metodo cross-fitting parametrico Bootstrap (descrivo l'algoritmo qui ). Possiamo provare ad applicarlo a questi dati:

x.gmm$parameters
# $mean
# 12346.98 23322.06 
# $variance$sigmasq
# [1]  4514863 24582180
x.gmm.1$parameters
# $mean
# [1] 17520.91
# $variance$sigmasq
# [1] 43989870

set.seed(7809)
B = 10000;    x2.d = vector(length=B);    x1.d = vector(length=B)
for(i in 1:B){
  x2      = c(rnorm(68, mean=12346.98, sd=sqrt( 4514863)), 
              rnorm(52, mean=23322.06, sd=sqrt(24582180)) )
  x1      = rnorm( 120, mean=17520.91, sd=sqrt(43989870))
  x2.d[i] = Mclust(x2, G=2)$loglik - Mclust(x2, G=1)$loglik
  x1.d[i] = Mclust(x1, G=2)$loglik - Mclust(x1, G=1)$loglik
}
x2.d = sort(x2.d);  x1.d = sort(x1.d)
summary(x1.d)
#     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
# -0.29070 -0.02124  0.41460  0.88760  1.36700 14.01000 
summary(x2.d)
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#  9.006  23.770  27.500  27.760  31.350  53.500 

inserisci qui la descrizione dell'immagine

Le statistiche di riepilogo e i grafici della densità del kernel per le distribuzioni di campionamento mostrano diverse caratteristiche interessanti. La probabilità di log per il modello a singolo componente è raramente maggiore di quella dell'adattamento a due componenti, anche quando il vero processo di generazione dei dati ha un solo componente e quando è maggiore, la quantità è banale. L'idea di confrontare modelli che differiscono nella loro capacità di adattarsi ai dati è una delle motivazioni alla base della PBCM. Le due distribuzioni di campionamento si sovrappongono a malapena; solo lo .35% di x2.dè inferiore al massimox1.dvalore. Se si seleziona un modello a due componenti se la differenza nella probabilità del registro fosse> 9,7, si selezionerebbe in modo errato il modello a un componente .01% e il modello a due componenti .02% delle volte. Questi sono altamente discriminabili. Se, d'altra parte, hai scelto di utilizzare il modello a un componente come ipotesi nulla, il risultato osservato è sufficientemente piccolo da non comparire nella distribuzione empirica del campionamento in 10.000 iterazioni. Possiamo usare la regola di 3 (vedi qui ) per posizionare un limite superiore sul valore p, ovvero stimiamo che il tuo valore p sia inferiore a .0003. Cioè, questo è molto significativo.

p<0,000,001 milap<.001) e i componenti sottostanti, qualora esistessero, non sono garantiti per essere perfettamente normali. Se ritieni ragionevole che i tuoi dati possano provenire da una distribuzione distorta, piuttosto che da una normale, questo livello di bimodalità potrebbe benissimo rientrare nell'intervallo tipico di variazione, il che è ciò che sospetto stia dicendo il dip test.


1
Il problema con questo approccio è che l'alternativa a cui stai confrontando una miscela gaussiana non è molto ragionevole. Uno più ragionevole sarebbe che la distribuzione è una sorta di inclinazione a destra, come una Gamma. È quasi scontato che una miscela si adatterà a qualsiasi set di dati distorto "significativamente" meglio di un singolo gaussiano .
whuber

Hai ragione, @whuber. Ho cercato di chiarire questo punto in modo esplicito. Non sono sicuro di come fare un Gamma FMM, ma sarebbe meglio.
gung - Ripristina Monica

1
Poiché questo è esplorativo, si potrebbe tentare di trasformare la distribuzione originale in simmetria (forse con una trasformazione offset di Box-Cox, stimata in modo robusto da alcuni quantili dei dati) e riprovare il proprio approccio. Ovviamente non parleresti di "significato" di per sé, ma l'analisi della probabilità potrebbe essere ancora rivelatrice.
whuber

@whuber, l'ho fatto, ma l'ho menzionato solo di sfuggita. (La trasformazione ottimale di Box-Cox è la radice quadrata inversa.) Si ottiene lo stesso risultato, ma i valori di p sono (ancora altamente, ma) meno significativi.
gung - Ripristina Monica

3
Mi piace molto l'idea che dovresti modellare quello che pensi sia il processo di generazione. Il mio problema è che anche quando le miscele gaussiane funzionano bene, sento che dovrebbe esserci un'interpretazione sostanziale. Se l'OP ci dicesse di più anche su quali siano i dati, potrebbero essere possibili ipotesi migliori.
Nick Cox,

10

In seguito le idee di @ risposte e commenti di Nick, si può vedere come a livello delle esigenze di larghezza di banda per essere a proprio appiattire la modalità secondaria:

inserisci qui la descrizione dell'immagine

Prendi questa stima della densità del kernel come null prossimale - la distribuzione più vicina ai dati ma ancora coerente con l'ipotesi nulla che sia un campione di una popolazione unimodale - e simula da essa. Nei campioni simulati la modalità secondaria non appare spesso così distinta e non è necessario ampliare la larghezza di banda tanto da appiattirla.

<code> inserisci qui la descrizione dell'immagine </code>

La formalizzazione di questo approccio porta al test fornito in Silverman (1981), "Uso delle stime della densità del kernel per studiare la modalità", JRSS B , 43 , 1. Il silvermantestpacchetto di Schwaiger & Holzmann implementa questo test, e anche la procedura di calibrazione descritta da Hall & York ( 2001), "Sulla calibrazione del test di Silverman per la multimodalità", Statistica Sinica , 11 , p 515, che regola il conservatorismo asintotico. L'esecuzione del test sui dati con un'ipotesi nulla di unimodalità comporta valori di p di 0,08 senza calibrazione e 0,02 con calibrazione. Non ho abbastanza familiarità con il dip test per indovinare perché potrebbe differire.

Codice R:

  # kernel density estimate for x using Sheather-Jones method to estimate b/w:
density(x, kernel="gaussian", bw="SJ") -> dens.SJ
  # tweak b/w until mode just disappears:
density(x, kernel="gaussian", bw=3160) -> prox.null
  # fill matrix with simulated samples from the proximal null:
x.sim <- matrix(NA, nrow=length(x), ncol=10)
for (i in 1:10){
  x.sim[ ,i] <- rnorm(length(x), sample(x, size=length(x), replace=T), prox.null$bw)
}
  # perform Silverman test without Hall-York calibration:
require(silvermantest)
silverman.test(x, k=1, M=10000, adjust=F)
  # perform Silverman test with Hall-York calibration:
silverman.test(x, k=1, M=10000, adjust=T)

+1. Interessante! Quale kernel viene utilizzato qui? Come ricordo vagamente, ci sono ragioni sottili per cui i kernel gaussiani dovrebbero essere usati per varianti formali di questo approccio.
Nick Cox,

@Nick: kernel gaussiano, ma non ricordo se c'è una ragione convincente per questo. Ogni campione simulato viene riscalato, e c'è una correzione per un pregiudizio conservativo che il test originale ha - elaborato da qualcuno chiamato Storey credo.
Scortchi - Ripristina Monica

@NickCox: scusa, non piano affatto.
Scortchi - Ripristina Monica

@Scortchi, ho leggermente modificato il tuo testo e codice. Spero non ti dispiaccia. +1. Inoltre, usi il temuto operatore di assegnazione della freccia a destra ?! Oh l'umanità ...
Gung - Ripristina Monica

2
Non è migliore o peggiore, in realtà, ma la convenzione in programmazione è di dichiarare le variabili a sinistra e di avere ciò che è loro assegnato a destra. Molte persone sono impazzite da ->; Sono solo confuso.
gung - Ripristina Monica

7

Le cose di cui preoccuparsi includono:

  1. La dimensione del set di dati. Non è piccolo, non grande.

  2. La dipendenza di ciò che vedi sull'origine dell'istogramma e sulla larghezza del cestino. Con una sola scelta evidente, tu (e noi) non avete idea della sensibilità.

  3. La dipendenza di ciò che vedi sul tipo e la larghezza del kernel e qualsiasi altra scelta venga fatta per te nella stima della densità. Con una sola scelta evidente, tu (e noi) non avete idea della sensibilità.

Altrove ho suggerito provvisoriamente che la credibilità delle modalità è supportata (ma non stabilita) da un'interpretazione sostanziale e dalla capacità di discernere la stessa modalità in altri set di dati della stessa dimensione. (Anche più grande è meglio ....)

Non possiamo commentare nessuno dei due qui. Un piccolo punto sulla ripetibilità è quello di confrontare ciò che si ottiene con campioni bootstrap della stessa dimensione. Ecco i risultati di un esperimento di token che utilizza Stata, ma ciò che vedi è arbitrariamente limitato alle impostazioni predefinite di Stata, che a loro volta sono documentate come estratte dall'aria . Ho ottenuto stime di densità per i dati originali e per 24 campioni bootstrap dagli stessi.

L'indicazione (non più, non meno) è ciò che penso che gli analisti esperti indovinerebbero in qualche modo dal tuo grafico. La modalità per la mano sinistra è altamente ripetibile e la mano destra è decisamente più fragile.

Si noti che esiste un'inevitabilità al riguardo: poiché ci sono meno dati più vicini alla modalità di destra, non riappariranno sempre in un esempio bootstrap. Ma questo è anche il punto chiave.

inserisci qui la descrizione dell'immagine

Si noti che il punto 3. sopra rimane intatto. Ma i risultati sono a metà strada tra unimodale e bimodale.

Per chi è interessato, questo è il codice:

clear 
set scheme s1color 
set seed 2803 

mat data = (10346, 13698, 13894, 19854, 28066, 26620, 27066, 16658, 9221, 13578, 11483, 10390, 11126, 13487, 15851, 16116, 24102, 30892, 25081, 14067, 10433, 15591, 8639, 10345, 10639, 15796, 14507, 21289, 25444, 26149, 23612, 19671, 12447, 13535, 10667, 11255, 8442, 11546, 15958, 21058, 28088, 23827, 30707, 19653, 12791, 13463, 11465, 12326, 12277, 12769, 18341, 19140, 24590, 28277, 22694, 15489, 11070, 11002, 11579, 9834, 9364, 15128, 15147, 18499, 25134, 32116, 24475, 21952, 10272, 15404, 13079, 10633, 10761, 13714, 16073, 23335, 29822, 26800, 31489, 19780, 12238, 15318, 9646, 11786, 10906, 13056, 17599, 22524, 25057, 28809, 27880, 19912, 12319, 18240, 11934, 10290, 11304, 16092, 15911, 24671, 31081, 27716, 25388, 22665, 10603, 14409, 10736, 9651, 12533, 17546, 16863, 23598, 25867, 31774, 24216, 20448, 12548, 15129, 11687, 11581)
set obs `=colsof(data)' 
gen data = data[1,_n] 

gen index = . 

quietly forval j = 1/24 { 
    replace index = ceil(120 * runiform()) 
    gen data`j' = data[index]
    kdensity data`j' , nograph at(data) gen(xx`j' d`j') 
} 

kdensity data, nograph at(data) gen(xx d) 

local xstuff xtitle(data/1000) xla(10000 "10" 20000 "20" 30000 "30") sort 
local ystuff ysc(r(0 .0001)) yla(none) `ystuff'   

local i = 1 
local colour "orange" 
foreach v of var d d? d?? { 
    line `v' data, lc(`colour') `xstuff'  `ystuff' name(g`i', replace) 
    local colour "gs8" 
    local G `G' g`i' 
    local ++i 
} 

graph combine `G' 

+1 Mi piace il tuo approccio bootstrap: l'array di grafici aiuta tutti a comprendere meglio i dati. Mi chiedo se quelle trame potrebbero essere sensibili a come Stata stima la larghezza di banda. Sospetto che potrebbe sfociare in un test sotto-alimentato perché la sua stima probabilmente si basa su un presupposto unimodale, portando a una larghezza di banda relativamente ampia. Anche una stima della larghezza di banda leggermente più stretta potrebbe rendere la seconda modalità più prominente in tutti i campioni bootstrap.
whuber

2
@whuber Grazie! Come al solito, ti concentri infallibilmente sulle debolezze di cui dobbiamo preoccuparci, e sono d'accordo. Con l'aumentare della larghezza di banda del kernel, la comparsa di unimodalità tende all'inevitabilità. Al contrario, le piccole larghezze di banda spesso indicano solo modalità spurie che sono irripetibili e / o banali. Il compromesso è davvero delicato. Penso che il merito principale di questo approccio sia la retorica di "È replicabile se ci muoviamo?" Sono spesso preoccupato dalla volontà degli utenti di software di copiare i risultati predefiniti senza riflettere.
Nick Cox,

2
Esistono approcci sistematici a questo problema basati sulla modifica progressiva della larghezza di banda e sul tracciare l'aspetto e la scomparsa delle modalità al variare della larghezza di banda. In sostanza, una modalità credibile persiste e una modalità poco credibile no. È un approccio carino, ma a volte accenderebbe un costruttore di tunnel quando una vanga lo farà. Ad esempio, se modificate le scelte dell'istogramma e la modalità secondaria scompare (o si sposta) in modo troppo rapido, non ci credete.
Nick Cox,

2

Identificazione modalità non parametrica LP

Identificazione modalità non parametrica LP (nome dell'algoritmo LPMode , il riferimento della carta è riportato di seguito)

MaxEntModalità [triangoli di colore rosso nella trama]: 12783.36 e 24654.28.

L2Modalità [triangoli di colore verde nella trama]: 13054.70 e 24111.61.

Interessante notare le forme modali, in particolare la seconda che mostra una notevole asimmetria (modello di miscela gaussiana tradizionale che probabilmente qui fallirà).

Mukhopadhyay, S. (2016) Identificazione della modalità su larga scala e scienze basate sui dati. https://arxiv.org/abs/1509.06428


1
Puoi elaborare e fornire un contesto per introdurre e spiegare questi metodi? È bello avere un collegamento al documento, ma preferiamo che le nostre risposte qui siano autosufficienti, specialmente se il collegamento si interrompe.
gung - Ripristina Monica

Il contesto è la domanda originale: esiste la multimodalità? in tal caso posizioni. e la rilevanza di un nuovo metodo deriva dal fatto che la caccia agli urti in modo non parametrico è un problema di modellazione difficile.
Deep Mukherjee,

@gung ti sta chiedendo di espandere la tua risposta. Ad esempio, il risultato deriva da un metodo spiegato in un documento che non ha una versione pubblica.
Nick Cox,

2
No, intendo cos'è "Identificazione modalità non parametrica LP"? Che cos'è "MaxEnt"? Ecc. In un paio di frasi, come funziona? Perché / quando potrebbe essere preferibile ad altri metodi? Ecc. Sono consapevole che si collega al documento che li spiega, ma sarebbe bello avere un paio di frasi per introdurli qui, soprattutto se il collegamento si interrompe, ma anche se non per dare ai lettori futuri un senso se voglio perseguire questo metodo.
gung - Ripristina Monica

2
@DeepMukherjee, sicuramente non è necessario riscrivere l'intero documento nel tuo post. Basta aggiungere alcune frasi dicendo che cos'è e come funziona.
gung - Ripristina Monica
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.