Testare l'uniformità è qualcosa di comune, tuttavia mi chiedo quali siano i metodi per farlo per una nuvola di punti multidimensionale.
Testare l'uniformità è qualcosa di comune, tuttavia mi chiedo quali siano i metodi per farlo per una nuvola di punti multidimensionale.
Risposte:
Il metodo standard utilizza la funzione K di Ripley o qualcosa derivato da essa come una funzione L. Questo è un diagramma che riassume il numero medio di vicini dei punti in funzione della distanza massima tra loro ( ). Per una distribuzione uniforme in n dimensioni, quella media dovrebbe comportarsi come ρ n : e lo farà sempre per piccoli ρ . Si discosta da tale comportamento a causa del raggruppamento, di altre forme di non indipendenza spaziale e degli effetti collaterali (da cui è fondamentale specificare la regione campionata dai punti). A causa di questa complicazione - che peggiora come naumenta: nella maggior parte delle applicazioni viene eretta una banda di confidenza per la funzione K nulla tramite simulazione e la funzione K osservata viene sovrastampata per rilevare le escursioni. Con un po 'di pensiero ed esperienza, le escursioni possono essere interpretate in termini di tendenze a raggrupparsi o meno a determinate distanze.
Esempi di una funzione K e della sua funzione L associata da Dixon (2001), ibid. La funzione L è costruita in modo tale che per una distribuzione uniforme sia la linea orizzontale a zero: un buon riferimento visivo. Le linee tratteggiate sono bande di confidenza per questa particolare area di studio, calcolate tramite simulazione. La traccia grigia solida è la funzione L per i dati. L'escursione positiva a distanze 0-20 m indica un certo raggruppamento a queste distanze.
Ho pubblicato un esempio funzionante in risposta a una domanda correlata su /stats//a/7984 , in cui un grafico derivato dalla funzione K per una distribuzione uniforme su una varietà bidimensionale incorporata in è stimato dalla simulazione.
In R
, lo spazio spaziale funziona kest
e k3est
calcola la funzione K rispettivamente per e n = 3 . In più di 3 dimensioni probabilmente sei da solo, ma gli algoritmi sarebbero esattamente gli stessi. È possibile eseguire i calcoli da una matrice di distanza calcolata (con moderata efficienza) da .stats::dist
Si scopre che la domanda è più difficile di quanto pensassi. Tuttavia, ho fatto i compiti e, dopo essermi guardato intorno, ho trovato due metodi oltre alle funzioni di Ripley per testare l'uniformità in diverse dimensioni.
Ho creato un pacchetto R chiamato unf
che implementa entrambi i test. Puoi scaricarlo da github all'indirizzo https://github.com/gui11aume/unf . Gran parte di esso è in C, quindi dovrai compilarlo sul tuo computer con R CMD INSTALL unf
. Gli articoli su cui si basa l'implementazione sono in formato pdf nel pacchetto.
Il primo metodo deriva da un riferimento menzionato da @Procrastinator ( Test di uniformità multivariata e sue applicazioni, Liang et al., 2000 ) e consente di testare l'uniformità solo sull'ipercubo dell'unità. L'idea è di progettare statistiche di discrepanza asintoticamente gaussiane dal teorema del limite centrale. Ciò consente di calcolare una statistica , che è la base del test.
library(unf)
set.seed(123)
# Put 20 points uniformally in the 5D hypercube.
x <- matrix(runif(100), ncol=20)
liang(x) # Outputs the p-value of the test.
[1] 0.9470392
Il secondo approccio è meno convenzionale e utilizza alberi di spanning minimi . Il lavoro iniziale fu eseguito da Friedman & Rafsky nel 1979 (riferimento nel pacchetto) per verificare se due campioni multivariati provenissero dalla stessa distribuzione. L'immagine seguente illustra il principio.
I punti di due campioni bivariati sono tracciati in rosso o blu, a seconda del loro campione originale (pannello di sinistra). Viene calcolato l'albero di spanning minimo del campione raggruppato in due dimensioni (pannello centrale). Questo è l'albero con la somma minima delle lunghezze dei bordi. L'albero è scomposto in sottotitoli in cui tutti i punti hanno le stesse etichette (pannello di destra).
Nella figura seguente, mostro un caso in cui i punti blu sono aggregati, il che riduce il numero di alberi alla fine del processo, come puoi vedere nel pannello di destra. Friedman e Rafsky hanno calcolato la distribuzione asintotica del numero di alberi che si ottengono nel processo, il che consente di eseguire un test.
L'idea di creare un test generale per l'uniformità di un campione multivariato è stata sviluppata da Smith e Jain nel 1984 e implementata da Ben Pfaff in C (riferimento nel pacchetto). Il secondo campione viene generato uniformemente nello scafo convesso approssimativo del primo campione e il test di Friedman e Rafsky viene eseguito sul pool di due campioni.
Il vantaggio del metodo è che verifica l'uniformità su ogni forma convessa multivariata e non solo sull'ipercubo. Il forte svantaggio è che il test ha una componente casuale perché il secondo campione viene generato a caso. Naturalmente, si può ripetere il test e fare una media dei risultati per ottenere una risposta riproducibile, ma questo non è utile.
Continuando la precedente sessione R, ecco come va.
pfaff(x) # Outputs the p-value of the test.
pfaff(x) # Most likely another p-value.
Sentiti libero di copiare / fork il codice da github.