簡體   English   中英

從矩陣列表創建X%概率矩陣

[英]create a X % probability matrix from list of matrices

我有一個矩陣列表(數十萬個)。 我想創建一個單元格對應於例如95%的單個矩陣。 我的意思是:如果在95%的矩陣中,例如cell mat[1,2]為正(即> 0),則其得分為1;如果例如cell mat[2,1]為負(即<0 )在95%的矩陣中得分為-1。 如果它們低於此閾值,則它們的得分為0。

#Dummy data
listX <- list()
for(i in 1:10){listX[[i]]<-matrix(rnorm(n = 25, mean = 0.5, sd = 1),5,5)}
listX2 <- listX
for(i in 1:10) { listX2[[i]] <- ifelse(listX[[i]] >0, 1, -1) }

為了獲得虛擬數據,可以將95%更改為60%,以便保留在10個矩陣中的6個矩陣中保持其符號的單元格,並將其計為1或-1,其余記為0。

我一直堅持下去,因此無法提供更多代碼。

我會做:

listX <- list()
set.seed(20)
# I set seed for reproducability, and changed your mean so you could see the negatives
for(i in 1:10){listX[[i]]<-matrix(rnorm(n = 25, mean = 0, sd = 1),5,5)}

threshold <- 0.7
(Reduce('+',lapply(listX,function(x){x > 0}))/length(listX) >= threshold) - (Reduce('+',lapply(listX,function(x){x < 0}))/length(listX) >= threshold)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0   -1    1
[2,]   -1    1   -1   -1    1
[3,]    0    0    0    1    1
[4,]    0    1    0    0    0
[5,]    0    0    0    0    0

這基本上檢查了兩個條件,並將兩個檢查加在一起。 分解條件之一(Reduce('+',lapply(listX,function(x){x > 0}))/length(listX) > threshold)

lapply(listX,function(x){x > 0})循環遍歷每個矩陣,並對每個大於零的值將其轉換為true / false矩陣。

Reduce('+',lapply(listX,function(x){x > 0}))/length(listX)然后將它們全部加在一起( Reduce ),然后除以觀察次數。 如果比例大於閾值,則將該值設置為1,否則將其設置為零。

然后,我們減去x < 0的相同矩陣作為測試,在每種情況下,如果有足夠的子值為負,則得出-1

您可以將列表更改為數組,然后對維度取平均值。

arr <- simplify2array(listX)
grzero = rowMeans(arr > 0, dims = 2) 
lezero = rowMeans(arr < 0, dims = 2)  

prop = 0.6

1* (grzero >= prop) + -1* (lezero >= prop)

測試用例顯示到目前為止,哪些答案有效! (編輯)

在下面,您將找到我的原始答案。 最終,在涉及隨機種子數據的測試用例上,其結果可與其他答案相比。 為了進行三重檢查,我創建了一個帶有已知答案的小型測試數據集。 事實證明,只有@Chris的答案現在才通過(盡管如注釋中所示,如果在此示例中使用>= ,則@ user20650應該可以)。 這是萬一其他人想要使用它的情況:

listX <- list(
  matrix(c(1,0,-1,1), nrow = 2),
  matrix(c(1,0,-1,1), nrow = 2),
  matrix(c(1,0, 1,0), nrow = 2)
)

# With any threshold < .67,
# result should be...
matrix(c(1, 0, -1, 1), nrow = 2)
#>      [,1] [,2]
#> [1,]    1   -1
#> [2,]    0    1

# Otherwise...
matrix(c(1, 0, 0, 0), nrow = 2)
#>      [,1] [,2]
#> [1,]    1    0
#> [2,]    0    0

# @Chris answer passes
threshold <- 0.5
(Reduce('+',lapply(listX,function(x){x > 0}))/length(listX) >= threshold) - (Reduce('+',lapply(listX,function(x){x < 0}))/length(listX) >= threshold)
#>      [,1] [,2]
#> [1,]    1   -1
#> [2,]    0    1

threshold <- 1.0
(Reduce('+',lapply(listX,function(x){x > 0}))/length(listX) >= threshold) - (Reduce('+',lapply(listX,function(x){x < 0}))/length(listX) >= threshold)
#>      [,1] [,2]
#> [1,]    1    0
#> [2,]    0    0

# My function fails...
prob_matrix(listX, .5)
#>      [,1] [,2]
#> [1,]    1   -1
#> [2,]    0    1
prob_matrix(listX,  1)
#>      [,1] [,2]
#> [1,]    1    0
#> [2,]    0    1

# @user20650 answer fails...
arr <- simplify2array(listX)
grzero = rowSums(arr > 0, dims = 2) / length(listX)
lezero = rowSums(arr < 0, dims = 2) / length(listX)
prop = 0.5
1* (grzero > prop) + -1* (lezero > prop)
#>      [,1] [,2]
#> [1,]    1   -1
#> [2,]    0    1

arr <- simplify2array(listX)
grzero = rowSums(arr > 0, dims = 2) / length(listX)
lezero = rowSums(arr < 0, dims = 2) / length(listX)
prop = 1.0
1* (grzero > prop) + -1* (lezero > prop)
#>      [,1] [,2]
#> [1,]    0    0
#> [2,]    0    0

原始答案

這是一種方法

  • 結合signReduce做的值在每個單元中的標志的累加值,返回一個矩陣。
  • 此值小於閾值數(您的概率*列表中的矩陣數)的所有像元都將轉換為0。
  • 返回所有單元格的sign()

下面是帶有包裝函數的示例:

玩具數據...

set.seed(12)
listX <- list()
for(i in 1:10){listX[[i]]<-matrix(rnorm(n = 25, mean = 0, sd = 1), 5, 5)}

功能...

prob_matrix <- function(matrix_list, prob) {
  # Sum the signs of values in each cell
  matrix_list <- lapply(matrix_list, sign)
  x <- Reduce(`+`, matrix_list)

  # Convert cells below prob to 0, others to relevant sign
  x[abs(x) < (prob * length(matrix_list)) / 2] <- 0
  sign(x)
}

示例案例...

prob_matrix(listX, .2)
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]   -1    1    0    1    0
#> [2,]   -1    0   -1   -1    0
#> [3,]    1   -1    1    1    1
#> [4,]    0   -1    1    1   -1
#> [5,]   -1    0   -1    0   -1

prob_matrix(listX, .4)
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]   -1    1    0    1    0
#> [2,]   -1    0   -1   -1    0
#> [3,]    1   -1    1    1    1
#> [4,]    0   -1    1    1   -1
#> [5,]   -1    0   -1    0   -1

prob_matrix(listX, .6)
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    0    1    0    1    0
#> [2,]   -1    0    0   -1    0
#> [3,]    1   -1    0    1    1
#> [4,]    0    0    0    1   -1
#> [5,]   -1    0    0    0   -1

prob_matrix(listX, .8)
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    0    1    0    1    0
#> [2,]   -1    0    0   -1    0
#> [3,]    1   -1    0    1    1
#> [4,]    0    0    0    1   -1
#> [5,]   -1    0    0    0   -1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM