Her zaman "önemli ölçüde" farklı olan soru, her zaman veriler için istatistiksel bir model gerektirir. Bu cevap, soruda sunulan asgari bilgilerle tutarlı en genel modellerden birini önermektedir. Kısacası, çok çeşitli durumlarda çalışacaktır, ancak her zaman bir farkı tespit etmenin en güçlü yolu olmayabilir.
Verilerin üç yönü gerçekten önemlidir: noktaların kapladığı alanın şekli; noktaların o boşluk içindeki dağılımı; ve "tedavi" grubu olarak adlandıracağım "koşula" sahip nokta çiftlerinin oluşturduğu grafik. "Grafik" ile, tedavi grubundaki nokta çiftleri tarafından ima edilen noktaların ve ara bağlantıların örüntüsünü kastediyorum. Örneğin, grafiğin on nokta çifti ("kenarlar") 20 farklı noktaya veya beş noktaya kadar içerebilir. İlk durumda iki kenar ortak bir noktayı paylaşmazken, ikinci durumda kenarlar beş nokta arasındaki tüm olası çiftlerden oluşur.
Tedavi grubundaki kenarlar arasındaki ortalama mesafenin "anlamlı" olup olmadığını belirlemek için, tüm noktalarının bir permütasyon tarafından rastgele izin verildiği rastgele bir işlemi düşünebiliriz . Bu kenarlara da izin verir: kenar , . Sıfır hipotezi, kenar tedavi grubunun bu permütasyondan biri olarak ortaya . Eğer öyleyse, ortalama mesafesi bu permütasyonlarda görünen ortalama mesafelerle karşılaştırılabilir olmalıdır. Tüm bu permütasyonlardan birkaç binini örnekleyerek bu rastgele ortalama mesafelerin dağılımını oldukça kolay bir şekilde tahmin edebiliriz.σ ( v i , v j ) ( v σ ( i ) , v σ ( j ) ) 3000 ! ≈ 10 21024n = 3000σ( vben, vj)( vσ( i ), vσ( j ))3000 ! ≈ 1021024
(Bu yaklaşımın, sadece küçük modifikasyonlarla, mümkün olan her nokta çifti ile ilişkili herhangi bir mesafe veya gerçekten herhangi bir miktarda çalışacağı dikkate değerdir . Ayrıca, sadece ortalama değil, mesafelerin herhangi bir özeti için de işe yarayacaktır.)
Açıklamak gerekirse, burada bir tedavi grubunda puan ve kenarı içeren iki durum vardır . Üst sırada, her bir kenardaki ilk noktalar noktadan rastgele seçildi ve daha sonra her bir kenarın ikinci noktaları bağımsız olarak ve ilk noktalarından farklı noktadan rastgele seçildi . Bu kenarda nokta hep birlikte yer alıyor .28 100 100 - 1 39 28n = 10028100100 - 13928
Alt sırada, noktanın sekizi rastgele seçildi. kenarları bunların tüm olası çiftinden meydana gelmektedir.2810028
Sağdaki histogramlar , konfigürasyonların rasgele permütasyonu için örnekleme dağılımlarını göstermektedir . Veriler için gerçek ortalama mesafeler dikey kesikli kırmızı çizgilerle işaretlenmiştir. Her iki araç da örnekleme dağılımlarıyla tutarlıdır: ikisi de sağa veya sola uzak değildir.10000
Örnekleme dağılımları farklıdır: ortalama mesafeler ortalama olmasına rağmen, ortalama mesafedeki değişim ikinci durumda kenarlar arasındaki grafiksel bağımlılıklar nedeniyle daha büyüktür . Merkezi Limit Teoreminin basit bir versiyonunun kullanılmamasının bir nedeni budur: bu dağılımın standart sapmasının hesaplanması zordur.
İşte soruda açıklanan verilerle karşılaştırılabilir sonuçlar: nokta yaklaşık olarak bir kare içinde eşit olarak dağıtılır ve çiftlerinin tedavi grubundadır. Hesaplamalar sadece birkaç saniye sürdü ve uygulanabilirliklerini gösterdi.1500n =30001500
Üst sıradaki çiftler tekrar rastgele seçildi. Alt sırada, tedavi grubundaki tüm kenarlar sadece sol alt köşeye en yakın noktayı kullanır . Ortalama mesafeleri, örnekleme dağılımından çok daha küçüktür ve bu istatistiksel olarak anlamlı kabul edilebilir.56
Genel olarak, hem simülasyon hem de tedavi grubundan, tedavi grubundaki ortalama mesafeye eşit ya da daha büyük ortalama mesafelerin oranı, bu parametrik olmayan permütasyon testinin p değeri olarak alınabilir .
R
İllüstrasyonları oluşturmak için kullanılan kod budur .
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")
}