Domanda

Ho un set di dati con 60 righe e 3036 colonne.Ho già calcolato i quantili di riga con la funzione rowQuantiles dal pacchetto matrixStats.Da questo ho ricevuto un vettore di colonna [60,1].Ora, voglio selezionare da ogni riga solo i dati più alti del quantilio di riga.Se utilizzo la funzione di seguito:

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

Quindi perdo le dimensioni dei dati e ottengo solo un array invece di una matrice con le seguenti dimensioni [60,152].

Qualcuno può aiutarmi?

Grazie!

È stato utile?

Soluzione

Non penso che sia necessaria una funzione rowquAntile.Basta scegliere i valori più alti fino a una soglia di probabilità: (Modifica nota (la prima versione ha avuto un'espressione indice errata)

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

E come sempre, poiché le matrici R sono orientate alla colonna, probabilmente vorrai utilizzare t() sul risultato per riportarlo nell'orientamento della riga che ti aspetti.

al tuo commento: risoltolo in modo che raccoglie i valori più alti anziché i valori più bassi:

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

Altri suggerimenti

0.05 * 3036 = 151.8 ma selezionando in ogni riga i valori superiori al 95% quantili non significa che avrai sistematicamente 152 valori.Se si desidera mantenere le dimensioni dell'oggetto è possibile provare a sostituire i valori indesiderati con NA's.
Poiché il tuo oggetto non è enorme, potresti anche lavorare con gli oggetti del frame dati e avere le tue osservazioni lungo la dimensione della riga.

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top