內(nèi)容獲取 1、購買打包合集(《KS科研分享與服務(wù)》付費(fèi)內(nèi)容打包集合),價(jià)格感人,可以加入微信VIP群(答疑交流群,甚至有小伙伴覺得群比代碼更好),可以獲取建號(hào)以來所有內(nèi)容,群成員專享視頻教程,提前更新,其他更多福利! 2、《KS科研分享與服務(wù)》公眾號(hào)有QQ群,進(jìn)入門檻是20元(完全是為了防止白嫖黨,請理解),請考慮清楚。群里有免費(fèi)推文的注釋代碼和示例數(shù)據(jù)(終身擁有),沒有付費(fèi)內(nèi)容,群成員福利是購買單個(gè)付費(fèi)內(nèi)容半價(jià)!需要者詳情請聯(lián)系作者(非需要者勿擾,處理太費(fèi)時(shí)間):
也是群里小伙伴需求,介紹一個(gè)新的工具,METAFlux是一款基于R語言分析的代謝通量工具,2022年文章發(fā)表在Nature communications,可以從bulk或單細(xì)胞RNA-seq數(shù)據(jù)中推斷代謝通量。METAFlux旨在解決現(xiàn)有實(shí)驗(yàn)技術(shù)在研究癌癥代謝時(shí)的局限性,如代謝組學(xué)和通量分析方法,這些方法在準(zhǔn)確模擬復(fù)雜的腫瘤微環(huán)境方面存在挑戰(zhàn)。METAFlux利用基因組尺度的代謝模型從基因表達(dá)數(shù)據(jù)計(jì)算代謝反應(yīng)活性得分,然后應(yīng)用二次規(guī)劃為基礎(chǔ)的通量平衡分析來估計(jì)代謝通量。對于單細(xì)胞數(shù)據(jù),METAFlux將腫瘤微環(huán)境建模為一個(gè)代謝群落,以考慮細(xì)胞類型之間的相互作用。作者使用NCI-60細(xì)胞系和體內(nèi)Raji-NK細(xì)胞共培養(yǎng)模型的實(shí)驗(yàn)數(shù)據(jù)驗(yàn)證了METAFlux的性能,證明了它準(zhǔn)確描述腫瘤微環(huán)境中代謝異質(zhì)性和相互作用的能力。很顯然,METAFlux是針對腫瘤微環(huán)境代謝的工具,但是在非腫瘤細(xì)胞中也是可以應(yīng)用的!需要注意的是:METAFlux只能對人的數(shù)據(jù)進(jìn)行分析。 (reference:Characterizing cancer metabolism from bulk and single-cell RNA-seq data using METAFlux)原理感興趣的可以閱讀下原paper,分析教程官網(wǎng)也寫得比較詳細(xì),包括運(yùn)行過程和結(jié)果解釋。寫在前面,請看完:METAFlux只針對人的數(shù)據(jù)分析,作者不建議同源轉(zhuǎn)化做其他物種,因?yàn)槊總€(gè)物種代謝反應(yīng)有差別,而METAFlux只是人的代謝模型。此外,在分析中有一個(gè)參數(shù)設(shè)置,n_bootstrap,這個(gè)參數(shù)用于生成多個(gè)重采樣數(shù)據(jù)集,有助于通過考慮單細(xì)胞RNA-seq數(shù)據(jù)固有的稀疏性和隨機(jī)性來穩(wěn)定細(xì)胞簇級(jí)別代謝通量的估計(jì),作者教程演示(包括我)只設(shè)置了3,其實(shí)建議高一點(diǎn)比如100以上,但是有一個(gè)問題,也是這個(gè)包的分析局限,最后一步會(huì)非常耗費(fèi)內(nèi)存,一般電腦是帶不動(dòng)的,比如我演示的數(shù)據(jù),分析最后一步的時(shí)候內(nèi)存飆升到140G。 github鏈接: https://github.com/KChen-lab/METAFlux?tab=readme-ov-file 首先安裝包加載數(shù)據(jù): #paper # METAFlux: Characterizing metabolism from bulk and single-cell RNA-seq data # https://www./articles/s41467-023-40457-w
#github:https://github.com/KChen-lab/METAFlux?tab=readme-ov-file
devtools::install_github('KChen-lab/METAFlux') library(METAFlux) library(Seurat)
load("C:/Users/tq199/Downloads/adj_scRNA.RData") 首先按照單個(gè)樣本分析:流程很簡單!三步,calculate_avg_exp():: 計(jì)算celltype bootstrap 平均表達(dá)量,calculate_reaction_score():: calculate metabolic reaction scores,compute_sc_flux()::計(jì)算代謝通量。#我們單獨(dú)提取一個(gè)組的數(shù)據(jù)進(jìn)行演示 SD_scRNA <- subset(adj_scRNA, orig.ident=='SD_scRNA') mean_exp=calculate_avg_exp(myseurat = SD_scRNA, #需要分析的單細(xì)胞seurat obj,單細(xì)胞obj是normalization 的 myident = 'celltype',#celltype分組 n_bootstrap=3, #抽樣次數(shù) seed=1)#隨機(jī)數(shù)
#計(jì)算代謝反應(yīng)分?jǐn)?shù) scores<-calculate_reaction_score(data=mean_exp) #計(jì)算這個(gè)樣本中每種celltype占比,每種celltype的數(shù)量除以總的細(xì)胞數(shù) #需要注意,這里celltype fraction順序要與score里面celltype的順序一致 fr = round(table(SD_scRNA$celltype)/nrow(SD_scRNA@meta.data),2) fr = as.vector(fr)
#計(jì)算代謝通量 flux=compute_sc_flux(num_cell = 10, #celltype數(shù)量,比如這里我的數(shù)據(jù)中有10種celltype fraction = fr, #celltype比例,和必須是1 fluxscore=scores, medium = human_blood)#
#代謝model,可以查看代謝反應(yīng)ID,代謝公式,代謝通路! data("human_gem") human_gem <- human_gem
#選擇感興趣的代謝反應(yīng),提取數(shù)據(jù)進(jìn)行可視化 #比如這里看glucose的代謝反應(yīng),我們可以通過nutrient_lookup_files文件查找glucose對應(yīng)的ID data("nutrient_lookup_files") glucose_ID <- nutrient_lookup_files$EQUATION[grepl("glucose", nutrient_lookup_files$EQUATION)] select_ID <- subset(nutrient_lookup_files, nutrient_lookup_files$EQUATION %in% glucose_ID) #這樣我們就可以得知glucose ID glucose<-data.frame(glucose=flux[grep("HMR_9034",rownames(flux)),])
#if needed we can apply cubic root normalization to normalize the scores cbrt <- function(x) { sign(x) * abs(x)^(1/3) }
glucose=cbrt(glucose)
#ggplot做一個(gè)箱線圖展示 library(ggplot2) glucose$celltype=rownames(glucose) long_glucose=reshape2::melt(glucose,id.vars='celltype') ggplot(long_glucose,aes(y=-value,x=celltype))+ geom_boxplot()+ ggtitle("Glucose uptake level for different cell types")+ xlab("")+ylab("Glucose uptake scores")+ theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
熱圖展示通路平均活性。這里我是將所有的,每個(gè)celltype代謝反應(yīng)抽樣計(jì)算的flux平均,然后對每條通路計(jì)算了平均,思路應(yīng)該沒有問題:flux1 <- rowMeans(flux) %>% as.data.frame() colnames(flux1) <- "flux"
celltype <- c("Endo","Fib","Musc","Ker","APCs","Other","Tcell","Mast","LY","Mela")#順序和mean-exp順序一樣 celltype <- paste0(celltype," ") flux_celltype <- paste("celltype", seq(length(celltype)),"") for(i in 1:length(celltype)){
rownames(flux1) <- gsub(flux_celltype[i], celltype[i], rownames(flux1))
}
flux1$celltype <- sub(" .*$", "", rownames(flux1)) flux1 <- flux1[!grepl("external_medium", flux1$celltype), ] flux1$pathway <- rep(human_gem$SUBSYSTEM, length(celltype))
library(tidyr) library(dplyr) library(pheatmap)
df_summary <- flux1 %>% group_by(celltype, pathway) %>% summarize(mean_value = mean(abs(flux)))
df_summary_w <- df_summary %>% pivot_wider(names_from = pathway, values_from = mean_value) %>% as.data.frame()
rownames(df_summary_w) <- df_summary_w[,1] df_summary_w <- df_summary_w[,-1]
#heatmap mapal <- colorRampPalette(RColorBrewer::brewer.pal(11,"RdBu"))(256) pheatmap::pheatmap(t(df_summary_w),cluster_cols = F,color = rev(mapal),scale = "row")
如果你有多個(gè)樣本,或者patients,可以循環(huán)分析:#load your seurat object,多樣本數(shù)據(jù)循環(huán)分析 # obj.list <- SplitObject(seurat, split.by = "orig.ident") # for (i in c(1:length(obj.list))){ # sc<-obj.list[[i]] # mean_exp=calculate_avg_exp(myseurat = sc,myident = 'celltype',n_bootstrap=50,seed=1) # scores<-calculate_reaction_score(data=mean_exp) # fr = round(table(sc$celltype)/nrow(sc@meta.data),2) # fr = as.vector(fr) # flux=compute_sc_flux(num_cell = length(unique(sc$celltype)), # fraction = fr, # fluxscore=scores,medium = human_blood) # saveRDS(flux,paste0(unique(sc$orig.ident),"_flux",".rds")) # }
上面的這種情況可能適用于看微環(huán)境中每種celltype的代謝,或者可以說做細(xì)胞亞群的時(shí)候看看關(guān)注celltype的代謝差異。那么很多時(shí)候,我們還有這樣的想法,那就是比較兩組之間同一個(gè)celltype的代謝差異。我們可以選擇自己感興趣的celltype,將其當(dāng)作一個(gè)新的celltype/sample進(jìn)行分析,步驟和上面是一樣的。bulk分析和scRNA一樣,只不過不需要計(jì)算calculate_avg_exp。對于結(jié)果文件的解讀,建議仔細(xì)閱讀官網(wǎng)教程!覺得我們分享有些用的,點(diǎn)個(gè)贊再走唄!
|