Pergunta

Eu tenho um conjunto de dados com 60 linhas e 3.036 colunas.Já calculei os quantis das linhas com a função rowQuantiles de matrixStats pacote.A partir disso obtive um vetor coluna [60,1].Agora, quero selecionar de cada linha apenas os dados que são superiores ao quantil da linha.Se eu usar a função which da seguinte forma:

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

então perco as dimensões dos dados e obtenho apenas uma matriz em vez de uma matriz com as seguintes dimensões [60.152].

Alguém pode me ajudar?

Obrigado!

Foi útil?

Solução

Não acho que uma função rowQuantile seja necessária.Basta escolher os valores mais altos até um limite de probabilidade:(nota de edição (a primeira versão tinha expressão de índice incorreta)

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

E como sempre, como as matrizes R são orientadas a colunas, você provavelmente desejará usar t() no resultado para voltar à orientação de linha esperada.

Para o seu comentário:Corrigido para que ele pegue os valores mais altos em vez dos valores mais baixos:

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

Outras dicas

0.05 * 3036 = 151.8 mas selecionar em cada linha os valores maiores que o quantil de 95% não significa que você terá sistematicamente 152 valores.Se você quiser manter as dimensões do seu objeto, você pode tentar substituir valores indesejados por NA's.
Como seu objeto não é enorme, você também pode trabalhar com objetos de quadro de dados e fazer suas observações ao longo da dimensão da linha.

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top