reldist::wtd.iqr дает результат, отличный от IQR для одинаковых весов
Я получаю неожиданные результаты, используя wtd.iqr
функция от reldist
пакет (версия 1.6.6) для расчета взвешенного межквартильного диапазона (в отличие от невзвешенного межквартильного диапазона, возвращаемого IQR
из ванили R stats
пакет). Чтобы исследовать проблему, я попытался сравнить вывод reldist::wtd.iqr
на выход IQR
,
К моему удивлению, я обнаружил, что IQR
а также reldist::wtd.iqr
возвращать совершенно разные выходные значения для одинаковых входных значений, даже если входные значения имеют одинаковый вес (т. е. когда весовые коэффициенты не должны иметь значения).
> x <- rnorm(10000)
> wt <- rep(1, length(x))
> paste(c('IQR:', IQR(x), 'wtd.iqr:', reldist::wtd.iqr(x, weight = wt)))
[1] "IQR:" "1.34879539936654" "wtd.iqr:" "0.675866062623211"
>
В приведенном выше тесте IQR
кажется, всегда возвращать выходное значение примерно вдвое больше, чем wtd.iqr
возвращает для тех же входных значений.
С входными значениями, которые не соответствуют указанному выше распределению, это соотношение не обязательно сохраняется: фактически, с реальными данными я иногда получаю отрицательные значения от wtd.iqr
что я бы предположил, что это невозможно, но никогда не находил, чтобы это случилось с IQR
,
На самом деле, мне кажется, что wtd.iqr
может фактически возвращать не межквартильный диапазон, а один из квартилей. Но если здесь есть ошибка, она не может быть такой очевидной - не так ли?
Предположительно две функции по-разному определяют концепцию межквартильного диапазона, но в документации нет никакой подсказки. Документация для IQR
утверждает, что он "вычисляет межквартильный диапазон значений х", в то время как документация для wtd.iqr
утверждает, что он "возвращает эмпирический межквартильный диапазон из взвешенной выборки".
1 ответ
Нет, вы не задумывались. Это на самом деле ошибка. Я прошел через определение функции здесь: https://github.com/cran/reldist/blob/master/R/wtd.quantile.R. Это использует Hmisc
пакет-х wtd.quantile
функционировать внутри, а затем вычитать его с вероятностями.25 и.75. Но два вызова выполняются в отдельных строках, и, следовательно, R рассматривает его как разные вызовы, а не вычисляет выражение a-b
, это возвращает -b
которая является последней строкой. Следовательно, -ve значение 25% возвращается.
Если вы просто попробуйте это:
quantile(x = x,c(0,0.25,0.5,0.75,1))
# 0% 25% 50% 75%
#-3.903016136384592105202 -0.677263029412919159711 -0.012691140400805673433 0.636730086813689699632
# 100%
# 3.745404178709976328321
reldist::wtd.iqr(x = x,weight = wt)
#25%
#0.67726302941291915971
Возвращается отрицание 25% иль. Последняя строка возвращается в вызове функции R.
Это определение функции:
wtd.iqr <- function(x, na.rm = FALSE, weight=FALSE) {
wtd.quantile(x, q=0.75, na.rm = na.rm, weight=weight)
- wtd.quantile(x, q=0.25, na.rm = na.rm, weight=weight)
}
Так должно быть:
wtd.iqr <- function(x, na.rm = FALSE, weight=FALSE) {
wtd.quantile(x, q=0.75, na.rm = na.rm, weight=weight) - wtd.quantile(x, q=0.25, na.rm = na.rm, weight=weight)
}