Statistical-Significance

距離差異的統計顯著性

  • November 20, 2016

我在二維網格上有超過 3000 個向量,具有近似均勻的離散分佈。一些向量對滿足特定條件。注意:該條件僅適用於向量,不適用於單個向量。我有一個大約 1500 個這樣的對的列表,我們稱之為第 1 組。第 2 組包含所有其他向量對。我想知道第 1 組中一對向量之間的距離是否明顯小於兩個向量之間的平均距離。我怎樣才能做到這一點?

統計檢驗:中心極限定理是否適用於我的案例?也就是說,我可以取距離樣本的均值並使用學生 t 檢驗來比較滿足條件的樣本均值與不滿足條件的樣本均值嗎?否則,這裡適合什麼統計測試?

樣本大小和样本數量:我知道這裡有兩個變量,對於兩組中的每一個,我需要取n 個大小為m的樣本並取每個樣本的平均值。有什麼原則性的方法來選擇nm嗎?它們應該盡可能大嗎?還是應該盡可能少,只要它們顯示出統計意義?兩組中的每一個都應該相同嗎?或者對於包含更多向量對的第 2 組,它們是否應該更大?

“顯著”不同的問題總是以數據的統計模型為前提。 該答案提出了與問題中提供的最少信息一致的最通用模型之一。簡而言之,它適用於各種情況,但它可能並不總是檢測差異的最有效方法。

**數據的三個方面真正重要:**點所佔據空間的形狀;該空間內的點分佈;以及由具有“條件”的點對形成的圖形——我將其稱為“治療”組。“圖表”是指治療組中點對所暗示的點和互連模式。例如,圖的十個點對(“邊”)可能涉及多達 20 個不同的點或少至五個點。在前一種情況下,沒有兩條邊共享一個公共點,而在後一種情況下,邊由五個點之間的所有可能對組成。

為了確定治療組中邊緣之間的平均距離是否“顯著”,我們可以考慮一個隨機過程,其中所有 點由排列隨機排列. 這也會置換邊緣:邊緣被替換為. 零假設是邊緣的治療組作為其中之一出現排列。如果是這樣,它的平均距離應該與這些排列中出現的平均距離相當。我們可以通過對所有這些排列中的幾千個進行抽樣來相當容易地估計這些隨機平均距離的分佈。

(值得注意的是,這種方法只需稍作修改即可適用於任何距離或與每個可能的點對相關的任何數量。它也適用於距離的任何總結,而不僅僅是平均值。)


**為了說明,**這裡有兩種情況涉及點和治療組的邊緣。在第一行中,每條邊的第一個點是從點,然後每條邊的第二個點是獨立且隨機地從點與他們的第一點不同。全部一起這些點涉及到邊緣。

在最下面一行,八個點是隨機選擇的。這邊由所有可能的對組成。

圖1

右側的直方圖顯示了樣本分佈配置的隨機排列。數據的實際平均距離用垂直的紅色虛線標記。兩種方法都與採樣分佈一致:既不位於右側也不位於左側。

採樣分佈不同:雖然平均距離相同,但在第二種情況下,由於邊緣之間的圖形相互依賴性,平均距離的變化更大。 **這是不能使用中心極限定理的簡單版本的原因之一:**計算這個分佈的標準差很困難。

以下是與問題中描述的數據相當的結果:點大致均勻分佈在一個正方形內,並且他們的對在治療組。 **計算只用了幾秒鐘,**證明了它們的實用性。

圖 2

頂行中的對再次被隨機選擇。在底行中,處理組中的所有邊僅使用離左下角最近的點。它們的平均距離遠小於採樣分佈,因此可以認為具有統計學意義。

一般來說,模擬和治療組的平均距離等於或大於治療組平均距離**的比例可以作為這個非參數置換檢驗的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")
}

引用自:https://stats.stackexchange.com/questions/247004

comments powered by Disqus