Question

J'ai un ensemble de données avec 60 lignes et 3036 colonnes.J'ai déjà calculé les quantiles de lignes avec la fonction rowQuantiles du matrixStats emballer.De là, j'ai obtenu un vecteur colonne [60,1].Maintenant, je souhaite sélectionner dans chaque ligne uniquement les données supérieures au quantile de la ligne.Si j'utilise la fonction which comme suit :

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

puis je perds les dimensions des données et n'obtiens qu'un tableau au lieu d'une matrice avec les dimensions suivantes [60,152].

Quelqu'un peut-il m'aider ?

Merci!

Était-ce utile?

La solution

Je ne pense pas qu'une fonction rowQuantile soit nécessaire.Relevez simplement les valeurs les plus élevées jusqu'à un seuil de probabilité :(modifier la note (la première version avait une expression d'index incorrecte)

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

Et comme toujours, comme les matrices R sont orientées colonnes, vous souhaiterez probablement utiliser t() sur le résultat pour le remettre dans l'orientation de ligne que vous attendez.

A votre commentaire :Correction du problème pour qu'il récupère les valeurs les plus élevées plutôt que les valeurs les plus basses :

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

Autres conseils

0.05 * 3036 = 151.8 mais sélectionner dans chaque ligne les valeurs supérieures au quantile 95% ne signifie pas que vous aurez systématiquement 152 valeurs.Si vous souhaitez conserver les dimensions de votre objet, vous pouvez essayer de remplacer les valeurs indésirables par NA's.
Comme votre objet n'est pas énorme, vous pouvez également travailler avec des objets de bloc de données et avoir vos observations le long de la dimension de ligne.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top