簡體   English   中英

在大型矩陣中搜索特定基因,循環需要優化

[英]Searching for specific genes within a large matrix, loop needs optimization

對於我的代碼的每次迭代,我首先從基因來源的PPI網絡中找到值,並在每次運行結束時重新計算。 如果在A或B類別中找到了該基因,我會將其完成度的得分和基因都存儲在另一個位置,以進行分類和連接以進行進一步測試。 搜索過程需要時間,無論如何我都在尋找優化方法。 問題是我已經開始分批處理300多個基因,而花三天時間進行演算是很長的。 額外的信息矩陣是PPI網絡內所有相互作用的矩陣,總計約176,000X3。

慢速代碼:

#CREATE THE DNS LIST
    DNSList = FALSE
    DNSListNameHolder = NA
    DNSListValueHolder = NA
    DNSListHolder = 0
    CN = 0
    Prev = 0
    while(!DNSList)
    {
        CN = CN + 1
        IDNSList = FALSE
        CNN = Prev
        while(!IDNSList)
        {
            CNN = CNN + 1
            if(as.character(ForDNSList$Gene.A[CNN]) == as.character(Candidate[CN]))
            {
                DNSListHolder = DNSListHolder  + 1
                DNSListValueHolder[DNSListHolder] = as.character(ForDNSList$Score[CNN])
                DNSListValueHolder[DNSListHolder] = as.numeric(DNSListValueHolder[DNSListHolder]) 
                DNSListNameHolder [DNSListHolder] = as.character(ForDNSList$Gene.B[CNN])
            }
            if(as.character(ForDNSList$Gene.B[CNN]) == as.character(Candidate[CN]))
            {
                DNSListHolder = DNSListHolder  + 1
                DNSListValueHolder[DNSListHolder] = as.character(ForDNSList$Score[CNN])
                DNSListValueHolder[DNSListHolder] = as.numeric(DNSListValueHolder[DNSListHolder]) 
                DNSListNameHolder [DNSListHolder] = as.character(ForDNSList$Gene.A[CNN])
            }
            if(CNN == length(ForDNSList$Gene.A))
                IDNSList = TRUE
        }
        if(CN == length(Candidate))
            DNSList = TRUE
        print(paste("Pre-DNS List in Progress",CN/length(Candidate), sep = " "))    
    }
    print("Pre-DNS List Completed")

出於示例目的,可以將候選列表設置為此

Candidate = c("BRCA1", "BRCA2", "ATK1", "FYN")

ForDNSList很長,因此這里有一個小節選,以了解如何列出外觀。 如果我要搜索的基因在基因列A或B中,則它的隨機性或多或少。

> ForDNSList[1:50, 1:3]
     Gene.A     Gene.B Score
1    Q96BE0     POLR3A 0.126
2    Q96BE0      PDPK1 0.126
3    Q96BE0      MGEA5 0.126
4    Q96BE0     DNAJA2 0.126
5    Q96BE0     DNAJB6 0.126
6    Q96BE0       BAG4 0.126
7    Q96BE0     HSPA4L 0.126
8     THAP1 A0A024RA76 0.332
9    Q96BE0       BAG2 0.236
10   Q96BE0       BAG3 0.236
11   Q96BE0       EGFR 0.236
12   Q96BE0        MOS 0.126
13   Q96BE0       RAF1 0.126
14   Q96BE0     GABRB1 0.126
15   Q96BE0       GNAZ 0.126
16    MS4A7      HMGCL 0.286
17   Q96BE0     ATP5A1 0.126
18   Q96BE0     DNAJA1 0.126
19     DVL3      PPM1A 0.210
20   Q96BE0       MCM5 0.126
21   Q96BE0       MCM7 0.126
22   Q96BE0      HSPA4 0.126
23   Q96BE0      PSMC2 0.126
24   Q96BE0       GNAL 0.126
25   Q96BE0        AMT 0.126
26    MECP2      SOX18 0.286
27   Q96BE0     CSNK1E 0.126
28   Q96BE0       ST13 0.126
29  CSNK2A1       MYH9 0.454
30   Q96BE0       CDK9 0.126
31   Q96BE0     SEC24C 0.126
32   TUBA4A       MYH9 0.081
33   Q96BE0      HSPA2 0.236
34   Q96BE0      PRAME 0.126
35   Q96BE0      FANCC 0.126
36   Q96BE0       HSF2 0.126
37      KDR      MYO1C 0.126
38   Q96BE0      HCFC1 0.126
39   Q96BE0      RAD51 0.126
40      KDR        FYN 0.210
41   Q96BE0      PSMD2 0.126
42   Q96BE0       SKP2 0.126
43      KDR        MET 0.376
44   Q96BE0      IKBKE 0.126
45   Q96BE0      ENDOG 0.126
46   Q96BE0      GNA13 0.126
47   TSG101      EIF3L 0.183
48   Q96BE0     SETDB1 0.126
49   Q96BE0      CDK10 0.126
50 HSP90AB1     TNNI3K 0.126

