Die Frage nach "wesentlich" Unterschieden setzt immer ein statistisches Modell für die Daten voraus. Diese Antwort schlägt eines der allgemeinsten Modelle vor, das mit den in der Frage angegebenen Mindestinformationen übereinstimmt. Kurz gesagt, es funktioniert in einer Vielzahl von Fällen, ist jedoch möglicherweise nicht immer die leistungsfähigste Methode, um einen Unterschied zu erkennen.
Drei Aspekte der Daten sind wirklich wichtig: die Form des von den Punkten eingenommenen Raums; die Verteilung der Punkte innerhalb dieses Raumes; und der Graph, der durch die Punktpaare mit der "Bedingung" gebildet wird - die ich die "Behandlungs" -Gruppe nennen werde. Mit "Graph" meine ich das Muster von Punkten und Verbindungen, die durch die Punktpaare in der Behandlungsgruppe impliziert werden. Beispielsweise können zehn Punktpaare ("Kanten") des Diagramms bis zu 20 verschiedene Punkte oder nur fünf Punkte umfassen. Im ersten Fall haben keine zwei Kanten einen gemeinsamen Punkt, während im zweiten Fall Kanten aus allen möglichen Paaren zwischen fünf Punkten bestehen.
Um festzustellen, ob der mittlere Abstand zwischen den Kanten in der Behandlungsgruppe "signifikant" ist, können wir einen zufälligen Prozess betrachten, bei dem alle Punkte zufällig durch eine Permutation σ permutiert werden . Dies durchläuft auch die Kanten: Die Kante ( v i , v j ) wird durch ( v σ ( in = 3000σ( vich, vj)( vσ( i ), vσ( j ))3000 ! ≈ 1021024Permutationen. In diesem Fall sollte der mittlere Abstand mit den mittleren Abständen in diesen Permutationen vergleichbar sein. Wir können die Verteilung dieser zufälligen mittleren Abstände ziemlich leicht abschätzen, indem wir einige tausend dieser Permutationen abtasten.
(Es ist bemerkenswert, dass dieser Ansatz mit nur geringfügigen Änderungen bei jeder Entfernung oder in der Tat bei jeder Menge, die mit jedem möglichen Punktpaar verbunden ist, funktioniert. Er funktioniert auch für jede Zusammenfassung der Entfernungen, nicht nur für den Mittelwert.)
Zur Veranschaulichung sind hier zwei Situationen mit Punkten und 28n = 10028100100 - 13928
10028
10000
Die Stichprobenverteilungen unterscheiden sich: Obwohl die mittleren Abstände im Durchschnitt gleich sind, ist die Variation des mittleren Abstands im zweiten Fall aufgrund der grafischen Interdependenzen zwischen den Kanten größer . Dies ist ein Grund, warum keine einfache Version des zentralen Grenzwertsatzes verwendet werden kann: Die Berechnung der Standardabweichung dieser Verteilung ist schwierig.
n = 30001500
56
Im Allgemeinen kann der Anteil der mittleren Abstände sowohl von der Simulation als auch von der Behandlungsgruppe, der gleich oder größer als der mittlere Abstand in der Behandlungsgruppe ist, als p-Wert dieses nichtparametrischen Permutationstests verwendet werden.
Dies ist der R
Code, der zum Erstellen der Illustrationen verwendet wird.
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")
}