El presente trabajo expone el tema de predicción de diabetes de tipo 2 mediante métodos de clasificación de aprendizaje automático, que se puede definir como el anuncio de un hecho a futuro a partir del historial de datos de los pacienes y la aplicación de algoritmos, con la finalidad de dar solución y prevenir la enfermedad.
La diabetes mellitus tipo 2 (DM2) es una enfermedad crónica que se caracteriza por niveles elevados de azúcar en la sangre. Además, es una de las enfermedades crónicas más comunes en el mundo, con una prevalencia estimada de 463 millones de personas en 2020.
Para analizar esta problemáica es necesario mencionar sus causas. Una de ellas es el factor genético, por lo que las personas con antecedentes familiares de DM2 tienen un mayor riesgo de desarrollar la enfermedad.Los factores ambientales tambíen inciden, ya que aumentan el riesgo de DM2, estas son: sobrepeso y obesidad, inactividad física, edad, historial familiar de diabetes, etinia y algunas afecciones médicas.
La investigación de esta problemática social se realizó por el interés de predecir la DM2 con la ayuda de la aplicación de los métodos de aprendizaje automático, ya que tiene el potencial de mejorar el diagnóstico temprano de la enfermedad y, por lo tanto, de prevenir complicaciones graves.
Por otro lado, profundizar el tema como interés académico es esencial para el entendimiento de la aplicación de los métodos de clasificación en temas de la salud. Ya que, como estudiante es importante la práctica e interpretación adecuada para la toma de decisiones.
diabetes2 <- read.csv("C:/Users/CHRIS LLIGUIN/OneDrive - ESCUELA SUPERIOR POLITECNICA DE CHIMBORAZO/Escritorio/Trabajo individual/diabetes2.txt", sep=";")
head(diabetes2)
str(diabetes2)
## 'data.frame': 906 obs. of 18 variables:
## $ Age : chr "less than 40" "less than 40" "60 or older" "less than 40" ...
## $ Gender : chr "Male" "Male" "Female" "Male" ...
## $ Family_Diabetes : chr "yes" "yes" "yes" "yes" ...
## $ highBP : chr "no" "no" "no" "no" ...
## $ PhysicallyActive: chr "one hr or more" "one hr or more" "none" "more than half an hr" ...
## $ BMI : int 22 22 26 19 23 26 26 23 22 38 ...
## $ Smoking : chr "no" "no" "no" "yes" ...
## $ Alcohol : chr "no" "no" "no" "yes" ...
## $ Sleep : int 8 8 7 7 7 8 8 7 6 8 ...
## $ SoundSleep : int 6 6 7 5 6 7 3 7 2 6 ...
## $ RegularMedicine : chr "no" "no" "no" "no" ...
## $ JunkFood : chr "often" "often" "occasionally" "occasionally" ...
## $ Stress : chr "not at all" "not at all" "sometimes" "not at all" ...
## $ BPLevel : chr "normal" "normal" "normal" "normal" ...
## $ Pregancies : int 0 0 3 0 0 0 0 1 0 0 ...
## $ Pdiabetes : chr "0" "0" "0" "0" ...
## $ UriationFreq : chr "not much" "not much" "not much" "not much" ...
## $ Diabetic : chr "no" "no" "no" "no" ...
Age : Edad. Variable de tipo cualitativa nominal, con rangos de edad: “40-49”, “50-59”, “60 or older”(60 o más), “less than 40”(menos de 40).
Gender: Género del individuo. Variable de tipo cualitativa nominal con 2 niveles: Male (Masculino) y Female(Femenino).
Family_Diabetes: Antecedentes familiares de diabetes. Variable de tipo cualitativa nominal con dos niveles “yes”(sí) y “no”. Este constituye uno de los factores de riesgo en padecer diabetes tipo 2.
highBP: Diagnóstico de hipertensión arterial alta. Variable cualitativa nominal, con dos niveles:“yes”(sí) y “no”. Es decir, contiene presión arterial alta o no contiene.
PhysicallyActive: -Actividad física. Frecuencia
del paciente para correr, caminar entre otros. Variable
cualitativa nominal, con 5 niveles: “one hr or more”(una hora o
más), “none”(ninguno),”
more than half an hr”(más de media hora), “more than half an hr”(más de
media hora), “less than half an hr”(menos de media hora).
BMI: Índice de masa corporal. Variable cuantitativa discreta. Es un cálculo simple que utiliza la altura y el peso de una persona. La mayoría de los adultos con un BMI-IMC por encima de 25 tienen sobrepeso y un mayor riesgo de desarrollar diabetes tipo 2 Variable de tipo entero. \[IMC = kg/m^2\]Una persona con un IMC de 18.5 a 24.9 está en el rango peso normal o saludable. Una persona con un IMC de 25 a 29.9 se clasifica como persona con sobrepeso. Una persona con un IMC de 30 a 39.9 se clasifica como persona con obesidad.Una persona con un IMC de 40 o más se clasifica como persona con obesidad severa.
Smoking: Tabaquismo. Variable cualitativa nominal con dos niveles, “yes”(Sí) y “no”. Es decir, si la persona fuma o no consume.
Alcohol: Consumo de alcohol. Variable cualitativa nominal con dos niveles, “yes”(sí) y “no”. Es decir, si la persona consume alcohol o no consume.
Sleep: Horas de sueño.Variable cuantitativa discreta. Las horas adecuadas de sueño es de 7 por noche o más. Variable de tipo entero.
Sound Sleep: Horas de sueño profundo. Variable cuantitativa discreta. El porcentaje asignado al sueño profundo es del 20% sobre todas las horas que hemos dormido. Variable de tipo entero.
RegularMedicine: Si la persona toma regularmente medicamentos. Variable cualitativa nominal con dos niveles “yes” y “no”.
JunkFood: Comida basura o chatarra. Variable cualitativa nominal que dicta la frecuencia del consumo de la comida chatarra, contiene 4 niveles: “often”(frecuentemente), “occasionally”(casionalmente), “always”(siempre), “very often”(muy a menudo).
Stress: Estrés. Puede hacer que sea más difícil de controlar la diabetes porque puede desequilibrar la rutina diaria y puede resultar en un deterioro del cuerpo. Variable cualitativa nominal que contiene 4 niveles “not at all”(“en absoluto),”sometimes”(a veces), “very often”(muy a menudo), “always”(siempre).
BPLevel: Diagnóstico de hipertensión arterial. La presión arterial normal es de 120/80 milímetros de mercurio o inferior, si presenta más a esa cantidad, se dicta que contiene hipertensión alta(Hipertensión). Si es menor a inferior a 90/60 mm Hg se dicta que la presión es baja. Variable cualitativa nominal que contiene 3 niveles. Normal, Low(baja) y High(alta).
Pregancies: Número de embarazos. Variable cuantitativa discreta.
Pdiabetes: La diabetes gestacional es un tipo de diabetes que puede aparecer durante el embarazo en las mujeres que no tengan ya diabetes. Variable cualitativa nominal con 2 niveles 0 (No) y 1 (Sí)
UriationFreq Frecuencia urinaria. Variable cualitativa nominal con 2 nivles: “not much”(no mucho),“quite often”(bastante a menudo).
Diabético: Diabético.Si la persona es diabética o no. Variable cualitativa nominal contiene 2 niveles: “yes” y “no”.
Se transforman las variables tipo cualitativas nominal a factor, lo cual nos ayuda a diferenciar los diferentes niveles.
clases <- sapply(diabetes2, class)
clases
## Age Gender Family_Diabetes highBP
## "character" "character" "character" "character"
## PhysicallyActive BMI Smoking Alcohol
## "character" "integer" "character" "character"
## Sleep SoundSleep RegularMedicine JunkFood
## "integer" "integer" "character" "character"
## Stress BPLevel Pregancies Pdiabetes
## "character" "character" "integer" "character"
## UriationFreq Diabetic
## "character" "character"
diabetes2$Age= factor (diabetes2$Age)
levels(diabetes2$Age) = c ("less than 40","40-49", "50-59", "60 or older")
class(diabetes2$Age)
## [1] "factor"
diabetes2$Gender= factor (diabetes2$Gender)
levels(diabetes2$Gender) = c ("Male", "Female")
class(diabetes2$Gender)
## [1] "factor"
diabetes2$Family_Diabetes= factor (diabetes2$Family_Diabetes)
levels(diabetes2$Family_Diabetes) = c ("no", "yes")
class(diabetes2$Family_Diabetes)
## [1] "factor"
diabetes2$highBP= factor (diabetes2$highBP)
levels(diabetes2$highBP) = c ("no", "yes")
class(diabetes2$highBP)
## [1] "factor"
diabetes2$PhysicallyActive <- factor(diabetes2$PhysicallyActive)
levels(diabetes2$PhysicallyActive) <- c("
one hr or more","none","
more than half an hr","
less than half an hr","none")
class(diabetes2$PhysicallyActive)
## [1] "factor"
diabetes2$Smoking= factor (diabetes2$Smoking)
levels(diabetes2$Smoking) = c ("no", "yes")
class(diabetes2$Smoking)
## [1] "factor"
diabetes2$Alcohol= factor (diabetes2$Alcohol)
levels(diabetes2$Alcohol) = c ("no", "yes")
class(diabetes2$Alcohol)
## [1] "factor"
diabetes2$RegularMedicine = factor (diabetes2$RegularMedicine )
levels(diabetes2$RegularMedicine ) = c ("no", "yes")
class(diabetes2$RegularMedicine )
## [1] "factor"
diabetes2$JunkFood = factor (diabetes2$JunkFood )
levels(diabetes2$JunkFood ) = c ("often", "occasionally", "very often", "always")
class(diabetes2$JunkFood )
## [1] "factor"
diabetes2$Stress = factor (diabetes2$Stress )
levels(diabetes2$Stress ) = c ("always", "not at all", "sometimes", "very often")
class(diabetes2$Stress )
## [1] "factor"
diabetes2$BPLevel <- factor(diabetes2$BPLevel)
levels(diabetes2$BPLevel) <- c("high", "normal"," low")
class(diabetes2$BPLevel)
## [1] "factor"
diabetes2$UriationFreq <- factor(diabetes2$UriationFreq)
levels(diabetes2$UriationFreq) <- c("quite often","not much")
class(diabetes2$UriationFreq)
## [1] "factor"
diabetes2$Pdiabetes <- factor(diabetes2$Pdiabetes)
levels(diabetes2$Pdiabetes) <- c("0","1")
class(diabetes2$Pdiabetes)
## [1] "factor"
diabetes2$Diabetic <- factor(diabetes2$Diabetic)
levels(diabetes2$Diabetic) <- c("no","yes")
class(diabetes2$Diabetic)
## [1] "factor"
Classes <- sapply(diabetes2, class)
for (i in 1:ncol(diabetes2))
if(Classes [i]== "integer")
diabetes2[[i]]= as.numeric(diabetes2[[i]])
Classes = sapply(diabetes2, class)
Classes
## Age Gender Family_Diabetes highBP
## "factor" "factor" "factor" "factor"
## PhysicallyActive BMI Smoking Alcohol
## "factor" "numeric" "factor" "factor"
## Sleep SoundSleep RegularMedicine JunkFood
## "numeric" "numeric" "factor" "factor"
## Stress BPLevel Pregancies Pdiabetes
## "factor" "factor" "numeric" "factor"
## UriationFreq Diabetic
## "factor" "factor"
which(is.na(diabetes2))
## integer(0)
Se obtiene que no hay datos perdidos o faltantes en la base de datos “diabetes2”.
\[Desviación ~ estándar \longrightarrow \sigma = \sqrt( \frac{\sum_{i=1}^{n} = (x_{i}- \bar{x})^2}{n})\]
Atención: esta fórmula nos indica la posición del cuartil, no el valor del cuartil. El cuartil será el dato situado en la posición obtenida por la fórmula.
\[Cuartiles ~ \longrightarrow Q_k= \frac{k*N}{4}\]
summary(diabetes2[, clases == "integer"])
## BMI Sleep SoundSleep Pregancies
## Min. :15.00 Min. : 4.000 Min. : 0.000 Min. :0.0000
## 1st Qu.:21.00 1st Qu.: 6.000 1st Qu.: 4.000 1st Qu.:0.0000
## Median :24.00 Median : 7.000 Median : 6.000 Median :0.0000
## Mean :25.33 Mean : 6.976 Mean : 5.609 Mean :0.3819
## 3rd Qu.:28.00 3rd Qu.: 8.000 3rd Qu.: 7.000 3rd Qu.:0.0000
## Max. :42.00 Max. :11.000 Max. :11.000 Max. :4.0000
apply(diabetes2[,clases == "integer"], 2, sd)
## BMI Sleep SoundSleep Pregancies
## 5.1399922 1.3042497 1.8435140 0.9090479
Se obtiene que el mínimo del índice de masa corporal de 15 \(kg/m^2\) por lo que el riesgo de padecer diabetes tipo 2, aún es bajo pero no descartable, ya que, se considera un mayor riesgo a las personas que tiene un BMI por encima de las 25 \(kg/m^2\) . Sin embargo, hay que tomar en cuenta que su mediana es de 24 \(kg/m^2\) y su media de 25.33 \(kg/m^2\).
Además, al considerar el 1er cuartil, se infiere que el 25% de la población en estudio contiene 21\(kg/m^2\) y el 75% que representa el 3er cuartil que posee 28 \(kg/m^2\), con una desviación estándar de 5.1399922.
Considerando estos valores se infiere que la población es propensa a ser diabética.
Se obtiene que el mínimo es de 4 horas de sueño, lo cual es poco, ya que el sueño adecuado es de 7 horas o más para un adulto. Sin embardo su mediana es de 7 horas y su media de igual manera, por lo que, se acerca al rango adecuado. Aunque se verificó que el máximo de horas de sueño es de 11 horas.
Además, al considerar el 1er cuartil, se infiere que el 25% de la población en estudio constituye 6 horas de sueño, mientras que, el 3er cuartil que representa el 75% es de 8 horas, con una desviación estándar de 1.3042497.
Por lo que, el sueño no parece un factor que influya mucho para la predicción diabetes tipo 2 en pacientes.
Se obtiene que el mínimo es 0 horas por lo que es una cifra alarmante, ya que, el porcentaje asignado al sueño profundo es del 20% sobre todas las horas que se ha dormido. Por lo que, al comparar con la variable Sleep, es decir, sueño, el dato es caótico ya que en cuestión de sueño las horas son altas, sin embargo, en sueño profundo son bajas. Por lo que, ciertas personas no tienen un buen descanso.
Pero, al ya comprobar la mediana de SoundSleep es 6 horas y su media es de aproximadamente lo mismo. Por lo que la población intermedia tiene una buena hora de sueño. Esto se puede corroborar con la hora máxima, ya que esta fue de 11 horas de sueño, por lo que es muy bueno, puesto que, al comparar con la variable Sleep con su máximo de 11 horas es bueno porque contuvo la misma cantidad con sueño profundo.
Además, al considerar el 1er cuartil, se infiere que el 25% de la población en estudio constituye 4 horas de sueño profundo, mientras que, el 3er cuartil que representa el 75% es de 7 horas, con una desviación estándar de 1.8435140.
Entonces, se infiere que la mayoría de personas tienen un buen sueño profundo, sin embargo, existe personas que no lo tienen, por lo que, esta variable puede ser un factor que influya en la diabetes 2.
Se obtiene que el mínimo de embarazos es de 0 y el máximo de 4 embarazos. Por lo que, el 25% y el 75% de la población, es decir, el 1er cuartil y 3er cuartil se encuentra en 0 embarazos, con una desviación estándar de 0.9090479.
Es decir, que la variable “Pregancies” no es muy notable ya que no muchas mujeres se encuentran en este estado. Sin embargo, es bueno considerar la variable, puesto que, la diabetes gestacional aumenta el riesgo de tener presión arterial alta y preeclampsia, una complicación grave del embarazo que provoca presión arterial alta y otros síntomas que pueden poner en riesgo la vida de la madre y la del bebé.
library(ggplot2)
grafico_1 = ggplot(diabetes2,aes(x=Gender))+
geom_bar(stat="count", width=0.7, fill="skyblue")+
theme_minimal() + geom_text(aes(label = ..count..), stat="count" )
print(grafico_1)
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Interpretación
Se obtiene que en la variable “Gender”, el más predominante es “Male”(masculino) con 557 individuos, mientras que “Female”(Femenino) tiene 349.
grafico_2 = ggplot(diabetes2,aes(x=Age))+
geom_bar(stat="count", width=0.7, fill="orange")+
theme_minimal() + geom_text(aes(label = ..count..), stat="count" )
print(grafico_2)
Interpretación
Se obtiene que en la variable “Age”, el rango predominante es “60 or older”(más de 60) con una suma de 464, por lo cual la población mayoritaria se encuentra en la 3ra edad.
Los otros rangos sobrantes se asemejan en cantidades, “less than 40”(menores de 40) con 139, 40-49 con 165 y 50-59 con 138 individuos.
grafico_3 = ggplot(diabetes2,aes(x=PhysicallyActive))+
geom_bar(stat="count", width=0.7, fill="green")+
theme_minimal() + geom_text(aes(label = ..count..), stat="count" )
print(grafico_3)
Interpretación
Se obtiene que el nivel que más predomina es “less than half an hr”(menos de media hora) con 321 individuos, cantidad preocupante ya que mientras menos ejercicio se realiza, mayor el riesgo de padecer alguna enfermedad.
También, el segundo rango sobresaliente es “more than half an hr”(más de media hora) con 227, es bueno la cantidad, siempre y cuando se considere que la gente lo haga al menos 5 días a la semana.
Los rangos minotarios es “none”(ninguno) con 134 y “one hr or more”(una hora o más) con 224.
Entonces, se infiere que, es importante hacer conciencia sobre la acividad física, para que así baje el rango de personas que no lo hacen. Sin embargo, como la población mayoritaria en edad es de la 3ra edad puede que sea dificil para ellos hacer ejercicio.
grafico_4 =ggplot(diabetes2,aes(x=JunkFood))+
geom_bar(stat="count", width=0.7, fill="pink")+
theme_minimal() + geom_text(aes(label = ..count..), stat="count" )
print(grafico_4)
Interpretación
Se obtiene que el nivel “occasionally”(ocasionalmente), sobresale entre todos, por lo cual, se encuentra bien, ya que “always”(siempre) es 38, often(a menudo) es 188 y “very often”(muy a menudo) es 65, cantidades muy bajos con respecto a “occasionally”.
Por lo que, se infiere que la población trata de no comer mucha comida chatarra.
Relacion entre las variables. Ayuda a la predicción aportan a diagnostivo de diabetes
library(ggplot2)
qplot(BMI, Sleep, data = diabetes2, colour = Diabetic)
## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Interpretación
Se obtiene que mientras más BMI con repecto al sueño, más probabilidad de ser diabético es la persona. Puesto que, a partir del 20 \(kg/m^2\) BMI y el sueño bajo desde 4, más personas son propensas a ser diabéticos. Sin embargo, se visualiza que no hay muchas personas diabéticas.
qplot(BMI, Age, data = diabetes2, colour = Diabetic)
Interpretación
Se infiere que mientras menos edad y menos BMI se tiene menor probabilidad de ser diabético, por lo que, el rango de edad de más de 60 es más propensa a contraer diabetes tipo 2. Además, el rango con menos probabilidad de que ocurra la enfermedad son los menores de 40 años.
library(ggplot2)
qplot(BMI, JunkFood, data = diabetes2, colour = Diabetic)
Interpretación
Se infiere que mientras más BMI y consumo de comida chatarra, mayor es el riesgo de padecer diabetes tipo 2. Ya que se observa
library(ggplot2)
qplot(BMI, BPLevel, data = diabetes2, colour = Diabetic)
Interpretación
Se obtiene que hay mayor relación cuando el BMI es alto y el nivel de hipertención es alto. Es decir mientras más BMI y mayor presión arterial más propenso es la persona en ser diabética.
library(ggplot2)
ggplot(diabetes2, aes (x = Diabetic, y = BMI, color = Diabetic)) + geom_boxplot()
Interpretación:
Se obtiene que la variable BMI en relación a diabetes, en el nivel “no” el 25% de la población, es decir, el 1er cuartil sobrepasa los 20 \(kg/m^2\), su mediana y media es aproximadamente de 24\(kg/m^2\).
También el 3er cuartil se acerca a 30 \(kg/m^2\), por lo que, el 75% de las personas en estudio tienen sobrepeso. Aunque con el máximo se verifica que efectivamente se trata con personas de obesidad severa, ya que contienen aproximadamente más de 38 \(kg/m^2\) e incluso se refleja 2 datos atípicos entre 38 y 45 \(kg/m^2\).
En el nivel yes el 25% de la población, es decir, el 1er cuartil se encuentra entre los 26 \(kg/m^2\), su mediana y media sobrepasa 25\(kg/m^2\).
ggplot(diabetes2, aes (x = Diabetic, y = Sleep, color = Diabetic)) + geom_boxplot()
Interpretación:
Se obtiene que el mínimo es de 4 horas de sueño entre los niveles yes y no, lo cual es poco, ya que el sueño adecuado es de 7 horas o más para un adulto. Sin embargo, su mediana es de 7 horas y su media de igual manera en los dos niveles, por lo que, se acerca al rango adecuado. Aunque se verificó que el máximo de horas de sueño es de 10 horas para yes y 11 horas para no.
Además, al considerar el 1er cuartil de los 2 niveles, se infiere que el 25% de la población en estudio constituye 6 horas de sueño, mientras que, el 3er cuartil de los 2, que representa el 75% es de 8 horas.
Por lo que, los niveles estudiados, son semejantes pero no iguales.
ggplot(diabetes2, aes (x = Diabetic, y = SoundSleep , color = Diabetic)) + geom_boxplot()
Interpretación:
Se obtiene que el mínimo del nivel “no”, es decir, cuando el individuo no contiene diabetes 2, es 0 horas , mientras, que el nivel “yes”, tiene un mínimo de 2, por lo que es una cifra alarmante, ya que, el porcentaje asignado al sueño profundo es del 20% sobre todas las horas que se ha dormido.
Pero, al ya comprobar la mediana de SoundSleep de los dos niveles es 6 horas y su media es de aproximadamente lo mismo. Por lo que la población intermedia tiene una buena hora de sueño. Esto se puede corroborar con la hora máxima de “yes” con 10 y el nivel “no” es de 11 horas.
Además, al considerar el 1er cuartil de los dos niveles , se infiere que el 25% de la población en estudio constituye 4 horas de sueño profundo, mientras que, el 3er cuartil que representa el 75% es de 7 horas..
Entonces, se infiere que la mayoría de personas tienen un buen sueño profundo, sin embargo, se observa que el sueño de las personas que contienen diabetes tipo 2 es muy bajo a comparación de los que no possen.
ggplot(diabetes2, aes (x = Diabetic, y = Pregancies, color = Diabetic)) + geom_boxplot()
Interpretación
Se obtiene que el mínimo de embarazos es 0 para las 2 variables y el máximo es de 4 embarazos sólo para el nivel yes. Por lo que, el 25%, es decir, el 1er cuartil se encuentra en 0 embarazos para los dos niveles. Sin embargo, para el 3er cuartil , es decir, el 75% de la población de la variable “no” queda en 0, mientras para las personas diabéticas de tipo 2, es de 2 embarazos.
Por lo que se infiere, que mientras, la persona tenga más embarazos, tiene más probabilidad de contener diabetes tipo 2.
library(ggmosaic)
library(gridExtra)
q1<- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Gender),
fill = Diabetic)) + labs ("Gender",
title = "Factores_Diabetes")
q2<- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Family_Diabetes),
fill = Diabetic)) + labs ("Family_Diabetes",
title = "Factores_Diabetes")
q3 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, highBP),
fill = Diabetic)) + labs ("highBP",
title = "Factores_Diabetes")
q4 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, PhysicallyActive),
fill = Diabetic)) + labs("PhysicallyActive",
title = "Factores_Diabetes")
grid.arrange(q1, q2, q3, q4, nrow= 2, ncol = 2)
## Warning: `unite_()` was deprecated in tidyr 1.2.0.
## ℹ Please use `unite()` instead.
## ℹ The deprecated feature was likely used in the ggmosaic package.
## Please report the issue at <https://github.com/haleyjeppson/ggmosaic>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que entre la variable “Male”(Masculino) posse más individuos con DM2 que las mujeres “Female”.
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que si la persona proviene de una familia con historial de la enfermedad, tiene más probabilidades de poseer la enfermedad DM2.
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras el diagnóstico de hipertensión arterial es alta, más probabilidad es que la persona contenga DM2.
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras menos deporte haga la persona, más es la probabilidad de contraer DM2.
q5<- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Smoking),
fill = Diabetic)) + labs ("Smoking",
title = "Factores_Diabetes")
q6<- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Alcohol),
fill = Diabetic)) + labs ("Alcohol",
title = "Factores_Diabetes")
q7 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, RegularMedicine),
fill = Diabetic)) + labs ("RegularMedicine",
title = "Factores_Diabetes")
q8 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, JunkFood),
fill = Diabetic)) + labs("JunkFood",
title = "Factores_Diabetes")
grid.arrange(q5, q6, q7, q8, nrow= 2, ncol = 2)
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más la persona fume, se tiene más probabilidad de contraer DM2.
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más la persona fume, se tiene más probabilidad de contraer DM2.
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más se toma alcohol, se tiene más probabilidad de contraer DM2.
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más se consume comida chatarra, más es la probabilidad de contraer DM2.
q9<- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Stress),
fill = Diabetic)) + labs ("Stress",
title = "Factores_Diabetes")
q10<- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, BPLevel),
fill = Diabetic)) + labs ("BPLevel",
title = "Factores_Diabetes")
q11 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, UriationFreq),
fill = Diabetic)) + labs ("UriationFreq",
title = "Factores_Diabetes")
grid.arrange(q9, q10, q11, nrow= 2, ncol = 2)
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más estrés tenga la persona, más probabilidad es contraer la enfermedad.
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras más alta el la presión arterial, mayor es la probabilidad de contraer DM2.
Se observa que las personas que no contienen diabetes tipo 2 sobresale, mientras, que la población minotaria es los que contienen la enfermedad. Sin embargo, se visualiza que mientras que más alta la frecuencia urinaria, mayor es el riesgo de contraer la enfermedad.
library(GGally)
library(ggmosaic)
ggpairs(diabetes2[, clases == "integer"])+ theme_bw()
Este gráfico brinda mayor información sobre la data estudiada.
library(GGally)
library(ggmosaic)
p <- ggpairs(diabetes2[, c(which( clases == "integer") ,18)], aes(color = Diabetic)) + theme_bw()
for(i in 1:p$nrow){
for(j in 1:p$ncol){
p[i,j] <- p[i,j] +
scale_fill_manual(values = c("#66CDAA", "#EE3050")) +
scale_color_manual(values = c("#66CDAA", "#EE4050"))
}
}
p
La relación entre las variales “Sleep” y “BMI” tiene una correlación de -0.073, lo cual es una correlación nula negativa. Por lo que, indica que mientras más sea el BMI, menor cantidad de sueño en horas tendrá el paciente.
Además, existe dispersión entre los valores de las dos variables, dando como resultado una correlación no lineal.
La relación entre las variales “SoundSleep” y “BMI” tiene una correlación de -0.291, lo cual es una correlación nula negativa. Por lo cual, mientras más BMI presenta el paciente peor será el sueño profundo.
La relación entre las variales “Pregancies” y “BMI” tiene una correlación de -0.086, lo cual es una correlación nula negativa.
La relación entre las variables “SoundSleep” y “Sleep” revela una correlación con moderada intensidad, expresada mediante un valor numérico de 0.575. Este coeficiente sugierre una asociación significativa entre ambos aspectos, indicando cambios en uno podría estar relacionado con cambios proporcionados en el otro, aunque no de manera extremadamente fuerte.
La relación entre las variales “Pregancies” y “Sleep” tiene una correlación de 0.054, lo cual es una correlación nula positiva.
La relación entre las variales “Pregancies” y “SoundSleep” tiene una correlación de 0.117, lo cual es una correlación débil positiva.
Divideremos el conjunto completo de individuos en dos partes, uno para entrenar el modelo, que contienen el 80% d elos individuos y otra para validarlo que contiene el resto. Esto es así porque si valoramos el modelo con las mismas observaciones que usamos para ajustarlo, la bondad del ajuste quedará sobrevalorada.
Antes de ajustar cualquier modelo, es conveniente escalar las variables numériccas y tenemos que reacondicionar las variables categóricas convirtiéndolas en variables ficticias y usando la primera o la última categoría como comparación.
diabetes2[, clases == "integer"]= scale(diabetes2[, clases == "integer"])
head(diabetes2)
Las varibles categóricas aparecen con 0 y 1.
X= model.matrix(Diabetic ~ ., data = diabetes2)
head(X)
## (Intercept) Age40-49 Age50-59 Age60 or older GenderFemale
## 20 1 0 0 1 1
## 258 1 0 0 1 1
## 511 1 0 1 0 0
## 907 1 0 0 1 1
## 582 1 0 1 0 1
## 726 1 0 0 0 1
## Family_Diabetesyes highBPyes PhysicallyActivenone
## 20 1 0 0
## 258 1 0 0
## 511 1 0 0
## 907 1 0 1
## 582 0 0 1
## 726 0 0 0
## PhysicallyActive \nmore than half an hr
## 20 0
## 258 0
## 511 1
## 907 0
## 582 0
## 726 0
## PhysicallyActive \nless than half an hr BMI Smokingyes Alcoholyes
## 20 1 -0.6487242 0 0
## 258 1 -0.6487242 0 0
## 511 0 0.1294871 0 0
## 907 0 -1.2323826 1 1
## 582 0 -0.4541713 0 1
## 726 0 0.1294871 1 0
## Sleep SoundSleep RegularMedicineyes JunkFoodoccasionally
## 20 0.78534240 0.2119477 0 0
## 258 0.78534240 0.2119477 0 0
## 511 0.01861803 0.7543900 0 1
## 907 0.01861803 -0.3304947 0 1
## 582 0.01861803 0.2119477 1 1
## 726 0.78534240 0.7543900 0 1
## JunkFoodvery often JunkFoodalways Stressnot at all Stresssometimes
## 20 1 0 1 0
## 258 1 0 1 0
## 511 0 0 0 1
## 907 0 0 1 0
## 582 0 0 0 0
## 726 0 0 0 1
## Stressvery often BPLevelnormal BPLevel\tlow Pregancies Pdiabetes1
## 20 0 0 1 -0.4201082 0
## 258 0 0 1 -0.4201082 0
## 511 0 0 1 2.8800479 0
## 907 0 0 1 -0.4201082 0
## 582 1 0 0 -0.4201082 0
## 726 0 0 1 -0.4201082 0
## UriationFreqnot much
## 20 0
## 258 0
## 511 0
## 907 0
## 582 1
## 726 0
Se observa que las variables numéricas reescaladas contienen los mismo valores iniciales. Cada una de las variables nominales han sido convertida en variables binarias. El número de variables binarias es siempre el número de categorías de la variable nominal. Por ejemplo, la variable Gender (con dos categorías) ha sido convertida en GenderMale que es una variable numérca que vale 1 cuando el sexo es hombre y 0 cuando es mujer. El resto de variables también son convertidas a Binarias con el número de categorías que cada una almacena. Los parámetros correspondientes a las categóricas retenidas comparan a éstas con la categoría eliminada.
Divideremos el conjunto completo de individuos en dos partes, uno para entrenar el modelo, que contiene el 80% de los de los individuos y otra para validarlo que contiene el resto. Esto es
tr = round(nrow(diabetes2)*0.7)
set.seed(06071981) # semilla para el entrenamiento
muestra = sample.int(nrow(diabetes2), tr) # tomo una muestra del 70%
Train.diabet = diabetes2[muestra,] #tomo los datos para entrenamiento
Val.diabet = diabetes2[-muestra,] #tomo los datos para validación
Ahora disponemos de un conjunto de entrenamiento Train.diabet que es el 70% y un conjunto de validación Val.diabet que es el 30%.
Trataremos de modelar la probabilidad de DIABETES positiva en función del resto de las variables.
\[{p_1} = P\left({Y=1|X={x_i}}\right)=\frac{e^{\beta_{0}+\beta_{1}x_{i1}+...\beta_{p}x_{ip}}}{1+e^{\beta_{0}+\beta_{1}x_{i1}+...\beta_{p}x_{ip}}}\] Vamos ajustar el modelo desde el punto de vista estadístico para interpretar los parámetros.
Un GLM está especificado por tres componentes:
Aleatoria.
Sistemática.
De enlace.
Los GLM son, por tanto, una extensión de los modelos lineales que permiten utilizar distribuciones no normales de los errores (binomiales, Poisson, gamma, etc) y varianzas no constantes.
glm <- ajusta los modelos de regresió, que tipo de distribución se va aplicar. Distribucion binomial.
La columna Pr(>|z|) representa el valor p asociado con el valor en la columna del valor z.
Si el valor p es menor que un cierto nivel de significancia (por ejemplo, α = 0,05), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable de respuesta en el modelo.
\[Valor ~ z = \frac{Estimación}{Error ~ Estándar} \]
\[Valor ~ p = 2*(1-pnorm(valor ~ z))\]
library(stats)
gfit1 <- glm( Diabetic ~ ., data = diabetes2, family = binomial)
summary(gfit1)
##
## Call:
## glm(formula = Diabetic ~ ., family = binomial, data = diabetes2)
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) -2.77088 1.08160 -2.562
## Age40-49 0.41120 0.36291 1.133
## Age50-59 1.62408 0.41602 3.904
## Age60 or older -1.68936 0.43244 -3.907
## GenderFemale 0.48706 0.37089 1.313
## Family_Diabetesyes 1.00920 0.25459 3.964
## highBPyes -0.85083 0.38970 -2.183
## PhysicallyActivenone 0.55514 0.36247 1.532
## PhysicallyActive \nmore than half an hr 0.85532 0.38718 2.209
## PhysicallyActive \nless than half an hr 1.68317 0.37751 4.459
## BMI 0.17735 0.12090 1.467
## Smokingyes 1.15528 0.50424 2.291
## Alcoholyes 0.09689 0.36237 0.267
## Sleep 0.05861 0.15561 0.377
## SoundSleep 0.39536 0.18442 2.144
## RegularMedicineyes 2.97844 0.30926 9.631
## JunkFoodoccasionally 0.08808 0.84774 0.104
## JunkFoodvery often 0.25582 0.83663 0.306
## JunkFoodalways 0.04005 0.97557 0.041
## Stressnot at all -0.03269 0.51891 -0.063
## Stresssometimes -0.53932 0.39565 -1.363
## Stressvery often -0.32951 0.45855 -0.719
## BPLevelnormal -15.08888 758.75534 -0.020
## BPLevel\tlow -1.47618 0.39038 -3.781
## Pregancies 0.32210 0.14874 2.165
## Pdiabetes1 4.01652 0.88504 4.538
## UriationFreqnot much 0.43749 0.31153 1.404
## Pr(>|z|)
## (Intercept) 0.010412 *
## Age40-49 0.257177
## Age50-59 9.47e-05 ***
## Age60 or older 9.36e-05 ***
## GenderFemale 0.189105
## Family_Diabetesyes 7.37e-05 ***
## highBPyes 0.029013 *
## PhysicallyActivenone 0.125639
## PhysicallyActive \nmore than half an hr 0.027165 *
## PhysicallyActive \nless than half an hr 8.25e-06 ***
## BMI 0.142372
## Smokingyes 0.021955 *
## Alcoholyes 0.789187
## Sleep 0.706443
## SoundSleep 0.032045 *
## RegularMedicineyes < 2e-16 ***
## JunkFoodoccasionally 0.917245
## JunkFoodvery often 0.759775
## JunkFoodalways 0.967253
## Stressnot at all 0.949776
## Stresssometimes 0.172845
## Stressvery often 0.472393
## BPLevelnormal 0.984134
## BPLevel\tlow 0.000156 ***
## Pregancies 0.030350 *
## Pdiabetes1 5.67e-06 ***
## UriationFreqnot much 0.160219
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1091.56 on 905 degrees of freedom
## Residual deviance: 491.38 on 879 degrees of freedom
## AIC: 545.38
##
## Number of Fisher Scoring iterations: 16
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “Age” en el nivel “60 or older”(60 o más), la estimación para la variable predictora es de 1.62408, su error estándar es de , con valor de z 3.904 y con un valor p de 9.47e-05.
El valor p es menor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p.
Por lo cual, indica que tener 60 o mas años aumenta considerablemente la probabilidad de tener diabetes tipo 2.
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “Age” en el nivel “less than 40”(menos de 40), la estimación para la variable predictora es de -1.68936 , su error estándar es de , con valor de z -3.907 y con un valor p de 9.36e-05.
El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p.
Por lo cual, indica que tener menos de 40 años, disminuye la probabilidad de contener diabetes tipo 2.
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “Family_Diabetes” en el nivel “yes”(sí), la estimación para la variable predictora es de 1.00920, su error estándar es de , con valor de z 3.964 y con un valor p de 7.37e-05.
El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p.
Por lo cual, indica que tener antecedentes familiares con diabetes tipo 2, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “highBP” en el nivel “yes”(sí), la estimación para la variable predictora es de -0.85083 , su error estándar es de , con valor de z -2.183 y con un valor p de 0.029013.
El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en el asterisco al lado del valor p.
Por lo cual, indica que tener no contener presión alterial alta, disminuye la probabilidad de contener diabetes tipo 2.
PhysicallyActivenone 0.85532 0.38718 2.209 0.027165 *
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “PhysicallyActive” en el nivel “none”(ninguno), la estimación para la variable predictora es de 0.85532, su error estándar es de , con valor de z 2.209 y con un valor p de 0.027165.
El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p.
Por lo cual, indica que al no tener actividad física, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “PhysicallyActive” en el nivel “nhr or more”(una hora o más), la estimación para la variable predictora es de 1.68317, su error estándar es de , con valor de z 4.459 y con un valor p de 8.25e-06.
El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p.
Por lo cual, indica que al tener actividad física, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “Smoking” en el nivel “yes”(sí), la estimación para la variable predictora es de 1.15528, su error estándar es de , con valor de z 0.021955 y con un valor p de 0.021955.
El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p.
Por lo cual, indica que al ser fumador, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “RegularMedcine” en el nivel “yes”(sí), la estimación para la variable predictora es de 2.97844, su error estándar es de , con valor de z 9.631 y con un valor p de 2e-16.
El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p.
Por lo cual, indica que al medicarse, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “BPLevel” en el nivel “normal”, la estimación para la variable predictora es de -1.47618, su error estándar es de , con valor de z -3.781 y con un valor p de 0.000156.
El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p.
Por lo cual, indica que al tener la presion arterial normal, el paciente disminuye considerablemente la probabilidad de tener diabetes tipo 2.
Se obtiene el modelo lineal generalizado (Regresión logística) para la variable “BPLevel” en el nivel “normal”, la estimación para la variable predictora es de 4.01652, su error estándar es de , con valor de z 4.538 y con un valor p de 5.67e-06.
El valor p es mayor que el nivel de significancia ( \(\alpha = 0.05\)), esto indica que la variable predictiva tiene una relación estadísticamente significativa con la variable respuesta, esto se evidencia en los asteriscos al lado del valor p.
Por lo cual, indica que al tener la diabetes gestional, el paciente aumenta considerablemente la probabilidad de tener diabetes tipo 2.
Compara medias para ver si hay diferencas significativas en diferentes grupos.
Se utiliza el test chi - cuadrado
gfit0 <- glm(Diabetic ~ 1, data = diabetes2,
family = binomial)
anova (gfit0, gfit1, test = "Chisq")
anova(gfit1, test = "Chisq")
Se corrobora que las variables significativas son las mismas en los dos casos. Es decir, estas influyen en el modelo.
gfit2 <- glm( Diabetic ~ ., data = Train.diabet, family = binomial)
cbind(gfit1$coefficients, gfit2$coefficients)
## [,1] [,2]
## (Intercept) -2.77087932 -1.74808262
## Age40-49 0.41120398 0.59253917
## Age50-59 1.62408303 1.61214689
## Age60 or older -1.68935773 -1.74881721
## GenderFemale 0.48706126 0.75499209
## Family_Diabetesyes 1.00919861 1.10013745
## highBPyes -0.85082885 -1.34929812
## PhysicallyActivenone 0.55513711 0.96937032
## PhysicallyActive \nmore than half an hr 0.85532299 1.24247791
## PhysicallyActive \nless than half an hr 1.68316752 1.65601454
## BMI 0.17735494 0.14903473
## Smokingyes 1.15528381 1.46817871
## Alcoholyes 0.09688630 -0.93616362
## Sleep 0.05860712 0.13708311
## SoundSleep 0.39536387 0.24376942
## RegularMedicineyes 2.97844459 3.18194151
## JunkFoodoccasionally 0.08808372 -0.59620345
## JunkFoodvery often 0.25582142 -0.68203158
## JunkFoodalways 0.04005097 -0.80432089
## Stressnot at all -0.03268509 -0.09683845
## Stresssometimes -0.53932026 -0.66670031
## Stressvery often -0.32951273 -0.76141479
## BPLevelnormal -15.08887804 -15.55244810
## BPLevel\tlow -1.47618023 -1.88078889
## Pregancies 0.32210269 0.41273999
## Pdiabetes1 4.01651629 5.09624708
## UriationFreqnot much 0.43749258 0.41011844
Al ya calcular el modelo, se predice con el conjunto de validación (Val.diabet) y entrenamiento.
p = predict(gfit2, Val.diabet, type = "response")
PredDiabet = as.factor (p > 0.5)
levels(PredDiabet) = c( "no", "yes")
library(lattice)
library(caret)
matrizLogis <- confusionMatrix (Val.diabet$Diabetic, PredDiabet)
matrizLogis
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 185 20
## yes 16 51
##
## Accuracy : 0.8676
## 95% CI : (0.8215, 0.9056)
## No Information Rate : 0.739
## P-Value [Acc > NIR] : 1.799e-07
##
## Kappa : 0.6506
##
## Mcnemar's Test P-Value : 0.6171
##
## Sensitivity : 0.9204
## Specificity : 0.7183
## Pos Pred Value : 0.9024
## Neg Pred Value : 0.7612
## Prevalence : 0.7390
## Detection Rate : 0.6801
## Detection Prevalence : 0.7537
## Balanced Accuracy : 0.8194
##
## 'Positive' Class : no
##
Para los verdaderos negativos es decir las personas que no tienen diabetes en este momento, la posibilidad de que no presenten diabetes tipo 2 a un futuro es de 185 personas.
Para los falsos negativos es decir las personas que si presentan diabetes tipo 2 en este momento, la posibilidad de que no presenten diabetes tipo 2 a un futuro es de 20 personas.
Para los falsos positivos es decir las personas que presentan diabetes tipo 2 en este momento, la posibilidad de que no presenten diabetes tipo 2 a un futuro es de 16 personas.
Para los verdaderos positivos es decir las personas que presentan diabetes tipo 2 en este momento, la posibilidad de que presenten diabetes tipo 2 a un futuro es de 51 personas.
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
test_prob = predict(gfit2, newdata = Val.diabet, type = "response")
test_roc = roc(Val.diabet$Diabetic ~ test_prob, plot = T, print.auc = T)
## Setting levels: control = no, case = yes
## Setting direction: controls < cases
Es un modelo completamente aceptable, ya que es moderado. En la sensibildiad podemos ver el comportamiento de los valors positivos y la especicifidad es la de los valores negativos.
Los umbrales de desicion se establecen por el area bajo la curva se dice que el modelo de prediccion con el modelos de regresion logística aparentemente es bueno.
Otro modelo de clasificación binaria es el conocido como Support Vector Machine (Maquina de vector soporte). Los paquetes que ajustan los modelos de SVM es e1071 y liblinear. Ajustamos el modelo para nuestros datos con el kernel radial que es el que se ajusta por defecto.
library(e1071)
fitsvm1 <- svm(Diabetic~., data= Train.diabet)
summary(fitsvm1)
##
## Call:
## svm(formula = Diabetic ~ ., data = Train.diabet)
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: radial
## cost: 1
##
## Number of Support Vectors: 265
##
## ( 132 133 )
##
##
## Number of Classes: 2
##
## Levels:
## no yes
A continuación la predicción los valores de la respuesta y calculamos la matriz de confusión:
library(caret)
predictedSVM <- predict(fitsvm1, Val.diabet)
matrizSVM1 <- confusionMatrix(Val.diabet$Diabetic,
predictedSVM)
matrizSVM1
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 196 9
## yes 14 53
##
## Accuracy : 0.9154
## 95% CI : (0.8758, 0.9456)
## No Information Rate : 0.7721
## P-Value [Acc > NIR] : 3.803e-10
##
## Kappa : 0.7664
##
## Mcnemar's Test P-Value : 0.4042
##
## Sensitivity : 0.9333
## Specificity : 0.8548
## Pos Pred Value : 0.9561
## Neg Pred Value : 0.7910
## Prevalence : 0.7721
## Detection Rate : 0.7206
## Detection Prevalence : 0.7537
## Balanced Accuracy : 0.8941
##
## 'Positive' Class : no
##
Interpretemos esta matriz de confusión y sus estadísticas:
Accuracy (Precisión): 0.9154. Indica que el modelo tiene una precisión total del 91.54%.
95% CI (Intervalo de confianza al 95%): (0.8758, 0.9456). Hay un 95% de confianza de que la precisión real del modelo esté entre 87.58% y 94.56%.
No Information Rate: 0.7721. Indica la precisión que se obtendría si se predijera siempre la clase mayoritaria (“no”).
P-Value [Acc > NIR]: 3.803e-10. Muy bajo, lo que indica que la precisión del modelo es significativamente mejor que predecir siempre la clase mayoritaria.
Kappa: 0.7664. Un valor alto que indica buen acuerdo entre las predicciones y las clases reales.
Sensitivity (Sensibilidad): 0.9333 para la clase positiva “no”. Indica buena capacidad de detectar la clase “no”.
Specificity (Especificidad): 0.8548 para la clase “no”. Indica buena capacidad de detectar la clase “sí”.
Pos Pred Value: Valor predictivo positivo alto (95.61%) para la clase “no”.
Neg Pred Value: Valor predictivo negativo del 79.1% para la clase “no”.
En conclusión, la matriz indica que el modelo tiene una muy buena precisión, con capacidad tanto para detectar la clase positiva “no” como la negativa “sí”.
library(e1071)
fitsvm2 <- svm(Diabetic ~ ., data = Train.diabet, kernel = "polynomial")
summary(fitsvm2)
##
## Call:
## svm(formula = Diabetic ~ ., data = Train.diabet, kernel = "polynomial")
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: polynomial
## cost: 1
## degree: 3
## coef.0: 0
##
## Number of Support Vectors: 386
##
## ( 202 184 )
##
##
## Number of Classes: 2
##
## Levels:
## no yes
predictedSVM <- predict(fitsvm2, Val.diabet)
matrizSVM2 <- confusionMatrix(Val.diabet$Diabetic, predictedSVM)
matrizSVM2
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 203 2
## yes 51 16
##
## Accuracy : 0.8051
## 95% CI : (0.753, 0.8505)
## No Information Rate : 0.9338
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.3038
##
## Mcnemar's Test P-Value : 4.301e-11
##
## Sensitivity : 0.7992
## Specificity : 0.8889
## Pos Pred Value : 0.9902
## Neg Pred Value : 0.2388
## Prevalence : 0.9338
## Detection Rate : 0.7463
## Detection Prevalence : 0.7537
## Balanced Accuracy : 0.8441
##
## 'Positive' Class : no
##
Interpretación de resultados
Accuracy (precisión): 80.51%. Indica el porcentaje de predicciones correctas sobre el total.
Sensitivity (sensibilidad): 79.92%. Indica la capacidad del modelo para detectar correctamente los casos positivos (que sí tienen diabetes).
Specificity (especificidad): 88.89%. Indica la capacidad para detectar correctamente los negativos (que no tienen diabetes).
PPV (valor predictivo positivo): 99.02%. Indica la fiabilidad de las predicciones positivas.
NPV (valor predictivo negativo): 23.88%. Indica la fiabilidad de las predicciones negativas.
En conclusión, el modelo tiene una precisión moderada (80%), con mejor capacidad para detectar negativos que positivos. Las predicciones positivas son muy fiables (99%) pero las negativas mucho menos (24%).
library(e1071)
fitsvm3 <- svm(Diabetic ~ ., data = Train.diabet, kernel = "sigmoid")
summary(fitsvm3)
##
## Call:
## svm(formula = Diabetic ~ ., data = Train.diabet, kernel = "sigmoid")
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: sigmoid
## cost: 1
## coef.0: 0
##
## Number of Support Vectors: 281
##
## ( 140 141 )
##
##
## Number of Classes: 2
##
## Levels:
## no yes
predictedSVM <- predict(fitsvm3, Val.diabet)
matrizSVM3 <- confusionMatrix(Val.diabet$Diabetic, predictedSVM)
matrizSVM3
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 186 19
## yes 16 51
##
## Accuracy : 0.8713
## 95% CI : (0.8256, 0.9087)
## No Information Rate : 0.7426
## P-Value [Acc > NIR] : 1.512e-07
##
## Kappa : 0.6586
##
## Mcnemar's Test P-Value : 0.7353
##
## Sensitivity : 0.9208
## Specificity : 0.7286
## Pos Pred Value : 0.9073
## Neg Pred Value : 0.7612
## Prevalence : 0.7426
## Detection Rate : 0.6838
## Detection Prevalence : 0.7537
## Balanced Accuracy : 0.8247
##
## 'Positive' Class : no
##
Interpretación de resultados
Se utilizó un kernel sigmoidal con un costo (regularización) de 1.
Se entrenó el modelo con 281 vectores de soporte (140 de la clase “no” y 141 de la clase “sí”).
Hay 2 clases, “no” para no diabético y “sí” para diabético.
La matriz de confusión muestra que el modelo predijo correctamente a 186 de 205 pacientes no diabéticos (verdaderos negativos) y 51 de 67 pacientes diabéticos (verdaderos positivos).
La precisión (accuracy) global es del 87.13%.
La sensibilidad (capacidad de detectar positivos) es del 92.08%.
La especificidad (capacidad de detectar negativos) es del 72.86%.
El valor predictivo positivo (precisión en positivos) es 90.73%.
El valor predictivo negativo (precisión en negativos) es 76.12%.
library(e1071)
fitsvm4 <- svm(Diabetic ~ ., data = Train.diabet,
kernel = "linear")
summary(fitsvm4)
##
## Call:
## svm(formula = Diabetic ~ ., data = Train.diabet, kernel = "linear")
##
##
## Parameters:
## SVM-Type: C-classification
## SVM-Kernel: linear
## cost: 1
##
## Number of Support Vectors: 195
##
## ( 98 97 )
##
##
## Number of Classes: 2
##
## Levels:
## no yes
predictedSVM <- predict(fitsvm4, Val.diabet)
matrizSVM4 <- confusionMatrix(Val.diabet$Diabetic, predictedSVM)
matrizSVM4
## Confusion Matrix and Statistics
##
## Reference
## Prediction no yes
## no 186 19
## yes 16 51
##
## Accuracy : 0.8713
## 95% CI : (0.8256, 0.9087)
## No Information Rate : 0.7426
## P-Value [Acc > NIR] : 1.512e-07
##
## Kappa : 0.6586
##
## Mcnemar's Test P-Value : 0.7353
##
## Sensitivity : 0.9208
## Specificity : 0.7286
## Pos Pred Value : 0.9073
## Neg Pred Value : 0.7612
## Prevalence : 0.7426
## Detection Rate : 0.6838
## Detection Prevalence : 0.7537
## Balanced Accuracy : 0.8247
##
## 'Positive' Class : no
##
Interpretación de resultados
Se utilizó una SVM con regularización C = 1 y kernel lineal.
El modelo resultante tiene 195 vectores de soporte (98 de la clase “no” y 97 de la clase “sí”). Los vectores de soporte son los puntos de datos críticos que definen la frontera de decisión.
Hay 2 clases, “no” para no diabético y “sí” para diabético.
La matriz de confusión compara las predicciones con los valores reales. El modelo predijo correctamente 186 de 205 no diabéticos y 51 de 67 diabéticos.
La precisión (accuracy) global es 87.13%.
La sensibilidad es 92.08%, indica la capacidad de detectar positivos.
La especificidad es 72.86%, capacidad de detectar negativos.
Valor predictivo positivo de 90.73%, precisión en los casos positivos predichos.
Valor predictivo negativo de 76.12%, precisión en los casos negativos predichos.
Accuracy <- c(matrizLogis$overall[1], matrizSVM1$overall[1],
matrizSVM2$overall[1], matrizSVM3$overall[1],
matrizSVM4$overall[1])
names(Accuracy) = c("Logística", "SVM-Radial","SVM-Polynomial",
"SVM-Sigmoid", "SVM-Linear")
Accuracy
## Logística SVM-Radial SVM-Polynomial SVM-Sigmoid SVM-Linear
## 0.8676471 0.9154412 0.8051471 0.8713235 0.8713235
INTERPRETACIÓN
Esta tabla muestra la precisión (accuracy) de 5 modelos de clasificación diferentes entrenados en los mismos datos para predecir diabetes:
Regresión Logística
SVM con kernel radial
SVM con kernel polinomial
SVM con kernel sigmoidal
SVM con kernel lineal
Al observar los valores de precisión:
El modelo con mejor performance es la SVM con kernel radial, con una precisión de 0.915 o 91.5 %.
Le siguen la SVM sigmoidal, la SVM lineal y la regresión logística todas con una precisión de 0.871 o 87.1 %.
La SVM polinomial tiene la precisión más baja de 0.805 o 80.5 %.
En conclusión, para estos datos la SVM con kernel radial es la que logra el mejor balance entre capacidad de aprendizaje y prevention del overfitting, resultando en la mayor precisión.
#Redes neuronales
require(neuralnet)
Loading required package: neuralnet
Train = data.frame(Train.diabet$Diabetic, model.matrix(Diabetic~.,
data = Train.diabet)[, -1])
colnames(Train)[1] = "Diabetic"
nn1 = neuralnet(Diabetic ~., data = Train, hidden = 3, act.fct = "logistic", linear.output = F)
plot(nn1, main = "Redes neuronales")
Validate = data.frame(Val.diabet$Diabetic, model.matrix(Diabetic~.,
data = Val.diabet)[,-1])
colnames(Validate)[1] = "Diabetic"
Predict = compute (nn1, Validate)
predictedNN1 = factor(Predict$net.result[, 1]>0.5, labels = c ("no", "yes"))
matrizNN1 <- confusionMatrix(Val.diabet$Diabetic, predictedNN1)
matrizNN1
Confusion Matrix and Statistics
Reference
Prediction no yes
no 5 200
yes 58 9
Accuracy : 0.0515
95% CI : (0.0284, 0.0849)
No Information Rate : 0.7684
P-Value [Acc > NIR] : 1
Kappa : -0.491
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.07937
Specificity : 0.04306
Pos Pred Value : 0.02439
Neg Pred Value : 0.13433
Prevalence : 0.23162
Detection Rate : 0.01838
Detection Prevalence : 0.75368
Balanced Accuracy : 0.06121
'Positive' Class : no
Se obtiene que en la matriz de confusión los verdaderes negativos contiene un valor bajo de 5 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 9 personas que tienen diabetes y que aun futuro lo seguirá teniendo.
Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es malo, ya que, su valor es 0.0515, lo cual es muy bajo. Este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7684.
Incluso en kkapa se observa que contiene un valor negativo, lo cual se infiere que el modelo para esta predicción es demasiado malo.
n11 = neuralnet(Diabetic ~., data = Train, hidden = c(5,3), act.fct = "logistic", linear.output = F)
plot(nn1)
Predict = compute (nn1, Validate)
predictedNN1 = factor(Predict$net.result[,1]>0.5, labels = c ("no", "yes"))
matrizNN1 <- confusionMatrix(Val.diabet$Diabetic, predictedNN1)
matrizNN1
Confusion Matrix and Statistics
Reference
Prediction no yes
no 5 200
yes 58 9
Accuracy : 0.0515
95% CI : (0.0284, 0.0849)
No Information Rate : 0.7684
P-Value [Acc > NIR] : 1
Kappa : -0.491
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.07937
Specificity : 0.04306
Pos Pred Value : 0.02439
Neg Pred Value : 0.13433
Prevalence : 0.23162
Detection Rate : 0.01838
Detection Prevalence : 0.75368
Balanced Accuracy : 0.06121
'Positive' Class : no
Se obtiene que en la matriz de confusión los verdaderes negativos contiene un valor bajo de 5 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 9 personas que tienen diabetes y que aun futuro lo seguirá teniendo.
Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es malo, ya que, su valor es 0.0515, lo cual es muy bajo. Este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7684.
Incluso en kkapa se observa que contiene un valor negativo, lo cual se infiere que el modelo para esta predicción es demasiado malo.
Se verifica que es lo mismo que el del anterior, ya que el resultado de comprobación del modelo no cambia, incluso colocando 5 y 4 nodos.
#Naive Bayes Trabaja con modelos de probabilidad.
fitbayes <- naiveBayes(Diabetic ~., data = Train.diabet)
summary(fitbayes)
Length Class Mode
apriori 2 table numeric
tables 17 -none- list
levels 2 -none- character
isnumeric 17 -none- logical
call 4 -none- call
#Predict Output
predictedBayes = predict(fitbayes, Val.diabet)
matrizNB <- confusionMatrix(Val.diabet$Diabetic, predictedBayes)
matrizNB
Confusion Matrix and Statistics
Reference
Prediction no yes
no 175 30
yes 19 48
Accuracy : 0.8199
95% CI : (0.7689, 0.8637)
No Information Rate : 0.7132
P-Value [Acc > NIR] : 3.363e-05
Kappa : 0.5402
Mcnemar's Test P-Value : 0.1531
Sensitivity : 0.9021
Specificity : 0.6154
Pos Pred Value : 0.8537
Neg Pred Value : 0.7164
Prevalence : 0.7132
Detection Rate : 0.6434
Detection Prevalence : 0.7537
Balanced Accuracy : 0.7587
'Positive' Class : no
Se obtiene que en la matriz de confusión los verdaderes negativos contiene un valor bajo de 175 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 48 personas que tienen diabetes y que aún futuro lo seguirá teniendo.
Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.8199, lo cual es bueno. Este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7132.
Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es mejor que el anterior, es decir, al modelo de redes neuronales.
#Árboles de decisión
library(tree)
tree1 = tree(Diabetic~., data = Train.diabet)
summary(tree1)
Classification tree:
tree(formula = Diabetic ~ ., data = Train.diabet)
Variables actually used in tree construction:
[1] "RegularMedicine" "Pdiabetes" "Age" "Stress"
[5] "SoundSleep" "UriationFreq" "PhysicallyActive" "Alcohol"
[9] "Family_Diabetes" "BMI" "Sleep"
Number of terminal nodes: 21
Residual mean deviance: 0.3115 = 190.9 / 613
Misclassification error rate: 0.05836 = 37 / 634
plot(tree1)
text(tree1, pretty = 1)
library(caret)
predicedtree1 = predict(tree1, Val.diabet, type = "class")
matriztree1 <- confusionMatrix(Val.diabet$Diabetic, predicedtree1)
matriztree1
Confusion Matrix and Statistics
Reference
Prediction no yes
no 197 8
yes 16 51
Accuracy : 0.9118
95% CI : (0.8716, 0.9426)
No Information Rate : 0.7831
P-Value [Acc > NIR] : 1.257e-08
Kappa : 0.7524
Mcnemar's Test P-Value : 0.153
Sensitivity : 0.9249
Specificity : 0.8644
Pos Pred Value : 0.9610
Neg Pred Value : 0.7612
Prevalence : 0.7831
Detection Rate : 0.7243
Detection Prevalence : 0.7537
Balanced Accuracy : 0.8946
'Positive' Class : no
Se obtiene que en la matriz de confusión los verdaderos negativos contiene un valor bajo de 197 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 51 personas que tienen diabetes y que aún futuro lo seguirá teniendo.
Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.9118, lo cual es bueno. Este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7831.
Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es mejor que el anterior, es decir, al modelo de naive bayes.
cv.tree1 =cv.tree(tree1, FUN = prune.misclass)
cv.tree1
## $size
## [1] 21 18 16 11 8 7 6 3 2 1
##
## $dev
## [1] 65 65 64 62 63 67 88 90 114 196
##
## $k
## [1] -Inf 0.0 1.0 1.8 2.0 5.0 7.0 8.0 22.0 84.0
##
## $method
## [1] "misclass"
##
## attr(,"class")
## [1] "prune" "tree.sequence"
plot(cv.tree1)
prune.tree1 = prune.misclass(tree1, best = 10)
plot(prune.tree1)
text(prune.tree1, pretty = 0)
predicedtree2 = predict(prune.tree1, Val.diabet, type = "class")
matriztree2 <- confusionMatrix(Val.diabet$Diabetic,predicedtree2)
matriztree2
Confusion Matrix and Statistics
Reference
Prediction no yes
no 192 13
yes 22 45
Accuracy : 0.8713
95% CI : (0.8256, 0.9087)
No Information Rate : 0.7868
P-Value [Acc > NIR] : 0.0002243
Kappa : 0.637
Mcnemar's Test P-Value : 0.1762964
Sensitivity : 0.8972
Specificity : 0.7759
Pos Pred Value : 0.9366
Neg Pred Value : 0.6716
Prevalence : 0.7868
Detection Rate : 0.7059
Detection Prevalence : 0.7537
Balanced Accuracy : 0.8365
'Positive' Class : no
Se obtiene que en la matriz de confusión a través de validación cruzada con 10 ramas, los verdaderos negativos contiene un valor bajo de 197 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 49 personas que tienen diabetes y que aún futuro lo seguirá teniendo.
Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.8713 , lo cual es bueno Sin embargo, baja con respecto al anterior. Además, este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7868.
Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es buena pero no mejor que el anterior, es decir, al modelo de árboles de decisión sin ramas predichas.
prune.tree2 = prune.misclass(tree1, best = 5)
plot(prune.tree2)
text(prune.tree2, pretty = 0)
predicedtree3 = predict(prune.tree2, Val.diabet, type = "class")
matriztree3 <- confusionMatrix(Val.diabet$Diabetic,predicedtree3)
matriztree3
Confusion Matrix and Statistics
Reference
Prediction no yes
no 191 14
yes 27 40
Accuracy : 0.8493
95% CI : (0.8011, 0.8896)
No Information Rate : 0.8015
P-Value [Acc > NIR] : 0.02584
Kappa : 0.5657
Mcnemar's Test P-Value : 0.06092
Sensitivity : 0.8761
Specificity : 0.7407
Pos Pred Value : 0.9317
Neg Pred Value : 0.5970
Prevalence : 0.8015
Detection Rate : 0.7022
Detection Prevalence : 0.7537
Balanced Accuracy : 0.8084
'Positive' Class : no
Se obtiene que en la matriz de confusión a través de validación cruzada con 5 ramas, los verdaderos negativos contiene un valor bajo de 191 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 40 personas que tienen diabetes y que aún futuro lo seguirá teniendo.
Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.8493, lo cual es bueno Sin embargo, baja con respecto al anterior. Además, este dato se corrobora en la No Information Rate (tasa de no información) con un 0.8015.
Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es buena pero no mejor que el anterior, es decir, al modelo de árboles de decisión con ramas = 10.
prune.tree3 = prune.misclass(tree1, best = 15)
plot(prune.tree3)
text(prune.tree3, pretty = 0)
predicedtree4 = predict(prune.tree3, Val.diabet, type = "class")
matriztree4 <- confusionMatrix(Val.diabet$Diabetic,predicedtree4)
matriztree4
Confusion Matrix and Statistics
Reference
Prediction no yes
no 192 13
yes 17 50
Accuracy : 0.8897
95% CI : (0.8463, 0.9243)
No Information Rate : 0.7684
P-Value [Acc > NIR] : 2.327e-07
Kappa : 0.6969
Mcnemar's Test P-Value : 0.5839
Sensitivity : 0.9187
Specificity : 0.7937
Pos Pred Value : 0.9366
Neg Pred Value : 0.7463
Prevalence : 0.7684
Detection Rate : 0.7059
Detection Prevalence : 0.7537
Balanced Accuracy : 0.8562
'Positive' Class : no
Se obtiene que en la matriz de confusión a través de validación cruzada con 15 ramas, los verdaderos negativos contiene un valor bajo de 192 personas que no tienen diabetes y un futuro de igualmanera no lo tendrán. Además se obtiene que los verdaderos positivos contiene un valor de 50 personas que tienen diabetes y que aún futuro lo seguirá teniendo.
Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es moderado, ya que, su valor es 0.8897, lo cual es bueno. Sin embargo, baja con respecto al anterior. Además, este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7684.
Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es buena pero no mejor que el anterior, es decir, al modelo de árboles de decisión con ramas = 15.
library(randomForest)
randomForest 4.7-1.1
Type rfNews() to see new features/changes/bug fixes.
Attaching package: 'randomForest'
The following object is masked from 'package:gridExtra':
combine
The following object is masked from 'package:ggplot2':
margin
fitRF <- randomForest(Diabetic ~., data = Train.diabet, ntree = 500)
summary(fitRF)
Length Class Mode
call 4 -none- call
type 1 -none- character
predicted 634 factor numeric
err.rate 1500 -none- numeric
confusion 6 -none- numeric
votes 1268 matrix numeric
oob.times 634 -none- numeric
classes 2 -none- character
importance 17 -none- numeric
importanceSD 0 -none- NULL
localImportance 0 -none- NULL
proximity 0 -none- NULL
ntree 1 -none- numeric
mtry 1 -none- numeric
forest 14 -none- list
y 634 factor numeric
test 0 -none- NULL
inbag 0 -none- NULL
terms 3 terms call
#Predict Output
predictedRF <- predict(fitRF, Val.diabet)
matrizRF <- confusionMatrix(Val.diabet$Diabetic, predictedRF)
matrizRF
Confusion Matrix and Statistics
Reference
Prediction no yes
no 200 5
yes 9 58
Accuracy : 0.9485
95% CI : (0.9151, 0.9716)
No Information Rate : 0.7684
P-Value [Acc > NIR] : 4.633e-16
Kappa : 0.8585
Mcnemar's Test P-Value : 0.4227
Sensitivity : 0.9569
Specificity : 0.9206
Pos Pred Value : 0.9756
Neg Pred Value : 0.8657
Prevalence : 0.7684
Detection Rate : 0.7353
Detection Prevalence : 0.7537
Balanced Accuracy : 0.9388
'Positive' Class : no
importance(fitRF)
MeanDecreaseGini
Age 47.996445
Gender 4.847399
Family_Diabetes 10.942331
highBP 7.969586
PhysicallyActive 15.932822
BMI 20.336674
Smoking 1.582601
Alcohol 4.221527
Sleep 12.078554
SoundSleep 14.328307
RegularMedicine 56.264017
JunkFood 6.266867
Stress 15.764495
BPLevel 16.423671
Pregancies 11.551984
Pdiabetes 5.105988
UriationFreq 4.936928
varImpPlot(fitRF)
Se obtiene que en la matriz de confusión, los verdaderos negativos
contiene un valor bajo de 200 personas que no tienen diabetes y un
futuro de igualmanera no lo tendrán. Además se obtiene que los
verdaderos positivos contiene un valor de 58 personas que tienen
diabetes y que aún futuro lo seguirá teniendo.
Esta predicción se verifica en el Accuracy, lo cual dicta que el modelo es bueno, ya que, su valor es 0.9485, lo cual es excelente, este dato se corrobora en la No Information Rate (tasa de no información) con un 0.7684.
Incluso en kkapa se observa se acerca a 1 e incluso su valor p es muy pequeño, lo cual se infiere que el modelo para esta predicción es excelente e incluso mejor que los otros modelos.