Predicción de la diabetes tipo 2 mediante aprendizaje automático (Métodos de clasificación)
INTRODUCCIÓN
Las enfermedades crónicas se definen como procesos patológicos de evolución prolongada que no se resuelven espontáneamente, rara vez alcanzan una curación completa y, además, generan una gran carga social desde el punto de vista económico, así como desde la perspectiva de la dependencia social y la discapacidad. Tienen una etiología múltiple, su desarrollo es poco predecible, presentan múltiples factores de riesgo y, con algunas excepciones, su origen no es infeccioso. Por todo ello, representan un problema nacional e internacional de salud pública que afecta a la mayoría de las naciones, con un gran impacto en las poblaciones de los países en desarrollo. Entre las enfermedades crónicasmás importantes se cuentan la hipertensión arterial sistémica, la diabetes, las hiperlipidemias, el sobrepeso y la obesidad, el cáncer y la enfermedad respiratoria crónica, muy ligadas a malos estilos de vida -como las dietas inadecuadas, la ingestión exagerada de alcohol y tabaco, y la vida sedentaria-, así como las discapacidades visuales y auditivas.(Ardila2018).
Importar base de datos desde rda - rstudio Se debe cargar desde R la base para guardar en una extención compatible con Rstudio, para los cual realizamos el siguiente proseso.
write.table(diabetes,file=“diabetes2.txt”,sep=“;”,eol=“”)
#Importar la base de datos
#file.choose()
diabetes_1 <- read.csv("C:\\Users\\ASUS\\Documents\\diabetes2.txt",sep = ";")
#diabetes_1
# nombres de las variables
names(diabetes_1)
## [1] "Age" "Gender" "Family_Diabetes" "highBP"
## [5] "PhysicallyActive" "BMI" "Smoking" "Alcohol"
## [9] "Sleep" "SoundSleep" "RegularMedicine" "JunkFood"
## [13] "Stress" "BPLevel" "Pregancies" "Pdiabetes"
## [17] "UriationFreq" "Diabetic"
DESCRIPCIÓN DE LAS VARIABLES
En este estudio, se seleccionan un total de 952 participantes de 18 años o más, de los cuales 580 son hombres y 372 son mujeres, en los cuales se pidió a los participantes que respondieran un cuestionario que se va a describir a continuación:
Age: es la edad
Gender: genero(masculino y femenino)
Family history with diabetes: antecedentes familiares con diabetes(si,no)
Diagnosted with high blood pressure: diagnóstico con presión alta
Físicamente activo: (una hora o más,ninguna,más de media hora,menos de media hora,ninguno)
Espesor de la piel: (en mm Hg)
Fuma: (si, no)
Consumo de alcohol: (si,no)
Horas de sueño: (horas que descansa)
Sueño profundo: (horas de sueño)
Ingesta regular de medicina: (si,no)
Consumo de comida chatarra: (si,no)
Estrés:(Siempre, a menudo, a veces, nunca)
Nivel de presión arterial: (bajo, normal,alto)
Número de embarazos: (número)
Diabetes en gestación: (si,no)
Frecuencia al orinar: (Poco, bastante)
Diabético: (diabético-267, no diabético-685)
# Comprobar el tipo de clase de cada variable
clases <- sapply(diabetes_1, 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"
Variable Age
diabetes_1$Age <- factor(diabetes_1$Age)
levels(diabetes_1$Age) <- c("40-49","50-59","60 or older","less than 40")
class(diabetes_1$Age)
## [1] "factor"
Variable Gender
diabetes_1$Gender <- factor(diabetes_1$Gender)
levels(diabetes_1$Gender) <- c("Female","Male")
class(diabetes_1$Gender)
## [1] "factor"
Variable Family_Diabetes
diabetes_1$Family_Diabetes <- factor(diabetes_1$Family_Diabetes)
levels(diabetes_1$Family_Diabetes) <- c("no","yes")
class(diabetes_1$Family_Diabetes)
## [1] "factor"
Variable highBP
diabetes_1$highBP <- factor(diabetes_1$highBP)
levels(diabetes_1$highBP) <- c("no","yes")
class(diabetes_1$highBP)
## [1] "factor"
Variable PhysicallyActive
diabetes_1$PhysicallyActive <- factor(diabetes_1$PhysicallyActive)
levels(diabetes_1$PhysicallyActive) <- c("
one hr or more","none","
more than half an hr","
less than half an hr","none")
class(diabetes_1$PhysicallyActive)
## [1] "factor"
Variable Smoking
diabetes_1$Smoking <- factor(diabetes_1$Smoking)
levels(diabetes_1$Smoking) <- c("no","yes")
class(diabetes_1$Smoking)
## [1] "factor"
Variable Alcohol
diabetes_1$Alcohol <- factor(diabetes_1$Alcohol)
levels(diabetes_1$Alcohol) <- c("no","yes")
class(diabetes_1$Alcohol)
## [1] "factor"
Variable RegularMedicine
diabetes_1$RegularMedicine <- factor(diabetes_1$RegularMedicine)
levels(diabetes_1$RegularMedicine) <- c("no","yes")
class(diabetes_1$RegularMedicine)
## [1] "factor"
Variable JunkFood
diabetes_1$JunkFood <- factor(diabetes_1$JunkFood)
levels(diabetes_1$JunkFood) <- c("often","occasionally","very often","always")
class(diabetes_1$JunkFood)
## [1] "factor"
Variable Stress
diabetes_1$Stress <- factor(diabetes_1$Stress)
levels(diabetes_1$Stress) <- c("always","onot at all","sometimes","very often")
class(diabetes_1$Stress)
## [1] "factor"
Variable BPLevel
diabetes_1$BPLevel <- factor(diabetes_1$BPLevel)
levels(diabetes_1$BPLevel) <- c("high","normal","low")
class(diabetes_1$BPLevel)
## [1] "factor"
Variable Pdiabetes
diabetes_1$Pdiabetes <- factor(diabetes_1$Pdiabetes)
levels(diabetes_1$Pdiabetes) <- c("0","yes" )
class(diabetes_1$Pdiabetes)
## [1] "factor"
Variable UriationFreq
diabetes_1$UriationFreq <- factor(diabetes_1$UriationFreq)
levels(diabetes_1$UriationFreq) <- c("quite often","not much" )
class(diabetes_1$UriationFreq)
## [1] "factor"
Variable Diabetic
diabetes_1$Diabetic <- factor(diabetes_1$Diabetic)
levels(diabetes_1$Diabetic) <- c("no","yes" )
class(diabetes_1$Diabetic)
## [1] "factor"
Realizamos un análisis para poder ver si existen datos perdidos
diabetes <- na.omit(diabetes_1)
#vereficamos el resultado
head(diabetes)
Craeacion de la matriz completa con la conversión de clases realizada
classes=sapply(diabetes,class)
for(i in 1:ncol(diabetes))
if(classes[i]=="integer")
diabetes[[i]]=as.numeric(diabetes[[i]])
classes=sapply(diabetes,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"
Analisis descriptivo
descriptcion teoria(que hace la media el mini etc,concepto y formula)
Mínimo: Es el valor más pequeño en un conjunto de datos. Representa el extremo inferior de la distribución.
Primer Cuartil (Q1): También conocido como el percentil 25 o el 25º percentil. Es el valor que separa al 25% más bajo de los datos del 75% más alto cuando los datos están ordenados de menor a mayor.
Mediana: Es el valor que se encuentra en el centro de un conjunto de datos cuando están ordenados de menor a mayor. Exactamente la mitad de los datos se encuentran por encima de la mediana y la otra mitad por debajo de ella.
Media: Es el promedio de un conjunto de números. Se calcula sumando todos los valores y dividiendo esa suma por la cantidad de valores en el conjunto.
Tercer Cuartil (Q3): También conocido como el percentil 75 o el 75º percentil. Es el valor que separa al 75% más bajo de los datos del 25% más alto cuando los datos están ordenados de menor a mayor.
Máximo: Es el valor más grande en un conjunto de datos. Representa el extremo superior de la distribución. En esta parte procederemos hacer nuestro analisis descriptivo de nuestras variables de tipo entero y vamos a obtener los siguientes resultados:
Formulas
MEDIA Datos impares \[Mediana = x_{(\frac{n+1}{2})}\]
MEDIANA Datos impares \[Mediana = x_{(\frac{n+1}{2})}\] Datos pares
\[Mediana = \frac{x_{\frac{n}{2}}+x_{(\frac{n}{2})+1}}{2}\] DESVIACIÓN ESTANDAR
\[SD = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n-1}}\]
summary(diabetes[,classes=="numeric"])
## 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(diabetes[,classes=="numeric"],2,sd)
## BMI Sleep SoundSleep Pregancies
## 5.1399922 1.3042497 1.8435140 0.9090479
INTERPRETACIÓN:
IMC (Índice de Masa Corporal):
Mínimo (15.00): Representa el valor más bajo del Índice de Masa Corporal registrado en el conjunto de datos. Primer Cuartil (Q1 - 21.00): Indica que el 25% de los datos tienen un Índice de Masa Corporal igual o inferior a 21.00, lo que sugiere un rango inicial de valores.
Mediana (50% - 24.00): El punto medio de los datos, donde el 50% tiene un Índice de Masa Corporal igual o inferior a 24.00 y el otro 50% tiene valores superiores. Es una medida de tendencia central. Media (~25.33): Es el promedio del Índice de Masa Corporal en el conjunto de datos, indicando la tendencia general de los valores.
Tercer Cuartil (Q3 - 28.00): Representa que el 75% de los datos tienen un Índice de Masa Corporal igual o inferior a 28.00, lo que muestra un rango más alto de valores. Máximo (42.00): Es el valor más alto registrado del Índice de Masa Corporal en el conjunto de datos.
Sleep (Sueño):
Mínimo (4.000): La duración más baja del sueño registrada en las unidades de medida utilizadas en el conjunto de datos.
Primer Cuartil (Q1 - 6.000): Indica que el 25% de los registros tienen una duración de sueño igual o inferior a 6.000 unidades.
Mediana (50% - 7.000): El punto medio de las mediciones de duración del sueño, donde el 50% de los datos tienen una duración igual o inferior a 7.000 unidades.
Media (6.976): Es el valor promedio de la duración del sueño registrado en el conjunto de datos. Tercer Cuartil (Q3 - 8.000): Indica que el 75% de los registros tienen una duración de sueño igual o inferior a 8.000 unidades.
Máximo (11.000): Representa la duración más larga del sueño registrada en las unidades de medida del conjunto de datos.
SoundSleep (Sueño Profundo):
Mínimo (0.000): La duración más baja de sueño profundo registrada en las unidades de medida utilizadas.
Primer Cuartil (Q1 - 4.000): Indica que el 25% de los registros tienen una duración de sueño profundo igual o inferior a 4.000 unidades.
Mediana (50% - 6.000): El punto medio de las mediciones de duración de sueño profundo, donde el 50% de los datos tienen una duración igual o inferior a 6.000 unidades.
Media (5.609): Es el valor promedio de la duración de sueño profundo en el conjunto de datos.
Tercer Cuartil (Q3 - 7.000): Indica que el 75% de los registros tienen una duración de sueño profundo igual o inferior a 7.000 unidades.
Máximo (11.000): Representa la duración más larga de sueño profundo registrada en las unidades de medida del conjunto de datos.
Embarazos:
Mínimo (0.0000): Representa el número más bajo de embarazos registrado en el conjunto de datos.
Primer Cuartil (Q1 - 0.0000): Indica que el 25% de los datos tienen un número de embarazos igual o inferior a 0.0000, sugiriendo un rango inicial de valores.
Mediana (50% - 0.0000): El punto medio de los datos, donde el 50% tiene un número de embarazos igual o inferior a 0.0000 y el otro 50% tiene valores superiores. Es una medida de tendencia central.
Media (~0.3819): Es el promedio del número de embarazos en el conjunto de datos, indicando la tendencia general de los valores.
Tercer Cuartil (Q3 - 0.0000): Representa que el 75% de los datos tienen un número de embarazos igual o inferior a 0.0000, lo que muestra un rango más alto de valores.
Máximo (4.0000): Es el número más alto de embarazos registrado en el conjunto de datos.
ANALISIS VISUAL DE DATOS
DIAGRAMA DE BARRAS Genero, edad, actividad fisica, comida chatarra, cada variable de diferente color.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.2
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.3.2
grafico_1 = ggplot(diabetes,aes(x=Gender))+
geom_bar(stat="count", width=0.7, fill="blue")+
theme_minimal()+
labs(x = "Gender", y = "Count")
grafico_2 = ggplot(diabetes,aes(x=Age))+
geom_bar(stat="count", width=0.7, fill="orange")+
theme_minimal()+
labs(x = "Age", y = "Count")
grafico_3 = ggplot(diabetes,aes(x=PhysicallyActive))+
geom_bar(stat="count", width=0.7, fill="yellow")+
theme_minimal() +
labs(x = "Physically Active", y = "Count")
grafico_4 =ggplot(diabetes,aes(x=JunkFood))+
geom_bar(stat="count", width=0.7, fill="pink")+
theme_minimal()+
labs(x = "Junk Food", y = "Count")
grid.arrange(grafico_1,grafico_2,grafico_3,grafico_4,nrow=3,ncol=4)
INTERPRETACIÓN:El primer gráfico de barras destaca una tendencia notable: hay una mayor representación de personas del género masculino en este estudio. Este dato resalta una disparidad demográfica que puede ser relevante al considerar diversas perspectivas y enfoques en relación con los resultados obtenidos.
INTERPRETACIÓN: El segundo gráfico de barras ofrece una perspectiva interesante: la mayoría de la población estudiada corresponde a personas menores de 40 años. Este dato resalta la composición demográfica predominante en nuestra muestra, mostrando una mayor representación de personas más jóvenes. Este hallazgo es significativo ya que refleja la dinámica y la vitalidad de esta franja demográfica en nuestro estudio.
INTERPRETACIÓN:El gráfico de barras número tres revela un patrón alentador: la mayoría de las personas se comprometen con la actividad física durante una hora o más. Este dato refleja un enfoque positivo hacia la salud y el bienestar en nuestra comunidad. Es alentador ver que tantas personas valoran y dedican tiempo a cuidar su salud a través del ejercicio regular.
INTERPRETACIÓN:En este gráfico de barras, se destaca un patrón revelador: más de 600 personas muestran un hábito ocasional de consumir comida chatarra. Este dato subraya la prevalencia de este tipo de alimentación en nuestra comunidad. Es crucial entender la importancia de promover opciones más saludables y educar sobre los beneficios de una dieta equilibrada. Este hallazgo nos motiva a trabajar hacia un cambio positivo, ofreciendo alternativas más nutritivas y opciones de comida que fomenten un estilo de vida más saludable para todos.
DIAGRAMA DE DISPERSION #indice de masa corporar y horas de sueño para el de dispersion
qplot(BMI,Sleep, data=diabetes,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.
Boxplot del diabetes vs indice de masa corporal, Sleep, Sound Sleep, Pregancies
library(gridExtra)
library(ggplot2)
p1 <- ggplot(diabetes,aes(x=Diabetic,
y=BMI, color=Diabetic))+
geom_boxplot()
p2 <- ggplot(diabetes,aes(x=Diabetic,
y=Sleep, color=Diabetic))+
geom_boxplot()
p3 <- ggplot(diabetes,aes(x=Diabetic,
y=SoundSleep, color=Diabetic))+
geom_boxplot()
p4 <- ggplot(diabetes,aes(x=Diabetic,
y=Pregancies, color=Diabetic))+
geom_boxplot()
grid.arrange(p1,p2,p3,p4,nrow=3,ncol=4)
INTERPRETACIÓN GRÁFICA 1 En nuestro primer diagrama de bigotes que compara el índice de masa corporal con la presencia de diabetes, se observa una distribución asimétrica positiva en los individuos sin diabetes, indicada por la presencia de valores atípicos y una mayor dispersión de datos hacia la parte superior de la distribución. En contraste, en los individuos con diabetes, la distribución muestra simetría, donde la mediana se encuentra en el centro de la caja, coincidiendo con una distribución equilibrada de datos alrededor de la mediana, representando un equilibrio entre la media, mediana y moda.
INTERPRETACIÓN GRÁFICA 2 En el segundo diagrama de bigotes, se observa una distribución asimétrica negativa o sesgada a la izquierda, donde la ausencia de valores atípicos indica una concentración de datos por encima de la mediana. La mayor parte de los datos se sitúa en la parte superior de la distribución, y la mediana suele ser mayor que la media, lo que refleja la concentración de datos en valores menores.
INTERPRETACIÓN GRÁFICA 3 En el tercer diagrama de bigotes, se identifica una asimetría positiva o sesgada a la derecha, con una ausencia de valores atípicos y una concentración de datos hacia la parte inferior de la distribución. La mayor parte de los datos se encuentran por debajo de la mediana, lo que indica una concentración de valores mayores y una media que suele ser mayor que la mediana.
INTERPRETACIÓN GRÁFICA 4 En nuestro cuarto diagrama de bigotes, se evidencia la presencia de datos atípicos en las personas que no presentan diabetes y se encuentran en período de embarazo. Esta observación destaca la singularidad de este grupo en relación con la distribución de los datos, lo cual puede indicar una influencia especial del embarazo en la manifestación de la diabetes en este conjunto de datos.
Relación entre la variable binaria con las variables nominales
library(ggmosaic)
## Warning: package 'ggmosaic' was built under R version 4.3.2
library(gridExtra)
q1 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic,Gender),fill = Diabetic))+ labs(x="Gender", title = "factores diabetes")
q2 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic,Smoking),fill = Diabetic))+ labs(x="Smoking", title = "factores diabetes")
q3 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic,Alcohol),fill = Diabetic))+ labs(x="Alcohol", title = "factores diabetes")
q4 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic,Family_Diabetes),fill = Diabetic))+ labs(x="Family_Diabetes", title = "factores diabetes")
q5 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic,highBP),fill = Diabetic))+ labs(x="highBP", title = "factores diabetes")
q6 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic,PhysicallyActive),fill = Diabetic))+ labs(x="PhysicalluActive", title = "factores diabetes")
q7 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic,RegularMedicine),fill = Diabetic))+ labs(x="RegularMedicine", title = "factores diabetes")
q8 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic, JunkFood),fill = Diabetic))+ labs(x="junkfood", title = "factores diabetes")
q9 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic, Stress),fill = Diabetic))+ labs(x="stress", title = "factores diabetes")
q10 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic, BPLevel),fill = Diabetic))+ labs(x="BPlevel", title = "factores diabetes")
q11 <- ggplot(data = diabetes)+geom_mosaic(aes(x = product(Diabetic, UriationFreq),fill = Diabetic))+ labs(x="UriationFreq", title = "factores diabetes")
grid.arrange(q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,nrow=4,ncol=4)
## 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.
INTERPRETACIÓN 1:
En el gráfico, se destaca que tanto en la población femenina como en la masculina, la mayoría de las personas no padecen diabetes. Esta información sugiere que, independientemente del género, una proporción significativa de la población estudiada no muestra esta condición.
INTERPRETACIÓN 2:
El gráfico muestra que tanto entre fumadores como no fumadores, hay una distribución similar en cuanto a la presencia o ausencia de diabetes. Esto sugiere que, en esta muestra, el hábito de fumar parece no ser un factor influyente en la prevalencia de la diabetes.
INTERPRETACIÓN 3: Tanto entre aquellos que consumen alcohol como los que no lo hacen, se observa una proporción similar de individuos con y sin diabetes. Estos resultados indican que, en esta muestra, el consumo de alcohol no parece correlacionarse con la presencia de diabetes.
INTERPRETACIÓN 4: El gráfico muestra que la condición de tener familiares diabéticos no parece ser determinante en la presencia de diabetes en esta muestra. La mayoría de las personas, independientemente de esta condición familiar, no sufren de diabetes.
INTERPRETACIÓN 5: Se evidencia que una proporción considerable de las personas con presión arterial alta también tienen diabetes. Esto sugiere una posible relación entre la presión arterial y la presencia de diabetes en esta población estudiada.
INTERPRETACIÓN 6: Se observa que una minoría de las personas con diabetes se dedican a una actividad física significativa. Esto sugiere que una baja proporción de individuos diabéticos en esta muestra se comprometen con una actividad física regular.
INTERPRETACIÓN 7: El gráfico muestra que la mayoría de las personas con diabetes toman medicación regular. Esto sugiere que el uso de medicamentos está relacionado con la presencia de diabetes en esta población estudiada.
INTERPRETACIÓN 8: En este estudio, no se evidencia una correlación entre el consumo de comida chatarra y la presencia de diabetes, ya que la distribución entre aquellos que consumen y no consumen este tipo de comida parece similar en términos de diabetes.
INTERPRETACIÓN 9: No se observa una influencia clara del estrés en la presencia de diabetes en esta muestra. La distribución entre aquellos que informan estrés y los que no lo hacen no parece variar significativamente en términos de presencia de diabetes.
INTERPRETACIÓN 10: El gráfico sugiere que la presión arterial no parece ser un factor determinante en la presencia de diabetes, ya que más del 50% de las personas no presentan diabetes, independientemente de su nivel de presión arterial.
INTERPRETACIÓN 11: La frecuencia de orinar no parece ser un factor influyente en la presencia de diabetes en esta muestra, ya que más del 50% de las personas que informan frecuencia al orinar no tienen diabetes.
GRÁFICO MULTIVARIANTE
Introducción de la libreria GGally
El paquete GGally en R es una librería de gráficos ggplot2 que permite a los usuarios crear y personalizar sus propios gráficos.
El paquete GGally es un paquete de R que contiene funciones para la visualización de datos. El paquete contiene una serie de funciones de gráficos de alta calidad y es muy útil para la exploración de datos.
El paquete GGally se puede utilizar para mostrar la relación entre dos variables.
El paquete GGally en R ofrece una variedad de funciones de gráficos y análisis que pueden ser útiles para los usuarios de R.
GGally es una librería de R que proporciona una interfaz gráfica para explorar y visualizar los datos. La librería incluye funciones para crear gráficos de dispersión, histogramas, diagramas de caja, mapas de calor y muchos otros. GGally también permite la interactividad, por ejemplo, el usuario puede hacer clic en un punto de datos en un gráfico de dispersión y ver los valores de otras variables para ese punto.(ESTADISTICOL,2023)
library(GGally)
## Warning: package 'GGally' was built under R version 4.3.2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
##
## Attaching package: 'GGally'
## The following object is masked from 'package:ggmosaic':
##
## happy
ggpairs(diabetes[,classes=="numeric"])+
theme_bw()
INTERPRETACIÓN:
Se puede concluir que las variables sueño, sueño profundo y embarazo no muestran una influencia directa en el índice de masa corporal, como se refleja en su nivel de correlación.
La relación entre las variables sueño y sueño profundo presenta una correlación moderada, evidenciada por un coeficiente de correlación de 0.57. Este valor sugiere una asociación significativa entre ambas variables, indicando que el sueño puede tener cierta influencia en la calidad del sueño profundo.
En contraste, la relación entre la variable sueño y embarazo muestra una correlación baja, representada por un coeficiente de correlación de 0.054. Esto sugiere que no existe una asociación significativa entre estas dos variables, indicando que el embarazo no parece estar directamente relacionado con los patrones de sueño.
Asimismo, la relación entre la variable sueño profundo y embarazo también presenta una correlación baja, con un coeficiente de correlación de 0.117. Esta baja correlación sugiere que no hay una asociación significativa entre el sueño profundo y el embarazo, lo que indica que el estado de embarazo no parece influir directamente en la calidad del sueño profundo.
p <- ggpairs(diabetes[,c(which(classes=="numeric"),18)], aes(color= Diabetic))+ theme_bw()
#change color manual
#loop through each plot changing relevant scales
for(i in 1:p$nrow){
for(j in 1:p$ncol){
p[i,j]<-p[i,j]+
scale_fill_manual(values=c("pink","skyblue"))+
scale_color_manual(values=c("pink","skyblue"))
}
}
p
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Dividiremos el conjunto completo de individuos en dos partes, una para entrenar el modelo, que contiene el 80% de los individuos y otra para validarlo que contiene el resto.Esto es asi porque si valoramos el modelo con las mismas observaciones que usamos para ajustarlo, la bondad de ajuste quedara sobrevalorada.
Antes de ajustar cualquier modelo, es conveniente escalar las variables numericas y tenemos que reacondicionar las variables categoricas convirtiendolas en variables ficticias y usando la primera o ultima categoria como comparación.
Definición de variable ficticia
Las variables ficticias son variables binarias que toman valor 0,1. Al definir una variable ficticia debemos decidir a qué acontecimiento se le asigna el valor 1, y a cuál el 0. ello conduce a modelos de regresión en los que los parámetros se prestan a interpretaciones muy naturales.
diabetes[,classes =="numeric"] = scale(diabetes[,classes=="numeric"])
head(diabetes)
Modelos para la predicción de la variable binaria
categoricas -ficticias numericas-cambiado escalamiento
# La variable Diabetic que era cualitativa se la transforma a variable ficticia entre 0 y 1.
X = model.matrix(Diabetic~., data=diabetes)
head(X)
## (Intercept) Age50-59 Age60 or older Ageless than 40 GenderMale
## 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\t\nmore than half an hr
## 20 0
## 258 0
## 511 1
## 907 0
## 582 0
## 726 0
## PhysicallyActive\t\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 Stressonot 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 BPLevellow Pregancies Pdiabetesyes
## 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
Observara que las variables numéricas reescaladas contienen los mismos valores iniciales. Cada una de las variables nominales ha 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érica que vale 1 cuando el sexo es hombre y 0 cuando es mujer.El resto de variables tambien son convertidas a Binarias con el número de categorías que cada una almacena. Los parámetros correspondientes a las categorias retenidas comparan a estas con la categoria eliminada.
Dividiremos el conjunto completo de individuos en dos partes, uno para entrenar el modelo, que contiene el 80% de los individuos y otro para validarlo que contiene el resto. Esto es así porque si valoramos el modelo con las mismas observaciones que usamos para ajustarlo, la bondad de ajuste quedara sobrevalorada. Por ejemplo, vamos a usar el 70% de los individuos para ajustar el modelo y el 30% para probarlo.Para que siempre obtengamos los mismos resultados colocamos la semilla de los numeros pseudo aleatorios con la fecha de nacimiento sin separaciones(diamesaño).
tr=round(nrow(diabetes)*0.7)
set.seed(06071981)
muestra <- sample.int(nrow(diabetes),tr)
Train.diabet <- diabetes[muestra,]
Val.diabet <- diabetes[-muestra,]
Ahora disponemos de un conjunto de entrenamiento train diabetes que es del 65% y un conjunto de validación val.diabet que corrresponde al 35%.
Predicción de diabetes (binaria) y variables que influyen en la misma
Modelos de clasificación
Regresión logística
Trataremos de modelar la probabilidad de DIABETES positiva en función del resto de las variables.
El modelo logístico es:
\[{p_i}=P\left({Y=1/X={x_i}}\right)={{{e^{{\beta_0}+}\beta_1}{x_{i1}}+\ldots + {\beta_p}{x_{ip}}}} \over {1 + {e^{{\beta_0}+ {beta_1}{x_{i1}} + \ldots + {\beta_p}{x_{ip}}}}}\]
Se trata de un modelo lineal en el logit de la probabilidad
#insertar mas teoria del modelo que estamos utilizando
library(stats)
gfit1=glm(formula = Diabetic~., data=diabetes, family = 'binomial')
summary(gfit1)
Call:
glm(formula = Diabetic ~ ., family = "binomial", data = diabetes)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.77088 1.08160 -2.562 0.010412
Age50-59 0.41120 0.36291 1.133 0.257177
Age60 or older 1.62408 0.41602 3.904 9.47e-05
Ageless than 40 -1.68936 0.43244 -3.907 9.36e-05
GenderMale 0.48706 0.37089 1.313 0.189105
Family_Diabetesyes 1.00920 0.25459 3.964 7.37e-05
highBPyes -0.85083 0.38970 -2.183 0.029013
PhysicallyActivenone 0.55514 0.36247 1.532 0.125639
PhysicallyActive\t\nmore than half an hr 0.85532 0.38718 2.209 0.027165
PhysicallyActive\t\nless than half an hr 1.68317 0.37751 4.459 8.25e-06
BMI 0.17735 0.12090 1.467 0.142372
Smokingyes 1.15528 0.50424 2.291 0.021955
Alcoholyes 0.09689 0.36237 0.267 0.789187
Sleep 0.05861 0.15561 0.377 0.706443
SoundSleep 0.39536 0.18442 2.144 0.032045
RegularMedicineyes 2.97844 0.30926 9.631 < 2e-16
JunkFoodoccasionally 0.08808 0.84774 0.104 0.917245
JunkFoodvery often 0.25582 0.83663 0.306 0.759775
JunkFoodalways 0.04005 0.97557 0.041 0.967253
Stressonot at all -0.03269 0.51891 -0.063 0.949776
Stresssometimes -0.53932 0.39565 -1.363 0.172845
Stressvery often -0.32951 0.45855 -0.719 0.472393
BPLevelnormal -15.08888 758.75534 -0.020 0.984134
BPLevellow -1.47618 0.39038 -3.781 0.000156
Pregancies 0.32210 0.14874 2.165 0.030350
Pdiabetesyes 4.01652 0.88504 4.538 5.67e-06
UriationFreqnot much 0.43749 0.31153 1.404 0.160219
(Intercept) *
Age50-59
Age60 or older ***
Ageless than 40 ***
GenderMale
Family_Diabetesyes ***
highBPyes *
PhysicallyActivenone
PhysicallyActive\t\nmore than half an hr *
PhysicallyActive\t\nless than half an hr ***
BMI
Smokingyes *
Alcoholyes
Sleep
SoundSleep *
RegularMedicineyes ***
JunkFoodoccasionally
JunkFoodvery often
JunkFoodalways
Stressonot at all
Stresssometimes
Stressvery often
BPLevelnormal
BPLevellow ***
Pregancies *
Pdiabetesyes ***
UriationFreqnot much
---
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
INTERPRETACIÓN:
(Intercept) (Intercepción): Este valor indica la estimación del logaritmo de la odds (razón de probabilidades) de tener diabetes cuando todas las demás variables son cero.
Edad 50-59, Edad 60 o más, Edad menor de 40: Estos coeficientes representan cómo cada grupo de edad se relaciona con la probabilidad de tener diabetes en comparación con un grupo de referencia. Por ejemplo, “Edad 60 años o más” tiene una probabilidad de tener diabetes 1.624 veces mayor que el grupo de referencia cuando se controlan otras variables.
GenderMale: Indica cómo el género masculino se relaciona con la probabilidad de tener diabetes en comparación con el género femenino. Sin embargo, parece que no hay una diferencia significativa en este caso.
Family_Diabetesyes: Representa cómo el antecedente familiar de diabetes afecta la probabilidad de tener diabetes. Un antecedente familiar positivo aumenta la probabilidad de tener diabetes en 1.009 veces en comparación con aquellos sin antecedentes familiares de diabetes.
highBPyes: Indica cómo tener presión arterial alta se relaciona con la probabilidad de tener diabetes. Aquí, tener alta presión arterial parece disminuir la probabilidad de tener diabetes.
FísicamenteActivoona, FísicamenteActivode media hora, FísicamenteActivode media hora: Estos coeficientes representan diferentes niveles de actividad física y cómo se relacionan con la probabilidad de tener diabetes en comparación con un grupo de referencia. Parece que tener menos de media hora de actividad física aumenta considerablemente la probabilidad de tener diabetes.
IMC: Cada aumento en el índice de masa corporal (IMC) se asocia con un aumento del 0,17735 en la probabilidad de tener diabetes, aunque no es estadísticamente significativo en este modelo.
Smokingyes, Alcoholyes, Sleep, SoundSleep: Estos coeficientes representan cómo fumar, beber alcohol, la calidad del sueño y otros factores se relacionan con la probabilidad de tener diabetes. En este modelo, parecen tener efectos diferentes, pero no todos son significativos.
RegularMedicineyes: Tener un régimen de medicación regular está fuertemente asociado con un aumento significativo (2.97844 veces) en la probabilidad de tener diabetes.
JunkFoodoccasionally, JunkFoodvery a menudo, JunkFoodalways: Estos coeficientes muestran cómo los diferentes niveles de consumo de comida chatarra se relacionan con la probabilidad de tener diabetes. En este modelo, no parecen ser significativas.
Estrés en absoluto, estrés a veces, estrés muy a menudo: Estos coeficientes indican cómo diferentes niveles de estrés se relacionan con la probabilidad de tener diabetes. En este caso, no parece haber una asociación significativa entre el estrés y la diabetes.
BPLevelnormal, BPLevellow: Aquí, tener un nivel de presión arterial bajo se relaciona significativamente con una disminución en la probabilidad de tener diabetes.
Embarazos: Cada embarazo adicional está asociado con un aumento de 0.32210 en la probabilidad de tener diabetes, aunque no es estadísticamente significativo en este modelo.
Pdiabetesyes: Tener diabetes previa está fuertemente asociado con un aumento significativo (4.01652 veces) en la probabilidad de tener diabetes.
UriationFreqnot much: La frecuencia urinaria parece no tener una asociación significativa con la probabilidad de tener diabetes en este modelo.
gfit0= glm(Diabetic~1, data = diabetes,family = binomial)
anova(gfit0,gfit1, test="Chisq")
La diferencia es altamente significativa es decir el modelo con toda las varianles es significativamente mejor ue el modelo solo con la constante.Mirando el test de wald para la significacion de cada parametro individual vemos que son altamente significativos los coeficientes para las variables: Age, Family_Diabetes, highBP, PhysicallActive, smoking, RegularMedicine, BPLevvel, Pdiabetes, Esto quiere decir que el resto de las variables no aportan significativamente cuando las demás estan presentes. Si queremos ver los efectos conjuntos de cada variable podemos usar el comando ANOVA en el que las variables.
Estos resultados provienen de un análisis de regresión logística.Se a ajustado dos modelos, gfit0 y gfit1, y se está realizando una prueba de chi-cuadrado para comparar la bondad de ajuste de estos modelos.
gfit0: Este modelo parece ser un modelo de regresión logística simple con una variable independiente, posiblemente constante o un solo predictor.
gfit1: Es el segundo modelo que has ajustado. Tiene una deviance residual menor (491.3764) en comparación con el primer modelo (1091.5641). También hay una diferencia en los grados de libertad (Resid. Df) entre los dos modelos, con el segundo modelo teniendo 26 grados de libertad más que el primero.
La prueba de chi-cuadrado indica que hay una diferencia significativa en la bondad de ajuste entre estos dos modelos. El valor p extremadamente pequeño (5.436403e-110) sugiere que la diferencia en la deviance entre los modelos no es aleatoria y es estadísticamente significativa.
En resumen, el modelo gfit1 parece tener un mejor ajuste que el gfit0, ya que tiene una deviance residual más baja. La diferencia en la deviance entre los dos modelos es significativa según la prueba de chi-cuadrado.
anova(gfit1, test = "Chisq")
Df (Grados de libertad): Indica la cantidad de parámetros que se agregaron al modelo con cada término. Por ejemplo, Age tiene 3 grados de libertad, lo que sugiere que probablemente sea una variable categórica con múltiples niveles.
Deviance y Resid. Dev (Deviance residual): Representa cuánta variabilidad no explicada queda en el modelo después de agregar cada término. Una deviance más baja después de agregar un término sugiere una mejoría en la capacidad del modelo para explicar la variabilidad en los datos.
Valor p de la prueba de chi-cuadrado: Indica la significancia estadística de cada término. Valores pequeños (por ejemplo, < 0.05) sugieren que el término es significativo para predecir la variable de respuesta.
Interpretación de las variables más significativas:
Age: Tiene una contribución significativa al modelo, lo que sugiere que diferentes grupos de edad tienen diferentes probabilidades de ser diagnosticados como diabéticos.
Gender: También es significativo, lo que implica que el género puede tener una influencia en la probabilidad de ser diagnosticado como diabético. F amily_Diabetes, highBP, PhysicallyActive, RegularMedicine: Todos estos son significativos y podrían ser factores importantes para predecir la diabetes. B MI, Alcohol, Sleep, SoundSleep, JunkFood, Stress, BPLevel, Pregancies, Pdiabetes, UriationFreq: Estos términos no parecen ser significativos según los valores p altos (por encima de 0.05).
gfit2=glm(Diabetic~., data=Train.diabet, family="binomial")
cbind(gfit1$coefficients, gfit2$coefficients)
## [,1] [,2]
## (Intercept) -2.77087932 -1.74808262
## Age50-59 0.41120398 0.59253917
## Age60 or older 1.62408303 1.61214689
## Ageless than 40 -1.68935773 -1.74881721
## GenderMale 0.48706126 0.75499209
## Family_Diabetesyes 1.00919861 1.10013745
## highBPyes -0.85082885 -1.34929812
## PhysicallyActivenone 0.55513711 0.96937032
## PhysicallyActive\t\nmore than half an hr 0.85532299 1.24247791
## PhysicallyActive\t\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
## Stressonot at all -0.03268509 -0.09683845
## Stresssometimes -0.53932026 -0.66670031
## Stressvery often -0.32951273 -0.76141479
## BPLevelnormal -15.08887804 -15.55244810
## BPLevellow -1.47618023 -1.88078889
## Pregancies 0.32210269 0.41273999
## Pdiabetesyes 4.01651629 5.09624708
## UriationFreqnot much 0.43749258 0.41011844
Un coeficiente positivo grande para “RegularMedicineyes” indica una fuerte relación positiva entre tomar medicamentos regularmente y la probabilidad de ser diagnosticado como diabético.
Los coeficientes cercanos a cero o muy pequeños (como “BMI”, “Sleep”, “Alcoholyes”) pueden sugerir que estas variables tienen una influencia mínima o no significativa en la probabilidad de diagnóstico de diabetes.
Los coeficientes extremadamente grandes o negativos (como “BPLevelnormal”) podrían ser indicativos de un problema en el modelo, a menudo asociado con la colinealidad o la presencia de valores atípicos/influyentes.
Con el modelo calculado vamos a predecir los valores para el 30%
p=predict(gfit2, Val.diabet, type="response")
PredDiabet=as.factor(p>0.5)
levels(PredDiabet)=c("no","yes")
library(lattice)
## Warning: package 'lattice' was built under R version 4.3.2
library(caret)
## Warning: package 'caret' was built under R version 4.3.2
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)
## Warning: package 'pROC' was built under R version 4.3.2
## 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, 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 logistica aparentemente es bueno.
Maquinas de vector soporte
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
#Consultar #maquias de vector de soporte defincion tipos modelo matematico o estadistico que esta fundamentado libros y la bibliografia minimo 3 hojas
#modelo de clasificacion random forest y redes neuronales,naive bayes,