Нахождение n-го процентиля в матрице с условиями - PullRequest
0 голосов
/ 01 октября 2019

У меня есть матрица размером 100 строк x 10 столбцов:

mat1 = matrix(1:1000, nrow = 100, ncol = 10)

Я хочу найти n-й процентиль каждого столбца, используя colQuantiles, где n-й процентиль равен значению вероятности, содержащемуся в Probs,за исключением случаев, когда любое из значений в Probs> 0.99 - в этом случае я хочу применить значение 0.99.

Probs = c(0.99, 0.95, 1, 1, 0.96, 0.92, 1, 0.98, 0.99, 1)

Я пробовал следующее:

Res = ifelse(Probs > 0.99, colQuantiles(mat1, Probs = c(0.99)), colQuantiles(mat1, probs = Probs))

Но это просто возвращает часть if вышеупомянутого оператора if true для всех десяти столбцов mat1, возможно потому, что хотя бы один иззначения в Probs> 0,99. Как я могу адаптировать вышеупомянутое, чтобы оно обрабатывало каждый столбец mat1 индивидуально согласно вероятностям в Пробах?

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

Мы не можем передать разные вероятности для разных столбцов в colQuantiles, но мы можем получить все вероятности для каждого столбца, используя colQuantiles

temp <- matrixStats::colQuantiles(mat1, probs = pmin(Probs, 0.99))

, а затем извлечь диагональ матрицы, чтобы получить требуемуювероятность в каждом столбце.

diag(temp)
#[1]  99.01 195.05 299.01 399.01 496.04 592.08 699.01 798.02 899.01 999.01
3 голосов
/ 01 октября 2019

Вы можете использовать mapply следующим образом:

Probs[Probs > 0.99] <- 0.99
unname(mapply(function(x, p) quantile(x, p), 
    split(mat1, rep(1:ncol(mat1), each = nrow(mat1))),
    Probs))

output:

[1]  99.01 195.05 299.01 399.01 496.04 592.08 699.01 798.02 899.01 999.01

Она разбивает матрицу на набор векторов столбцов (см. Как преобразоватьматрица к списку векторов-столбцов в R? ), а затем найдите n-й процентиль для каждого столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...