Istotność statystyczna różnicy między odległościami

12

Mam ponad 3000 wektorów na dwuwymiarowej siatce o mniej więcej jednolitym dyskretnym rozkładzie. Niektóre pary wektorów spełniają określony warunek. Uwaga: warunek dotyczy tylko par wektorów, a nie pojedynczych wektorów. Mam listę około 1500 takich par, nazwijmy to grupą 1. Grupa 2 zawiera wszystkie inne pary wektorów. Chcę dowiedzieć się, czy odległość między wektorami w parze w grupie 1 jest znacznie mniejsza niż średnia odległość między dwoma wektorami. Jak mogę to zrobić?

Test statystyczny : czy centralne twierdzenie graniczne ma zastosowanie w moim przypadku? Czy mogę pobrać środki odległości i użyć testu t-Studenta do porównania średnich próbek spełniających warunek ze średnimi próbek niespełniających warunku? W przeciwnym razie jaki test statystyczny byłby tutaj odpowiedni?

Wielkość próbki i liczba próbek : Rozumiem, że istnieją tutaj dwie zmienne, dla każdej z dwóch grup muszę pobrać n próbek o wielkości m i pobrać średnią z każdej próbki. Czy istnieje jakiś zasadniczy sposób wybrać n oraz m ? Czy powinny być tak duże, jak to możliwe? A może powinny być tak małe, jak to możliwe, o ile wykazują istotność statystyczną? Czy powinny być takie same dla każdej z dwóch grup? A może powinny być większe dla grupy 2, która zawiera znacznie więcej par wektorów?

Michau
źródło
1
Zwykle ludzie nie mają tyle szczęścia, że ​​mają określone granice swoich punktów danych - w przeciwnym razie granice są skomplikowane. To, wraz z korelacjami między odległościami (stworzonymi przez nierówność trójkąta), wyklucza opracowanie ładnego analitycznego wyrażenia dla rozkładu prób średnich odległości. Dlatego zazwyczaj szacują rozkłady próbkowania średnich odległości poprzez ponowne próbkowanie z danych.
whuber
@ whuber Nie jestem pewien, czy dobrze cię rozumiem, czy sugerujesz, żebym wziął n próbek z każdej z dwóch grup i użył testu t do porównania średnich z tych próbek? Zredagowałem swoje pytanie, mam nadzieję, że teraz jest bardziej zrozumiałe.
michau,

Odpowiedzi:

14

Pytanie „znacząco” różne zawsze, zawsze zakłada model statystyczny danych. Ta odpowiedź proponuje jeden z najbardziej ogólnych modeli, który jest zgodny z minimalną ilością informacji zawartych w pytaniu. Krótko mówiąc, będzie działać w wielu różnych przypadkach, ale nie zawsze może być najskuteczniejszym sposobem wykrycia różnicy.

Trzy aspekty danych naprawdę mają znaczenie: kształt przestrzeni zajmowanej przez punkty; rozkład punktów w tej przestrzeni; oraz wykres utworzony przez pary punktowe posiadające „warunek” - który nazywam grupą „leczenia”. Przez „wykres” rozumiem wzór punktów i wzajemnych powiązań sugerowany przez pary punktów w grupie leczenia. Na przykład dziesięć par punktowych („krawędzi”) wykresu może obejmować do 20 różnych punktów lub zaledwie pięć punktów. W pierwszym przypadku żadne dwie krawędzie nie mają wspólnego punktu, podczas gdy w drugim przypadku krawędzie składają się ze wszystkich możliwych par między pięcioma punktami.

Aby ustalić, czy średnia odległość między krawędziami w grupie leczenia jest „znacząca”, możemy rozważyć losowy proces, w którym wszystkie punktów są losowo permutowane przez permutację . To także permutuje krawędzie: krawędź zostaje zastąpiona przez . Hipotezą zerową jest to, że grupa leczenia krawędzi powstaje jako jedna z tych permutacji . Jeśli tak, jego średnia odległość powinna być porównywalna ze średnimi odległościami występującymi w tych permutacjach. Możemy dość łatwo oszacować rozkład tych losowych średnich odległości, próbkując kilka tysięcy wszystkich tych permutacji.σ ( v i , v j ) ( v σ ( i ) , v σ ( j ) ) 3000 ! 10 21024n=3000σ(vja,vjot)(vσ(ja),vσ(jot))3000!1021024

(Warto zauważyć, że to podejście będzie działać, z niewielkimi modyfikacjami, z dowolną odległością, a nawet dowolną ilością związaną z każdą możliwą parą punktów. Będzie również działało dla każdego podsumowania odległości, a nie tylko średniej).


