คำถามที่ "แตกต่าง" อย่างมีนัยสำคัญเสมอให้สันนิษฐานรูปแบบทางสถิติสำหรับข้อมูลเสมอ คำตอบนี้เสนอหนึ่งในโมเดลทั่วไปที่สอดคล้องกับข้อมูลน้อยที่สุดที่มีในคำถาม ในระยะสั้นมันจะทำงานในหลายกรณี แต่อาจไม่ใช่วิธีที่ทรงพลังที่สุดในการตรวจจับความแตกต่าง
ข้อมูลสามด้านมีความสำคัญอย่างแท้จริง:รูปร่างของพื้นที่ที่ถูกครอบครองโดยจุดนั้น การกระจายของคะแนนภายในพื้นที่นั้น และกราฟที่เกิดจากจุดคู่ที่มี "เงื่อนไข" - ซึ่งฉันจะเรียกกลุ่ม "การรักษา" โดย "กราฟ" ฉันหมายถึงรูปแบบของจุดและการเชื่อมโยงระหว่างกันโดยนัยโดยจุดคู่ในกลุ่มการรักษา ตัวอย่างเช่นสิบจุดคู่ ("edge") ของกราฟอาจเกี่ยวข้องกับจุดที่แตกต่างกันถึง 20 จุดหรือน้อยกว่าห้าจุด ในกรณีก่อนไม่มีขอบสองจุดที่ใช้ร่วมกันในขณะที่ในกรณีหลังขอบประกอบด้วยคู่ที่เป็นไปได้ทั้งหมดระหว่างห้าจุด
n=3000σ(vi,vj)(vσ(i),vσ(j))3000!≈1021024พีชคณิต ถ้าเป็นเช่นนั้นระยะทางเฉลี่ยควรเทียบเคียงกับระยะทางเฉลี่ยที่ปรากฏในการเรียงสับเปลี่ยน เราอาจประมาณการกระจายตัวของระยะทางเฉลี่ยแบบสุ่มเหล่านั้นได้ง่ายพอสมควร
(เป็นที่น่าสังเกตว่าวิธีการนี้จะทำงานด้วยการปรับเปลี่ยนเพียงเล็กน้อยกับใด ๆระยะทางหรือปริมาณแน่นอนใด ๆ ที่เกี่ยวข้องใด ๆ กับคู่เป็นไปได้ทุกจุด. นอกจากนี้ยังจะทำงานให้สรุปของระยะทางใด ๆ ไม่ได้เป็นเพียงค่าเฉลี่ย.)
n=10028100100−13928
10028
10000
การกระจายตัวตัวอย่างแตกต่างกัน:แม้ว่าโดยเฉลี่ยแล้วระยะทางเฉลี่ยเท่ากัน แต่ความแปรปรวนของระยะทางเฉลี่ยนั้นยิ่งใหญ่กว่าในกรณีที่สองเนื่องจากการพึ่งพาซึ่งกันและกันแบบกราฟิกระหว่างขอบ นี่คือเหตุผลหนึ่งที่ไม่มีทฤษฎีบทขีด จำกัด กลางที่ใช้งานง่าย: การคำนวณค่าเบี่ยงเบนมาตรฐานของการแจกแจงนี้เป็นเรื่องยาก
n=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")
}