Проблема с квантилем типа 2 - PullRequest
1 голос
/ 23 апреля 2020

Я не понимаю следующее поведение с quantile. При type=2 он должен усредняться по разрывам, но это не всегда происходит. Если я создаю список из 100 чисел и смотрю на процентили, то не должен ли я взять среднее значение для каждого процентиля? Такое поведение происходит для некоторых, но не для всех (то есть 7-й процентиль).

quantile(seq(1, 100, 1), 0.05, type=2)
# 5%
# 5.5 

quantile(seq(1, 100, 1), 0.06, type=2)
# 6%
# 6.5 

quantile(seq(1, 100, 1), 0.07, type=2)
# 7%
# 8 

quantile(seq(1, 100, 1), 0.08, type=2)
# 8%
# 8.5 

Это связано с проблемами с плавающей запятой?

100*0.06 == 6
#TRUE

100*0.07 == 7 
#FALSE

sprintf("%.20f", 100*0.07)
#"7.00000000000000088818"

1 Ответ

2 голосов
/ 23 апреля 2020

Насколько я могу судить, это относится к плавающим точкам, так как 0,07 не совсем точно представляется с плавающими точками.

p <- seq(0, 0.1, by = 0.001)
q <- quantile(seq(1, 100, 1), p, type=2)
plot(p, q, type = "b")
abline(v = 0.07, col = "grey")

enter image description here

Если вы рассматриваете квантиль (тип 2) как функцию от p, вы никогда не будете оценивать функцию точно в 0,07, отсюда ваши результаты. Попробуйте, например, уменьшить by в приведенном выше. В этом смысле функция возвращается точно так, как ожидалось. На практике с непрерывными данными я не могу себе представить, что это будет иметь какое-либо значение (но я знаю, что это плохой аргумент).

...