R sélectionner les données de chaque ligne en fonction des quantiles de ligne
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!
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