library(dplyr)
Warning: package 'dplyr' was built under R version 4.3.2
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
library(knitr)
# Para transformar la base de datos
library(readr)
Warning: package 'readr' was built under R version 4.3.2
diabetes2 <- read.csv("~/diabetes2.txt", sep = ";", dec = ".")
View(diabetes2)
##Introduccion
Las enfermedades crónicas representan un desafío significativo para la salud global en la actualidad. Estas condiciones de salud persisten a lo largo del tiempo y generalmente progresan lentamente. A diferencia de las enfermedades agudas, que suelen tener un inicio repentino y una duración limitada, las enfermedades crónicas pueden perdurar durante meses, años o toda la vida de una persona.
##Descripcion de la data
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 hembras. Se pidió a los participantes que respondieran un cuestionario que se muestra en la Tabla 1, que fue preparado por ellos mismos en base a las limitaciones que podrían conducir a la diabetes. Para verificar la validez del modelo se realizaron los mismos experimentos. en otra base de datos llamada PIMA Indian Diabetes Database [28] que se muestra en la Tabla 1. La Figura 6 muestra un conjunto de datos de muestra. recopilados a través de cuestionario.
##Varibales
Edad: Genero: Historia familiar con diabetes: Diagnostico con alta presion arterial: Fisicamente activo: IMC: De fumar: Consumo de alcoho: Horas de sueño: Horas de sueño profundo Numérico: Ingesta regular: consumo de comida chatarra: Estrés: nivel de presión arterial: Numero de embarazos: Frecuencia de miccion: Diabético:
##Descripcion de variables
Edad:.- Período de tiempo que ha transcurrido desde el nacimiento de una persona, un ser vivo o una entidad
Genero:.- Identificación interna y profunda de una persona como hombre, mujer
Historia familiar con diabetes:.- Se refiere a la presencia de esta enfermedad en los antecedentes médicos de una familia
Diagnostico con alta presion arterial: Concentración de glucosa plasmática y respondemos con si o no
Fisicamente activo: para medir la presion arterial
IMC: Grosor del pliegue cutáneo del tríceps
De fumar:.- Se refiere comúnmente al acto de inhalar y exhalar el humo producido por la combustión de sustancias, especialmente tabaco.
Consumo de alcohol:.- Es una práctica común en muchas culturas y sociedades, y puede tener una variedad de efectos tanto en la salud como en el bienestar general de las personas.
Horas de sueño: La cantidad de horas de sueño que una persona necesita puede variar según su edad, estado de salud, estilo de vida y otros factores individuales.
Horas de sueño profundo Numérico: Nos da valores de Diabético – 268 y No diabéticos - 500
Ingesta regular:.-
consumo de comida chatarra: alimentos que son bajos en valor nutricional pero altos en calorías, grasas, azúcares y sal.
Estrés:.-Una respuesta natural del cuerpo ante situaciones percibidas como desafiantes o amenazantes.
nivel de presión arterial:.- Fuerza que ejerce la sangre contra las paredes de las arterias mientras el corazón bombea y se relaja.
Numero de embarazos:.-
Frecuencia de miccion:.-La cantidad de veces que una persona va al baño para orinar, puede variar según diversos factores, como la cantidad de líquidos que se consumen, la edad, la salud general y la presencia de ciertas condiciones médicas.
Diabético:.- Es una enfermedad crónica que se produce cuando el cuerpo no puede producir suficiente insulina
##Tipos de variables
classses = sapply(diabetes2,class)
classses
## 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"
##Conversion de variable Age
##Age
edadfactor<-factor(diabetes2$Age)
levels(edadfactor)=c("40-49","50-59","60 or older","less than 40")
class(edadfactor)
## [1] "factor"
##Gender
generofactor<-factor(diabetes2$Gender)
levels(generofactor)=c("male","female")
class(generofactor)
## [1] "factor"
##PhysicallyActive
PhysicallyActive<-factor(diabetes2$PhysicallyActive)
levels(PhysicallyActive)=c("less than half an hr ","more than half an hr","none
","one hour or more")
class(PhysicallyActive)
## [1] "factor"
##Family_diabetes
familydiabetes<-factor(diabetes2$Family_Diabetes)
levels(familydiabetes)=c("yes","no")
class(familydiabetes)
## [1] "factor"
##Smoking
smoking<-factor(diabetes2$Smoking)
levels(smoking)=c("yes","no")
class(smoking)
## [1] "factor"
##Alcohol
alcohol<-factor(diabetes2$Alcohol)
levels(alcohol)=c("yes","no")
class(alcohol)
## [1] "factor"
##RegularMedicine
Medicina<-factor(diabetes2$RegularMedicine)
levels(Medicina)=c("yes","no")
class(Medicina)
## [1] "factor"
##JunkFood
JunkFood<-factor(diabetes2$JunkFood)
levels(JunkFood)=c("often","occasionally","very often","always")
class(JunkFood)
## [1] "factor"
##highBP
highBP<-factor(diabetes2$highBP)
levels(highBP)=c("yes","no")
class(highBP)
## [1] "factor"
columnas_a_convertir <- c("Age", "Gender","Family_Diabetes","highBP","PhysicallyActive","Smoking","Alcohol","RegularMedicine","JunkFood","Stress","BPLevel","UriationFreq","Diabetic","Pdiabetes")
diabetes2 <- diabetes2 %>%
mutate_at(vars(columnas_a_convertir), as.factor)
## Warning: Using an external vector in selections was deprecated in tidyselect 1.1.0.
## ℹ Please use `all_of()` or `any_of()` instead.
## # Was:
## data %>% select(columnas_a_convertir)
##
## # Now:
## data %>% select(all_of(columnas_a_convertir))
##
## See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
str(diabetes2)
## 'data.frame': 906 obs. of 18 variables:
## $ Age : Factor w/ 4 levels "40-49","50-59",..: 4 4 3 4 3 1 3 1 4 2 ...
## $ Gender : Factor w/ 2 levels "Female","Male": 2 2 1 2 2 2 2 1 2 2 ...
## $ Family_Diabetes : Factor w/ 2 levels "no","yes": 2 2 2 2 1 1 2 1 1 2 ...
## $ highBP : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
## $ PhysicallyActive: Factor w/ 4 levels "less than half an hr",..: 4 4 3 2 2 1 2 3 1 4 ...
## $ BMI : int 22 22 26 19 23 26 26 23 22 38 ...
## $ Smoking : Factor w/ 2 levels "no","yes": 1 1 1 2 1 2 1 1 1 1 ...
## $ Alcohol : Factor w/ 2 levels "no","yes": 1 1 1 2 2 1 2 1 1 2 ...
## $ 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 : Factor w/ 2 levels "no","yes": 1 1 1 1 2 1 2 1 1 2 ...
## $ JunkFood : Factor w/ 4 levels "always","occasionally",..: 3 3 2 2 2 2 2 3 3 2 ...
## $ Stress : Factor w/ 4 levels "always","not at all",..: 2 2 3 2 4 3 3 4 2 4 ...
## $ BPLevel : Factor w/ 3 levels "high","low","normal": 3 3 3 3 1 3 3 3 3 3 ...
## $ Pregancies : int 0 0 3 0 0 0 0 1 0 0 ...
## $ Pdiabetes : Factor w/ 2 levels "0","yes": 1 1 1 1 1 1 1 1 1 1 ...
## $ UriationFreq : Factor w/ 2 levels "not much","quite often": 1 1 1 1 2 1 2 1 2 1 ...
## $ Diabetic : Factor w/ 2 levels "no","yes": 1 1 1 1 2 1 2 1 1 2 ...
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"
hay_na <- any(is.na(diabetes2))
print(hay_na)
## [1] FALSE
##Analisis descriptivo
Realizamos una descripcion basica y visualizacion de los datos . La fincion describe colocada en una dara frame nos proporciona la descriptiva basica de todas las variables numericas nos proporciona recuento la media aritmetica.
which(is.na(diabetes2))
## integer(0)
Desviacion tipica
\[S=\sqrt {{{\sum\nolimits_{i = 1}^n {{{\left({{x_i}-\bar x} \right)}^2}} }\over n}}\]
Media Aritmetica
\(\bar{X}=\frac{\sum_{i=1}^{n}x_{i}}{n}\)
Cuartiles
\(Q_{1}=L+\frac{(\frac{N}{4}-F)*c}{f}\)
Segundo cuartil (Q2)
\(Q_{1}=L+\frac{(\frac{N}{2}-F)*c}{f}\)
Tercer cuartil (Q3)
\(Q_{1}=L+\frac{(\frac{3N}{4}-F)*c}{f}\)
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"
summary(diabetes2[,Classes=="integer"])
## < table of extent 0 x 0 >
sd(diabetes2$BMI)
## [1] 5.139992
sd(diabetes2$Sleep)
## [1] 1.30425
sd(diabetes2$SoundSleep)
## [1] 1.843514
sd(diabetes2$Pregancies)
## [1] 0.9090479
Media: .- La media aritmética, conocida también simplemente como “media” o “promedio”, es una medida de tendencia central que se calcula sumando todos los valores en un conjunto de datos y dividiendo la suma por la cantidad de valores en ese conjunto.
Mediana: .- La mediana es el valor que ocupa el lugar central de todos los datos cuando están ordenados de menor a mayor. Es una medida de tendencia central utilizada en estadística para describir y comprender la distribución y las características de un conjunto de datos.
Minimo: .- El mínimo se refiere a la cantidad más baja o el valor más pequeño en un contexto específico.
Maximo: .- El máximo se refiere al valor más grande dentro de un conjunto de números o datos.
INTERPRETACION: Según los datos proporcionados, se presenta información sobre cuatro variables: BMI (Índice de Masa Corporal), Sleep (Cantidad de horas de sueño), SoundSleep (Cantidad de horas de sueño profundo) y Pregancies (Número de embarazos).
-El valor mínimo para el BMI es 15.00, lo que indica que hay al menos una persona con un índice de masa corporal muy bajo.
-En cuanto a la cantidad de horas de sueño, el mínimo es 4.000, lo que sugiere que al menos una persona en el conjunto de datos duerme muy pocas horas.
-Para las horas de sueño profundo (SoundSleep), también se encuentra un valor mínimo de 0.000, lo que indica que al menos una persona en el conjunto de datos no tiene ninguna hora de sueño profundo.
-En cuanto al número de embarazos (Pregancies), el mínimo es 0.0000, lo que sugiere que hay personas en el conjunto de datos que no han tenido embarazos.
-La mediana de 24.00 sugiere que el 50% de las personas tienen un índice de masa corporal igual o inferior a este valor.
-La mediana de 7.000 indica que el 50% de las personas duermen 7 horas o menos.
-La mediana de 6.000 sugiere que el 50% de las personas tienen 6 horas o menos de sueño profundo.
-La mediana de 0.0000 indica que el 50% de las personas no han tenido embarazos.
-El valor máximo de 42.00 indica que al menos una persona en el conjunto de datos tiene un índice de masa corporal muy alto.
-La media de 25.33 indica el promedio de los índices de masa corporal en la base de datos.
El valor máximo de 11.000 indica que al menos una persona en el conjunto de datos duerme muchas horas.
-La media de 6.976 indica el promedio de las horas de sueño en la base de datos.
-El valor máximo de 11.000 indica que al menos una persona en el conjunto de datos tiene un alto número de horas de sueño profundo.
-La media de 5.609 indica el promedio de las horas de sueño profundo en la base de datos.
-El valor máximo de 4.0000 indica que hay personas en el conjunto de datos que han tenido hasta 4 embarazos.
-La media de 0.3819 indica el promedio del número de embarazos en la base de datos.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.2
grafico_1 = ggplot(diabetes2,aes(x=Gender))+
geom_bar(stat="count", width=0.7, fill="yellow")+
theme_minimal()
grafico_2 = ggplot(diabetes2,aes(x=Age))+
geom_bar(stat="count", width=0.7, fill="red")+
theme_minimal()
grafico_3 = ggplot(diabetes2,aes(x=PhysicallyActive))+
geom_bar(stat="count", width=0.7, fill="purple")+
theme_minimal()
grafico_4 =ggplot(diabetes2,aes(x=JunkFood))+
geom_bar(stat="count", width=0.7, fill="pink")+
theme_minimal()
print(grafico_1)
print(grafico_2)
print(grafico_3)
print(grafico_4)
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.
##Interpretacion
En la grafica de dispersion se observa que la variable indice de masa corporal con horas de dormir existe un exceso de personas que no presentan diabetes.
p1 <- ggplot(diabetes2, aes(x=Diabetic, y=BMI, color=Diabetic)) + geom_boxplot()
p1
##Interpretacion
Usando un diagrama de caja de la variable BMI (Índice de Masa Corporal), se puede ver que hay datos atípicos para personas sin diabetes, pero también se puede notar que hay más personas con diabetes.
p2 <- ggplot(diabetes2, aes(x=Diabetic, y= Sleep, color=Diabetic)) + geom_boxplot()
p2
##Interpretacion
El diagrama de caja muestra que no hay datos atípicos entre no diabéticos y personas con diabetes, y la media de ambos se observa en personas que duermen unas 7 horas.
p3<- ggplot(diabetes2, aes(x=Diabetic, y=SoundSleep , color=Diabetic)) + geom_boxplot()
p3
##Interpretacion
En los dos cuadros para personas con y sin diabetes, podemos ver que no hay valores atípicos porque para las personas sin diabetes, el bigote inferior significa que los datos en la parte inferior de la distribución son más pequeños que en la parte superior. Los datos están más dispersos. o es más diverso.
p4 <- ggplot(diabetes2, aes(x=Diabetic, y= Pregancies, color=Diabetic)) + geom_boxplot()
p4
##Interpretacion
Se puede observar que las personas sin diabetes tienen valores atípicos, es decir, observaciones que están muy fuera del rango esperado para la mayoría de los datos. Estos valores pueden proporcionar información valiosa sobre la distribución de los datos y resaltar puntos que son significativamente diferentes del resto de los datos. La mayoría de los datos son generalmente inferiores a la media, lo que indica un sesgo en la parte inferior de la distribución. La mediana está en la parte inferior y es apenas visible, los datos están claramente concentrados en la parte inferior de la distribución.
##Relacion entre la variable binaria y la varibale nominales
library(ggmosaic)
## Warning: package 'ggmosaic' was built under R version 4.3.2
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.3.2
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
q1 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Age),
fill = Diabetic)) + labs(x = "Age", title = "Factores_Diabetes")
q2 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Gender),
fill = Diabetic)) + labs(x = "Gender", title = "Factores_Diabetes")
q3 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Family_Diabetes),
fill = Diabetic)) + labs(x = "Family_Diabetes", title = "Factores_Diabetes")
q4 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, highBP),
fill = Diabetic)) + labs(x = "highBP", title = "Factores_Diabetes")
q5 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, PhysicallyActive),
fill = Diabetic)) + labs(x = "PhysicallyActive", title = "Factores_Diabetes")
q6 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Smoking),
fill = Diabetic)) + labs(x = "Smoking", title = "Factores_Diabetes")
q7 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Alcohol),
fill = Diabetic)) + labs(x = "Alcohol", title = "Factores_Diabetes")
q8 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, RegularMedicine),
fill = Diabetic)) + labs(x = "RegularMedicine", title = "Factores_Diabetes")
q9 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, JunkFood),
fill = Diabetic)) + labs(x = "JunkFood", title = "Factores_Diabetes")
q10 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Stress),
fill = Diabetic)) + labs(x = "Stress", title = "Factores_Diabetes")
q11 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, BPLevel),
fill = Diabetic)) + labs(x = "BPLevel", title = "Factores_Diabetes")
q12 <- ggplot(data = diabetes2)+
geom_mosaic(aes(x= product(Diabetic, Pdiabetes),
fill = Diabetic)) + labs(x = "Pdiabetes", title = "Factores_Diabetes")
q13 <- ggplot(data = diabetes2)+
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, q12, q13, 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.
##Interpretacion
En un gráfico de mosaico observaremos si estas variables son significativas Si estas variables se utilizan para determinar si las personas tienen diabetes, entonces todas las variables son importantes para determinar si las personas tienen diabetes y pueden determinar si las personas no tienen diabetes.
##Grafico multivariante
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(diabetes2[,Classes=="numeric"]) + theme_bw()
##Interpretacion
Esta correlación negativa sugiere que la duración total del sueño tiende a disminuir ligeramente al aumentar el índice de masa corporal. Sin embargo, la magnitud de la correlación (-0,073) sugiere que esta relación es bastante débil. Debido a la débil correlación, la relación entre el BMI y la duración del sueño puede no tener mucho sentido desde una perspectiva práctica.
Esto muestra que existe una correlación negativa moderada entre estas dos variables. La correlación negativa indica que la calidad del sueño (sueño profundo) generalmente tiende a disminuir al aumentar el BMI.
La correlación entre el índice de masa corporal (BMI) y el número de embarazos es de -0,086, lo que indica una correlación negativa muy débil entre las dos variables; un valor de -0,086 indica una correlación débil entre el BMI y el número de embarazos. Esta correlación negativa sugiere que generalmente existe una pequeña tendencia negativa en las tasas de embarazo a medida que aumenta el BMI.
La correlación entre la duración del sueño y el sueño profundo fue de 0,575, lo que indica una correlación positiva moderada entre estas dos variables. En otras palabras, existe una tendencia a que una mayor duración del sueño aumente la frecuencia o calidad del sueño profundo y viceversa, y estas variables están asociadas con la diabetes. La correlación entre la duración del sueño y la diabetes fue de 0,644, y la correlación entre el sueño profundo y la diabetes fue de 0,543, lo que sugiere una asociación moderada entre estas variables y la diabetes.
La correlación entre la duración del embarazo y la duración del sueño fue de 0,054, lo que indica una correlación muy débil y casi nula entre estas dos variables. El valor bajo indica que generalmente no existe una relación significativa entre las horas de sueño y las variables del embarazo; estas variables están asociadas con la presencia de diabetes. La correlación entre el embarazo y la diabetes fue de 0,029, y la correlación entre la duración del sueño y la diabetes fue de 0,102, lo que indica una asociación muy débil entre estas variables y la diabetes.
La correlación entre el embarazo y el sueño profundo fue de 0,117, lo que indica una correlación positiva débil entre estas dos variables. A medida que aumentan las variables del embarazo, también aumenta la frecuencia o calidad del sueño profundo, y viceversa. Sin embargo, la magnitud de la correlación sugiere que la relación es relativamente débil. Estas variables están asociadas con la presencia o ausencia de diabetes. La correlación entre el embarazo y la diabetes fue de 0,078, y la correlación entre el sueño profundo y la diabetes fue de 0,169, lo que sugiere una asociación débil entre estas variables y la diabetes.
p <- ggpairs(diabetes2[,c(which(Classes=="numeric"),18)], aes(color = Diabetic)) + theme_bw()
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 de individuos en dos partesn 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 del ajuste quedara sobrevalorada.
Antes de ajustar cualquier modelo, es conveniente escalar las variables numericas y tenemos que reacondicionar las variables categoricas convirtiendolas en varibales ficticias y usando la primera o la ultima categorica como comparacion.
diabetes2[,Classes=="numeric"]=scale(diabetes2[,Classes=="numeric"])
head(diabetes2)
##Conversion a varibales ficticias
X <- model.matrix(Diabetic ~., data = diabetes2)
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 PhysicallyActivemore than half an hr
## 20 1 0 0
## 258 1 0 0
## 511 1 0 0
## 907 1 0 1
## 582 0 0 1
## 726 0 0 0
## PhysicallyActivenone PhysicallyActiveone hr or more BMI Smokingyes
## 20 0 1 -0.6487242 0
## 258 0 1 -0.6487242 0
## 511 1 0 0.1294871 0
## 907 0 0 -1.2323826 1
## 582 0 0 -0.4541713 0
## 726 0 0 0.1294871 1
## Alcoholyes Sleep SoundSleep RegularMedicineyes JunkFoodoccasionally
## 20 0 0.78534240 0.2119477 0 0
## 258 0 0.78534240 0.2119477 0 0
## 511 0 0.01861803 0.7543900 0 1
## 907 1 0.01861803 -0.3304947 0 1
## 582 1 0.01861803 0.2119477 1 1
## 726 0 0.78534240 0.7543900 0 1
## JunkFoodoften JunkFoodvery often 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 BPLevellow BPLevelnormal 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
## UriationFreqquite often
## 20 0
## 258 0
## 511 0
## 907 0
## 582 1
## 726 0
Observara que las variables umericas rescaladas contienen los mismo valores iniciales.Cada una de las variables nomibales ha sido convertida en variables binarias. El numero de variables binarias es siempre el numero de categorias de la variable nominal.Por ejempl, la variable Gender (con dos categorias) ha sido convertida en GenderMale que es una variable numerica que vale 1 cuando el sexo es hombre y 0 cuando es mujer.El resto de varibales tambien son convertidas a binarias con numero de categorias que cada una almacena.Los parametros correpondientes a las categorias retenidas comparan a estas con la categorias eliminada.
Dividiremos el conjunto completo de individuos en dos partes, un 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 del ajuste quedara sobrevalorada.Por ejemplo, vamos a usar el 70% de los individuos para ajustar el modelo y el 30\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).
Semilla modificada con numeros de cedula
tr <- round(nrow(diabetes2)*0.7)
set.seed(06071981)
muestra <- sample.int(nrow(diabetes2), tr)
Train.diabet <- diabetes2[muestra,];Train.diabet
Val.diabet <- diabetes2[-muestra,]
anyNA(Train.diabet)
## [1] FALSE
Semilla Original
tr2 <- round(nrow(diabetes2)*0.7)
set.seed(06071981)
muestra <- sample.int(nrow(diabetes2), tr2)
Train.diabet2 <- diabetes2[muestra,];Train.diabet2
Val.diabet2 <- diabetes2[-muestra,]
anyNA(Train.diabet2)
## [1] FALSE
Interpretacion
Como se puede observar que la semilla nueva creada es diferente a la original dando asi que al realizar el nuevo analisis sus valores cambiaran, como las variables Age ,Gender, Family_Diabetes, highBP, PhysicallyActive, BMI, Smoking, Alcohol, Sleep, SoundSleep, RegularMedicine, JunkFood,Stress,BPLevel,Pregancies, UriationFreq,Diabetic y se observa que no presenta datos faltantes en las dos bases de datos, la base modificada esta entrenada con el 85% mientras que la base oroginal esta entrenada con el 70%.
Ahora disponemos de un conjunto de entrenamiento Train.diabet y un conjunto de validacion val.diabet.
##Prediccion de la diabetes (binaria) y variable que influye en la misma.
##Modelos de clasificacion
##Regresion logistica
Trataremos de modelar la probabilidad de DIABETES positiva en funcion del resto de las variables.
Ecuacion del modelo logistico
\(p_i = P(Y=1/X=x_i)=\frac{e^{\beta_0+\beta_1+...+\beta_k}}{1+e^{\beta_0+\beta_1+...+\beta_k}}\)
Se trata de un modelo lineal en el logit de la probabilidad
\({\rm{logit}}({p_i}) = {\beta_0} + {\beta_1}{x_{i1}} + \ldots + {\beta_p}{x_{ip}}\)
El modelo logistico es
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 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 *
## PhysicallyActivemore than half an hr 0.55514 0.36247 1.532 0.125639
## PhysicallyActivenone 0.85532 0.38718 2.209 0.027165 *
## PhysicallyActiveone hr or more 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
## JunkFoodoften 0.25582 0.83663 0.306 0.759775
## JunkFoodvery often 0.04005 0.97557 0.041 0.967253
## Stressnot 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
## BPLevellow -15.08888 758.75534 -0.020 0.984134
## BPLevelnormal -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 ***
## UriationFreqquite often 0.43749 0.31153 1.404 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
INTERPRETACION
ANOVA
gfit0=glm(Diabetic~1, data = diabetes2, family = binomial)
anova(gfit0, gfit1, test = "Chisq")
La diferencia es altamente significativa, es decir el modelo con todas las variables es significativamente mejor que 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,PhysicallyActive, Smoking, RegularMedice Bplevel,Pdiabetes.Esto quiere decir que es el resto de las variables no aportan significativamente cuando las demas estan presenten.Si queremos ver los efectos conjuntos de cada varibale podemos usar el comando anova en el que las variables se añaden secuencialmente.
anova(gfit1, test = "Chisq")
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
## PhysicallyActivemore than half an hr 0.55513711 0.96937032
## PhysicallyActivenone 0.85532299 1.24247791
## PhysicallyActiveone hr or more 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
## JunkFoodoften 0.25582142 -0.68203158
## JunkFoodvery often 0.04005097 -0.80432089
## Stressnot at all -0.03268509 -0.09683845
## Stresssometimes -0.53932026 -0.66670031
## Stressvery often -0.32951273 -0.76141479
## BPLevellow -15.08887804 -15.55244810
## BPLevelnormal -1.47618023 -1.88078889
## Pregancies 0.32210269 0.41273999
## Pdiabetesyes 4.01651629 5.09624708
## UriationFreqquite often 0.43749258 0.41011844
Con el modelo calculado predecimos los valores para el 30% de datos seleccionados para la validacion de la prediccion
p <- predict(gfit2, Val.diabet, type = "response")
PredDiabet <- as.factor(p>0.5)
levels(PredDiabet) <- c("no", "yes")
library(lattice)
library(caret)
## Warning: package 'caret' was built under R version 4.3.2
INTERPRETACION
El modelo predijo correctamente 20 muestras que pertenecen a la clase “no” y 51 muestras que pertenecen a la clase “sí”. Sin embargo, también cometió errores al predecir 16 muestras de la clase “no” como “sí”.
Accuracy (Exactitud): El valor de Accuracy es 0.8676, lo cual indica que el modelo tiene una tasa de aciertos del 86.76%. Esto significa que el modelo tiene un buen desempeño al predecir correctamente las clases de los datos.
95% CI (Intervalo de confianza al 95%): El intervalo de confianza al 95% para la exactitud del modelo es de (0.8215, 0.9056). Esto significa que hay un 95% de probabilidad de que la exactitud real del modelo esté dentro de este rango.
No Information Rate (Tasa de No Información): La tasa de No Información es 0.739, lo cual indica la precisión que se obtendría si se predijera siempre la clase mayoritaria. En este caso, el modelo tiene un rendimiento significativamente mejor que simplemente predecir la clase mayoritaria.
P-Value [Acc > NIR] (Valor de p [Acc > NIR]): El valor de p es 1.799e-07, lo cual indica una diferencia significativa entre la exactitud del modelo y la tasa de No Información. Un valor de p tan pequeño sugiere que es altamente improbable que la diferencia observada entre la exactitud del modelo y la tasa de No Información sea debido al azar. Por lo tanto, podemos concluir que el modelo es estadísticamente mejor que simplemente predecir la clase mayoritaria.
Tambien podemosdibujar la curva ROC para distintas probabilidades de corte.Un bien modelo tendra un area bajo la curva alta
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_prob = roc(Val.diabet$Diabetic ~ test_prob, plot = TRUE, print.auc = TRUE)
## Setting levels: control = no, case = yes
## Setting direction: controls < cases
##MAquinas de vector soporte
Otro modelo de clasificacion binaria es 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 usa por defecto.