LUAD文章复现代码汇总

1+1#1+1代表普通的运算
#install.packages("tidyverse")
#也可以通过右下角的操作栏通过点击来安装R包
#chooseBioCmirror()
#a<-6
#a
#以上是试验赋值的用法,还可以用=来表示,不过==代表一种逻辑判断
#setwd("DAY1")#此代码用来设置工作目录(临时工作目录,退出后回到初始目录),以免在使用过程中将储存文件弄混
#dir.create()可以用来直接创建目录,不过麻烦
#getwd()#查看当前目录
#setwd("DAY1.1")
#ctrl+F可以用来查找代码框中的代码,ctrl+Z是撤销一次的含义
#read.table()#读取文本文档
#write.CSV()#是输出为表格
write.table(counts01A,"counts01A.txt",sep="\t",row.names=T,col.names=NA,quote=F)#是输出文本文档#对文件的读取或输出可以直接点击右上角的读取来导入#通常txt格式会更不容易出错
#t()是用于行列反转的函数
#当一个可以判断为数据框的格式但R语言并没有将其判断为数据框时,可以通过函数as.data.frame()来改变

#class()#用来判断数据框类型,若是数据框内的某一列数据通过输入$符号来确定
#[,]代表对数据框进行提取。其中:表示多少到多少。并且,前是行后是列
#%>%表示传导符号

#install.packages("tidyverse")
#library(tidyverse)
#a<-c("a","b","a","b","c")
#duplicated(a)#用来判断数据里的元素是否重复
#a<-!duplicated(a)#感叹号是指将数据集内判断结果反过来,[]中括号可以把判断中是TRUE的元素提取出来
#a[a]#以上操作中将判断结果赋予了a故导致原本数据的丢失
#a<-c("a","b","a","b","c")
#duplicated(a)
#a<-a[!duplicated(a)]
#a
#这才是正确操作结果

#inner_join()#是将两数据框中数据相同的进行合并的函数,包括(表一,表二,by='合并标准')
#left_join()#则是代表以函数内左的数据框为标准进行合并


###接下来进行数据的下载实战#####
##建立好文件##
#setwd("TCGA-LUAD")
#setwd('TCGAdata')
library(tidyverse)
install.packages('BiocManager')
library(BiocManager)
BiocManager::install("BioinformaticsFMRP/TCGAbiolinksGUI.data")
BiocManager::install("remotes")
BiocManager::install("ExperimentHub")
BiocManager::install("BioinformaticsFMRP/TCGAbiolinks")
#library(TCGAbiolinks)
cancer_type<-"TCGA-LUAD"
expquery<-GDCquery(project=cancer_type,
                   data.category="Transcriptome Profiling",
                   data.type="Gene Expression Quantification",
                   workflow.type="STAR - Counts")
GDCdownload(expquery,directory="GDCdata")
expquery2<-GDCprepare(expquery,directory="GDCdata",summarizedExperiment = T)
save(expquery2,file="luad.gdc_2023.rad")#对数据进行保存,rad格式是属于R的格式

setwd('TCGA-LUAD')
setwd("TCGAdata")
load("luad.gdc_2023.rad")
load("gene_annotation_2023.rad")
gene_annotation_2023<-data.txt


library(tidyverse)
counts<-expquery2@assays@data@listData[["unstranded"]]
colnames(counts)<-expquery2@colData@rownames
rownames(counts)<-expquery2@rowRanges@ranges@NAMES
counts<-as.data.frame(counts)
counts<-rownames_to_column(counts,var = "ENSEMBL")
counts<-inner_join(counts,gene_annotation_2023,"ENSEMBL")
counts<-counts[!duplicated(counts$symbol),]


rownames(counts)<-NULL#去除行名
counts<-column_to_rownames(counts,var = "symbol")
table(counts$type)#数一下有多少的type
counts<-counts[counts$type == "protein_coding",]
counts<-counts[,-c(1,ncol(counts))]
colnames(counts)<-substring(colnames(counts),1,16)#将列名中1~16字符提取出来 
counts<-counts[,!duplicated(colnames(counts))]



table(substring(colnames(counts),14,16))#通常01A代表肿瘤样本,11A代表正常样本
counts01A<-counts[,substring(colnames(counts),14,16)=="01A"]
counts11A<-counts[,substring(colnames(counts),14,16)=="11A"]#将样本中01A和11A的样本提出来做分析



write.table(counts01A,"counts01A.txt",sep="\t",row.names=T,col.names=NA,quote=F)
write.table(counts11A,"counts11A.txt",sep="\t",row.names=T,col.names=NA,quote=F)
###接下来提取tpms###前面提的counts是用来做差异分析的,而tpms是用来做后面分析的

tpms1<-expquery2@assays@data@listData[["tpm_unstrand"]]
colnames(tpms1)<-expquery2@colData@rownames
rownames(tpms1)<-expquery2@rowRanges@ranges@NAMES
tpms1<-tpms1%>%
  as.data.frame()%>%
  rownames_to_column("ENSEMBL")%>%
  inner_join(gene_annotation_2023,"ENSEMBL")%>%
  .[!duplicated(.$symbol),]
rownames(tpms1)<-NULL
tpms1<-tpms1 %>%column_to_rownames("symbol")
  
table(tpms1$type)#查看分类计数

tpms1<-tpms1[tpms1$type == "protein_coding",]
tpms1<-tpms1[,-c(1,ncol(tpms1))]
colnames(tpms1)<-substring(colnames(tpms1),1,16)#将列名中1~16字符提取出来 
tpms1<-tpms1[,!duplicated(colnames(tpms1))]
table(substring(colnames(tpms1),14,16))

tpms01A<-tpms1[,substring(colnames(tpms1),14,16)=="01A"]
tpms11A<-tpms1[,substring(colnames(tpms1),14,16)=="11A"]


identical(rownames(counts01A),rownames(tpms01A))
identical(rownames(counts11A),rownames(tpms11A))
identical(colnames(counts01A),colnames(tpms01A))
identical(colnames(counts11A),colnames(tpms11A))#验证几个样本是否一致

write.table(tpms01A,"tpms01A.txt",sep="\t",row.names=T,col.names=NA,quote=F)
write.table(tpms11A,"tpms11A.txt",sep="\t",row.names=T,col.names=NA,quote=F)


counts<-cbind(counts01A,counts11A)#cbind是以列colnames来合并,rbind是以行rownames来合并
tpms<-cbind(tpms01A,tpms11A)
write.table(tpms,"tpms.txt",sep="\t",row.names=T,col.names=NA,quote=F)
write.table(counts,"counts.txt",sep="\t",row.names=T,col.names=NA,quote=F)


range(tpms)#查看数据范围
range(tpms01A)
range(tpms11A)
tpms_log2<-log2(tpms+1)
range(tpms_log2)
tpms01A_log2<-log2(tpms01A+1)
range(tpms01A_log2)
tpms11A_log2<-log2(tpms11A+1)
range(tpms11A_log2)
write.table(tpms_log2,"tpms_log2.txt",sep="\t",row.names=T,col.names=NA,quote=F)
write.table(tpms01A_log2,"tpms01A_log2.txt",sep="\t",row.names=T,col.names=NA,quote=F)
write.table(tpms11A_log2,"tpms11A_log2.txt",sep="\t",row.names=T,col.names=NA,quote=F)




