【搬砖】构建预后signature 实践

Cox 回归模型

写在最开头:诚心推荐解螺旋麦子的Cox回归模型R教学视频!!!如果你对cox还稀里糊涂的,下面的链接,点!15分钟就能GET超级舒爽的代码~
【Cox回归的R操作:从单因素到多因素一气呵成https://www.bilibili.com/video/av18918951/

最后的效果图

根据麦子老师的课,我整理的代码如下↓

library(survival)
library(plyr)
library(xlsx)

data(lung)
### 1 COX 风险模型
## 1.1 转换数据类型(基线表要改成数值型)
Baseline = lung
## 1.2 单因素Cox回归,用sex
BaSurv <- Surv(time=Baseline$time,event=Baseline$status)
Baseline$BaSurv <- with(Baseline,BaSurv)  # with函数的用法
SexCox <- coxph(BaSurv~sex,data=Baseline) # ties='breslow' 那么结果与SPSS一样
SexSum <- summary(SexCox)
HR <- round(SexSum$coefficients[,2],2)
PValue <- round(SexSum$coefficients[,5],3)
CI <- paste0(round(SexSum$conf.int[,3:4],2),collapse="-")
Unicox <- data.frame("Characteristics" = "Sex",
                    "Hazard ratio" = HR,
                    "CI95" = CI,
                    "p-Value" = PValue)

# 多个单因素回归,自定义函数,使用lapply(向量化处理)
UniCox <- function(x){
 FML <- as.formula(paste0("BaSurv~",x))
 SexCox <- coxph(FML,data=Baseline)
 SexSum <- summary(SexCox)
 HR <- round(SexSum$coefficients[,2],2)
 PValue <- round(SexSum$coefficients[,5],3)
 CI <- paste0(round(SexSum$conf.int[,3:4],2),collapse="-")
 Unicox <- data.frame("Characteristics" = x,
                      "Hazard ratio" = HR,
                      "CI95" = CI,
                      "p-Value" = PValue)
 return(Unicox)
}
UniCox("ph.ecog")
ValNames <- colnames(Baseline)[4:10]
UniVar <- lapply(ValNames,UniCox) #前面填名字,后面填函数
UniVar <- ldply(UniVar)  #把list转换为data.frame
UniVar$Characteristics[UniVar$p.Value < 0.05]

## 1.3 多因素Cox回归分析
fml=as.formula(paste0("BaSurv~",paste0(UniVar$Characteristics[UniVar$p.Value < 0.05],collapse = "+")))
MultiCox <- coxph(fml,data=Baseline)
MultiSum <- summary(MultiCox)
MultiSum$coefficients
MultiSum$conf.int
MHR <- round(MultiSum$coefficients[,2],2)
MPValue <- round(MultiSum$coefficients[,5],3)
MCIL <- round(MultiSum$conf.int[,3],2)
MCIH <- round(MultiSum$conf.int[,4],2)
MCI <- paste0(MCIL,'-',MCIH)
MultiName=as.character(UniVar$Characteristics[UniVar$p.Value < 0.05])
Multicox <- data.frame("Characteristics" = MultiName,
                    "Hazard ratio" = MHR,
                    "CI95" = MCI,
                    "p-Value" = MPValue)
## 1.4 整合表格
Final <- merge.data.frame(UniVar,Multicox,by="Characteristics",all=T,sort = T)
write.xlsx(Final,'CoxOnline.xlsx',col.names = T,row.names = F,showNA = F)

Final。输出到excel就可以制作paper上那种表格啦

回到正题:如何构建预后signature?

参考文章:doi: 10.3389/fonc.2019.00078


doi: 10.3389/fonc.2019.00078

统计学中,多重检验,两两检验的p值需要进行Bonferroni校正。结合这篇文章(https://www.jianshu.com/p/1aeeac34ce51)理解下容错率FDR。

使用library(My.stepwise)

### 2 MUV Cox,逐步回归 stepwise forward
newBaseline <- Baseline
newBaseline$BoneRe.status <- ifelse(newBaseline$BoneRe.status==2,1,0)
Varlist <- colnames(newBaseline[9:26])
My.stepwise.coxph(Time = "time.m", Status = "BoneRe.status", variable.list = Varlist) # 结果只能直接输出
结果

得到含9个gene的signature。
接下来进行可视化。类似下图。


doi: 10.7150/ijbs.45050

(a) risk score 分布

# 散点图:Risk score 分布
ggplot(data=plot.data)+
  geom_point(mapping = aes(x=id,y=data),
             color=ifelse(plot.data$group==0,"blue","red"),
             show.legend = F)+
  labs(x="Patiens",y="Risk Score")
a

(b) PCA

library("factoextra") 
dat_pca <- t(GSE2034_log) 
DatPCA <- prcomp(dat_pca)
fviz_pca_ind(DatPCA, label="none",habillage=group_risk$group,
             addEllipses=TRUE, ellipse.level=0.95,
             palette = c("red","blue"))
b

(c)t-SNE

library(Rtsne)
tsne_out <- Rtsne(
  dat_pca,
  dims = 2, #降维之后的维度,默认值为2
  pca = FALSE, #是否对原始数据进行PCA分析,再用PCA得到的topN主成分进行后续分析
  perplexity = 60, #参数的取值必须小于(nrow(data) - 1 )/ 3
  theta = 0.0,
  max_iter = 1000 # 最大迭代次数
)
tsne_res <- as.data.frame(tsne_out$Y)
colnames(tsne_res) <- c("tSNE1","tSNE2")
head(tsne_res)
Group=group_risk$group
ggplot(tsne_res,aes(tSNE1,tSNE2,color=Group)) + 
  geom_point() + theme_bw() + 
  geom_hline(yintercept = 0,lty=2,col="black") + 
  geom_vline(xintercept = 0,lty=2,col="black") + #lwd
  theme(plot.title = element_text(hjust = 0.5)) + 
  labs(title = "tSNE plot")
c

(d)略。
(e)生存曲线

Baseline$RiskScore = RiskScore
Baseline$Group = ifelse(Baseline$RiskScore>= median(Baseline$RiskScore),
                        "high-risk","low-risk")
ReSurv = Surv(time = Baseline$time.m, event = Baseline$relapse.status)
fit <- survfit(ReSurv ~ Group, data = Baseline) 
ggsurvplot(fit, # 创建的拟合对象
           #surv.median.line = "hv",  # 增加中位生存时间
           #conf.int = TRUE, # 显示置信区间
           pval = TRUE, # 添加P值
           # add.all = TRUE,# 添加总患者生存曲线
           # risk.table = TRUE)
e

(f)ROC

library(pROC)
BoneRe.risk = roc(response = Baseline$BoneRe.status, 
                  predictor = Baseline$RiskScore,ci=T,auc=T)
ggroc(BoneRe.risk,col="red")+
  theme_bw()+
  geom_abline(intercept=1,slope=1)+
  labs(x="Specificity",y="Sensitivity",title = "ROC")+
  annotate("text", x= 0.75, y= 0.75,label="AUC = 0.5726")
f

综上,我的signature 表现不是很好。。。 :)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容