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)
}
Другие вопросы по тегам