[daa031]: / function / plot_evaluation.R

Download this file

167 lines (144 with data), 7.2 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
library(dplyr)
library(ggplot2)
library(ggpubr)
library(reshape2)
library(rstatix)
######### test ############
# out = out_all
# folder = 'results/CV_all_patients'
############# res ###############
plot_evaluation = function(folder,out){
if (!file.exists(folder)) dir.create(folder)
# out
out2 = out %>% rowwise() %>% mutate(repeats = unlist(strsplit(column_label, split="[.]"))[2]) %>% as.data.frame()
get_out = function(rep,model,time,v,tp,k){
dt = out2 %>% subset(.,repeats==rep&model2==model&variable==v&type==tp)
n= length(na.omit(dt[,as.character(time)]))
mean = mean(dt[,as.character(time)],na.rm = TRUE)
return(dynGet(k))
}
new_out = expand.grid(
'rep' = unique(out2$rep),
"model2" = unique(out2$model2) ,
"time" = as.character(predict_times),
"variable"= c("AUC","PE"),
"type"= c('training','testing')
)
new_out$value = mapply(get_out,rep=new_out$rep, model=new_out$model2,time=new_out$time,
v=new_out$variable,tp=new_out$type,MoreArgs = list(k="mean"))
NA_rep = new_out[is.na(new_out$value),c('rep','model2','type','time')]
for ( i in 1:nrow(NA_rep)){
new_out[new_out$rep==NA_rep$rep[i]&
new_out$model2==NA_rep$model2[i]&
new_out$type==NA_rep$type[i]&
new_out$time==NA_rep$time[i],'value'] = NA
}
write.csv(new_out %>% mutate(model2 = recode(model2,"LM_bi" = "cox(Landmark)","LM_P2"="cox(Postsurgical)")),
file = paste0(folder,"/outdata.csv"),quote = F)
# res
get_res = function(model,t,v,tp,k){
dt = new_out %>% subset(.,model2==model&variable==v&type==tp)
n= length(na.omit(dt[dt$time==t,]))
mean = mean(dt[dt$time==t,'value'],na.rm = TRUE)
return(dynGet(k))
}
res_table = expand.grid(
"model2" = unique(new_out$model2),
"variable"= c("AUC","PE"),
"time" = as.character(predict_times),
"type"= c('training','testing')
)
res_table$value = mapply(get_res,model=res_table$model2,t=res_table$time,
v=res_table$variable,tp=res_table$type,MoreArgs = list(k="mean"))
res_table = dcast(res_table,...~model2) %>% rename( "cox-Landmark" = LM_bi, 'cox-Postsurgical' = LM_P2) %>% arrange(variable,time,type)
write.csv(res_table,file = paste0(folder,"/res_table.csv"),quote = F)
# label
rs_label = c("AUC"="AUROC","PE"="Prediction Error")
rs_label2 = c('12' = "12 months",'15' = "15 months")
## between JMs using different association structures
df2 = subset(new_out,model2 %in% c('JM_cumulative','JM_value','JM_value-slope')) %>%
rename( evaluation = variable )
ggplot(df2,aes(x=model2,y=value,fill=type))+
geom_boxplot(outlier.shape = NA)+
geom_point(pch = 21, position = position_jitterdodge(jitter.width=0.1))+
scale_fill_brewer(palette ='Pastel1',)+
scale_color_brewer(palette ='Pastel1')+
scale_y_continuous(name = "")+
scale_x_discrete(name="Joint Models",
limits=c('JM_value','JM_value-slope','JM_cumulative'),
breaks=c('JM_value','JM_value-slope','JM_cumulative'),
labels=c('value','value\n+slope','value\n+cumulative'))+
facet_grid(rows = vars(evaluation) ,cols = vars(time),scales="free",space="free",switch = 'y',
labeller = labeller(evaluation=rs_label,time = rs_label2))+
theme_bw()+
theme(
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
plot.background = element_blank(),
# legend.position = 'none',
axis.text = element_text(size=12),
axis.title = element_text(size=15),
strip.background=element_blank(),
strip.text=element_text(size = 14),
strip.placement = 'outside'
)
ggsave(paste0(folder,"/betweenJMs.pdf"),device='pdf',width=8,height=8)
## comparison between jm and cox
df = subset(new_out,model2 %in% c('JM_cumulative','LM_P2','LM_bi')) %>% rename( evaluation = variable )
stat.test <- df %>%
group_by(time,evaluation,type) %>%
wilcox_test(value ~ model2,ref.group = 'JM_cumulative') %>%
add_significance("p",cutpoints = c( 0,0.001, 0.01, 0.05, 1),
symbols = c("***", "**", "*", "ns")) %>%
add_xy_position(x='model2',step.increase=0.03)
# df %>% group_by(time,evaluation,type) %>% wilcox_effsize(value ~ model2,ref.group = 'JM_cumulative')
ggplot(subset(df,type == "testing"),aes(x=model2,y=value,fill=time))+
geom_boxplot(outlier.shape = NA)+
geom_point(position = position_jitterdodge(jitter.width=0.3),shape = 21)+
scale_fill_brewer(palette ='Pastel1')+
scale_color_brewer(palette ='Pastel1')+
scale_y_continuous(name = "")+
scale_x_discrete(name="Models",
breaks=c('JM_cumulative','LM_P2','LM_bi'),
labels=c('Joint model','Postsurgical\nCox','Landmark\nCox'))+
# labs(title = paste0('Testing Sets'))+
facet_grid(rows = vars(evaluation) ,cols = vars(time),scales="free",space="free",switch = 'y',
labeller = labeller(evaluation=rs_label,time = rs_label2))+
stat_pvalue_manual(subset(stat.test,type == "testing"), label = "p.signif",hide.ns = F,tip.length = 0)+
theme_bw()+
theme(
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
plot.background = element_blank(),
legend.position = 'none',
axis.text = element_text(size=10),
axis.title = element_text(size=12),
strip.background=element_blank(),
strip.text=element_text(size = 12),
strip.placement = 'outside'
)
ggsave(paste0(folder,"/JMvsCox_testing.pdf"),device='pdf',width=6,height=6)
ggplot(subset(df,type == "training"),aes(x=model2,y=value,fill=time))+
geom_boxplot(outlier.shape = NA)+
geom_point(pch = 21, position = position_jitterdodge(jitter.width=0.3))+
scale_fill_brewer(palette ='Pastel1')+
scale_color_brewer(palette ='Pastel1')+
scale_y_continuous(name = "")+
scale_x_discrete(name="Models",
breaks=c('JM_cumulative','LM_P2','LM_bi'),
labels=c('Joint model','Postsurgical\nCox','Landmark\nCox'))+
# labs(title = paste0('Training Sets'))+
facet_grid(rows = vars(evaluation) ,cols = vars(time),scales="free",space="free",switch = 'y',
labeller = labeller(evaluation=rs_label,time = rs_label2))+
stat_pvalue_manual(subset(stat.test,type == "testing"), label = "p.signif",hide.ns = F,tip.length = 0)+
theme_bw()+
theme(
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
plot.background = element_blank(),
legend.position = 'none',
axis.text = element_text(size=12),
axis.title = element_text(size=15),
strip.background=element_blank(),
strip.text=element_text(size = 14),
strip.placement = 'new_outside'
)
ggsave(paste0(folder,"/JMvsCox_training.pdf"),device='pdf',width=6,height=6)
}