La cuestión de "significativamente" diferente siempre, siempre presupone un modelo estadístico para los datos. Esta respuesta propone uno de los modelos más generales que es consistente con la mínima información proporcionada en la pregunta. En resumen, funcionará en una amplia gama de casos, pero puede que no siempre sea la forma más poderosa de detectar una diferencia.
Tres aspectos de los datos realmente importan: la forma del espacio ocupado por los puntos; la distribución de los puntos dentro de ese espacio; y el gráfico formado por los pares de puntos que tienen la "condición", que llamaré el grupo "tratamiento". Por "gráfico" me refiero al patrón de puntos e interconexiones implicados por los pares de puntos en el grupo de tratamiento. Por ejemplo, diez pares de puntos ("bordes") de la gráfica podrían involucrar hasta 20 puntos distintos o tan solo cinco puntos. En el primer caso, no hay dos aristas que compartan un punto común, mientras que en el último caso las aristas consisten en todos los pares posibles entre cinco puntos.
Para determinar si la distancia media entre los bordes en el grupo de tratamiento es "significativa", podemos considerar un proceso aleatorio en el que todos los puntos son permutados aleatoriamente por una permutación . Esto también permuta los bordes: el borde se reemplaza por . La hipótesis nula es que el grupo de tratamiento de aristas surge como una de estas permutaciones. Si es así, su distancia media debería ser comparable a las distancias medias que aparecen en esas permutaciones. Podemos estimar con bastante facilidad la distribución de esas distancias medias aleatorias mediante el muestreo de algunos miles de todas esas permutaciones.σ ( v i , v j ) ( v σ ( i ) , v σ ( j ) ) 3000 ! ≈ 10 21,024n = 3000σ( vyo, vj)( vσ( i ), vσ( j ))3000 ! ≈ 1021024
(Es de destacar que este enfoque funcionará, con solo modificaciones menores, con cualquier distancia o, de hecho, cualquier cantidad asociada con cada par de puntos posible. También funcionará para cualquier resumen de las distancias, no solo la media).
Para ilustrar, aquí hay dos situaciones que involucran puntos y aristas en un grupo de tratamiento. En la fila superior, los primeros puntos en cada borde se eligieron aleatoriamente entre los puntos y luego los segundos puntos de cada borde se eligieron de forma independiente y aleatoria entre los puntos diferentes de su primer punto. En total, puntos están involucrados en estos bordes.28 100 100 - 1 39 28n=10028100100−13928
En la fila inferior, ocho de los puntos fueron elegidos al azar. Los bordes consisten en todos los pares posibles de ellos.2810028
Los histogramas a la derecha muestran las distribuciones de muestreo para permutaciones aleatorias de las configuraciones. Las distancias medias reales para los datos están marcadas con líneas rojas discontinuas verticales. Ambos medios son consistentes con las distribuciones de muestreo: ninguno se encuentra muy a la derecha o a la izquierda.10000
Las distribuciones de muestreo difieren: aunque en promedio las distancias medias son las mismas, la variación en la distancia media es mayor en el segundo caso debido a las interdependencias gráficas entre los bordes. Esta es una razón por la que no se puede utilizar una versión simple del Teorema del límite central: calcular la desviación estándar de esta distribución es difícil.
Aquí hay resultados comparables a los datos descritos en la pregunta: puntos están distribuidos aproximadamente de manera uniforme dentro de un cuadrado y de sus pares están en el grupo de tratamiento. Los cálculos tomaron solo unos segundos, lo que demuestra su viabilidad.1500n=30001500
Los pares en la fila superior nuevamente fueron elegidos al azar. En la fila inferior, todos los bordes en el grupo de tratamiento usan solo los puntos más cercanos a la esquina inferior izquierda. Su distancia media es mucho menor que la distribución de muestreo que se puede considerar estadísticamente significativa.56
En general, la proporción de distancias medias tanto de la simulación como del grupo de tratamiento que son iguales o mayores que la distancia media en el grupo de tratamiento puede tomarse como el valor p de esta prueba de permutación no paramétrica.
Este es el R
código utilizado para crear las ilustraciones.
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")
}