Вопрос «существенно» отличается всегда, всегда предполагает статистическую модель данных. Этот ответ предлагает одну из наиболее общих моделей, которая согласуется с минимальной информацией, представленной в вопросе. Короче говоря, он будет работать в самых разных случаях, но не всегда может быть самым мощным способом обнаружения различий.
Три аспекта данных действительно имеют значение: форма пространства, занимаемого точками; распределение точек в этом пространстве; и график, образованный точечными парами, имеющими «условие» - которое я назову группой «лечение». Под «графиком» я подразумеваю схему точек и взаимосвязей, подразумеваемых парами точек в группе лечения. Например, десять пар точек («ребер») графа могут включать до 20 различных точек или всего пять точек. В первом случае нет двух ребер, имеющих общую точку, тогда как во втором случае ребра состоят из всех возможных пар между пятью точками.
Чтобы определить, является ли среднее расстояние между ребрами в группе лечения «значительным», мы можем рассмотреть случайный процесс, в котором все точек случайным образом переставляются перестановкой . Это также переставляет ребра: ребро заменяется на . Нулевая гипотеза состоит в том, что группа обработки ребер возникает как одна из этих перестановок. Если это так, его среднее расстояние должно быть сопоставимо со средним расстоянием, указанным в этих перестановках. Мы можем довольно легко оценить распределение этих случайных средних расстояний, выбрав несколько тысяч всех этих перестановок.σ ( v i , v j ) ( v σ ( i ) , v σ ( j ) ) 3000 ! ≈ 10 21024n = 3000σ( vя, vJ)( vσ( я ), vσ( J ))3000 ! ≈ 1021024
(Следует отметить, что этот подход будет работать, только с небольшими изменениями, с любым расстоянием или даже с любой величиной, связанной с каждой возможной парой точек. Он также будет работать для любого суммирования расстояний, а не только для среднего значения.)
Чтобы проиллюстрировать это, вот две ситуации, включающие точек и ребер в группе лечения. В верхнем ряду первые точки в каждом ребре были случайным образом выбраны из точек, а затем вторые точки каждого ребра были независимо и случайно выбраны из точек, отличных от их первой точки. Всего в этих краях задействовано очков .28 100 100 - 1 39 28n=10028100100−13928
В нижнем ряду восемь из баллов были выбраны случайным образом. В ребер состоят из всех возможных пар из них.2810028
Гистограммы справа показывают распределения выборки для случайных перестановок конфигураций. Фактические средние расстояния для данных отмечены вертикальными пунктирными красными линиями. Оба средства согласуются с распределением выборки: ни один не лежит далеко направо или налево.10000
Распределения выборки различаются: хотя в среднем средние расстояния одинаковы, изменение среднего расстояния больше во втором случае из-за графической взаимозависимости между краями. Это одна из причин, по которой нельзя использовать простую версию Центральной предельной теоремы: вычислить стандартное отклонение этого распределения сложно.
Вот результаты, сопоставимые с данными, описанными в вопросе: точек приблизительно равномерно распределены в квадрате, и их пар находятся в группе лечения. Расчеты заняли всего несколько секунд, демонстрируя их практичность.1500n=30001500
Пары в верхнем ряду снова были выбраны случайным образом. В нижнем ряду все края в группе обработки используют только точек, ближайших к нижнему левому углу. Их среднее расстояние настолько меньше распределения выборки, что это можно считать статистически значимым.56
Как правило, в качестве значения p этого непараметрического теста на перестановку может быть взята доля средних расстояний как от симуляции, так и от группы лечения, которые равны или превышают среднее расстояние в группе лечения .
Это R
код, используемый для создания иллюстраций.
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")
}