Вручную вычислить Колмогорова-Смирнова с двумя выборками, используя ECDF

#r #cdf

#r #cdf

Вопрос:

Я пытаюсь вручную вычислить статистику KS для двух случайных выборок. Насколько я понял, статистика KS D — это максимальное вертикальное отклонение между двумя CDF. Однако вручную вычислить различия между двумя CDF и запустить ks.тест из базы R дает разные результаты. Интересно, где ошибка.

 set.seed(123)
a <- rnorm(10000)
b <- rnorm(10000)

### Manual calculation 
# function for calculating manually the ecdf
decdf <- function(x, baseline, treatment)  ecdf(baseline)(x) - ecdf(treatment)(x)
#Difference between the two CDFs 
d <- curve(decdf(x,a,b), from=min(a,b), to=max(a,b))
# getting D 
ks <- max(abs(d$y))

#### R-Base calculation 

ks.test(a,b)
  

R-база D = 0,0109, в то время как ручной расчет равен 0,0088. Приветствуется любая помощь, объясняющая разницу.

Я прилагаю исходный код R-Base (немного очищенный)

 
n <- length(a)                                                                          
n.x <- as.double(n)
n.y <- length(b)
n <- n.x * n.y/(n.x   n.y)
w <- c(a, b)
z <- cumsum(ifelse(order(w) <= n.x, 1/n.x, -1/n.y))
STATISTIC <- max(abs(z))


  

Ответ №1:

По умолчанию curve функция вычисляется при делении на 100 пунктов между from и to . Ограничившись этими 100 точками, возможно, вы пропустите значение, для которого достигается максимальная разница.

Вместо этого оцените разницу во всех точках, где происходит скачок ecdf, и вы обязательно поймаете значение, для которого достигается максимальная разница.

 set.seed(123)
a <- rnorm(10000)
b <- rnorm(10000)
Fa <- ecdf(a)
Fb <- ecdf(b)

x <- c(a,b) # the points where Fa or Fb jump

max(abs(Fa(x) - Fb(x)))
# [1] 0.0109