由於以上建議,我刪除了一個循環,並用兩個match()爭論代替了它。 原始代碼執行第一次迭代大約需要196秒,而僅花費20.4秒

    Nx = 0
DNSList = FALSE
DNSListNameHolder = NA
DNSListValueHolder = NA
DNSListHolder = 0
CN = 0
Prev = 0
system.time(while(Nx < length(ForDNSList$Gene.A))
{
    Nx = Nx + 1
    #Check if Gene A is a candidate disease gene
    if(is.element("TRUE",!is.na(match(Candidate,ForDNSList$Gene.A[Nx]))))
    {
        #if so push the holder one furter and fill the secondary varaibles with the complement and score info
        DNSListHolder = DNSListHolder  + 1
        DNSListValueHolder[DNSListHolder] = as.character(ForDNSList$Score[CNN])
        DNSListValueHolder[DNSListHolder] = as.numeric(DNSListValueHolder[DNSListHolder]) 
        DNSListNameHolder [DNSListHolder] = as.character(ForDNSList$Gene.B[CNN])
    }
    #Check if Gene B is a candidate disease gene
    if(is.element("TRUE",!is.na(match(Candidate,ForDNSList$Gene.B[Nx]))))
    {   
        #if so push the holder one furter and fill the secondary varaibles with the complement and score info
        DNSListHolder = DNSListHolder  + 1
        DNSListValueHolder[DNSListHolder] = as.character(ForDNSList$Score[CNN])
        DNSListValueHolder[DNSListHolder] = as.numeric(DNSListValueHolder[DNSListHolder]) 
        DNSListNameHolder [DNSListHolder] = as.character(ForDNSList$Gene.A[CNN])
    }
    print(Nx)
})

最好使用apply函數之一-我認為它們已經過優化,可以使用多處理,因此有了更多的內核,您使用apply的操作可能會更快。 此外,使用函數可能比使用循環更好,因為它更具模塊化且易於編碼。

這是我自己的代碼中的示例,顯示了“離群值” Z分數算法的部分實現:

rw <- assays(sum_exp)$fpkm

    #remove genes that have zero counts
    rw <- rw[apply(rw, 1, function(x){return (sum(x)>0)}),]

    #
    sample_means <- apply(rw, 2, function(x){median(x[x>0])})
    z_median <- median(sample_means)
    z_mad <- mad(sample_means)
    z_scores <- unlist(lapply(sample_means, function(x) {return ((x - z_median)/(z_mad))}))

如果要對其進行概念化,請考慮可能要在for循環的一次迭代中修改多個元素,例如實現Fibonacci的循環。 R無法並行優化循環,因為它無法隔離每個行/列/元素。 使用applysapplylapply ,您可以假設每行/每一列/每個元素都是獨立計算的,因此可以安全地將工作划分到不同的核心之間。

暫無
暫無

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

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