質問

私は60行と3036列のデータ・セットを持っています。rowQuantilesパッケージから関数matrixStatsを使用してrow分位数をすでに計算しています。これから私は列ベクトルを手に入れました[60,1]。さて、各行から、行分位数よりも高いデータのみから選択します。どの関数を以下のように使用している場合:

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

その後、データの寸法を失い、次の寸法のマトリックスの代わりに配列のみを取得します[60,152]。

誰かが私を助けることができますか?

ありがとうございました!

役に立ちましたか?

解決

漕ぎ式関数が必要なことは考えられていません。最高値を確率のしきい値まで選択してください。(編集メモ(最初のバージョンが正しくないindex expressionが正しくありません)

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

と常にR行列は列指向であるため、結果にt()を使用してこれを期待する行の向きに戻すことになります。

あなたのコメントに:最低値ではなく最高値をピックアップするように修正しました:

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

他のヒント

0.05 * 3036 = 151.8が各行で選択すると、95%の分位数よりも大きい値は、体系的に152の値を持つという意味ではありません。オブジェクトの寸法を維持したい場合は、望ましくない値をNAに置き換えることができます。
あなたのオブジェクトが巨大ではないので、データフレームオブジェクトを扱い、行の寸法に沿ってあなたの観察を持つこともできます。

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
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top