教小高改bug

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: :: 管理 ::

生存分析只需要tumor数据,不要normal,将其去掉,新表达矩阵数据命名为exprSet;
clinical信息需要进一步整理,成为生存分析需要的格式,新临床信息数据命名为meta。
由于不同癌症的临床信息表格组织形式不同,这里的代码需要根据实际情况修改。

rm(list = ls())
options(stringsAsFactors = F)
library(stringr)
setwd("D:/BioInformationAnalyze/TCGAdata/CRC")  # 设置工作目录(需修改)
load("TCGA-COAD_01.2.lncRNA_Expdata_tpm.Rdata") # 表达矩阵 tpm形式
load("TCGA-COAD_02.lncRNA_Clinical.Rdata") # 临床信息
load("TCGA-COAD_03.2.lncRNA_cg.Rdata") # 差异基因

临床数据整理

tmp <- data.frame(colnames(clinical))
clinical <-  clinical[, c(
  "bcr_patient_barcode", # 病人id
  "vital_status", # 生存状态:存活/死亡
  "days_to_death", # 从初次病理诊断日期到死亡日期的天数
  "days_to_last_followup", # 从初次病理诊断日期到最后一次随访日期的天数
  "race_list", # 人种
  "age_at_initial_pathologic_diagnosis", # 初次病理诊断年龄,没有这一列的话可以用days_to_birth/365计算
  "gender" , # 性别
  "stage_event" # 分级,6th和7th代表第6/7代分级标准
)]
# rownames(clinical) <- NULL
rownames(clinical) <- clinical$bcr_patient_barcode
meta <- clinical[clinical$days_to_death != 0,] # 去除诊断时已经死亡的病人
# 简化meta的列名
colnames(meta) <- c("ID", "event", "death", "last_followup", "race", "age", "gender", "stage")

表达矩阵整理

exprSet <- exp[cg, group_list == "tumor"] # 从表达矩阵中提取癌症样本的差异基因表达量。
# 因为cg是由counts数据得来的,而生存分析用的exp是tpm形式的,所以取交集就会有NA,下一步先去掉全是NA的行。
exprSet <- exprSet[apply(exprSet, 1, function(y) any(!is.na(y))), ] # 去除全是NA的行
table(str_sub(colnames(exprSet),1,12) %in% meta$ID) # 表达矩阵和临床信息的匹配情况
exprSet <- exprSet[, str_sub(colnames(exprSet),1,12) %in% meta$ID] # 从表达矩阵中挑选有临床信息的样本
exprSet <- exprSet[, str_sort(colnames(exprSet))] # 表达矩阵按列名排序
exprSet <- exprSet[, !duplicated(str_sub(colnames(exprSet),1,12) )] # 表达矩阵去重,每个病人只保留一个肿瘤样本

#调整meta的ID顺序与exprSet列名一致
meta <- meta[match(str_sub(colnames(exprSet),1,12), meta$ID), ] # 调整排序并去除没有肿瘤样本的病人
all(meta$ID == str_sub(colnames(exprSet),1,12)) # 确保顺序完全一致

整理生存分析的输入数据

# 1.由随访时间和死亡时间计算生存时间(天)
is.empty.chr <- function(x){
  ifelse(stringr::str_length(x) == 0, T, F)
} # 建立函数来判断字符串是否为空
is.empty.chr(meta[2,3]) # 判断函数可行性
meta[,3][is.empty.chr(meta[,3])] = 0 # 将“death”列的空字符串改为0
meta[,4][is.empty.chr(meta[,4])] = 0 # 将“last_followup”列的空字符串改为0
meta$time <- (as.numeric(meta[,3]) + as.numeric(meta[,4])) # 由随访时间和死亡时间计算生存时间(天)

# 2.根据生死定义event,活着是0,死的是1
meta$event <- ifelse(meta$event == "Alive", 0, 1)

# 3.年龄和年龄分组
meta$age <- as.integer(meta$age)
meta$age_group <- ifelse(meta$age > median(meta$age), "older", "younger")

# 4.stage 
# 关键在于定位T的位置
tmp <- str_split(meta$stage, " ", simplify = T)[,2] # 按空格分开再取后者,但有个别是空字符串
meta$stage[str_count(tmp, "T") == 0] # 查看空字符串的原因,是因为没有空格
tmp <- str_replace(meta$stage, "thT", "th T") # 将th和T分开
tmp <- str_split(tmp, " ", simplify = T)[,2] # 再分一次

table(str_count(tmp,"T")) # 看看还有没有没有T的
table(str_locate(tmp,"T")[,1]) # 看看T在哪个位置
tmp <- str_sub(tmp, 1, str_locate(tmp,"T")[,1]-1)
table(tmp)
table(is.na(tmp))
meta$stage <- tmp

# 5.race
table(meta$race)

save(meta, exprSet, cancer_type, file = paste0(cancer_type, "_04.lncRNA_SurvData.Rdata"))  # 得到做生存分析的数据,包括K-M曲线和Cox回归。

想要TNM分期的话,代码同stage

 

可以先做Lasso回归对自变量进行降维:

# lasso回归数据
datExpr <- as.data.frame(with(meta, cbind(event, time, t(exprSet))))
rownames(datExpr) <- str_sub(rownames(datExpr),1,12)
save(datExpr, cancer_type, file = paste0(cancer_type, "_04.lncRNA_SurvModel_LassoData.Rdata"))

  

 

posted on 2023-02-01 16:19  小高不高  阅读(1105)  评论(1编辑  收藏  举报