###计算肿瘤患者的免疫评分#####
#(基质,免疫,肿瘤)肿瘤纯度=肿瘤所占比例
setwd("TCGA-LUAD")
setwd("ESTIMATE")
#rfoge<-"http://r-forge.r-project.org"#RFORGE就是R语言自己的R包平台
#install.packages("estimate",repos=rfoge,dependencies=TRUE)
library(estimate)#estimate是用来计算免疫评分的
library(tidyverse)
exp<-read.table("tpms01A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                ,header=T)

filterCommonGenes(input.f="tpms01A_log2.txt",
                  output.f="tpms01A_log2.gct",
                  id="GeneSymbol")
estimateScore("tpms01A_log2.gct",
              "tpms01A_log2_estimate_score.txt",
              platform="affymetrix")#affymetrix是一个基因芯片平台,相比于其它平台结果更好

ESTIMATE_result<-read.table("tpms01A_log2_estimate_score.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                            ,header=T)
ESTIMATE_result<-ESTIMATE_result[,-1]
column_to_rownames(ESTIMATE_result,var="NAME")
colnames(ESTIMATE_result)<-ESTIMATE_result[1,]
ESTIMATE_result<-t(ESTIMATE_result[-1,])#通常行列转换后会变得不是数据框形式
ESTIMATE_result2<-as.data.frame(ESTIMATE_result)#可以直接用ESTIMATE_result<-as.data.frame(t(ESTIMATE_result[-1,]))


#dat1 <- as.data.frame(ESTIMATE_result2)
#dat1 <-rownames_to_column(dat1 )
#dat1 <- str_replace(ESTIMATE_result2[,1], ".", "_") #错误代码,练习更换字符

rownames(ESTIMATE_result)<-colnames(exp)
write.table(ESTIMATE_result,"ESTIMATE_result.txt",sep="\t",row.names=T,col.names=NA,quote=F)


##进行生存分析####
setwd("Survival_data")
library(tidyverse)
survival_data<-read.table("OS.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
           ,header=T)
survival_data<-survival_data[,2:3]
survival<-rownames_to_column(survival_data,"sample")
survival$name<-paste0(survival$sample,"A")#当粘贴到的数据框中没有name这列时,R会自动生成新的一列
#paste0表示粘贴连接一字符“”
table(substring(survival$name,14,16))
rownames(survival)<-survival$name
survival<-survival[,2:3]

#接下将生存信息与基因表达谱合并起来#
tpms01A_log2<-read.table("tpms01A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                         ,header=T)
a<-intersect(colnames(tpms01A_log2),rownames(survival))#对生存数据和基因表达谱
#~的sample名取交集,主要是为了得到一个额外的sample顺序,用来接下来将两者sample对齐
table(substring(a,14,16))
exp_01A<-tpms01A_log2[,a]
surv_01A<-survival[a,]#以顺序或以集合a作为模板来将两个数据中以行或列进行数据提取
exp_01A<-exp_01A%>%t()%>%as.data.frame()
identical(rownames(exp_01A),rownames(surv_01A))
exp_surv_01A<-cbind(surv_01A,exp_01A)#cbind是将两数据列和并起来(前提是行相同)
#~rbind是将两数据行合并起来(前提是列相同)
#将合并后的生存信息和基因表达谱合并的文件保存
write.table(exp_surv_01A,"exp_surv_01A.txt",sep="\t",row.names=T,col.names=NA,quote=F)


#合并生存信息与免疫评分数据(ESTIMATE)####
ESTIMATE_result<-read.table("ESTIMATE_result.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                            ,header=T)
identical(rownames(ESTIMATE_result),rownames(surv_01A))
ESTIMATE_result_surv_01A<-cbind(surv_01A,ESTIMATE_result)
write.table(ESTIMATE_result_surv_01A,"ESTIMATE_result_surv_01A.txt",sep="\t",row.names=T,col.names=NA,quote=F)


setwd("TCGA-LUAD")
setwd("survival")
surv01A<-read.table("ESTIMATE_result_surv_01A.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                    ,header=T)
surv01A$OS.time<-surv01A$OS.time/365#将生存时间从天变为年,利于后续分析





surv01A$group<-ifelse(surv01A$ImmuneScore>median(surv01A$ImmuneScore),"High","Low")
#该函数添加的high和low都是字符形式的,而非因子形式,故无法做二分类变量判断
#此次的评分分组为关键,分组不同所做的生存分析标准不同


class(surv01A$group)
surv01A$group<-factor(surv01A$group,levels=c("Low","High"))
class(surv01A$group)
table(surv01A$group)

#install.packages("survival")#安装做生存分析的包
library(survival)
fitd<-survdiff(Surv(OS.time,OS)~group,
               data=surv01A,
               na.action = na.exclude)#na.omit:这个操作会从数据中删除任何包含缺失值的行。
#~na.fail:这个操作会在数据中存在缺失值时导致模型失败。
#~na.exclude:这个操作会将包含缺失值的行从分析中排除,但不从数据中删除。
pValue<-1-pchisq(fitd$chisq,length(fitd$n)-1)#该步骤是用来做卡方检验P值
#~与统计学上卡方检验一样,小于0.01才具有统计学意义


#拟合生存曲线
fit<-survfit(Surv(OS.time,OS)~group,data=surv01A)
summary(fit)
p.lab<-paste0("P",ifelse(pValue<0.001,"<0.001",paste0("=",round(pValue,3))))
#该步只是将到的P值规范地写下来
#install.packages("survminer")
library(survminer)
ggsurvplot(
  fit,
  data = surv01A,
  palette = "jco",#配色采用Jco,lancet柳叶刀配色,jama是jama期刊的配色
  pval = p.lab,
  conf.int = TRUE,#显示置信区间
  risk.table = TRUE,#显示风险表
  risk.table.col="strata",
  legend.labs=c("Low","High"),#图例
  size=1,
  xlim=c(0,20),#x轴长度,根据自己数据中OS.time的时间来决定,此数据中最大为19年多,
  #故用20作X轴长度,可用range函数判断自己数据范围
  break.time.by=5,#X轴步长为5
  legend.title="ImmuneScore",#TITLE
  surv.median.line = "hv",#限制垂直和水平的中位生存
  ylab="Survival probability(%)",#修改Y轴标签
  xlab="Time(Years)",#修改x轴标签
  ncensor.plot=TRUE,#显示缺失图块
  ncensor.plot.height=0.25,
  risk.table.y.text=FALSE)
dev.off()#不知道干什么用暂时


#StromalScore#只需要将上述分组时的High和Low通过机制评分来进行分组便可以
#~进行机制的生存分析



surv01A$group<-ifelse(surv01A$StromalScore>median(surv01A$StromalScore),"High","Low")
#该函数添加的high和low都是字符形式的,而非因子形式,故无法做二分类变量判断
class(surv01A$group)
surv01A$group<-factor(surv01A$group,levels=c("Low","High"))
class(surv01A$group)
table(surv01A$group)

#install.packages("survival")#安装做生存分析的包
library(survival)
fitd<-survdiff(Surv(OS.time,OS)~group,
               data=surv01A,
               na.action = na.exclude)#na.omit:这个操作会从数据中删除任何包含缺失值的行。
#~na.fail:这个操作会在数据中存在缺失值时导致模型失败。
#~na.exclude:这个操作会将包含缺失值的行从分析中排除,但不从数据中删除。
pValue<-1-pchisq(fitd$chisq,length(fitd$n)-1)#该步骤是用来做卡方检验P值
#~与统计学上卡方检验一样,小于0.01才具有统计学意义


#拟合生存曲线
fit<-survfit(Surv(OS.time,OS)~group,data=surv01A)
summary(fit)
p.lab<-paste0("P",ifelse(pValue<0.001,"<0.001",paste0("=",round(pValue,3))))
#该步只是将到的P值规范地写下来
#install.packages("survminer")
library(survminer)
ggsurvplot(
  fit,
  data = surv01A,
  palette = "jco",#配色采用Jco,lancet柳叶刀配色,jama是jama期刊的配色
  pval = p.lab,
  conf.int = TRUE,#显示置信区间
  risk.table = TRUE,#显示风险表
  risk.table.col="strata",
  legend.labs=c("Low","High"),#图例
  size=1,
  xlim=c(0,20),#x轴长度,根据自己数据中OS.time的时间来决定,此数据中最大为19年多,
  #故用20作X轴长度,可用range函数判断自己数据范围
  break.time.by=5,#X轴步长为5
  legend.title="StromalScore",#TITLE
  surv.median.line = "hv",#限制垂直和水平的中位生存
  ylab="Survival probability(%)",#修改Y轴标签
  xlab="Time(Years)",#修改x轴标签
  ncensor.plot=TRUE,#显示缺失图块
  ncensor.plot.height=0.25,
  risk.table.y.text=FALSE)




#ESTIMATEScore



surv01A$group<-ifelse(surv01A$ESTIMATEScore>median(surv01A$ESTIMATEScore),"High","Low")
#该函数添加的high和low都是字符形式的,而非因子形式,故无法做二分类变量判断
class(surv01A$group)
surv01A$group<-factor(surv01A$group,levels=c("Low","High"))
class(surv01A$group)
table(surv01A$group)

#install.packages("survival")#安装做生存分析的包
library(survival)
fitd<-survdiff(Surv(OS.time,OS)~group,
               data=surv01A,
               na.action = na.exclude)#na.omit:这个操作会从数据中删除任何包含缺失值的行。
#~na.fail:这个操作会在数据中存在缺失值时导致模型失败。
#~na.exclude:这个操作会将包含缺失值的行从分析中排除,但不从数据中删除。
pValue<-1-pchisq(fitd$chisq,length(fitd$n)-1)#该步骤是用来做卡方检验P值
#~与统计学上卡方检验一样,小于0.01才具有统计学意义


#拟合生存曲线
fit<-survfit(Surv(OS.time,OS)~group,data=surv01A)
summary(fit)
p.lab<-paste0("P",ifelse(pValue<0.001,"<0.001",paste0("=",round(pValue,3))))
#该步只是将到的P值规范地写下来
#install.packages("survminer")
library(survminer)
ggsurvplot(
  fit,
  data = surv01A,
  palette = "jco",#配色采用Jco,lancet柳叶刀配色,jama是jama期刊的配色
  pval = p.lab,
  conf.int = TRUE,#显示置信区间
  risk.table = TRUE,#显示风险表
  risk.table.col="strata",
  legend.labs=c("Low","High"),#图例
  size=1,
  xlim=c(0,20),#x轴长度,根据自己数据中OS.time的时间来决定,此数据中最大为19年多,
  #故用20作X轴长度,可用range函数判断自己数据范围
  break.time.by=5,#X轴步长为5
  legend.title="ESTIMATEScore",#TITLE
  surv.median.line = "hv",#限制垂直和水平的中位生存
  ylab="Survival probability(%)",#修改Y轴标签
  xlab="Time(Years)",#修改x轴标签
  ncensor.plot=TRUE,#显示缺失图块
  ncensor.plot.height=0.25,
  risk.table.y.text=FALSE)





#分组画图,肿瘤阶段,转移,####


setwd("TCGA-LUAD")
setwd("Clinical")
library(tidyverse)
load("luad.gdc_2023.rad")
clinical<-as.data.frame(expquery2@colData)%>%.[!duplicated(.$sample),]
#提取文章中所需要的临床信息,性别,年龄。。。。
clinical<-clinical[,c("gender","age_at_index","ajcc_pathologic_stage",
                      "ajcc_pathologic_t","ajcc_pathologic_n","ajcc_pathologic_m")]
#判断一下每一列的数据类型,做到心中有数
class(clinical$gender)
class(clinical$age_at_index)#结果是"integer"代表整数
class(clinical$ajcc_pathologic_stage)
class(clinical$ajcc_pathologic_t)
class(clinical$ajcc_pathologic_n)
class(clinical$ajcc_pathologic_m)

#分组计数一下,可以看出结果
table(clinical$gender)
table(clinical$age_at_index)
table(clinical$ajcc_pathologic_stage)#只需要里面的一二三期便可以不需要分压型,故要去掉亚型分类
table(clinical$ajcc_pathologic_t)
table(clinical$ajcc_pathologic_n)
table(clinical$ajcc_pathologic_m)

#去掉亚型分类
clinical$ajcc_pathologic_stage<-gsub("A","",clinical$ajcc_pathologic_stage)
clinical$ajcc_pathologic_stage<-gsub("B","",clinical$ajcc_pathologic_stage)
clinical$ajcc_pathologic_t<-gsub("a","",clinical$ajcc_pathologic_t)
clinical$ajcc_pathologic_t<-gsub("b","",clinical$ajcc_pathologic_t)
clinical$ajcc_pathologic_m<-gsub("a","",clinical$ajcc_pathologic_m)
clinical$ajcc_pathologic_m<-gsub("b","",clinical$ajcc_pathologic_m)
#数据里的X表示未知并不是亚型
rownames(clinical)<-substring(rownames(clinical),1,16)

#接下来要将基因表达谱导入进来并且将与临床数据合并#和先前的生存数据一样
exp01A<-read.table("tpms01A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                   ,header=T)
clinical01A<-clinical[colnames(exp01A),]#以exp01A中的列名为模板对clinical中数据进行提取
exp01A<-exp01A%>%t()%>%as.data.frame()
clinical.expr01A<-cbind(clinical01A,exp01A)
write.table(clinical.expr01A,"clinical.expr01A.txt",sep="\t",row.names=T,col.names=NA,quote=F)


#再将临床数据与免疫评分进行合并####
ESTIMATE_result<-read.table("ESTIMATE_result.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                            ,header=T)
clinical.ESTIMATE_result01A<-cbind(clinical01A,ESTIMATE_result)
write.csv(clinical.ESTIMATE_result01A,file="clinical.ESTIMATE_result01A.csv")




#自己尝试用R作分组箱式图####
setwd("TCGA-LUAD")
setwd("Clinical")
df<-read.csv(file="clinical.ESTIMATE_result01A.csv")
library(tidyverse)
df1<-df[complete.cases(df$ajcc_pathologic_stage),]
table(df1$ajcc_pathologic_stage)
#df4$ajcc_pathologic_m<-gsub("MX",NA,df4$ajcc_pathologic_m)#将TX值换位缺失值
#df1<-df1[complete.cases(df3$ajcc_pathologic_n),]#过滤掉了stage中的缺失值
df1<- df1[order(df1$ajcc_pathologic_stage), ]#使数据按顺序排列,以便于画图
library(ggplot2)
library(RColorBrewer)#这是R语言的调色板,可以选择绘图颜色
display.brewer.all()#查看调色板
mycol<-brewer.pal(n=2,name="Set2")#设置了四个颜色,用Set2为色调
mycol#查看我的调色板的代码名字
mycol<-c("#66C2A5" ,"#FC8D62", "#8DA0CB", "#E78AC3")#设置为集合
library(ggpubr)
stage_ESTIMATEScore<-ggboxplot( df1,
                              x="ajcc_pathologic_stage",
                              y="ESTIMATEScore",
                              #color="ajcc_pathologic_stage",#外边框颜色
                              palette=mycol,
                              legend="none",
                              #add="jitter",#添加样本点
                              outlier.shape=NA,
                              fill="ajcc_pathologic_stage",#颜色填充
                              title="stage",
                              xlab="stage",
                              ylab="ESTIMATEScore",
           size=0.5,)+stat_boxplot(geom="errorbar",width=0.5,size=0.1)+
  geom_boxplot(fill=mycol,size=0.1)+#将中轴线覆盖
  stat_compare_means(method="kruskal.test",label="p.signif")+
  stat_compare_means(comparisons=list(c("Stage I","Stage IV")),method="wilcox",label="p.format")
stage_ESTIMATEScore

#小提琴图
stage_ImmuneScore2<-ggviolin( df1,
                              x="ajcc_pathologic_stage",
                              y="ImmuneScore",
                              #color="ajcc_pathologic_stage",#外边框颜色
                              palette=mycol,
                              legend="none",
                              #add="jitter",#添加样本点
                              add="boxplot",#添加箱式图
                              alpha=0.5,#调整透明度
                              outlier.shape=NA,
                              fill="ajcc_pathologic_stage",#颜色填充
                              title="stage_ImmuneScore",
                              xlab="stage",
                              ylab="ImmuneScore",
                              size=0.1,)+stat_boxplot(geom="errorbar",width=0.3,size=0.1)+
  geom_boxplot(fill=mycol,size=0.1,width=0.3)+#将中轴线覆盖
  stat_compare_means(method="kruskal.test",label="p.signif")+
  stat_compare_means(comparisons=list(c("Stage I","Stage IV")),method="wilcox",label="p.format")
stage_ImmuneScore2



####差异分析####
setwd("TCGA-LUAD")
setwd("Immune_DEG")
library("BiocManager")
BiocManager::install("DESeq2")#DESeq2主要包括以下功能:
##数据归一化:DESeq2提供了多种数据归一化方法,如TMM(Trimmed Mean of M-values)归一化。
##差异分析:DESeq2使用负二项分布模型及贝叶斯估计方法,基于基因或转录本的计数数据,计算基因/转录本在不同条件之间的差异表达。差异分析结果包括差异表达基因/转录本的统计显著性和折变倍数等信息。
##数据可视化:DESeq2提供了丰富的数据可视化功能,包括MA图、PCA图、热图等,帮助用户更好地理解数据的特征和差异表达结果
library(DESeq2)
library(tidyverse)
counts_01A<-read.table("counts01A.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                       ,header=T)
###TCGA做差异分析时是使用的counts数据中肿瘤组
estimate<-read.table("ESTIMATE_result.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                     ,header=T)
x<-"ImmuneScore"
med<-as.numeric(median(estimate[,x]))
counts_01A2<-as.data.frame(t(counts_01A))
estimate2<-as.data.frame(t(estimate))
identical(rownames(counts_01A2),rownames(estimate))

conditions=data.frame(sample=rownames(counts_01A2),group=factor(ifelse(estimate[,x]>med,"high","low"),levels=c("low","high")))
conditions<-column_to_rownames(conditions,"sample")   

#接下来是差异分析的准备工作
dds<-DESeqDataSetFromMatrix(
  countData =counts_01A,#计数矩阵,列名为ID必须与colData数据行名一致
  colData = conditions,#要获取的数据的内容,即分组文件(如处理组和对照组)
  desig=~group)#以什么来将所获取的基因分组

#开始差异分析
dds<-DESeq(dds)
#DESeq()内部做了统计分析,我们得到差异基因。所以这也是为什么要用的计数矩阵是原始的计数矩阵,未被标准化处理过
resultsNames(dds)#查看一下结果是high比上low还是反之
res<-results(dds)
save(res,file="DEG_ImmuneScore.rda")                    


####绘制热图####
DEG<-as.data.frame(res)##结果中的log2Foldchange的结果就表示log2(某个基因在免疫评分高的样本的表达量/该基因在免疫评分低的样本中的表达量)
#读取基因表达谱
exp<-read.table("tpms01A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
           ,header=T)#Counts数据是原始的读取次数数据,而TPMs数据是通过归一化和标准化Count数据得到的相对表达量数据。TPMs数据更适合用于不同样本之间的比较和基因表达分析。
#添加上下调信息,因为我们需要真正具有高表达或低表达的才作为上调或下调,也就是要除去那些表达差异不明显的基因,
#~通常文章以log2(high/low)大于1作UP组,小于-1作DOWN组。即至少差异有2.7倍
a<-1
b<--1
type1<-(DEG$padj<0.05)&(DEG$log2FoldChange<b )
type2<-(DEG$padj<0.05)&(DEG$log2FoldChange>a)
DEG$change=ifelse(type1,"DOWN",ifelse(type2,"UP","NOT"))
table(DEG$change)

#install.packages("pheatmap")#画的图的R包
library(pheatmap)
DEG$change<-gsub("NOT",NA,DEG$change)#将我不需要的数据变为空值
table(DEG$change)
DEG<-DEG[complete.cases(DEG$change),]#将DEG中完整的行提取出来
DEG<-DEG[order(DEG$change),]#进行排序,实际不需要排序#以上步骤也可以用filter()函数筛选来做
d<-rownames(DEG)
exp_diff<-exp[d,]#这就是差异表达的基因
groups<-conditions#分组信息
a<-filter(groups,group=="high")
b<-filter(groups,group=="low")
exp_diff_high<-exp_diff[,rownames(a)]
exp_diff_low<-exp_diff[,rownames(b)]
exp_diff<-cbind(exp_diff_high,exp_diff_low)#将样本对称分为左右,左边样本为免疫评分高,右边为低
#开始画图
pheatmap(exp_diff,
         annotation_col=groups,
         scale="row",
         show_rownames=F,
         shou_colnames=F,
        color=colorRampPalette(c("#000080FF", "white", "#CD262680"))(100),# #热图色块颜色是从蓝到红分为100个等级
         cluster_cols=F,
         cluster_rows=T,
         fontsize=10,
         fontsize_row=3,
         fontsize_col=3)
original_color <- "#000080FF"  # 原始颜色为红色
adjusted_color <- adjustcolor(original_color,  1)  # 将颜色亮度调暗一半
adjusted_color






####差异分析基质评分####
setwd("TCGA-LUAD")
setwd("Stromal_DEG")
library("BiocManager")
#BiocManager::install("DESeq2")#DESeq2主要包括以下功能:
##数据归一化:DESeq2提供了多种数据归一化方法,如TMM(Trimmed Mean of M-values)归一化。
##差异分析:DESeq2使用负二项分布模型及贝叶斯估计方法,基于基因或转录本的计数数据,计算基因/转录本在不同条件之间的差异表达。差异分析结果包括差异表达基因/转录本的统计显著性和折变倍数等信息。
##数据可视化:DESeq2提供了丰富的数据可视化功能,包括MA图、PCA图、热图等,帮助用户更好地理解数据的特征和差异表达结果
library(DESeq2)
library(tidyverse)
counts_01A<-read.table("counts01A.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                       ,header=T)
###TCGA做差异分析时是使用的counts数据中肿瘤组
estimate<-read.table("ESTIMATE_result.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                     ,header=T)
x<-"StromalScore"
med<-as.numeric(median(estimate[,x]))
counts_01A2<-as.data.frame(t(counts_01A))
estimate2<-as.data.frame(t(estimate))
identical(rownames(counts_01A2),rownames(estimate))

conditions=data.frame(sample=rownames(counts_01A2),group=factor(ifelse(estimate[,x]>med,"high","low"),levels=c("low","high")))
conditions<-column_to_rownames(conditions,"sample")   

#接下来是差异分析的准备工作
dds<-DESeqDataSetFromMatrix(
  countData =counts_01A,#计数矩阵,列名为ID必须与colData数据行名一致
  colData = conditions,#要获取的数据的内容,即分组文件(如处理组和对照组)
  desig=~group)#以什么来将所获取的基因分组

#开始差异分析
dds<-DESeq(dds)
#DESeq()内部做了统计分析,我们得到差异基因。所以这也是为什么要用的计数矩阵是原始的计数矩阵,未被标准化处理过
resultsNames(dds)#查看一下结果是high比上low还是反之
res<-results(dds)
save(res,file="DEG_StromalScore.rda")                    


####绘制热图####
DEG<-as.data.frame(res)##结果中的log2Foldchange的结果就表示log2(某个基因在免疫评分高的样本的表达量/该基因在免疫评分低的样本中的表达量)
#读取基因表达谱
exp<-read.table("tpms01A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                ,header=T)#Counts数据是原始的读取次数数据,而TPMs数据是通过归一化和标准化Count数据得到的相对表达量数据。TPMs数据更适合用于不同样本之间的比较和基因表达分析。
#添加上下调信息,因为我们需要真正具有高表达或低表达的才作为上调或下调,也就是要除去那些表达差异不明显的基因,
#~通常文章以log2(high/low)大于1作UP组,小于-1作DOWN组。即至少差异有2.7倍
a<-1
b<--1
type1<-(DEG$padj<0.05)&(DEG$log2FoldChange<b )
type2<-(DEG$padj<0.05)&(DEG$log2FoldChange>a)
DEG$change=ifelse(type1,"DOWN",ifelse(type2,"UP","NOT"))
table(DEG$change)

#install.packages("pheatmap")#画的图的R包
library(pheatmap)
DEG$change<-gsub("NOT",NA,DEG$change)#将我不需要的数据变为空值
table(DEG$change)
DEG<-DEG[complete.cases(DEG$change),]#将DEG中完整的行提取出来
DEG<-DEG[order(DEG$change),]#进行排序,实际不需要排序#以上步骤也可以用filter()函数筛选来做
d<-rownames(DEG)
exp_diff<-exp[d,]#这就是差异表达的基因
groups<-conditions#分组信息
a<-filter(groups,group=="high")
b<-filter(groups,group=="low")
exp_diff_high<-exp_diff[,rownames(a)]
exp_diff_low<-exp_diff[,rownames(b)]
exp_diff<-cbind(exp_diff_high,exp_diff_low)#将样本对称分为左右,左边样本为免疫评分高,右边为低
#开始画图
pheatmap(exp_diff,
         annotation_col=groups,
         scale="row",
         show_rownames=F,
         shou_colnames=F,
         color=colorRampPalette(c("#000080FF", "white", "#CD262680"))(100),# #热图色块颜色是从蓝到红分为100个等级
         cluster_cols=F,
         cluster_rows=T,
         fontsize=10,
         fontsize_row=3,
         fontsize_col=3)
original_color <- "#000080FF"  # 原始颜色为红色
adjusted_color <- adjustcolor(original_color,  1)  # 将颜色亮度调暗一半
adjusted_color



####将两次差异分析的结果取交集####
setwd("TCGA-LUAD")
setwd("Immune_Stromal_DEG")
#提取免疫的上下调基因
load("DEG_ImmuneScore.rda")
DEG<-as.data.frame(res)
#添加上下调基因#和差异分析步骤一样
a<-1
b<--1
type1<-(DEG$padj<0.05)&(DEG$log2FoldChange<b )
type2<-(DEG$padj<0.05)&(DEG$log2FoldChange>a)
DEG$change=ifelse(type1,"DOWN",ifelse(type2,"UP","NOT"))
table(DEG$change)
#用filter()函数来删选提取出上下调基因的信息
library(tidyverse)
e<-filter(DEG,change=="UP")
f<-filter(DEG,change=="DOWN")
write.csv(e,file="Immune_up.csv")
write.csv(f,file="Immune_down.csv")

#基质的上下调基因也以同样的方式提取出来
load("DEG_StromalScore.rda")
DEG<-as.data.frame(res)
#添加上下调基因#和差异分析步骤一样
a<-1
b<--1
type1<-(DEG$padj<0.05)&(DEG$log2FoldChange<b )
type2<-(DEG$padj<0.05)&(DEG$log2FoldChange>a)
DEG$change=ifelse(type1,"DOWN",ifelse(type2,"UP","NOT"))
table(DEG$change)
#用filter()函数来删选提取出上下调基因的信息
library(tidyverse)
j<-filter(DEG,change=="UP")
h<-filter(DEG,change=="DOWN")
write.csv(j,file="Stromal_up.csv")
write.csv(h,file="Stromal_down.csv")


##用交集差异基因做(GO  KEGG)富集分析
setwd("TCGA-LUAD")
setwd("FUJI_Immune_Stromal_DEG")
library(tidyverse)
library(BiocManager)
#安装需要的包
BiocManager::install('clusterProfiler')
BiocManager::install('org.Hs.eg.db')
library(org.Hs.eg.db)
library(clusterProfiler)
##导入交集基因
#导入immune或stromal差异分析的结果,主要是为了获取各基因信息,对后面的评分高低不在乎
load("DEG_ImmuneScore.rda")
DEG<-as.data.frame(res)
DEG<-DEG[DEG_final$SYMBOL,]
DEG<-rownames_to_column(DEG,"SYMBOL")
genelist<-bitr(DEG$SYMBOL,fromType = "SYMBOL",
               toType = "ENTREZID",OrgDb = 'org.Hs.eg.db')#对基因名进行了ID转换
DEG<-inner_join(DEG,genelist,by="SYMBOL")


##GO分析####
ego<-enrichGO(gene =DEG$ENTREZID,
              OrgDb = org.Hs.eg.db,
              ont = "all",#包括,BP,MF ,CC
              pAdjustMethod = 'BH',#矫正方法
              minGSSize = 1,
              pvalueCutoff = 0.05,
              qvalueCutoff = 0.05,
              readable = TRUE)
ego_res<-ego@result
save(ego,ego_res,file = "GO_DEG_final.Rda")

####KEGG####
kk<-enrichKEGG(gene = DEG$ENTREZID,
               organism = "hsa",
               keyType = "kegg",
               pvalueCutoff = 0.1,
               qvalueCutoff = 0.1,)
library(DOSE)
kk<-DOSE::setReadable(kk,
                          OrgDb = org.Hs.eg.db,
                          keyType = "ENTREZID")
head(kk)
kk_res<-kk@result
save(kk,kk_res,file="KEGG_DEG_final.Rda")

#网络图
library(ggnewscale)
List=DEG$log2FoldChange#画图时需要的是离散型的向量,而不是数据框
names(List)=DEG$ENTREZID
head(List)
List=sort(List,decreasing = T)#降序排列
#GO
cnetplot(ego,foldChange=List,circular=TRUE,colorEdge = FALSE,node_label = "all")
#KEGG
cnetplot(kk,foldChange=List,circular=TRUE,colorEdge = FALSE,node_label = "all")


####自己尝试直方图####
#setwd("TCGA-LUAD")
#setwd("PPI")
#PPI<-read.csv(file="network_ppi.csv")
#library(ggplot2)
#ggplot(data=PPI,aes(x=name,y=Degree))+geom_point()+
#  labs(title="ppi",x="name",y="Degree")##直方图或条形图需要的是单变量样本,以统计数量为做Y轴


#COX回归####
setwd("TCGA-LUAD")
setwd("COX")
library(survival)
library(tidyverse)
#install.packages("forestplot")
library(forestplot)
#读取文件
exp_surv_01A<-read.table("exp_surv_01A.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                         ,header=T)
DEG_final<-read.table("DEG_final_venny.txt",sep="\t",check.names=F,stringsAsFactors = F
                      ,header=T)
a<-exp_surv_01A[,DEG_final$SYMBOL]
b<-exp_surv_01A[,1:2]
DEG_exp_surv<-cbind(b,a)
#开始cox单因素分析
Coxoutput<-NULL
for(i in 3:ncol(DEG_exp_surv)){
  g<-colnames(DEG_exp_surv)[i]
  cox<-coxph(Surv(OS.time,OS)~DEG_exp_surv[,i],data=DEG_exp_surv)
  coxSummary=summary(cox)
  
  #修改某列列名,colnames(数据框)[第几列]<-"修改后的列名"
  Coxoutput<-rbind.data.frame(Coxoutput,
                              data.frame(gene=g,
                                         HR=as.numeric(coxSummary$coefficients[,"exp(coef)"])[1],
                                         z=as.numeric(coxSummary$coefficients[,"z"])[1],
                                         pvalue=as.numeric(coxSummary$coefficients[,"Pr(>|z|)"])[1],
                                         lower=as.numeric(coxSummary$conf.int[,3][1]),
                                         upper=as.numeric(coxSummary$conf.int[,4][1]),
                                         stringsAsFactors = F),
                              stringsAsFactors = F)
}

Coxoutput<-arrange(Coxoutput,pvalue)
gene_sig<-Coxoutput[Coxoutput$pvalue<0.005,]#根据文章的要求来进行P值小于0.005进行提取
write.csv(gene_sig,file="gene_sig.csv")
topgene<-gene_sig
##接下来绘制森林图
tabletext<-cbind(c("Gene",topgene$gene),
                 c("HR",format(round(as.numeric(topgene$HR),3),nsmall=3)),
                 c("lower 95%CI",format(round(as.numeric(topgene$lower),3),nsmall=3)),
                 c("upper 95%CI",format(round(as.numeric(topgene$upper),3),nsmall=3)),
                 c("pvalue",format(round(as.numeric(topgene$p),3),nsmall=3)))

#绘制森林图
forest<-forestplot(labeltext=tabletext,
           mean=c(NA,as.numeric(topgene$HR)),
           lower=c(NA,as.numeric(topgene$lower)),
           upper=c(NA,as.numeric(topgene$upper)),
           graph.pos=5,
           graphwidth=unit(.25,"npc"),
           fn.ci_norm="fpDrawDiamondCI",
           col=fpColors(box="#A1D99B",lines="black",zero="#41AB5D"),
           boxsize=0.4,
           zero=1,
           lwd.xaxis=1,
           xlab="a",
           txt_gp=fpTxtGp(label = gpar(cex=1),
                          ticks=gpar(cex=1),
                          xlab=gpar(cex=1),
                          title=gpar(cex=1)),
           hrzl_lines=list("1"=gpar(lwd=1.5,col="black"),
                           "2"=gpar(lwd=1.5,col="black"),
                           "53"=gpar(lwd=1.5,col="black")),
           lineheight=unit(.75,"cm"),
           colgap=unit(0.3,"cm"),
           mar=unit(rep(1.5,times=4),"cm"),
           new_page=F)
forest
#install.packages("forestploter")
#library(forestploter)
#tabletext2<-topgene
#tabletext2$` `<-paste(rep("",7),collapse="")
#p<-forest(data=tabletext2[,c(1,5,6,7,4)],
 #         lower=tabletext2$lower,
  #        upper=tabletext2$upper,
   #       est=tabletext2$HR,
    #      ci_column=4)
#print(p)
#forest1<-edit_plot(forest,
 #                  row=topgene$HR>1,
  #                 col=4,
   #                gp=gpar(col="red"))


setwd("TCGA-LUAD")
setwd("BTK")
library(tidyverse)
tpms01A<-read.table("tpms01A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
           ,header=T)
tpms11A<-read.table("tpms11A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
           ,header=T)
gene<-"BTK"
tpms01A<-tpms01A[gene,]
tpms11A<-tpms11A[gene,]
tpms01A<-tpms01A%>%t()%>%as.data.frame()
tpms11A<-tpms11A%>%t()%>%as.data.frame()
write.csv(tpms01A,file="BTK_01A.csv")
write.csv(tpms11A,file="BTK_11A.csv")

#
btk_01_11<-read.csv(file="BTKbar.csv")
library(ggplot2)
library(dplyr)
btk_01_11<-arrange(btk_01_11,desc(X01A_11A))
a<-ggplot(data=btk_01_11,aes(x=X01A_11A,y=BTK))+geom_boxplot()+
  geom_point(position="jitter",
             aes(color=X01A_11A))
a
##
BTK_01A<-read.csv(file="BTK_01A.csv")
BTK_11A<-read.csv(file="BTK_11A.csv")
rownames(BTK_01A)<-NULL
BTK_01A<-BTK_01A%>%as.data.frame%>%column_to_rownames("X")
rownames(BTK_11A)<-NULL
BTK_11A<-BTK_11A%>%as.data.frame%>%column_to_rownames("X")
rownames(BTK_01A)<-substring(rownames(BTK_01A),1,12)
rownames(BTK_11A)<-substring(rownames(BTK_11A),1,12)
BTK_peidui<-cbind(BTK_01A,BTK_11A)

a<-intersect(rownames(BTK_01A),rownames(BTK_11A))
btk_01a<-BTK_01A[a,,drop=F]
btk_11a<-BTK_11A[a,,drop=F]#加上drop=F保证提取出来的数据任然为数据框
BTK_peidui<-cbind(btk_01a,btk_11a)
write.csv(BTK_peidui,file="BTK_peidui.csv")#用EXCEL进行修改
BTK_peidui<-read.csv(file="BTK_peidui.csv")

#画配对图
ggplot(data=BTK_peidui,aes(x=SAMPLE,y=BTK))+
  geom_point(aes(color=SAMPLE))+
  geom_line(aes(group=group))
  



#BTK的生存分析####
setwd("TCGA-LUAD")
setwd("BTK_surv")
surv01A<-read.table("exp_surv_01A.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                    ,header=T)
surv01A$OS.time<-surv01A$OS.time/365#将生存时间从天变为年,利于后续分析





surv01A$group<-ifelse(surv01A$BTK>median(surv01A$BTK),"High","Low")
#该函数添加的high和low都是字符形式的,而非因子形式,故无法做二分类变量判断
#此次的评分分组为关键,分组不同所做的生存分析标准不同


class(surv01A$group)
surv01A$group<-factor(surv01A$group,levels=c("Low","High"))
class(surv01A$group)
table(surv01A$group)

#install.packages("survival")#安装做生存分析的包
library(survival)
fitd<-survdiff(Surv(OS.time,OS)~group,
               data=surv01A,
               na.action = na.exclude)#na.omit:这个操作会从数据中删除任何包含缺失值的行。
#~na.fail:这个操作会在数据中存在缺失值时导致模型失败。
#~na.exclude:这个操作会将包含缺失值的行从分析中排除,但不从数据中删除。
pValue<-1-pchisq(fitd$chisq,length(fitd$n)-1)#该步骤是用来做卡方检验P值
#~与统计学上卡方检验一样,小于0.01才具有统计学意义


#拟合生存曲线
fit<-survfit(Surv(OS.time,OS)~group,data=surv01A)
summary(fit)
p.lab<-paste0("P",ifelse(pValue<0.001,"<0.001",paste0("=",round(pValue,3))))
#该步只是将到的P值规范地写下来
#install.packages("survminer")
library(survminer)
ggsurvplot(
  fit,
  data = surv01A,
  palette = "jco",#配色采用Jco,lancet柳叶刀配色,jama是jama期刊的配色
  pval = p.lab,
  conf.int = TRUE,#显示置信区间
  risk.table = TRUE,#显示风险表
  risk.table.col="strata",
  legend.labs=c("Low","High"),#图例
  size=1,
  xlim=c(0,20),#x轴长度,根据自己数据中OS.time的时间来决定,此数据中最大为19年多,
  #故用20作X轴长度,可用range函数判断自己数据范围
  break.time.by=5,#X轴步长为5
  legend.title="BTK",#TITLE
  surv.median.line = "hv",#限制垂直和水平的中位生存
  ylab="Survival probability(%)",#修改Y轴标签
  xlab="Time(Years)",#修改x轴标签
  ncensor.plot=TRUE,#显示缺失图块
  ncensor.plot.height=0.25,
  risk.table.y.text=FALSE)

##自己代码做分组比较

df<-read.table("clinical.expr01A.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
           ,header=T)
library(tidyverse)
df1<-df[complete.cases(df$ajcc_pathologic_stage),]
table(df1$ajcc_pathologic_stage)
#df4$ajcc_pathologic_m<-gsub("MX",NA,df4$ajcc_pathologic_m)#将TX值换位缺失值
#df1<-df1[complete.cases(df3$ajcc_pathologic_n),]#过滤掉了stage中的缺失值
df1<- df1[order(df1$ajcc_pathologic_stage), ]#使数据按顺序排列,以便于画图
library(ggplot2)
library(RColorBrewer)#这是R语言的调色板,可以选择绘图颜色
display.brewer.all()#查看调色板
mycol<-brewer.pal(n=4,name="Set2")#设置了四个颜色,用Set2为色调
mycol#查看我的调色板的代码名字
mycol<-c("#66C2A5" ,"#FC8D62", "#8DA0CB", "#E78AC3")#设置为集合
library(ggpubr)
stage<-ggboxplot( df1,
                                x="ajcc_pathologic_stage",
                                y="BTK",
                                #color="ajcc_pathologic_stage",#外边框颜色
                                palette=mycol,
                                legend="none",
                                #add="jitter",#添加样本点
                                outlier.shape=NA,
                                fill="ajcc_pathologic_stage",#颜色填充
                                title="stage",
                                xlab="stage",
                                ylab="BTK",
                                size=0.5,)+stat_boxplot(geom="errorbar",width=0.5,size=0.1)+
  geom_boxplot(fill=mycol,size=0.1)+#将中轴线覆盖
  stat_compare_means(method="kruskal.test",label="p.signif")+
  stat_compare_means(comparisons=list(c("Stage I","Stage IV")),method="wilcox",label="p.format")
stage

#t

df1<-df[complete.cases(df$ajcc_pathologic_t),]
table(df1$ajcc_pathologic_t)
df1$ajcc_pathologic_t<-gsub("TX",NA,df1$ajcc_pathologic_t)#将TX值换位缺失值
df1<-df1[complete.cases(df1$ajcc_pathologic_t),]#过滤掉了stage中的缺失值
df1<- df1[order(df1$ajcc_pathologic_t), ]#使数据按顺序排列,以便于画图
table(df1$ajcc_pathologic_t)
library(RColorBrewer)#这是R语言的调色板,可以选择绘图颜色
display.brewer.all()#查看调色板
mycol<-brewer.pal(n=4,name="Set2")#设置了四个颜色,用Set2为色调
mycol#查看我的调色板的代码名字
mycol<-c("#66C2A5" ,"#FC8D62", "#8DA0CB", "#E78AC3")#设置为集合
library(ggpubr)
tclassification <-ggboxplot( df1,
                                x="ajcc_pathologic_t",
                                y="BTK",
                                #color="ajcc_pathologic_stage",#外边框颜色
                                palette=mycol,
                                legend="none",
                                #add="jitter",#添加样本点
                                outlier.shape=NA,
                                fill="ajcc_pathologic_t",#颜色填充
                                title="T Classification",
                                xlab="T",
                                ylab="BTK",
                                size=0.5,)+stat_boxplot(geom="errorbar",width=0.5,size=0.1)+
  geom_boxplot(fill=mycol,size=0.1)+#将中轴线覆盖
  stat_compare_means(method="kruskal.test",label="p.signif")+
  stat_compare_means(comparisons=list(c("T1","T4")),method="wilcox",label="p.format")
tclassification


#n
df1<-df[complete.cases(df$ajcc_pathologic_n),]
table(df1$ajcc_pathologic_n)
df1$ajcc_pathologic_n<-gsub("NX",NA,df1$ajcc_pathologic_n)#将TX值换位缺失值
df1<-df1[complete.cases(df1$ajcc_pathologic_n),]#过滤掉了stage中的缺失值
df1<- df1[order(df1$ajcc_pathologic_n), ]#使数据按顺序排列,以便于画图
table(df1$ajcc_pathologic_n)
library(RColorBrewer)#这是R语言的调色板,可以选择绘图颜色
display.brewer.all()#查看调色板
mycol<-brewer.pal(n=4,name="Set2")#设置了四个颜色,用Set2为色调
mycol#查看我的调色板的代码名字
mycol<-c("#66C2A5" ,"#FC8D62", "#8DA0CB", "#E78AC3")#设置为集合
library(ggpubr)
nclassification <-ggboxplot( df1,
                             x="ajcc_pathologic_n",
                             y="BTK",
                             #color="ajcc_pathologic_stage",#外边框颜色
                             palette=mycol,
                             legend="none",
                             #add="jitter",#添加样本点
                             outlier.shape=NA,
                             fill="ajcc_pathologic_n",#颜色填充
                             title="N Classification",
                             xlab="N",
                             ylab="BTK",
                             size=0.5,)+stat_boxplot(geom="errorbar",width=0.5,size=0.1)+
  geom_boxplot(fill=mycol,size=0.1)+#将中轴线覆盖
  stat_compare_means(method="kruskal.test",label="p.signif")+
  stat_compare_means(comparisons=list(c("N0","N3")),method="wilcox",label="p.format")
nclassification

#m

df1<-df[complete.cases(df$ajcc_pathologic_m),]
table(df1$ajcc_pathologic_m)
df1$ajcc_pathologic_m<-gsub("MX",NA,df1$ajcc_pathologic_m)#将TX值换位缺失值
df1<-df1[complete.cases(df1$ajcc_pathologic_m),]#过滤掉了stage中的缺失值
df1<- df1[order(df1$ajcc_pathologic_m), ]#使数据按顺序排列,以便于画图
table(df1$ajcc_pathologic_m)
library(RColorBrewer)#这是R语言的调色板,可以选择绘图颜色
display.brewer.all()#查看调色板
mycol<-brewer.pal(n=2,name="Set2")#设置了四个颜色,用Set2为色调
mycol#查看我的调色板的代码名字
mycol<-c("#66C2A5" ,"#FC8D62")#设置为集合
library(ggpubr)
mclassification <-ggboxplot( df1,
                             x="ajcc_pathologic_m",
                             y="BTK",
                             #color="ajcc_pathologic_stage",#外边框颜色
                             palette=mycol,
                             legend="none",
                             #add="jitter",#添加样本点
                             outlier.shape=NA,
                             fill="ajcc_pathologic_m",#颜色填充
                             title="M Classification",
                             xlab="M",
                             ylab="BTK",
                             size=0.5,)+stat_boxplot(geom="errorbar",width=0.5,size=0.1)+
  geom_boxplot(fill=mycol,size=0.1)+#将中轴线覆盖
  stat_compare_means(method="kruskal.test",label="p.signif")+
  stat_compare_means(comparisons=list(c("M0","M1")),method="wilcox",label="p.format")
mclassification

#查看四组图
stage
tclassification
nclassification
mclassification



#GESA分析####
setwd("TCGA-LUAD")
setwd("BTK_DEG")
library("BiocManager")
#BiocManager::install("DESeq2")#DESeq2主要包括以下功能:
##数据归一化:DESeq2提供了多种数据归一化方法,如TMM(Trimmed Mean of M-values)归一化。
##差异分析:DESeq2使用负二项分布模型及贝叶斯估计方法,基于基因或转录本的计数数据,计算基因/转录本在不同条件之间的差异表达。差异分析结果包括差异表达基因/转录本的统计显著性和折变倍数等信息。
##数据可视化:DESeq2提供了丰富的数据可视化功能,包括MA图、PCA图、热图等,帮助用户更好地理解数据的特征和差异表达结果
library(DESeq2)
library(tidyverse)
counts_01A<-read.table("counts01A.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                       ,header=T)
###TCGA做差异分析时是使用的counts数据中肿瘤组
exp<-read.table("tpms01A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                     ,header=T)
x<-"BTK"
med<-median(as.numeric(exp[x,]))
counts_01A2<-as.data.frame(t(counts_01A))
exp2<-as.data.frame(t(exp))
identical(rownames(counts_01A2),rownames(exp2))

conditions=data.frame(sample=rownames(counts_01A2),group=factor(ifelse(exp2[,x]>med,"high","low"),levels=c("low","high")))
conditions<-column_to_rownames(conditions,"sample")   

#接下来是差异分析的准备工作
dds<-DESeqDataSetFromMatrix(
  countData =counts_01A,#计数矩阵,列名为ID必须与colData数据行名一致
  colData = conditions,#要获取的数据的内容,即分组文件(如处理组和对照组)
  desig=~group)#以什么来将所获取的基因分组

#开始差异分析
dds<-DESeq(dds)
#DESeq()内部做了统计分析,我们得到差异基因。所以这也是为什么要用的计数矩阵是原始的计数矩阵,未被标准化处理过
resultsNames(dds)#查看一下结果是high比上low还是反之
res<-results(dds)
save(res,file="BTK_DEG.rda")                    


#数据整理,只要log2fc的分组和基因名即可
library(org.Hs.eg.db)
library(clusterProfiler)


DEG<-as.data.frame(res)
DEG<-arrange(DEG,padj)

DEG<-rownames_to_column(DEG,"SYMBOL")
geneList=DEG[,3]#log2fc进行提取,下面是排序
names(geneList)=as.character(DEG[,"SYMBOL"])
head(geneList)
geneList=sort(geneList,decreasing = TRUE)#降序排列
head(geneList)



#msigdbr包对富集数据提取
#H基因集进行提取分析
#BiocManager::install("msigdbr")
library(msigdbr)
h_gene_sets<-msigdbr(species="Homo sapiens",category="H")%>%
  dplyr::select(gs_name,gene_symbol)
head(h_gene_sets)

gsea<-GSEA(geneList,TERM2GENE =h_gene_sets )
gsea_result_df<-as.data.frame(gsea)
save(gsea,gsea_result_df,file="GSEA_BTK_h.all.rda")

#绘图
library(enrichplot)
gseaplot2(gsea,1,color="red",pvalue_table = T)#数据内的NES是峰值,根据NES分上下弯曲
H<-gseaplot2(gsea,geneSetID = c(1,2,3,4,5,7,8,11),subplots=1:3)
H
H2<-gseaplot2(gsea,geneSetID = c(6,9,10,12,13),subplots=1:3)
H2

#C7(免疫类)基因集进行提取分析

c7_gene_sets<-msigdbr(species="Homo sapiens",category="C7")%>%
  dplyr::select(gs_name,gene_symbol)
head(c7_gene_sets)

gsea<-GSEA(geneList,TERM2GENE =c7_gene_sets )
gsea_result_df<-as.data.frame(gsea)
save(gsea,gsea_result_df,file="GSEA_BTK_c7.all.rda")

#绘图
library(enrichplot)
c7_1<-gseaplot2(gsea,geneSetID =1:7,subplots=1:3)
c7_2<-gseaplot2(gsea,825,color="blue",pvalue_table = T)
c7_1
c7_2



免疫浸润分析#####

#install.packages("devtools")
#library(devtools)
#if(!require(CIBERSORT))devtools::install_github("Moonerss/CIBERSORT")
setwd("TCGA-LUAD")
setwd("CIBERSORT")
#library(CIBERSORT)
#source("CIBERSORT.R")<-CIBERSORT("LM22.txt","tpms01A.txt",perm=1000,QN=T)
install.packages("e1071")
install.packages("parallel")
BiocManager::install("preprocessCore")
library(e1071)
library(parallel)
library(preprocessCore)
library(tidyverse)
source("CIBERSORT.R")
sig_matrix<-"LM22.txt"
mixture_file="tpms01A.txt"
res_cibersort<-CIBERSORT(sig_matrix,mixture_file,perm = 100,QN=TRUE)
res_cibersort<-res_cibersort[,1:22]#将最后三列不需要的统计结果删去
ciber.res<-res_cibersort[,colSums(res_cibersort)>0]
ciber.res<-as.data.frame(ciber.res)
write.table(ciber.res,"ciber.res.txt",sep="\t",row.names=T,col.names=NA,quote=F)


#cibersort彩虹图
library(ggplot2)
mycol<-ggplot2::alpha(rainbow(ncol(ciber.res)),0.7)
par(bty="o",mgp=c(2.5,0.3,0),mar=c(2.1,4.1,2.1,10.1),tcl=-.25,las=1,xpd=F)
barplot(as.matrix(t(ciber.res)),
        border = NA,#柱子边框
        names.arg=rep("",nrow(ciber.res)),
        yaxt="n",
        ylab="Relative percentage",
        col=mycol)+
  axis(side=2,at=c(0,0.2,0.4,0.6,0.8,1),
       labels=c("0%","20%","40%","60%","80%","100%"))+
  legend(par("usr")[2]-20,
         par("usr")[4],
         legend = colnames(ciber.res),
         xpd=T,
         fill=mycol,
         cex=0.6,
         border=NA,
         y.intersp = 1,
         x.intersp = 0.2,
         bty="n")
#分组比较图
a<-ciber.res
exp<-read.table("tpms01A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                ,header=T)
med=median(as.numeric(exp["BTK",]))
exp<-exp%>%t()%>%as.data.frame()
exp<-exp%>%mutate(group=factor(ifelse(exp$BTK>med,"high","low"),levels=c("low","high")))#mutate是直接给数据框新增一列的函数
class(exp$group)
identical(rownames(a),rownames(exp))
a$group<-exp$group
a<-rownames_to_column(a,"sample")
library(ggsci)
library(tidyr)
library(ggpubr)
b<-gather(a,key=CIBERSORT,value = Fraction,-c(group,sample))
ggboxplot(b,x="CIBERSORT",y="Fraction",
          fill="group",palette="lancet")+
  stat_compare_means(aes(group=group),
                     method="wilcox.test",
                     label="p.signif",
                     symnum.args = list(cutpoints=c(0,0.001,0.01,0.05,1),
                                        symbols=c("***","**","*","ns")))+
  theme(text=element_text(size=10),
        axis.text.x = element_text(angle = 45,hjust=1))


#相关性热土
install.packages("ggstatsplot")
install.packages("ggcorrpolt")
install.packages("corrplot")
library(ggstatsplot)
library(ggcorrplot)
library(corrplot)
cor<-sapply(ciber.res,function(x,y) cor(x,y,method = "spearman"),ciber.res)
rownames(cor)<-colnames(ciber.res)

ggcorrplot(cor,
           hc.order=TRUE,#使用hc.order排序
           type="lower",
           outline.color="white",
           lab=TRUE,
           color=c("#01468b","white","#ee0000"))




library(tidyverse)
exp<-read.table("tpms01A_log2.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                ,header=T)
exp<-exp["BTK",]
ciber<-read.table("ciber.res.txt",sep="\t",row.names=1,check.names=F,stringsAsFactors = F
                ,header=T)
ciber<-ciber%>%t()%>%as.data.frame()
identical(colnames(ciber),colnames(exp))
exp_ciber<-rbind(exp,ciber)
exp_ciber<-exp_ciber%>%t()%>%as.data.frame()
colnames(exp_ciber)<-gsub(" ",".",colnames(exp_ciber))#将空格变为点才能画图
install.packages("ggside")
library(ggstatsplot)
library(ggside)
ggscatterstats(data=exp_ciber,
               y=BTK,
               x=B.cells.naive,
               type="nonparametric",
               margins="both",
               xfill="blue",
               yfill="red",
               marginal.type="densigram")

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当涉及到现diffusion算法的代码时,我需要确一下您指的是哪个具体的diffusion算法。Diffusion算法是一种用于图像处理和计算机视觉任务的图像扩散方法,有多种不同的变体和实现方式。 以下是一个简单的示例,展示了如何使用Python和OpenCV库来实现基于Diffusion的图像去噪算法: ```python import cv2 def diffusion_denoising(image, iterations, kappa, delta): # 将图像转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将灰度图转换为浮点型 gray = gray.astype(float) # 迭代应用Diffusion算法 for _ in range(iterations): # 计算梯度 grad_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) grad_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # 计算梯度的平方和 grad_xx = cv2.multiply(grad_x, grad_x) grad_yy = cv2.multiply(grad_y, grad_y) grad_xy = cv2.multiply(grad_x, grad_y) # 应用Diffusion公式 laplacian = cv2.Laplacian(gray, cv2.CV_64F) diffusion = kappa * (grad_xx + grad_yy) - delta * laplacian # 更新图像 gray += diffusion # 将浮点型图像转换为8位灰度图 denoised = cv2.convertScaleAbs(gray) return denoised # 读取图像 image = cv2.imread('input.jpg') # 调用Diffusion去噪函数 denoised_image = diffusion_denoising(image, iterations=10, kappa=0.1, delta=0.2) # 显示原始图像和去噪后的图像 cv2.imshow('Original Image', image) cv2.imshow('Denoised Image', denoised_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这只是一个简单的示例,实际的Diffusion算法可能有更杂的实现方式和参数设置。具体的现代码可能会因算法的不同而有所变化。如果您有特定的Diffusion算法或代码实现要求,请提供更多详细信息,以便我能够更好地帮助您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值