Я считаю, что это недостаток в пакете, и я объясню почему.
Во-первых, weighted.median
на самом деле просто вызывает weighted.quantile
с вектором probs
, установленным в 0.5
. Но если вы позвоните weighted.quantile
со своими данными, вы получите очень странные результаты:
weighted.quantile(x, w)
#> 0% 25% 50% 75% 100%
#> 10.00 10.00 10.50 11.25 12.00
Это неправильно.
Если вы посмотрите на тело этой функции, используя body(weighted.quantile)
, и следуйте логике c до конца, кажется, есть проблема с тем, как веса нормализуются в строке 10 в переменную с именем Fx
. Для правильной работы нормализованные веса должны иметь вектор такой же длины, что и x
, но начиная с 0 и заканчивая 1, с интервалом между ними, пропорциональным весам.
Но если вы посмотрите как это фактически вычисляется:
body(weighted.quantile)[[10]]
#> Fx <- cumsum(w)/sum(w)
Вы можете видеть, что он не начинается с 0. В вашем случае, первый элемент будет 0.3333.
Итак, чтобы показать, что это случай, давайте напишем над этой строкой с правильным выражением. (Сначала нам нужно разблокировать привязку, чтобы получить доступ к функции)
unlockBinding("weighted.quantile", asNamespace("spatstat"))
body(weighted.quantile)[[10]] <- substitute(Fx <- (cumsum(w) - min(w))/(sum(w) - min(w)))
Теперь мы получаем правильный результат для взвешенных квантилей (включая правильную медиану)
weighted.quantile(x, w)
#> 0% 25% 50% 75% 100%
#> 10.0 10.5 11.0 11.5 12.0