Entendendo o teste de Kolmogorov-Smirnov em R

17

Estou tentando entender a saída da função de teste Kolmogorov-Smirnov (duas amostras, duas faces). Aqui está um teste simples.

x <- c(1,2,2,3,3,3,3,4,5,6)
y <- c(2,3,4,5,5,6,6,6,6,7)
z <- c(12,13,14,15,15,16,16,16,16,17)

ks.test(x,y)

#   Two-sample Kolmogorov-Smirnov test
#
#data:  x and y
#D = 0.5, p-value = 0.1641
#alternative hypothesis: two-sided
#
#Warning message:
#In ks.test(x, y) : cannot compute exact p-value with ties

ks.test(x,z)

#Two-sample Kolmogorov-Smirnov test

#data:  x and z
#D = 1, p-value = 9.08e-05
#alternative hypothesis: two-sided
#
#Warning message:
#In ks.test(x, z) : cannot compute exact p-value with ties


ks.test(x,x)

#Two-sample Kolmogorov-Smirnov test

#data:  x and x
#D = 0, p-value = 1
#alternative hypothesis: two-sided
#
#Warning message:
#In ks.test(x, x) : cannot compute exact p-value with ties

Existem algumas coisas que não entendo aqui.

  1. Com a ajuda , parece que o valor-p se refere à hipótese var1=var2. No entanto, aqui isso significaria que o teste diz ( p<0.05):

    uma. Não posso dizer isso X = Y;

    b. Pode dizer isso X = Z;

    c. Não posso dizer isso X = X(!)

Além de parecer que x é diferente de si mesmo (!), Também é bastante estranho para mim que x=z, como as duas distribuições têm zero suporte sobreposto. Como isso é possível?

  1. De acordo com a definição do teste, Ddeve ser a diferença máxima entre as duas distribuições de probabilidade, mas, por exemplo no caso (x,y)deve ser D = Max|P(x)-P(y)| = 4(no caso em que P(x), P(y)não são normalizadas) ou D=0.3 (se eles são normalizados). Por que D é diferente disso?

  2. Intencionalmente, fiz um exemplo com muitos vínculos , pois os dados com os quais estou trabalhando têm muitos valores idênticos. Por que isso confunde o teste? Eu pensei que calculava uma distribuição de probabilidade que não deveria ser afetada por valores repetidos. Qualquer ideia?

Nonancourt
fonte

Respostas:

21

O teste KS tem como premissa testar a "mesmice" de duas amostras independentes de uma distribuição contínua (como a página de ajuda indica). Se for esse o caso, a probabilidade de laços deve ser surpreendentemente pequena (também declarada). A estatística do teste é a distância máxima entre os ECDFs das duas amostras. O valor p é a probabilidade de ver uma estatística de teste tão alta ou mais alta que a observada se as duas amostras foram retiradas da mesma distribuição. (Não é a "probabilidade de que var1 = var2". Além disso, 1-p_value NÃO é a probabilidade também.) Valores altos de p dizem que você não podereivindicar apoio estatístico para uma diferença, mas baixos valores de p não são evidências de similaridade. Valores p baixos podem ocorrer com tamanhos de amostra baixos (como o exemplo fornece) ou com presença de diferenças interessantes, mas pequenas, por exemplo, distúrbios oscilatórios sobrepostos. Se você estiver trabalhando com situações com grande número de vínculos, isso sugere que você pode precisar usar um teste que melhor se adapte à sua situação de dados.

Minha explicação de por que os laços eram uma violação de suposições não era uma alegação de que os laços invalidassem os resultados. As propriedades estatísticas do teste KS na prática são relativamente resistentes ou robustas ao fracasso dessa suposição. O principal problema com o teste KS, como vejo, é que ele é excessivamente geral e, como conseqüência, tem pouca capacidade de identificar diferenças significativas de natureza interessante. O teste KS é um teste muito geral e possui poder bastante baixo para hipóteses mais específicas.

Por outro lado, também vejo o teste KS (ou o "ainda mais poderoso" teste de Anderson Darling ou Lillefors (sp?)) Usado para testar a "normalidade" em situações em que esse teste é completamente injustificado, como teste para a normalidade das variáveis ​​sendo usadas como preditores em um modelo de regressão antes do ajuste. Pode ser legitimamente querem estar testando a normalidade dos resíduos que é o que é assumido na teoria de modelagem. Mesmo assim, desvios modestos da normalidade dos resíduos geralmente não desafiam a validade dos resultados. As pessoas seriam melhores em usar métodos robustos para verificar o impacto importante da "não normalidade" nas conclusões sobre a significância estatística.

Talvez você deva consultar um estatístico local? Isso pode ajudá-lo a definir a questão estatística um pouco mais precisamente e, portanto, ter uma chance maior de identificar uma diferença, se houver alguma. Isso seria evitar um "erro do tipo II": não apoiar uma conclusão da diferença quando essa diferença está presente.

DWin
fonte
1
Muito agradável. Isso pode ser esclarecedor: Kolmogorov-Smirnov com dados discretos: Qual é o uso adequado de dgof :: ks.test em R?
101316 Stephan Kolassa
Testei os mesmos exemplos com dgof::ks.test(x,y,simulate.p.value=TRUE, B=1000)e Matching::ks.boot(x,y, nboots=1000)( sekhon.berkeley.edu/matching/ks.boot.html ). D e o valor p calculado são absolutamente idênticos em ambos os casos. Isso me faz pensar que talvez o KS não seja tão ruim, mesmo quando se tem vários laços e o método não está garantido para funcionar? A razão pela qual eu gosto do KS é que isso não é paramétrico, ou seja, eu não preciso assumir uma distribuição para as amostras.
Nonancourt
No entanto, ainda não consigo entender os valores de D. Pensei que poderia ser um prefator como sqrt (m * n / (m + n)) como aqui , mas isso faria D(x,y) = sqrt(100/20)*0.3=0.67, que ainda é diferente.
Nonancourt
3

Para calcular o D (do ks.testcódigo):

ks.test(x,y)

    Two-sample Kolmogorov-Smirnov test

data:  x and y
D = 0.5, p-value = 0.1641
alternative hypothesis: two-sided

alternative <- "two.sided"
x <- x[!is.na(x)]
n <- length(x)
  y <- y[!is.na(y)]
  n.x <- as.double(n)
  n.y <- length(y)
  w <- c(x, y)
  z <- cumsum(ifelse(order(w) <= n.x, 1/n.x, -1/n.y))
  z <- z[c(which(diff(sort(w)) != 0), n.x + n.y)] #exclude ties
  STATISTIC <- switch(alternative, two.sided = max(abs(z)), 
                      greater = max(z), less = -min(z))
  STATISTIC

[1] 0.5
Robert
fonte