Установить вес для ewcdf {spatstat} [R]

Я хочу сравнить эталонное распределение d_1 с выборкой d_2, нарисованной пропорционально размеру w_1 с использованием расстояния Колмогорова – Смирнова.

Учитывая, что d_2 является взвешенным, я рассматривал возможность учета этого с помощью взвешенной эмпирической кумулятивной функции распределения в R (с использованием ewcdf {spatstat}).

Пример ниже показывает, что я, вероятно, неправильно указал веса, потому что когда lenght(d_1) == lenght(d_2) Колмогоров – Смирнов не дает значение 0.

Может кто-то помочь мне с этим? Для наглядности см. Воспроизводимый пример ниже.

#loop for testing sample sizes 1:length(d_1)
d_stat <- data.frame(1:1000, rep(NA, 1000))
names(d_stat) <- c("sample_size", "ks_distance")

for (i in 1:1000) {

#reference distribution
d_1 <- rpois(1000, 500)
w_1 <- d_1/sum(d_1)
m_1 <- data.frame(d_1, w_1)

#sample from the reference distribution
m_2 <-m_1[(sample(nrow(m_1), size=i, prob=w_1, replace=F)),]
d_2 <- m_2$d_1
w_2 <- m_2$w_1

#ewcdf for the reference distribution and the sample
f_d_1 <- ewcdf(d_1)
f_d_2 <- ewcdf(d_2, 1/w_2, normalise=F, adjust=1/length(d_2))

#kolmogorov-smirnov distance
d_stat[i,2] <- max(abs(f_d_1(d_2) - f_d_2(d_2)))
}

d_stat[1000,2]

person Gion Mors    schedule 02.09.2019    source источник


Ответы (2)


Ваш код генерирует некоторые данные d1 и связанные с ними числовые веса w1. Затем эти данные рассматриваются как эталонная совокупность. Код берет случайную выборку d2 из этой совокупности значений d1 с вероятностями выборки, пропорциональными связанным весам w1. На основе выборки вы вычисляете взвешенную эмпирическую функцию распределения f_d_2 выборочных значений d2 с весами, обратно пропорциональными исходным вероятностям выборки. Эта функция f_d_2 является правильной оценкой исходной функции распределения населения по принципу Хорвица-Томпсона. Но это не точно первоначального распределения населения, потому что это выборка. Статистика критерия Колмогорова-Смирнова не должна быть нулевой; это должно быть небольшое значение.

person Adrian Baddeley    schedule 04.09.2019
comment
Спасибо за объяснение, Адриан. Я просто внес небольшое изменение в код, чтобы скорректировать взвешенную эмпирическую функцию распределения для относительного размера выборки. Связанный с этим вопрос, который может быть интересен другим людям, интересующимся тестом Колмогорова-Смирнова - как бы вы вычислили p-значение для теста? - person Gion Mors; 05.09.2019

Я не совсем понимаю, что вы здесь пытаетесь сделать. Почему вы ожидаете, что ewcdf(d_1) и ewcdf(d_2, w_2, normalise=F) дадут одинаковый результат для i=1000? Первый - это обычный ecdf, который перескакивает на уникальные значения входного вектора с размером скачка, определяемым количеством повторений значения (больше связей - большие скачки). Второй прыгает с теми же уникальными значениями с высотой, определяемой суммой предоставленных вами весов.

То, что дает идентичные результаты, - это ewcdf(d_2, w_2) и ewcdf(d_1, w_1), но это не то же самое, что ewcdf(d_1). Чтобы понять, почему последние две разные, я бы предложил гораздо меньший пример ручной работы с парой завязок:

library(spatstat)
#> Loading required package: spatstat.data
#> Loading required package: nlme
#> Loading required package: rpart
#> 
#> spatstat 1.60-1.006       (nickname: 'See Above') 
#> For an introduction to spatstat, type 'beginner'
x <- c(1,2,3,3,4)
e <- ewcdf(x)

Это обычный ecdf, который прыгает со значением 1/5 при x = 1, 1/5 при x = 2, 2 * 1/5 при x = 3 и 1/5 при x = 4:

plot(e)

Теперь вы определяете веса как:

w <- x/sum(x)
w
#> [1] 0.07692308 0.15384615 0.23076923 0.23076923 0.30769231

Таким образом, ewcdf будет прыгать со значением 1/13 при x = 1, 2/13 при x = 2, 2 * 3/13 при x = 3 и 4/13 при x = 4 (с обычным ecdf, наложенным красным):

plot(ewcdf(x, w, normalise = FALSE), axes = FALSE)
axis(1)
axis(2, at = (0:13)/13, labels = c("0", paste(1:13, 13, sep = "/")), las = 2 )
abline(h = cumsum(c(1,2,6,4)/13), lty = 3, col = "gray")
plot(e, add = TRUE, col = "red")

person Ege Rubak    schedule 03.09.2019
comment
Спасибо за подробное объяснение. Похоже, что я совершенно неправильно понимаю концепцию весов в ewcdf. Здесь я пытаюсь проверить, насколько хорошо выборка, составленная пропорционально размеру, может приблизительно соответствовать распределению всего населения. Обычно, если я хочу сравнить среднее значение, я сравниваю среднее значение генеральной совокупности со средневзвешенным значением выборки. Не похоже, что я могу сделать что-то подобное с ecdf. - person Gion Mors; 03.09.2019
comment
На всякий случай, моя идея состоит в том, чтобы сравнить истинный ecdf на полном наборе данных с взвешенным ecdf на выборочном наборе данных, чтобы увидеть, удается ли стратегии выборки получить истинное распределение. Я отредактировал свой вопрос: веса отобранных единиц, конечно, обратны их вероятности быть выбранными. - person Gion Mors; 03.09.2019
comment
Не могли бы вы быть более конкретными? Если у вас популяция {1,2,3,3,4}, тогда вы хотите взять образец из {1,2,3,4} с помощью пробоотборника. 1/5, 1/5, 2/5, 1/5? - person Ege Rubak; 03.09.2019
comment
Спасибо за терпеливость. При генеральной совокупности {1,2,3,3,4} я хочу взять выборку с вероятностью {1 / 13,2 / 13,3 / 13,3 / 13,4 / 13}, другими словами , вероятность выборки из {1,2,3,4} будет {1 / 13,2 / 13,6 / 13,4 / 13}. - person Gion Mors; 03.09.2019
comment
Значит, числа имеют числовое значение, и выборка из {11,12,13,13,14} будет принципиально другой? Я действительно не уверен, куда идти дальше, но похоже, что сравнение с ecdf неверно, поскольку он не заботится о фактическом значении чисел при вычислении размеров прыжка. К чему конкретно относятся цифры? - person Ege Rubak; 03.09.2019
comment
Значения рассчитаны на численность населения на 100x100 м. У меня есть статистическое распределение истинной совокупности, и я хочу знать, учитывая различные размеры выборки, насколько хорошо эти выборки могут определить распределение истинной совокупности. Я не хочу использовать среднее значение дисперсии для сравнения двух, потому что истинное распределение далеко от нормального. Я думал, что использование расстояния Кормогорова-Смирнова могло бы быть хорошей идеей, но мне не удается взвесить свои выборки, чтобы учесть неслучайность. Это то, чего я надеялся достичь с помощью файла ewcdf. - person Gion Mors; 04.09.2019