inferCNV相關(guān)思考(配對(duì)樣本、多樣本問(wèn)題 )

由于層次聚類(lèi)的問(wèn)題(數(shù)據(jù)量太大的時(shí)候燎潮,層次聚類(lèi)的速度很慢喻鳄,同時(shí)會(huì)報(bào)堆錯(cuò)誤,出現(xiàn)內(nèi)存溢出)确封,inferCNV的不能處理大批量的數(shù)據(jù)除呵。另外,對(duì)于來(lái)源于不同病人的樣本爪喘,inferCNV的issue的討論也是分開(kāi)跑颜曾。
首先是對(duì)于配對(duì)的病人和多樣本的的處理問(wèn)題
官網(wǎng)的解釋?zhuān)?https://github.com/broadinstitute/infercnv/issues/429
對(duì)于同時(shí)具癌旁和癌paired的病人,可以使用正常的epithelial cel作為reference秉剑,tumor的epi cell作為observation泛豪。但是對(duì)于同時(shí)提供多個(gè)Normal作為ref,inferCNV并不能把他們和tumor的epi cell做到一一對(duì)應(yīng)侦鹏。
另外诡曙,單獨(dú)對(duì)一名患者的數(shù)據(jù)運(yùn)行 infercnv 確實(shí)會(huì)更快,并且如果您的不同樣本具有相似的類(lèi)型略水,則結(jié)果應(yīng)該在很大程度上相似价卤,盡管它們可能不會(huì)完全相同,因?yàn)榈捅磉_(dá)/不表達(dá)的初始過(guò)濾基因會(huì)受到細(xì)胞總數(shù)以及不同細(xì)胞類(lèi)型之間混合比例的影響渊涝。由于你對(duì)亞克隆結(jié)構(gòu)感興趣慎璧,官網(wǎng)強(qiáng)烈建議使用HMM=T,analysis_mode="subclusters"否則預(yù)測(cè)可能不準(zhǔn)確。
如果您決定對(duì)多個(gè)患者的數(shù)據(jù)一起運(yùn)行 infercnv跨释,除了cluster_by_groups您提到的選項(xiàng)之外胸私,plot_per_group()函數(shù)還可以將每個(gè)組繪制在不同的圖形上,并且dynamic_resize繪圖方法的選項(xiàng)可以使熱圖的可讀性更好鳖谈,得到的heatmap對(duì)于大型數(shù)據(jù)集友好岁疼。

對(duì)于單樣本分析完成樣本,如果想做可比的heatmap圖蚯姆,有一些問(wèn)題:

  1. plot_cnv默認(rèn)的參數(shù)x軸的scale五续,是直接根據(jù)測(cè)到gene數(shù)目進(jìn)行scale,需要使用plot_chr_scale 參數(shù)來(lái)保證染色體的寬度是可比的
chr_df = read.chromInfo(species = 'hg38')$df
  chr_df = chr_df[chr_df$chr %in% paste0("chr", 1:22), ]
  chrLen <- chr_df$end
  names(chrLen) <- chr_df$chr
  
  cnvobj <- readRDS(file = paste0('./result/run.final.infercnv_obj'))
  fileDir <- paste0('./result_ChromeScale/')
  dir_mk(fileDir)
  plot_cnv(infercnv_obj = cnvobj,
           out_dir = fileDir,
           title = sampleid,
           plot_chr_scale = T,
           chr_lengths = chrLen,
           #old version.
           x.range = c(0.9,1.1),
           x.center=1,
           png_res = 300,
           output_format = 'png',
           useRaster = T)
  1. 每個(gè)樣本測(cè)到的基因數(shù)目是不一樣的龄恋,為了不同樣本的CNV可比疙驾,需要使用complexHeatmap的提供的幫助函數(shù),從而獲得chromesome level的CNV結(jié)果郭毕。具體的操作如下:
library(circlize)
library(GenomicRanges)
chr_df = read.chromInfo()$df
chr_df = chr_df[chr_df$chr %in% paste0("chr", 1:22), ]
chr_gr = GRanges(seqnames = chr_df[, 1], ranges = IRanges(chr_df[, 2] + 1, chr_df[, 3]))

library(EnrichedHeatmap)
chr_window = makeWindows(chr_gr, w = 1e6)
chr_window

