簡體   English   中英

如何將函數應用於數組邊距並創建成對組合矩陣

[英]How to apply a function to array margin and create pairwise combination matrix

我正在使用R來應用自寫函數,該函數在數據幀的列邊距上將兩個數字矢量和一個數字參數作為輸入。 數據幀中的每一列都是一個數值向量,我想執行成對計算並創建一個矩陣,其中包含列的所有可能組合以及計算的指示結果。 所以從本質上講,我想生成一種類似於cor()函數產生的行為。

# Data
> head(d)
            1         2         3            4
1 -1.01035342 1.2490665 0.7202516  0.101467379
2 -0.50700743 1.4356733 0.9032172 -0.001583743
3 -0.09055243 0.4695046 2.4487632 -1.082570048
4  1.11230416 0.2885735 0.3534247 -0.728574628
5 -1.96115691 0.4831158 1.5650052  0.648675605
6  1.20434218 1.7668086 0.2170858 -0.161570792
> cor(d)
            1           2           3           4
1  1.00000000  0.08320968 -0.06432155  0.04909430
2  0.08320968  1.00000000 -0.04557743 -0.01092765
3 -0.06432155 -0.04557743  1.00000000 -0.01654762
4  0.04909430 -0.01092765 -0.01654762  1.00000000

我找到了這個有用的答案: 對矩陣進行成對比較

基於此,我編寫了此函數,該函數使用了另一個自寫函數compareFunctions()

createProbOfNonEqMatrix <- function(df,threshold){
  combinations <- combn(ncol(df),2)
  predDF <- matrix(nrow = length(density(df[,1])$y)) # df creation for predicted values from density function
  for(i in 1:ncol(df)){
    predCol <- density(df[,i])$y # convert df of original values to df of predicted values from density function
    predDF <- cbind(predDF,predCol)
  }
  predDF <- predDF[,2:ncol(predDF)]
  colnames(predDF) <- colnames(df) # give the predicted values column names as in the original df
  predDF <- as.matrix(predDF)
  out.mx <- apply( X=combinations,MARGIN = 2,FUN = "compareFunctions",
    predicted_by_first = predDF[,combinations[1]],
    predicted_by_second = predDF[,combinations[2]],
    threshold = threshold)
return(out.mx)
}

predicted_by_firstpredicted_by_second _by_second和threshold是compareFunctions的輸入。 但是我收到以下錯誤:

 Error in FUN(newX[, i], ...) : unused argument (newX[, i]) 

我無奈之下嘗試了這個:

createProbOfNonEqMatrix <- function(df,threshold){
  combinations <- combn(ncol(df),2)
  predDF <- matrix(nrow = length(density(df[,1])$y)) 
  for(i in 1:ncol(df)){
    predCol <- density(df[,i])$y 
    predDF <- cbind(predDF,predCol)
  }
  predDF <- predDF[,2:ncol(predDF)]
  colnames(predDF) <- colnames(df) 
  predDF <- as.matrix(predDF)
  out.mx <- apply(
    X=combinations,MARGIN = 2,FUN = function(x) {
      diff <- abs(predDF[,x[1]]-predDF[,x[2]])
      boolean <- diff<threshold
      acceptCount <- length(boolean[boolean==TRUE])
      probability <- acceptCount/length(diff)
      return(probability)
    }
    )
return(out.mx)
}

它似乎確實在工作,但是沒有返回成對矩陣,而是給了我一個向量:

> createProbOfNonEqMatrix(d,0.001)
[1] 0.10351562 0.08203125 0.13476562 0.13085938 0.14843750 0.10937500

您是否能夠指導我如何制作所需的成對矩陣,即使它意味着在apply()再次編寫函數代碼? 另外,如果您能給我一個如何跟蹤成對比較的想法,將不勝感激。 謝謝亞歷克斯

您的輸出將以combinations成對的順序為您提供計算結果:(1,2),(1,3),(1,4),(2,3),(2,4),(3 ,4)。 如果要將其組織成對稱方陣,則可以對結果進行基本處理,例如,如下所示:

out.mx<-c(0.10351562, 0.08203125, 0.13476562, 0.13085938, 0.14843750, 0.10937500)
out.mtx<-matrix(nrow=ncol(df1),ncol=ncol(df1))
out.mtx[,]<-1
for (i in 1:length(combinations[1,])){
  a<-combinations[1,i]
  b<-combinations[2,i]
  out.mtx[a,b]<-out.mtx[b,a]<-out.mx[i]
}
out.mtx

這給你

          [,1]      [,2]       [,3]      [,4]
[1,] 1.00000000 0.1035156 0.08203125 0.1347656
[2,] 0.10351562 1.0000000 0.13085938 0.1484375
[3,] 0.08203125 0.1308594 1.00000000 0.1093750
[4,] 0.13476562 0.1484375 0.10937500 1.0000000

暫無
暫無

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

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