R выберите данные каждой строки на основе квантилей строк

StackOverflow https://stackoverflow.com//questions/20052195

  •  26-12-2019
  •  | 
  •  

Вопрос

У меня есть набор данных с 60 строками и 3036 столбцами.Я уже вычислил квантили строк с помощью функции rowQuantiles из matrixStats посылка.Из этого я получил вектор-столбец [60,1].Теперь я хочу выбрать из каждой строки только те данные, которые выше квантиля строки.Если я использую функцию which следующим образом:

datset_qu95 = which(dataset > rowQuantiles(dataset, probs=c(0.95))

затем я теряю размеры данных и получаю только массив вместо матрицы со следующими размерами [60,152].

Кто-нибудь может мне помочь?

Спасибо!

Это было полезно?

Решение

Я не думаю, что функция rowQuantile необходима.Просто выберите самые высокие значения вплоть до порога вероятности:(примечание к редактированию (в первой версии было неправильное выражение индекса)

> apply( dat, 1, function(x) x[order(x)][1:( (1-0.95)*ncol(dat))])
    obs1     obs2     obs3 
 11.5379 856.3470 136.8860 

И, как всегда, поскольку матрицы R ориентированы на столбцы, вы, вероятно, захотите использовать t() на результат, чтобы вернуть это в ту ориентацию строки, которую вы ожидаете.

К вашему комментарию:Исправил это, чтобы он получал самые высокие значения, а не самые низкие:

 apply( dat, 1, function(x)
                  x[order(x, decreasing=TRUE)][1:( (1-0.95)*ncol(dat))])

Другие советы

0.05 * 3036 = 151.8 но выбор в каждой строке значений, превышающих 95% квантиль, не означает, что у вас будет систематически 152 значения.Если вы хотите сохранить размеры вашего объекта, вы можете попытаться заменить нежелательные значения на NA's.
Поскольку ваш объект невелик, вы также можете работать с объектами фрейма данных и вести свои наблюдения вдоль измерения строки.

library(matrixStats)

# To extract your values...
myfun <- function(k, q){x[k, x[k,] > q]}
x <- matrix(sample(1:100, 60*3036, replace=TRUE), ncol=3036)
xx <- mapply(myfun, seq(along=x[,1]), rowQuantiles(x, probs=.95))
# xx is a list, xx[[1]] contains the values of x[1,] > quantile(x[1, ], .95)

# The number of selected values depends on their distribution - with NORM should be stable
x11() ; par(mfrow=c(2,1))
hist(sample(1:100, 60*3036, replace=TRUE)) # UNIF DISTRIB
n.val <- sapply(xx, length)
hist(n.val, xlab="n.val > q_95%")
abline(v=152, col="red", lwd=5)

# Assuming you want the same number of value for each row
n <- min(n.val)
myfun <- function(x){sample(x, n)} # Representative sample - Ordering is possible but introduce bias. Depends on your goals
xx <- t(sapply(xx, myfun))
dim(xx) # 60 n
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top