背景:要做癌症的分子分型。现需要对照临床特征。
已有一组数据,需要学习其值的含义,并适当处理这些数据。
数据如下,每行是一名患者:
为了聚类,需要计算距离,将所有值处理为数字会跟方便。因此需要了解各个值的意思。
age:可以保持。要或不要都行。
gender: 因为是binary的,只有两种取值,所以直接用0和1即可。
运行一下代码:
data <- read.csv("data/TCGAClinical.csv", encoding="UTF-8",sep=",")
# 对每一列,提取所有unique的取值
for (i in c(4:ncol(data))){
cat(sprintf("%d. %s: \n",i,colnames(data)[i]))
n_occur <- data.frame(table(data[,i]))
print(n_occur[n_occur$Freq > 1,]) #告诉你哪些id发生了多次。
cat("\n\n")
}
Primary Tumor Site (原发肿瘤部位)
有如下8类
id | Value | 说明 | Freq |
---|---|---|---|
1 | Ascending Colon | 升直肠,上行直肠 | |
2 | Cecum | 盲肠 | |
3 | Descending Colon | 下行结肠 | |
4 | Hepatic Flexure | 结肠右曲 | |
6 | Sigmoid Colon | 乙状结肠 | |
7 | Splenic Flexure | 结肠左曲 | |
8 | Transverse Colon | 横行结肠 |
不是binary,各个部位之间不好描述相似性,弄成正交的onehot。
TNM分期
TNM分期系统是目前国际上最为通用的肿瘤分期系统。
I期的肿瘤通常是相对早期的肿瘤有着相对较好的预后。分期越高意味着肿瘤进展程度越高。
- T(“T”是肿瘤一词英文“Tumor”的首字母)指肿瘤原发灶的情况,随着肿瘤体积的增加和邻近组织受累范围的增加,依次用T1~T4来表示。
- N(“N”是淋巴结一词英文“Node”的首字母)指区域淋巴结(regional lymph node)受累情况。淋巴结未受累时,用N0表示。随着淋巴结受累程度和范围的增加,依次用N1~N3表示,
- M(“M”是转移一词英文“metastasis”的首字母)指远处转移(通常是血道转移),没有远处转移者用M0表示,有远处转移者用M1表示。在此基础上,用TNM三个指标的组合(grouping)划出特定的分期(stage)。
T原发病灶的侵犯深度(即进展程度):
(“T”是肿瘤一词英文“Tumor”的首字母)指肿瘤原发灶
首先数字越大越严重,字母参考结直肠癌TNM分期(第八版),也是越大越严重。
因此考虑用一个数值来表示,给分。
注意我们的结果里面有T4,也有T4a, T4b. T4 暂时不清楚是a还是b。
id | Value | 给分 | Freq |
---|---|---|---|
1 | T1 | 2 | 11 |
2 | T2 | 4 | 66 |
3 | T3 | 6 | 285 |
4 | T4 | 7.5 | 26 |
5 | T4a | 7 | 14 |
6 | T4b | 8 | 7 |
N: 癌细胞转移到淋巴结的情况
N(“N”是淋巴结一词英文“Node”的首字母)
id | Value | 给分 | Freq |
---|---|---|---|
1 | N0 | 0 | 236 |
2 | N1 | 2 | 72 |
3 | N1a | 1 | 15 |
4 | N1b | 2 | 12 |
5 | N1c | 3 | 2 |
6 | N2 | 4.5 | 58 |
7 | N2a | 4 | 5 |
8 | N2b | 5 | 10 |
M: 远处转移情况(M分期)(包括远处淋巴结转移、远隔脏器转移和血液转移)
M(“M”是转移一词英文“metastasis”的首字母)
id | Value | 给分 | Freq |
---|---|---|---|
1 | M0 | 0 | 306 |
2 | M1 | 2 | 48 |
3 | M1a | 1 | 7 |
5 | MX | NA | 41 |
Stage:
这看起来像是冗余数据,因为stage可以由TNM推出。
参考文献:TNM分级和分期的关系
id | Value | 说明 | Freq |
---|---|---|---|
1 | I | 63 | |
3 | II | 27 | |
4 | IIA | 123 | |
5 | IIB | 8 | |
7 | III | 19 | |
8 | IIIA | 11 | |
9 | IIIB | 57 | |
10 | IIIC | 37 | |
11 | IV | 41 | |
12 | IVA | 14 |
Overall Survival (monthes)
总生存(overallsurvival,OS) :从随机化分组开始,至因任何原因引起死亡的时间。对于死亡之前就已经失访的受试者,通常将最后一次随访时间计算为死亡时间。(包括非肿瘤原因引起的死亡,如车祸)
overall survival和disease free的参考链接
看起来是一个数值。应该保持原样即可。
9. Overall.Survival…Months.:
Var1 Freq
1 0 16
5 0.92 3
7 0.99 4
8 1.02 7
12 2 6
…
Overall.Survival.Status:
要不问一下雷博是啥意思。
考虑使用“生存分析” survival analysis 关键词进行搜索。
根据此链接
生存状态(布尔值):0-Alive;1-Dead
id | Value | 说明 | Freq |
---|---|---|---|
1 | 0 | 319 | |
2 | 1 | 91 |
Disease Free( Months)
overall survival和disease free的参考链接
无病生存期(DFS,Disease Free Survival):是指从随机化开始至第一次肿瘤复发/转移或由于任何原因导致受试者死亡的时间(失访患者为最后一次随访时间;研究结束时仍然存活患者,为随访结束日)。通常作为根治术后的主要疗效指标。目前对DFS存在不同定义和解释,不同研究者之间在判断疾病复发或进展时容易产生偏倚。
看起来就是从开始记录,到肿瘤复发/转移的时间。
11. Disease.Free…Months.:
Var1 Freq
1 0 12
6 0.92 3
8 0.99 3
9
Disease.Free.Status:
没找到。
估计就是
0是没有复发吧。
id | Value | 说明 | Freq |
---|---|---|---|
1 | 0 | 307 | |
2 | 1 | 81 |
microsatelite:
微卫星参考链接
那就是分级的吧。
id | Value | 给分 | Freq |
---|---|---|---|
1 | MSI-H | 2 | 78 |
2 | MSI-L | 1 | 80 |
3 | MSS | 0 | 252 |
数据处理
分数统计好了,就开始替换了:
# ###------- 数值化-----------#
# gender
colnames(data)
colnames(data)[3] # 发现性别类名为female,应改为gender
colnames(data)[3]="gender"
colnames(data)
data$gender = (tolower(data$gender) == "male" )
data$gender = as.numeric(data$gender)
head(data$gender)
# T
data$T = gsub("T1","2", data$T)
data$T = gsub("T2","4", data$T)
data$T = gsub("T3","6", data$T)
data$T = gsub("T4a","7", data$T)
data$T = gsub("T4b","8", data$T)
data$T = gsub("T4","7.5", data$T)
data$T = as.numeric(data$T)
head(data$T)
# N
data$N = gsub("N0","0", data$N)
data$N = gsub("N1a","1", data$N)
data$N = gsub("N1b","2", data$N)
data$N = gsub("N1c","3", data$N)
data$N = gsub("N1","2", data$N)
data$N = gsub("N2a","4", data$N)
data$N = gsub("N2b","5", data$N)
data$N = gsub("N2","4.5", data$N)
data$N = as.numeric(data$N)
head(data$N)
# M
data$M = gsub("M0","0",data$M)
data$M = gsub("M1a","1",data$M)
data$M = gsub("M1","2",data$M)
# MX leave alone
data$M = as.numeric(data$M)
head(data$M)
# microsatelite
data$microsatelite = gsub("MSI-H","2",data$microsatelite )
data$microsatelite = gsub("MSI-L","1",data$microsatelite )
data$microsatelite = gsub("MSS","0",data$microsatelite )
data$microsatelite = as.numeric(data$microsatelite)
head(data$microsatelite)
# Primary.Tumor.Site ( 放最后,因为会增加列)
data$Ascending.Colon = as.numetric(data$Primary.Tumor.Site == "Ascending Colon")
data$Cecum = as.numetric(data$Primary.Tumor.Site == "Cecum")
data$Descending.Colon = as.numetric(data$Primary.Tumor.Site == "Descending Colon")
data$Hepatic.Flexure = as.numetric(data$Primary.Tumor.Site == "Hepatic Flexure Colon")
data$Sigmoid.Colon = as.numetric(data$Primary.Tumor.Site == "Sigmoid Colon")
data$Splenic.Flexure = as.numetric(data$Primary.Tumor.Site == "Splenic Flexure")
data$Transverse.Colon = as.numetric(data$Primary.Tumor.Site == "Transverse Colon")
head(data$Ascending.Colon)
head(data)
#
# delete stage and Primary.Tumor.Site
data =data[ , -which(colnames(data) %in% c("Primary.Tumor.Site","Stage"))]
head(data)
这样就完成了~