La question des différences «significatives» toujours suppose toujours un modèle statistique pour les données. Cette réponse propose l'un des modèles les plus généraux qui soit cohérent avec les informations minimales fournies dans la question. En bref, cela fonctionnera dans un large éventail de cas, mais ce n'est peut-être pas toujours le moyen le plus puissant pour détecter une différence.
Trois aspects des données comptent vraiment: la forme de l'espace occupé par les points; la répartition des points dans cet espace; et le graphe formé par les paires de points ayant la "condition" - que j'appellerai le groupe "traitement". Par «graphique», j'entends la configuration des points et des interconnexions impliquée par les paires de points dans le groupe de traitement. Par exemple, dix paires de points ("arêtes") du graphique pourraient impliquer jusqu'à 20 points distincts ou aussi peu que cinq points. Dans le premier cas, deux arêtes ne partagent pas un point commun, tandis que dans le second cas, les arêtes sont constituées de toutes les paires possibles entre cinq points.
Pour déterminer si la distance moyenne entre les bords du groupe de traitement est «significative», nous pouvons considérer un processus aléatoire dans lequel tous les points sont permutés au hasard par une permutation . Cela permute également les arêtes: l'arête est remplacée par . L'hypothèse nulle est que le groupe de traitement des bords apparaît comme l'une de ces permutations. Dans l'affirmative, sa distance moyenne devrait être comparable aux distances moyennes figurant dans ces permutations. Nous pouvons assez facilement estimer la distribution de ces distances moyennes aléatoires en échantillonnant quelques milliers de toutes ces permutations.σ ( v i , v j ) ( v σ ( i ) , v σ ( j ) ) 3000 ! ≈ 10 21024n = 3000σ( vje, vj)( vσ( i ), vσ( j ))3000 ! ≈ 1021024
(Il est à noter que cette approche fonctionnera, avec seulement des modifications mineures, avec n'importe quelle distance ou même n'importe quelle quantité associée à chaque paire de points possible. Elle fonctionnera également pour tout résumé des distances, pas seulement la moyenne.)
Pour illustrer, voici deux situations impliquant points et bords dans un groupe de traitement. Dans la rangée supérieure, les premiers points de chaque bord ont été choisis au hasard parmi les points, puis les deuxièmes points de chaque bord ont été choisis indépendamment et au hasard parmi les points différents de leur premier point. Au total, points sont impliqués dans ces arêtes.28 100 100 - 1 39 28n = 10028100100−13928
Dans la rangée du bas, huit des points ont été choisis au hasard. Les bords se composent de toutes les paires possibles d'entre eux.2810028
Les histogrammes à droite montrent les distributions d'échantillonnage pour permutations aléatoires des configurations. Les distances moyennes réelles des données sont marquées par des lignes rouges verticales en pointillés. Les deux moyennes sont cohérentes avec les distributions d'échantillonnage: aucune ne se situe loin à droite ou à gauche.10000
Les distributions d'échantillonnage diffèrent: bien qu'en moyenne les distances moyennes soient les mêmes, la variation de la distance moyenne est plus importante dans le second cas en raison des interdépendances graphiques entre les bords. C'est une des raisons pour lesquelles aucune version simple du théorème central limite ne peut être utilisée: le calcul de l'écart type de cette distribution est difficile.
Voici des résultats comparables aux données décrites dans la question: points sont répartis approximativement uniformément dans un carré et de leurs paires sont dans le groupe de traitement. Les calculs n'ont pris que quelques secondes, démontrant leur praticabilité.1500n=30001500
Les paires de la rangée du haut ont de nouveau été choisies au hasard. Dans la rangée du bas, tous les bords du groupe de traitement n'utilisent que les points les plus proches du coin inférieur gauche. Leur distance moyenne est tellement inférieure à la distribution d'échantillonnage que cela peut être considéré comme statistiquement significatif.56
En général, la proportion des distances moyennes à la fois la simulation et le groupe de traitement qui sont égales ou supérieures à la distance moyenne du groupe de traitement peut être considéré comme la p-valeur de ce test de permutation non paramétrique.
Il s'agit du R
code utilisé pour créer les illustrations.
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")
}