En este ejemplo vamos a usar los mismos datos que se usaron anteriormente, es decir la base de datos de supervivencia vista en clase. Primero cargamos la paqueteria necesaria, y cargamos nuestra base de datos y le hacemos los ajustes correspondientes.
require(dplyr)
## Loading required package: dplyr
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
require(survival)
## Loading required package: survival
require(survminer)
## Loading required package: survminer
## Loading required package: ggplot2
## Loading required package: ggpubr
## Loading required package: magrittr
require(flexsurv)
## Loading required package: flexsurv
datos <- read.csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")#leemos los datos de nuestra base de datos
datos$Churn <- datos$Churn %>% as.factor()
datos$Churn <- ifelse(datos$Churn == "Yes", 1, 0)
Despues vamos a estimar funciones aproximadas de supervivenvia para cada grupo, en este caso los grupos hacen referencia al genero, hombre o mujer en este caso.
surv <- surv_fit(Surv(tenure, Churn) ~ gender, data = datos)#guardamos la informacion de supervivencia con respecto al genero
S1<-approxfun(surv[1]$surv, surv[1]$time)#aproximamos la funcion de supervivencia para el primer grupo
S2<-approxfun(surv[2]$surv, surv[2]$time)#aproximamos la funcion de supervivencia para el segundo grupo
c1<-S1(seq(0, 1, length.out = 1000))#hacemos secuencias de los valores en las funciones para poder obtener las diferencias
c2<-S2(seq(0, 1, length.out = 1000))
c3<-seq(0,1,length.out = 1000)#generamos un vector que haga un recorrido del cero al 1
A continuacion se estiman las distancias y se saca el maximo de estas distancias a travez de ciclos.Una vez hecho esto procedemos a obtener la posicion en la que se obtuvo esta maxima distancia
X<-numeric(1000)#generamos un vector
for(i in 1:1000){ #cada entrada de este nuevo vector va a ser la diferencias de las funciones de ambos grupos
X[i] = abs(c1[i]-c2[i])
}
X[is.na(X)] <- 0#en caso de que algunas entradas sean NA, las cambia por cero
a=max(X)#obtenemos el maximo de las diferencias
p=0
for(i in 1:1000){#buscamos en que posicion estaba ese maximo
if(X[i]==a){
p=i
}
}
Por ultimo vamos a graficar, la grafica nos arroja:
-Las dos funciones de supervivencia
-la distancia maxima
-Una barra que representa la distancia en ese punto
-Señalamiento de la distancia a los ejes
#ya que obtuvimos la posicion podemos graficar
x1=min(c1[p],c2[p])#vemos para esa probabilidad en cual funcion el cuantil es menor
x2=max(c1[p],c2[p])#y en cual el cuantil es mayor
#ahora generamos vectores que nos ayuden a hacer la grafica como se solicito
c20<-seq(x1,x2,length.out = 1000)
c21<-rep(c3[p],1000)
c22<-seq(c3[p]-.1,c3[p]+.1,length.out = 1000)
c23<-rep(x1,1000)
c24<-rep(x2,1000)
c25<-seq(0,c3[p]-.1,length.out = 1000)
c26<-seq(0,x1,length.out = 1000)
#graficamos las dos supervivencias, asi como la distancia y una barra que señala dicha distancia
plot(surv, col = 2:3, main="Maxima Diferencia de tiempos de supervivencia", xlab = "time", ylab = "survival" )
legend(x = "topright",legend=c("Categoria 1","Categoria 2"),
fill=c("red","green"),cex=.6,text.font=4, bg='grey')
text(x1,c3[p]-.1,a,col = "black")
lines(c20,c21, type = "l", col="black")
lines(c23,c22, type = "l", col="black")
lines(c24,c22, type = "l", col="black")
lines(c23,c25, type = "l", lty=2, col="cyan")
lines(c24,c25, type = "l", lty=2, col="cyan")
lines(c26,c21, type = "l", lty=2, col="cyan")