La domanda di "significativamente" sempre diversa, presuppone sempre un modello statistico per i dati. Questa risposta propone uno dei modelli più generali che è coerente con le informazioni minime fornite nella domanda. In breve, funzionerà in una vasta gamma di casi, ma potrebbe non essere sempre il modo più potente per rilevare una differenza.
Tre aspetti dei dati contano davvero: la forma dello spazio occupato dai punti; la distribuzione dei punti all'interno di quello spazio; e il grafico formato dalle coppie di punti aventi la "condizione" - che chiamerò il gruppo "trattamento". Per "grafico" intendo il modello di punti e interconnessioni implicite dalle coppie di punti nel gruppo di trattamento. Ad esempio, dieci coppie di punti ("spigoli") del grafico potrebbero coinvolgere fino a 20 punti distinti o fino a cinque punti. Nel primo caso, due bordi non condividono un punto comune, mentre nel secondo caso i bordi sono costituiti da tutte le possibili coppie tra cinque punti.
Per determinare se la distanza media tra i bordi nel gruppo di trattamento è "significativa", possiamo considerare un processo casuale in cui tutti i punti sono casualmente permutati da una permutazione . Ciò consente anche i bordi: il bordo è sostituito da . L'ipotesi nulla è che il gruppo di trattamento dei bordi si presenti come una di queste permutazioni. In tal caso, la sua distanza media dovrebbe essere paragonabile alle distanze medie che compaiono in quelle permutazioni. Possiamo facilmente stimare la distribuzione di tali distanze medie casuali campionando alcune migliaia di tutte quelle permutazioni.σ ( v i , v j ) ( v σ ( i ) , v σ ( j ) ) 3000 ! ≈ 10 21024n = 3000σ(vi,vj)(vσ(i),vσ(j))3000!≈1021024
(È interessante notare che questo approccio funzionerà, con solo lievi modifiche, con qualsiasi distanza o effettivamente qualsiasi quantità associata a ogni possibile coppia di punti. Funzionerà anche per qualsiasi sommario delle distanze, non solo la media.)
Per illustrare, qui ci sono due situazioni che coinvolgono punti e spigoli in un gruppo di trattamento. Nella riga superiore i primi punti in ciascun bordo sono stati scelti casualmente tra i punti e quindi i secondi punti di ciascun bordo sono stati scelti in modo indipendente e casuale tra i punti diversi dal loro primo punto. Tutti insieme punti sono coinvolti in questi bordi.28 100 100 - 1 39 28n=10028100100−13928
Nella riga inferiore, otto dei punti sono stati scelti in modo casuale. I bordi sono costituiti da tutte le possibili coppie di essi.2810028
Gli istogrammi a destra mostrano le distribuzioni di campionamento per permutazioni casuali delle configurazioni. Le distanze medie effettive per i dati sono contrassegnate da linee rosse tratteggiate verticali. Entrambi i mezzi sono coerenti con le distribuzioni di campionamento: nessuno dei due si trova a destra o a sinistra.10000
Le distribuzioni di campionamento differiscono: sebbene in media le distanze medie siano le stesse, la variazione della distanza media è maggiore nel secondo caso a causa delle interdipendenze grafiche tra i bordi. Questo è uno dei motivi per cui non è possibile utilizzare una versione semplice del Teorema del limite centrale: è difficile calcolare la deviazione standard di questa distribuzione.
Ecco risultati paragonabili ai dati descritti nella domanda: punti sono distribuiti approssimativamente in modo uniforme all'interno di un quadrato e delle loro coppie fanno parte del gruppo di trattamento. I calcoli sono durati solo pochi secondi, a dimostrazione della loro fattibilità.1500n=30001500
Le coppie nella riga superiore sono state scelte di nuovo a caso. Nella riga inferiore, tutti i bordi del gruppo di trattamento utilizzano solo i punti più vicini all'angolo in basso a sinistra. La loro distanza media è molto più piccola della distribuzione di campionamento che può essere considerata statisticamente significativa.56
In generale, la proporzione di distanze medie sia dalla simulazione che dal gruppo di trattamento che è uguale o maggiore della distanza media nel gruppo di trattamento può essere presa come il valore p di questo test di permutazione non parametrico.
Questo è il R
codice utilizzato per creare le illustrazioni.
n.vectors <- 3000
n.condition <- 1500
d <- 2 # Dimension of the space
n.sim <- 1e4 # Number of iterations
set.seed(17)
par(mfrow=c(2, 2))
#
# Construct a dataset like the actual one.
#
# `m` indexes the pairs of vectors with a "condition."
# `x` contains the coordinates of all vectors.
x <- matrix(runif(d*n.vectors), nrow=d)
x <- x[, order(x[1, ]+x[2, ])]
#
# Create two kinds of conditions and analyze each.
#
for (independent in c(TRUE, FALSE)) {
if (independent) {
i <- sample.int(n.vectors, n.condition)
j <- sample.int(n.vectors-1, n.condition)
j <- (i + j - 1) %% n.condition + 1
m <- cbind(i,j)
} else {
u <- floor(sqrt(2*n.condition))
v <- ceiling(2*n.condition/u)
m <- as.matrix(expand.grid(1:u, 1:v))
m <- m[m[,1] < m[,2], ]
}
#
# Plot the configuration.
#
plot(t(x), pch=19, cex=0.5, col="Gray", asp=1, bty="n",
main="The Data", xlab="X", ylab="Y",
sub=paste(length(unique(as.vector(m))), "points"))
invisible(apply(m, 1, function(i) lines(t(x[, i]), col="#80000040")))
points(t(x[, unique(as.vector(m))]), pch=16, col="Red", cex=0.6)
#
# Precompute all distances between all points.
#
distances <- sapply(1:n.vectors, function(i) sqrt(colSums((x-x[,i])^2)))
#
# Compute the mean distance in any set of pairs.
#
mean.distance <- function(m, distances)
mean(distances[m])
#
# Sample from the points using the same *pattern* in the "condition."
# `m` is a two-column array pairing indexes between 1 and `n` inclusive.
sample.graph <- function(m, n) {
n.permuted <- sample.int(n, n)
cbind(n.permuted[m[,1]], n.permuted[m[,2]])
}
#
# Simulate the sampling distribution of mean distances for randomly chosen
# subsets of a specified size.
#
system.time(
sim <- replicate(n.sim, mean.distance(sample.graph(m, n.vectors), distances))
stat <- mean.distance(m, distances)
p.value <- 2 * min(mean(c(sim, stat) <= stat), mean(c(sim, stat) >= stat))
hist(sim, freq=FALSE,
sub=paste("p-value:", signif(p.value, ceiling(log10(length(sim))/2)+1)),
main="Histogram of mean distances", xlab="Distance")
abline(v = stat, lwd=2, lty=3, col="Red")
}