|
@@ -0,0 +1,33 @@
|
|
|
+#' Create a KM plot
|
|
|
+#'
|
|
|
+#' @param x a data frame that contains followup and censored columns
|
|
|
+#' @param var a categorical variable to split the data to sub-curves
|
|
|
+#' @param comment An additional piece of text to write in the curve
|
|
|
+#'
|
|
|
+#' @return p probability that curves split by var differ significantly
|
|
|
+#'
|
|
|
+#' @export
|
|
|
+
|
|
|
+kaplan.meier<-function(x,var,comment=''){
|
|
|
+ #x should have followup and censored columns
|
|
|
+ surv.obj<-survival::Surv(x$followup,x$censored)
|
|
|
+ m=base::max(x$followup)
|
|
|
+
|
|
|
+ f<-stats::as.formula(paste('surv.obj',var,sep='~'))
|
|
|
+ s1<-survival::survfit(f,data=x)
|
|
|
+ #str(s1)
|
|
|
+ tit=base::sprintf('Kaplan-Meier plot by %s',var)
|
|
|
+ cols=base::c('red','blue')
|
|
|
+ labels=base::c(base::sprintf('%s=true',var),base::sprintf('%s=false',var))
|
|
|
+ #plot(s1,mark.time=TRUE,col=c('red','blue'),pch=labels,main=tit)
|
|
|
+ graphics::plot(s1,mark.time=TRUE,col=c('red','blue'),main=tit)
|
|
|
+ s=survival::survdiff(f,data=x)
|
|
|
+ #str(s)
|
|
|
+ p=stats::pchisq(s$chisq, length(s$n)-1, lower.tail = FALSE)
|
|
|
+ sv=base::sprintf("p=%.3f",p)
|
|
|
+ nLab=base::sprintf('N=%d',nrow(x))
|
|
|
+ graphics::text(x=c(0.9*m,0.3*m,0.9*m),y=c(0.2,0.1,0.3),label=c(sv,comment,nLab),cex=1.2)
|
|
|
+ lLab <- base::gsub("x=","",base::names(s1$strata)) ## legend labels
|
|
|
+ graphics::legend("top",legend=lLab,col=cols,lty=c(1,1),horiz=FALSE, bty='n')
|
|
|
+ p
|
|
|
+}
|