Pregunta

Tengo un conjunto de datos con 60 filas y 3036 columnas.Ya he calculado la fila con la función de cuantiles rowQuantiles a partir de la matrixStats paquete.A partir de este tengo un vector columna [60,1].Ahora, quiero seleccionar de cada fila sólo los datos que es superior a la fila de los cuantiles.Si yo uso el que la función como la siguiente:

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

luego me suelto a las dimensiones de datos y obtener sólo una matriz en lugar de una matriz con las siguientes dimensiones [60,152].

Puede alguien me ayuda?

Gracias!

¿Fue útil?

Solución

Yo no creo que una rowQuantile función es necesaria.Solo tienes que elegir los valores más altos hasta un umbral de probabilidad:(editar nota (primera versión tenía incorrecta expresión de índice)

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

Y como siempre, porque R matrices columna orientada, es probable que desee utilizar t() en el resultado para obtener esta de nuevo en la fila de la orientación que usted espera.

A tu comentario:Fijo para que recoge los valores más altos en lugar de los valores más bajos:

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

Otros consejos

0.05 * 3036 = 151.8 pero seleccionando en cada fila los valores mayor que el 95% de los cuantiles no significa que usted tendrá sistemáticamente 152 valores.Si desea mantener sus objetos de dimensiones puede intentar sustituir deseado de valores con NA's.
Como el objeto no es enorme también se podría trabajar con el marco de datos de objetos y tener sus observaciones a lo largo de la dimensión de fila.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top