average_in_window = function(window, gr, v, method = "weighted", empty_v = NA) {

    if(missing(v)) v = rep(1, length(gr))
    if(is.null(v)) v = rep(1, length(gr))
    if(is.atomic(v) && is.vector(v)) v = cbind(v)

    v = as.matrix(v)
    if(is.character(v) && ncol(v) > 1) {
        stop("`v` can only be a character vector.")
    }

    if(length(empty_v) == 1) {
        empty_v = rep(empty_v, ncol(v))
    }

    u = matrix(rep(empty_v, each = length(window)), nrow = length(window), ncol = ncol(v))

    mtch = as.matrix(findOverlaps(window, gr))
    intersect = pintersect(window[mtch[,1]], gr[mtch[,2]])
    w = width(intersect)
    v = v[mtch[,2], , drop = FALSE]
    n = nrow(v)

    ind_list = split(seq_len(n), mtch[, 1])
    window_index = as.numeric(names(ind_list))
    window_w = width(window)

    if(is.character(v)) {
        for(i in seq_along(ind_list)) {
            ind = ind_list[[i]]
            if(is.function(method)) {
                u[window_index[i], ] = method(v[ind], w[ind], window_w[i])
            } else {
                tb = tapply(w[ind], v[ind], sum)
                u[window_index[i], ] = names(tb[which.max(tb)])
            }
        }
    } else {
        if(method == "w0") {
            gr2 = reduce(gr, min.gapwidth = 0)
            mtch2 = as.matrix(findOverlaps(window, gr2))
            intersect2 = pintersect(window[mtch2[, 1]], gr2[mtch2[, 2]])

            width_intersect = tapply(width(intersect2), mtch2[, 1], sum)
            ind = unique(mtch2[, 1])
            width_setdiff = width(window[ind]) - width_intersect

            w2 = width(window[ind])

            for(i in seq_along(ind_list)) {
                ind = ind_list[[i]]
                x = colSums(v[ind, , drop = FALSE]*w[ind])/sum(w[ind])
                u[window_index[i], ] = (x*width_intersect[i] + empty_v*width_setdiff[i])/w2[i]
            }

        } else if(method == "absolute") {
            for(i in seq_along(ind_list)) {
                u[window_index[i], ] = colMeans(v[ind_list[[i]], , drop = FALSE])
            }
            
        } else if(method == "weighted") {
            for(i in seq_along(ind_list)) {
                ind = ind_list[[i]]
                u[window_index[i], ] = colSums(v[ind, , drop = FALSE]*w[ind])/sum(w[ind])
            }
        } else {
            if(is.function(method)) {
                for(i in seq_along(ind_list)) {
                    ind = ind_list[[i]]
                    u[window_index[i], ] = method(v[ind], w[ind], window_w[i])
                }
            } else {
                stop("wrong method.")
            }
        }
    }

    return(u)
}

bed1 = generateRandomBed(nr = 1000, nc = 10) # generateRandomBed() is from circlize package
# convert to a GRanes object
gr1 = GRanges(seqnames = bed1[, 1], ranges = IRanges(bed1[, 2], bed1[, 3]))
#獲取統(tǒng)一的結(jié)果
num_mat = average_in_window(chr_window, gr1, bed1[, -(1:3)])
#行為genomic ranges它碎, 列為cell
dim(num_mat)

獲得num_mat后,自己根據(jù)cellid作圖即可
參考: https://jokergoo.github.io/ComplexHeatmap-reference/book/genome-level-heatmap.html
我的數(shù)據(jù)得到的圖:

image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末显押,一起剝皮案震驚了整個(gè)濱河市扳肛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乘碑,老刑警劉巖挖息,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兽肤,居然都是意外死亡套腹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)资铡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)电禀,“玉大人,你說(shuō)我怎么就攤上這事笤休〖夥桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵店雅,是天一觀的道長(zhǎng)政基。 經(jīng)常有香客問(wèn)我,道長(zhǎng)底洗,這世上最難降的妖魔是什么腋么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮亥揖,結(jié)果婚禮上珊擂,老公的妹妹穿的比我還像新娘。我一直安慰自己费变,他們只是感情好摧扇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著挚歧,像睡著了一般扛稽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滑负,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天在张,我揣著相機(jī)與錄音用含,去河邊找鬼。 笑死帮匾,一個(gè)胖子當(dāng)著我的面吹牛啄骇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘟斜,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缸夹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了螺句?” 一聲冷哼從身側(cè)響起虽惭,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛇尚,沒(méi)想到半個(gè)月后芽唇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佣蓉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年披摄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勇凭。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疚膊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虾标,到底是詐尸還是另有隱情寓盗,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布璧函,位于F島的核電站傀蚌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蘸吓。R本人自食惡果不足惜善炫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望库继。 院中可真熱鬧箩艺,春花似錦、人聲如沸宪萄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拜英。三九已至静汤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虫给。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工藤抡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抹估。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓杰捂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親棋蚌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容