Pytanie „znacząco” różne zawsze, zawsze zakłada model statystyczny danych. Ta odpowiedź proponuje jeden z najbardziej ogólnych modeli, który jest zgodny z minimalną ilością informacji zawartych w pytaniu. Krótko mówiąc, będzie działać w wielu różnych przypadkach, ale nie zawsze może być najskuteczniejszym sposobem wykrycia różnicy.
Trzy aspekty danych naprawdę mają znaczenie: kształt przestrzeni zajmowanej przez punkty; rozkład punktów w tej przestrzeni; oraz wykres utworzony przez pary punktowe posiadające „warunek” - który nazywam grupą „leczenia”. Przez „wykres” rozumiem wzór punktów i wzajemnych powiązań sugerowany przez pary punktów w grupie leczenia. Na przykład dziesięć par punktowych („krawędzi”) wykresu może obejmować do 20 różnych punktów lub zaledwie pięć punktów. W pierwszym przypadku żadne dwie krawędzie nie mają wspólnego punktu, podczas gdy w drugim przypadku krawędzie składają się ze wszystkich możliwych par między pięcioma punktami.
Aby ustalić, czy średnia odległość między krawędziami w grupie leczenia jest „znacząca”, możemy rozważyć losowy proces, w którym wszystkie punktów są losowo permutowane przez permutację . To także permutuje krawędzie: krawędź zostaje zastąpiona przez . Hipotezą zerową jest to, że grupa leczenia krawędzi powstaje jako jedna z tych permutacji . Jeśli tak, jego średnia odległość powinna być porównywalna ze średnimi odległościami występującymi w tych permutacjach. Możemy dość łatwo oszacować rozkład tych losowych średnich odległości, próbkując kilka tysięcy wszystkich tych permutacji.σ ( v i , v j ) ( v σ ( i ) , v σ ( j ) ) 3000 ! ≈ 10 21024n = 3000σ( vja, vjot)( vσ( i ), vσ( j ))3000 ! ≈ 1021024
(Warto zauważyć, że to podejście będzie działać, z niewielkimi modyfikacjami, z dowolną odległością, a nawet dowolną ilością związaną z każdą możliwą parą punktów. Będzie również działało dla każdego podsumowania odległości, a nie tylko średniej).
Aby to zilustrować, oto dwie sytuacje obejmujące punktów i krawędzi w grupie leczenia. W górnym rzędzie pierwsze punkty na każdej krawędzi zostały losowo wybrane ze punktów, a następnie drugie punkty każdej krawędzi zostały niezależnie i losowo wybrane ze punktów różnych od ich pierwszego punktu. Wszyscy razem punktów są zaangażowane w te krawędzi.28 100 100 - 1 39 28n = 10028100100 - 13928
W dolnym rzędzie osiem ze punktów zostało wybranych losowo. W krawędzie składa się ze wszystkich możliwych par nich.2810028
Histogramy po prawej stronie przedstawiają rozkłady próbkowania dla losowych permutacji konfiguracji. Rzeczywiste średnie odległości dla danych są oznaczone pionowymi przerywanymi czerwonymi liniami. Oba sposoby są zgodne z rozkładami próbkowania: żadne nie leży daleko w prawo ani w lewo.dziesięć tysięcy
Rozkłady próbkowania różnią się: chociaż średnio średnie odległości są takie same, zmiana średniej odległości jest większa w drugim przypadku ze względu na graficzne zależności między krawędziami. Jest to jeden z powodów, dla których nie można zastosować prostej wersji Centralnego Twierdzenia Granicznego: obliczenie standardowego odchylenia tego rozkładu jest trudne.
n = 30001500
56
Zasadniczo odsetek średnich odległości zarówno od symulacji, jak i grupy leczonej, które są równe lub większe niż średnia odległość w grupie leczonej, można przyjąć jako wartość p tego nieparametrycznego testu permutacyjnego.
To jest R
kod używany do tworzenia ilustracji.
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")
}