Aby to zilustrować, oto dwie sytuacje obejmujące punktów i krawędzi w grupie leczenia. W górnym rzędzie pierwsze punkty na każdej krawędzi zostały losowo wybrane ze punktów, a następnie drugie punkty każdej krawędzi zostały niezależnie i losowo wybrane ze punktów różnych od ich pierwszego punktu. Wszyscy razem punktów są zaangażowane w te krawędzi.28 100 100 - 1 39 28n=10028100100-13928

W dolnym rzędzie osiem ze punktów zostało wybranych losowo. W krawędzie składa się ze wszystkich możliwych par nich.2810028

Rycina 1

Histogramy po prawej stronie przedstawiają rozkłady próbkowania dla losowych permutacji konfiguracji. Rzeczywiste średnie odległości dla danych są oznaczone pionowymi przerywanymi czerwonymi liniami. Oba sposoby są zgodne z rozkładami próbkowania: żadne nie leży daleko w prawo ani w lewo.dziesięć tysięcy

Rozkłady próbkowania różnią się: chociaż średnio średnie odległości są takie same, zmiana średniej odległości jest większa w drugim przypadku ze względu na graficzne zależności między krawędziami. Jest to jeden z powodów, dla których nie można zastosować prostej wersji Centralnego Twierdzenia Granicznego: obliczenie standardowego odchylenia tego rozkładu jest trudne.

n=30001500

Rysunek 2

56

Zasadniczo odsetek średnich odległości zarówno od symulacji, jak i grupy leczonej, które są równe lub większe niż średnia odległość w grupie leczonej, można przyjąć jako wartość p tego nieparametrycznego testu permutacyjnego.


To jest Rkod używany do tworzenia ilustracji.

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")
}
Whuber
źródło
Wielkie dzięki! Właśnie tego szukałem. Ale czy mógłbyś wyjaśnić, w jaki sposób należy obliczyć wartość p? Nie rozumiem sformułowania „proporcja średnich odległości zarówno od symulacji, jak i grupy leczenia, które są równe lub większe niż średnia odległość w grupie leczenia”. Mówisz o proporcji dwóch średnich odległości, a jedną z nich jest „średnia odległość od [...] grupy leczenia, która jest równa lub większa od średniej odległości w grupie leczenia”. Jestem zmieszany, to brzmi jak tautologia. Czy możesz napisać formułę lub kod R, aby był bardziej przejrzysty?
michau
W każdym razie okazuje się, że mój przypadek jest podobny do twojego drugiego przykładu, średnie odległości permutacji wynoszą około 22 przy standardowym odchyleniu około 0,3, a średnia grupy leczenia wynosi 12. Więc wygląda to na wyraźne wskazanie, że różnica jest istotna statystycznie. Jedyne, z czym się teraz zmagam, to oszacowanie wartości p. W rzeczywistości, nawet przy dość dużej próbce permutacji (10000), wszystkie środki bez wyjątku znajdują się w dość wąskim przedziale, powiedzmy [21, 23]. Czy mogę tego użyć do oszacowania wartości p?
michau
1
OK, przeczytałem już trochę o testach permutacyjnych Monte Carlo. Zgodnie z moim rozumieniem: jeśli średnie ze wszystkich 10000 permutacji, które wypróbowałem, są wyższe niż średnia grupy leczonej, mogę stwierdzić, że p <0,0001. Czy to takie proste?
michau
1
Tak, to takie proste! Na końcu dodałem kod, aby obliczyć i wyświetlić dwustronną wartość p (która jest prawdopodobnie odpowiednia dla twojej sytuacji). W przypadku jednostronnej wartości p użyj jednej mean(c(sim, stat) <= stat)lub mean(c(sim, stat) >= stat)odpowiednio.
whuber
Wspaniały! Sytuacja z testem jednostronnym jest teraz całkowicie jasna, ale nadal nie rozumiem testu dwustronnego, szczególnie mnożenia przez 2. Jeśli 10000 permutacji dało mi środki w zakresie [21, 23], to nie oznacza to, że zarówno 12, jak i 32 są poza przedziałem ufności 99,99%, co odpowiada p <0,0001? Czy nie powinienem po prostu liczyć średnich odległości, które są tak daleko statod środka rozkładu, w obu kierunkach? Coś jak p.value <- mean(abs(c(sim, stat)-mean(sim)) >= abs(stat-mean(sim))).
michau,