Разница между ntile и cut, а затем функцией квантиля() в R

Я нашел два потока по этой теме для вычисления децилей в R. Однако оба метода, т. е. dplyr::ntile и quantile() выход другой выход. На самом деле,dplyr::ntile() не удается вывести правильные децили.

метод 1: Использование ntile () От R: разделение набора данных на квартили / децили. Каков правильный метод? нить, мы могли бы использовать ntile().

вот мой код:

vector<-c(0.0242034679584454, 0.0240411606258083, 0.00519255930109344, 
  0.00948031338483081, 0.000549450549450549, 0.085972850678733, 
  0.00231687756193192, NA, 0.1131625967838, 0.00539244534707915, 
  0.0604885614579294, 0.0352030947775629, 0.00935626135385923, 
  0.401201201201201, 0.0208212839791787, NA, 0.0462887301644538, 
  0.0224952741020794, NA, NA, 0.000984952654008562)

ntile(vector,10)

выход:

ntile(vector,10)
5  5  2  3  1  7  1 NA  8  2  7  6  3  8  4 NA  6  4 NA NA  1

если мы анализируем это, мы видим, что нет 10-го квантиля!

Метод 2: Использование квантиля () Теперь давайте используем метод from как быстро сформировать группы(квартили, децили и т. д.), заказав столбец (ы) в фрейме данных нить.

вот мой код:

as.numeric(cut(vector, breaks=quantile(vector, probs=seq(0,1, length  = 11), na.rm=TRUE),include.lowest=TRUE))

выход:

 7  6  2  4  1  9  2 NA 10  3  9  7  4 10  5 NA  8  5 NA NA  1

как мы видим, результаты совершенно разные. Я что-то упускаю? Я был бы признателен за любое мысли.

это ошибка в

1 ответов


на dplyr::ntile NA всегда последний (самый высокий ранг), и именно поэтому вы не видите 10-й дециль в этом случае. Если вы хотите децили не учитывать NAs, Вы можете определить функцию, как здесь который я использую следующий:

ntile_na <- function(x,n)
{
  notna <- !is.na(x)
  out <- rep(NA_real_,length(x))
  out[notna] <- ntile(x[notna],n)
  return(out)
}

ntile_na(vector, 10)
# [1]  6  6  2  4  1  9  2 NA  9  3  8  7  3 10  5 NA  8  5 NA NA  1

и quantile имеет 9 способов вычисления квантилей, вы используете значение по умолчанию, которое является числом 7 (Вы можете проверить ?stats::quantile по-разному typeS и здесь для обсуждения вопроса о них).

если вы попытаетесь

as.numeric(cut(vector, 
               breaks = quantile(vector, 
                                 probs = seq(0, 1, length = 11), 
                                 na.rm = TRUE,
                                 type = 2),
               include.lowest = TRUE))
# [1]  6  6  2  4  1  9  2 NA  9  3  8  7  3 10  5 NA  8  5 NA NA  1

у вас тот же результат, что и при использовании ntile.

вкратце: это не ошибка, это просто разные способы их реализации.