डेटा के लिए "महत्वपूर्ण रूप से" हमेशा अलग, हमेशा एक सांख्यिकीय मॉडल निर्धारित करता है। यह उत्तर सबसे सामान्य मॉडल में से एक का प्रस्ताव करता है जो प्रश्न में प्रदान की गई न्यूनतम जानकारी के अनुरूप है। संक्षेप में, यह व्यापक मामलों में काम करेगा, लेकिन किसी अंतर का पता लगाने के लिए यह हमेशा सबसे शक्तिशाली तरीका नहीं हो सकता है।
डेटा के तीन पहलू सही मायने में मायने रखते हैं: बिंदुओं के कब्जे वाले स्थान का आकार; उस स्थान के भीतर बिंदुओं का वितरण; और "स्थिति" वाले बिंदु-युग्मों द्वारा गठित ग्राफ - जिसे मैं "उपचार" समूह कहूंगा। "ग्राफ़" से मेरा मतलब है कि उपचार समूह में बिंदु-जोड़े द्वारा निहित बिंदुओं और अंतर्संबंधों का पैटर्न। उदाहरण के लिए, ग्राफ के दस बिंदु-जोड़े ("किनारों") में 20 अलग-अलग बिंदु या पांच अंकों तक हो सकते हैं। पूर्व मामले में कोई भी दो किनारों का एक साझा बिंदु नहीं होता है, जबकि बाद वाले मामले में किनारों में पांच बिंदुओं के बीच सभी संभावित जोड़े होते हैं।
यह निर्धारित करने के लिए कि उपचार समूह में किनारों के बीच की दूरी "महत्वपूर्ण" है, हम एक यादृच्छिक प्रक्रिया पर विचार कर सकते हैं जिसमें सभी अंक क्रमिक रूप से क्रमपरिवर्तन द्वारा अनुमत हैं । यह किनारों को भी अनुमति देता है: किनारे को द्वारा प्रतिस्थापित किया जाता है । अशक्त परिकल्पना यह है कि किनारों का उपचार समूह इन में से एक के रूप में उत्पन्न होता है । यदि हां, तो इसकी क्रमिक दूरी उन क्रमपरिवर्तन में दिखाई देने वाली मध्य दूरी की तुलना में होनी चाहिए। हम काफी आसानी से उन सभी क्रमपरिवर्तन के कुछ हजार का नमूना करके उन यादृच्छिक माध्य दूरी के वितरण का अनुमान लगा सकते हैं।n=3000σ(vi,vj)(vσ(i),vσ(j))3000!≈1021024
(यह उल्लेखनीय है कि यह दृष्टिकोण केवल मामूली संशोधनों के साथ, किसी भी दूरी या वास्तव में किसी भी मात्रा में हर संभव बिंदु जोड़ी के साथ काम करेगा। यह केवल मतलब ही नहीं, बल्कि दूरी के किसी भी सारांश के लिए भी काम करेगा।)
समझाने के लिए, यहां दो स्थितियां हैं अंक और एक उपचार समूह में किनारे। शीर्ष पंक्ति में प्रत्येक किनारे के पहले बिंदुओं को यादृच्छिक रूप से अंकों से चुना गया था और फिर प्रत्येक किनारे के दूसरे बिंदुओं को स्वतंत्र रूप से और यादृच्छिक रूप से उनके पहले बिंदु से अलग अंकों से चुना गया था । इन किनारों में कुल मिलाकर बिंदु शामिल हैं ।n=10028100100−13928
नीचे की पंक्ति में, अंकों में से आठ को यादृच्छिक रूप से चुना गया था। किनारों उन सभी संभव जोड़े से मिलकर बनता है।10028
सही पर हिस्टोग्राम्स विन्यास के यादृच्छिक क्रमांकन के लिए नमूना वितरण दिखाते हैं । डेटा के लिए वास्तविक औसत दूरी ऊर्ध्वाधर धराशायी लाल लाइनों के साथ चिह्नित है। दोनों साधन नमूना वितरण के अनुरूप हैं: न तो दाएं या बाएं से अधिक दूर।10000
नमूना वितरण भिन्न होते हैं: यद्यपि औसत दूरी समान होती है, किनारों के बीच चित्रमय अन्योन्याश्रितियों के कारण दूसरे मामले में औसत दूरी में भिन्नता अधिक होती है। यह एक कारण है कि केंद्रीय सीमा प्रमेय का कोई सरल संस्करण उपयोग नहीं किया जा सकता है: इस वितरण के मानक विचलन की गणना करना कठिन है।
यहां प्रश्न में वर्णित आंकड़ों के तुलनीय परिणाम दिए गए हैं: अंक लगभग एक वर्ग के भीतर समान रूप से वितरित किए गए हैं और उनके जोड़े के उपचार समूह में हैं। गणनाओं को केवल कुछ सेकंड लगे, उनकी व्यावहारिकता का प्रदर्शन।n=30001500
शीर्ष पंक्ति में जोड़े को फिर से यादृच्छिक रूप से चुना गया था। नीचे की पंक्ति में, उपचार समूह के सभी किनारे नीचे के बाएं कोने के निकटतम बिंदुओं का उपयोग करते हैं । उनका माध्य दूरी नमूना वितरण से इतना छोटा है कि इसे सांख्यिकीय रूप से महत्वपूर्ण माना जा सकता है।56
आम तौर पर, उपचार समूह में सिमुलेशन और उपचार समूह दोनों से औसत दूरी के बराबर या बराबर दूरी से अधिक दूरी का अनुपात इस nonparametric क्रमपरिवर्तन परीक्षण के पी-मूल्य के रूप में लिया जा सकता है ।
यह 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")
}