La enfermedad de Alzheimer es un trastorno neurodegenerativo prevalente en la población adulta mayor. Se caracteriza por generar un daño significativo en el sistema nervioso central mediante la acumulación de placas de amiloide, que ocasiona pérdida del funcionamiento neuronal y muerte celular. En el mundo afecta al 11% de las personas mayores de 65 años. Sin embargo, al ser una enfermedad progresiva y compleja, no hay un marcador diagnóstico definitivo o estrategia de prevención temprana efectiva (Gao et al., 2022; Basavaraju & Lencastre, 2016).
El presente análisis se enfoca en el uso de bases de datos de acceso público para poder identificar estadísticamente qué variables podrían ser indicadores confiables de la enfermedad de Alzheimer. La información recolectada y recopilada de una muestra representativa favorece el reconocimiento múltiples factores clave para la detección temprana de dicha enfermedad.
El objetivo de este estudio es analizar si poseer un diagnóstico de Alzheimer depende de un conjunto de variables asociadas a la salud física y mental.
Se tomó una base de datos publicada en la página Kaggle (https://www.kaggle.com/datasets/rabieelkharoua/alzheimers-disease-dataset/data), la cual contiene información de 2149 pacientes, con y sin el diagnóstico de la enfermedad de Alzheimer. Esta base de datos recopila información de variables asociadas a la salud física y mental, así como patrones del estilo de vida, variables sociodemográficas y evaluaciones cognitivas realizadas a los pacientes.
A partir de esto, se realizó un análisis descriptivo de dichas variables de la muestra de estudio. Posteriormente, se generó un modelo de regresión logística utilizando el paquete de caret de R para identificar cuáles variables poseen un mayor efecto en la predicción del diagnóstico de Alzheimer. Se generó también un curva ROC, mediante el paquete pROC para evaluar la capacidad discriminativa del modelo para el diagnóstico de Alzheimer. Finalmente, con ayuda de IA, se creó una aplicación Shiny para predecir la presencia o ausencia del diagnóstico al colocar los valores de las variables pertinentes.
| Categoría | Variable | Descripción y Codificación |
|---|---|---|
| Identificación | PatientID |
Identificador único para cada paciente (rango: 4751 - 6900). |
| Detalles Demográficos | Age (Edad) |
Edad del paciente, en años (rango: 60 - 90). |
Gender (Género) |
Género del paciente (0: Masculino, 1: Femenino). | |
Ethnicity (Etnicidad) |
Etnicidad (0: Caucásico, 1: Afroamericano, 2: Asiático, 3: Otro). | |
EducationLevel (Nivel Educativo) |
Nivel educativo más alto alcanzado (0: Ninguno, 1: Secundaria, 2: Licenciatura, 3: Posgrado). | |
| Factores de Estilo de Vida | BMI (Índice de Masa Corporal) |
Índice de Masa Corporal (rango: 15 - 40). |
Smoking (Tabaquismo) |
Estado de tabaquismo (0: No, 1: Sí). | |
AlcoholConsumption (Consumo de
Alcohol) |
Consumo semanal de alcohol, en unidades (rango: 0 - 20). | |
PhysicalActivity (Actividad Física) |
Actividad física semanal, en horas (rango: 0 - 10). | |
DietQuality (Calidad de la Dieta) |
Puntuación de la calidad de la dieta (rango: 0 - 10). | |
SleepQuality (Calidad del Sueño) |
Puntuación de la calidad del sueño (rango: 4 - 10). | |
| Historial Médico | FamilyHistoryAlzheimers (Historial
Familiar) |
Historial familiar de Alzheimer (0: No, 1: Sí). |
CardiovascularDisease (Enfermedad
Cardiovascular) |
Presencia de enfermedad cardiovascular (0: No, 1: Sí). | |
Diabetes (Diabetes) |
Presencia de diabetes (0: No, 1: Sí). | |
Depression (Depresión) |
Presencia de depresión (0: No, 1: Sí). | |
HeadInjury (Lesión Craneal) |
Historial de lesión craneal (0: No, 1: Sí). | |
Hypertension (Hipertensión) |
Presencia de hipertensión (0: No, 1: Sí). | |
| Mediciones Clínicas | SystolicBP (Presión Sistólica) |
Presión arterial sistólica, en mmHg (rango: 90 - 180). |
DiastolicBP (Presión Diastólica) |
Presión arterial diastólica, en mmHg (rango: 60 - 120). | |
CholesterolTotal (Colesterol Total) |
Nivel de colesterol total, en mg/dL (rango: 150 - 300). | |
CholesterolLDL (Colesterol LDL) |
Nivel de lipoproteínas de baja densidad, en mg/dL (rango: 50 - 200). | |
CholesterolHDL (Colesterol HDL) |
Nivel de lipoproteínas de alta densidad, en mg/dL (rango: 20 - 100). | |
CholesterolTriglycerides
(Triglicéridos) |
Nivel de triglicéridos, en mg/dL (rango: 50 - 400). | |
| Evaluaciones Cognitivas y Funcionales | MMSE |
Puntuación en el Mini-Examen del Estado Mental (rango: 0 - 30). Puntuaciones bajas indican deterioro cognitivo. |
FunctionalAssessment (Evaluación
Funcional) |
Puntuación de evaluación funcional (rango: 0 - 10). Puntuaciones bajas indican mayor deterioro. | |
MemoryComplaints (Quejas de Memoria) |
Presencia de quejas de memoria (0: No, 1: Sí). | |
BehavioralProblems (Problemas
Conductuales) |
Presencia de problemas conductuales (0: No, 1: Sí). | |
ADL (Actividades de la Vida Diaria) |
Puntuación en actividades de la vida diaria (rango: 0 - 10). Puntuaciones bajas indican mayor deterioro. | |
| Síntomas | Confusion (Confusión) |
Presencia de confusión (0: No, 1: Sí). |
Disorientation (Desorientación) |
Presencia de desorientación (0: No, 1: Sí). | |
PersonalityChanges (Cambios de
Personalidad) |
Presencia de cambios de personalidad (0: No, 1: Sí). | |
DifficultyCompletingTasks (Dificultad para
Tareas) |
Presencia de dificultad para completar tareas (0: No, 1: Sí). | |
Forgetfulness (Olvidos) |
Presencia de olvidos (0: No, 1: Sí). | |
| Diagnóstico | Diagnosis (Diagnóstico) |
Diagnóstico de Enfermedad de Alzheimer (0: No, 1: Sí). |
Nota. Tabla resumen generada con apoyo de IA.
library(readr)
alzheimer_data <- read_delim("alzheimer_data.csv",
delim = ";", escape_double = FALSE, locale = locale(decimal_mark = ","),
trim_ws = TRUE)
head(alzheimer_data)## # A tibble: 6 × 35
## ID Edad Genero Etnia `Nivel de Educacion` Indice de Masa Corpora…¹ Fumador
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4751 73 0 0 2 22.9 0
## 2 4752 89 0 0 0 26.8 0
## 3 4753 73 0 3 1 17.8 0
## 4 4754 74 1 0 1 33.8 1
## 5 4755 89 0 0 0 20.7 0
## 6 4756 86 1 1 1 30.6 0
## # ℹ abbreviated name: ¹`Indice de Masa Corporal`
## # ℹ 28 more variables: `Consumo de Alcohol` <dbl>, `Actividad Fisica` <dbl>,
## # `Calidad de Dieta` <dbl>, `Calidad de Sueno` <dbl>,
## # `Historia Familiar` <dbl>, `Enfermedad Cardiovascular` <dbl>,
## # Diabetes <dbl>, Depresion <dbl>, `Lesion Craneal` <dbl>,
## # Hipertension <dbl>, `Presion Arterial Sistolica` <dbl>,
## # `Presion Arterial Diastolica` <dbl>, `Nivel Total de Colesterol` <dbl>, …
## [1] "ID" "Edad"
## [3] "Genero" "Etnia"
## [5] "Nivel de Educacion" "Indice de Masa Corporal"
## [7] "Fumador" "Consumo de Alcohol"
## [9] "Actividad Fisica" "Calidad de Dieta"
## [11] "Calidad de Sueno" "Historia Familiar"
## [13] "Enfermedad Cardiovascular" "Diabetes"
## [15] "Depresion" "Lesion Craneal"
## [17] "Hipertension" "Presion Arterial Sistolica"
## [19] "Presion Arterial Diastolica" "Nivel Total de Colesterol"
## [21] "Nivel de LDL" "Nivel de HDL"
## [23] "Nivel de Trigliceridos" "MMSE"
## [25] "Evaluacion Funcional" "Quejas de Memoria"
## [27] "Problemas Conductuales" "Acitividades de Vida Diaria"
## [29] "Confusion" "Desorientacion"
## [31] "Cambios de Personalidad" "Dificultad para Completar Tareas"
## [33] "Olvidos" "Diagnosis"
## [35] "DoctorInCharge" "alzheimer"
##
## 0 1
## 1389 760
| Overall (N=2149) |
|
|---|---|
| alzheimer | |
| 0 | 1389 (64.6%) |
| 1 | 760 (35.4%) |
Se preparó la base de datos utilizando únicamente las variables relevantes para el análisis estadístico y asociados a la historia médica, factores sociodemográficos, estilos de vida y evaluaciones clínicas.
datos_modelo$alzheimer <- factor(datos_modelo$alzheimer, labels = c("No", "Sí")) # Si estaba como 0/1
datos_modelo$Genero <- factor(datos_modelo$Genero, labels = c("Hombre", "Mujer"))
datos_modelo$Etnia <- factor(datos_modelo$Etnia, labels = c("Caucásico", "Afro-americano", "Asiático", "Otro"))
datos_modelo$Nivel.de.Educacion <- factor(datos_modelo$Nivel.de.Educacion, labels = c("Ninguna", "Bachillerato", "Pregrado", "Posgrado"))
datos_modelo$Edad <- as.numeric(datos_modelo$Edad)
table1(~ Edad + Genero + Etnia + Nivel.de.Educacion | alzheimer,
data = datos_modelo,
overall = "Total",
footnote = "Nota: Valores presentados como media (DE) para variables continuas y n (%) para categóricas."
)| No (N=1389) |
Sí (N=760) |
Total (N=2149) |
|
|---|---|---|---|
Nota: Valores presentados como media (DE) para variables continuas y n (%) para categóricas. | |||
| Edad | |||
| Mean (SD) | 74.9 (8.90) | 74.8 (9.15) | 74.9 (8.99) |
| Median [Min, Max] | 75.0 [60.0, 90.0] | 75.0 [60.0, 90.0] | 75.0 [60.0, 90.0] |
| Genero | |||
| Hombre | 675 (48.6%) | 386 (50.8%) | 1061 (49.4%) |
| Mujer | 714 (51.4%) | 374 (49.2%) | 1088 (50.6%) |
| Etnia | |||
| Caucásico | 815 (58.7%) | 463 (60.9%) | 1278 (59.5%) |
| Afro-americano | 308 (22.2%) | 146 (19.2%) | 454 (21.1%) |
| Asiático | 122 (8.8%) | 84 (11.1%) | 206 (9.6%) |
| Otro | 144 (10.4%) | 67 (8.8%) | 211 (9.8%) |
| Nivel.de.Educacion | |||
| Ninguna | 272 (19.6%) | 174 (22.9%) | 446 (20.8%) |
| Bachillerato | 552 (39.7%) | 302 (39.7%) | 854 (39.7%) |
| Pregrado | 419 (30.2%) | 217 (28.6%) | 636 (29.6%) |
| Posgrado | 146 (10.5%) | 67 (8.8%) | 213 (9.9%) |
Se realiza una descripción de la población de estudio. Se registraron los datos de 1389 pacientes sin el diagnóstico y 760 con Alzheimer. Se observa que los investigadores tomaron una muestra representativa, aparentemente de Estados Unidos, abarcando un rango amplio en edad, etnias y nivel educativo.
# Boxplots de variables clave vs diagnóstico
boxplot(Indice.de.Masa.Corporal ~ alzheimer, data = datos_modelo, main = "BMI vs Diagnóstico")boxplot(Consumo.de.Alcohol ~ alzheimer, data = datos_modelo, main = "Consumo de Alcohol vs Diagnóstico")boxplot(Actividad.Fisica ~ alzheimer, data = datos_modelo, main = "Actividad Física vs Diagnóstico")boxplot(Nivel.Total.de.Colesterol ~ alzheimer, data = datos_modelo, main = "Total Colesterol vs Diagnóstico")boxplot(Nivel.de.Trigliceridos ~ alzheimer, data = datos_modelo, main = "Triglicéridos vs Diagnóstico")boxplot(Evaluacion.Funcional ~ alzheimer, data = datos_modelo, main = "Evaluación Funcional vs Diagnóstico")Los gráficos de cajas y bigotes generadas para las variables continuas permiten hacer una comparación entre los dos grupos, con el fin de tener una primera impresión de las posibles diferencias más marcadas. Se observa poca diferencia en la mayoría de gráficos, exceptuando en las variables cognitivas. Por lo tanto, es posible estos sean los datos de mayor relevancia para las predicciones.
## Ajuste del Modelo
modelo_alzheimer=train(alzheimer~.,
data = datos_modelo,
method = "glm",
family = "binomial")
modelo_alzheimer## Generalized Linear Model
##
## 2149 samples
## 32 predictor
## 2 classes: 'No', 'Sí'
##
## No pre-processing
## Resampling: Bootstrapped (25 reps)
## Summary of sample sizes: 2149, 2149, 2149, 2149, 2149, 2149, ...
## Resampling results:
##
## Accuracy Kappa
## 0.8341034 0.6308894
##
## Call: NULL
##
## Coefficients:
## (Intercept) Edad
## 5.4278533 -0.0105082
## GeneroMujer `EtniaAfro-americano`
## -0.0549320 -0.2211344
## EtniaAsiático EtniaOtro
## 0.2298599 -0.2555481
## Nivel.de.EducacionBachillerato Nivel.de.EducacionPregrado
## -0.2424893 -0.1394103
## Nivel.de.EducacionPosgrado Indice.de.Masa.Corporal
## -0.3963829 -0.0044044
## Fumador Consumo.de.Alcohol
## -0.2041624 -0.0092070
## Actividad.Fisica Calidad.de.Dieta
## -0.0067143 0.0112428
## Calidad.de.Sueno Historia.Familiar
## -0.0583832 -0.0981272
## Enfermedad.Cardiovascular Diabetes
## 0.1548321 0.0233487
## Depresion Lesion.Craneal
## 0.0727888 -0.3548529
## Hipertension Presion.Arterial.Sistolica
## 0.2115128 -0.0008700
## Presion.Arterial.Diastolica Nivel.Total.de.Colesterol
## 0.0019086 0.0002876
## Nivel.de.LDL Nivel.de.HDL
## -0.0029533 0.0049236
## Nivel.de.Trigliceridos MMSE
## 0.0007797 -0.1077221
## Evaluacion.Funcional Quejas.de.Memoria
## -0.4521595 2.5886387
## Problemas.Conductuales Acitividades.de.Vida.Diaria
## 2.5065363 -0.4206530
## Confusion Desorientacion
## -0.1679901 -0.1018618
## Cambios.de.Personalidad Dificultad.para.Completar.Tareas
## -0.1050889 0.0993529
## Olvidos
## 0.0053150
##
## Degrees of Freedom: 2148 Total (i.e. Null); 2112 Residual
## Null Deviance: 2792
## Residual Deviance: 1576 AIC: 1650
##
## Call:
## NULL
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 5.4278533 0.9771756 5.555 2.78e-08 ***
## Edad -0.0105082 0.0070752 -1.485 0.1375
## GeneroMujer -0.0549320 0.1279495 -0.429 0.6677
## `EtniaAfro-americano` -0.2211344 0.1655276 -1.336 0.1816
## EtniaAsiático 0.2298599 0.2231986 1.030 0.3031
## EtniaOtro -0.2555481 0.2275640 -1.123 0.2614
## Nivel.de.EducacionBachillerato -0.2424893 0.1723839 -1.407 0.1595
## Nivel.de.EducacionPregrado -0.1394103 0.1844665 -0.756 0.4498
## Nivel.de.EducacionPosgrado -0.3963829 0.2471226 -1.604 0.1087
## Indice.de.Masa.Corporal -0.0044044 0.0088921 -0.495 0.6204
## Fumador -0.2041624 0.1425496 -1.432 0.1521
## Consumo.de.Alcohol -0.0092070 0.0109928 -0.838 0.4023
## Actividad.Fisica -0.0067143 0.0220515 -0.304 0.7608
## Calidad.de.Dieta 0.0112428 0.0222094 0.506 0.6127
## Calidad.de.Sueno -0.0583832 0.0364452 -1.602 0.1092
## Historia.Familiar -0.0981272 0.1488527 -0.659 0.5098
## Enfermedad.Cardiovascular 0.1548321 0.1761933 0.879 0.3795
## Diabetes 0.0233487 0.1837190 0.127 0.8989
## Depresion 0.0727888 0.1566490 0.465 0.6422
## Lesion.Craneal -0.3548529 0.2228865 -1.592 0.1114
## Hipertension 0.2115128 0.1777708 1.190 0.2341
## Presion.Arterial.Sistolica -0.0008700 0.0024629 -0.353 0.7239
## Presion.Arterial.Diastolica 0.0019086 0.0036070 0.529 0.5967
## Nivel.Total.de.Colesterol 0.0002876 0.0014906 0.193 0.8470
## Nivel.de.LDL -0.0029533 0.0015020 -1.966 0.0493 *
## Nivel.de.HDL 0.0049236 0.0027678 1.779 0.0753 .
## Nivel.de.Trigliceridos 0.0007797 0.0006282 1.241 0.2145
## MMSE -0.1077221 0.0082257 -13.096 < 2e-16 ***
## Evaluacion.Funcional -0.4521595 0.0266631 -16.958 < 2e-16 ***
## Quejas.de.Memoria 2.5886387 0.1671286 15.489 < 2e-16 ***
## Problemas.Conductuales 2.5065363 0.1855537 13.508 < 2e-16 ***
## Acitividades.de.Vida.Diaria -0.4206530 0.0260357 -16.157 < 2e-16 ***
## Confusion -0.1679901 0.1602357 -1.048 0.2945
## Desorientacion -0.1018618 0.1763523 -0.578 0.5635
## Cambios.de.Personalidad -0.1050889 0.1835794 -0.572 0.5670
## Dificultad.para.Completar.Tareas 0.0993529 0.1747529 0.569 0.5697
## Olvidos 0.0053150 0.1392772 0.038 0.9696
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2792.3 on 2148 degrees of freedom
## Residual deviance: 1576.1 on 2112 degrees of freedom
## AIC: 1650.1
##
## Number of Fisher Scoring iterations: 6
Al aplicar el modelo de regresión logística múltiple, se puede identificar el puntaje obtenido de la prueba del Mini-Mental (MMSE), la evaluación funcional, la presencia del síntoma asociado a quejas en la memoria, la presencia de problemas conductuales y el puntaje de la prueba de evaluación de actividades de la vida diaria son las que presentan diferencias significativas. Por lo tanto, se infiere que, en este caso, las pruebas cognitivas son las que mejor predicen el diagnóstico de Alzheimer.
## glm variable importance
##
## only 20 most important variables shown (out of 36)
##
## Overall
## Evaluacion.Funcional 100.000
## Acitividades.de.Vida.Diaria 95.263
## Quejas.de.Memoria 91.316
## Problemas.Conductuales 79.611
## MMSE 77.172
## Nivel.de.LDL 11.395
## Nivel.de.HDL 10.288
## Nivel.de.EducacionPosgrado 9.254
## Calidad.de.Sueno 9.242
## Lesion.Craneal 9.184
## Edad 8.552
## Fumador 8.239
## Nivel.de.EducacionBachillerato 8.088
## `EtniaAfro-americano` 7.670
## Nivel.de.Trigliceridos 7.110
## Hipertension 6.806
## EtniaOtro 6.411
## Confusion 5.971
## EtniaAsiático 5.861
## Enfermedad.Cardiovascular 4.968
En la figura anterior se puede observar el efecto de cada variable utilizada en el modelo para predecir la enfermedad, desplegadas en orden. Posterior a las variables mencionadas anteriormente, se observa que, dentro de las variables biológicas, se observa que los niveles de colesterol de lipoproteínas de alta (HDL) y baja (LDL) densidad presentan un mayor efecto.
## Generar Curva ROC del modelo logístico
roc_obj <- roc(datos_modelo$alzheimer, fitted(modelo_alzheimer))
plot(roc_obj, col = "blue", lwd = 2, main = "Curva ROC del modelo logístico")## Area under the curve: 0.9078
Al generar la curva ROC del modelo logístico, se obtuvo un valor de 0,907 del área bajo la curva. Esto quiere decir que el presente modelo posee una capacidad bastante alta para discriminar estadísticamente la presencia o no del diagnóstico de la enfermedad de Alzheimer.
Finalmente, a partir de los coeficientes obtenidos del modelo logístico de todas las variables de estudio, se pudo generar la siguiente aplicación que puede servir como una lista de chequeo para determinar el porcentaje de riesgo de presentar la enfermedad:
library(shiny)
library(shinythemes)
library(DT)
library(plotly)
# Interfaz de usuario
ui <- fluidPage(
theme = shinytheme("flatly"),
# CSS personalizado para mejoras estéticas
tags$head(
tags$style(HTML("
.well {
background-color: #f8f9fa;
border: 1px solid #e9ecef;
border-radius: 8px;
}
.shiny-input-container {
margin-bottom: 15px;
}
.result-box {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 20px;
border-radius: 10px;
text-align: center;
margin: 20px 0;
}
.diagnosis-positive {
color: #dc3545;
font-weight: bold;
font-size: 32px;
text-shadow: 1px 1px 2px rgba(0,0,0,0.1);
}
.diagnosis-negative {
color: #28a745;
font-weight: bold;
font-size: 32px;
text-shadow: 1px 1px 2px rgba(0,0,0,0.1);
}
"))
),
titlePanel(
div(
img(src = "https://cdn-icons-png.flaticon.com/512/6096/6096939.png", height = 50),
"Evaluacion de Riesgo de Alzheimer - Sistema de Prediccion",
style = "display: flex; align-items: center; gap: 15px;"
),
windowTitle = "Evaluador Alzheimer"
),
sidebarLayout(
sidebarPanel(
width = 4,
h4("📋 Informacion del Paciente"),
# Demográficas
wellPanel(
h5("👤 Datos Demograficos"),
numericInput("age", "Edad (años):", value = 70, min = 60, max = 90),
selectInput("gender", "Genero:", choices = c("Masculino" = 0, "Femenino" = 1)),
selectInput("ethnicity", "Etnia:",
choices = c("Caucasico" = 0, "Afroamericano" = 1, "Asiatico" = 2, "Otro" = 3)),
selectInput("education", "Nivel Educativo:",
choices = c("Ninguno" = 0, "Secundaria" = 1, "Universitario" = 2, "Posgrado" = 3))
),
# Evaluaciones Cognitivas (las más importantes)
wellPanel(
h5("🧠 Evaluaciones Cognitivas"),
sliderInput("mmse", "Puntuacion MMSE (0-30):",
min = 0, max = 30, value = 28, step = 1,
post = " puntos"),
sliderInput("functional_assessment", "Evaluacion Funcional (0-10):",
min = 0, max = 10, value = 8, step = 0.5,
post = " puntos"),
sliderInput("adl", "Actividades de Vida Diaria - ADL (0-10):",
min = 0, max = 10, value = 9, step = 0.5,
post = " puntos"),
radioButtons("memory_complaints", "Quejas de Memoria:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("behavioral_problems", "Problemas Conductuales:",
choices = c("No" = 0, "Si" = 1), inline = TRUE)
)
),
mainPanel(
width = 8,
tabsetPanel(
tabPanel("Evaluacion Principal",
br(),
div(class = "result-box",
h3("Resultado de la Evaluacion"),
uiOutput("diagnosis_output"),
uiOutput("probability_output"),
plotlyOutput("probability_gauge", height = 200)
),
h4("📊 Factores de Riesgo Clave"),
plotlyOutput("important_factors_plot")
),
tabPanel("Historia Medica",
wellPanel(
h5("🏥 Historia Medica"),
radioButtons("family_history", "Historia Familiar Alzheimer:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("cardiovascular", "Enfermedad Cardiovascular:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("diabetes", "Diabetes:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("depression", "Depresion:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("head_injury", "Lesion Craneal Previa:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("hypertension", "Hipertension:",
choices = c("No" = 0, "Si" = 1), inline = TRUE)
)
),
tabPanel("Estilo de Vida",
wellPanel(
h5("💪 Estilo de Vida"),
sliderInput("bmi", "Indice de Masa Corporal (BMI):",
min = 15, max = 40, value = 25, step = 0.5),
radioButtons("smoking", "Fumador:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
sliderInput("alcohol", "Consumo de Alcohol (unidades/semana):",
min = 0, max = 20, value = 2, step = 1),
sliderInput("physical_activity", "Actividad Fisica (horas/semana):",
min = 0, max = 10, value = 3, step = 0.5),
sliderInput("diet_quality", "Calidad de Dieta (0-10):",
min = 0, max = 10, value = 7, step = 0.5),
sliderInput("sleep_quality", "Calidad de Sueno (4-10):",
min = 4, max = 10, value = 7, step = 0.5)
)
),
tabPanel("Mediciones Clinicas",
wellPanel(
h5("🩺 Mediciones Clinicas"),
sliderInput("systolic_bp", "Presion Sistolica (mmHg):",
min = 90, max = 180, value = 120, step = 5),
sliderInput("diastolic_bp", "Presion Diastolica (mmHg):",
min = 60, max = 120, value = 80, step = 5),
sliderInput("cholesterol_total", "Colesterol Total (mg/dL):",
min = 150, max = 300, value = 200, step = 5),
sliderInput("cholesterol_ldl", "Colesterol LDL (mg/dL):",
min = 50, max = 200, value = 110, step = 5),
sliderInput("cholesterol_hdl", "Colesterol HDL (mg/dL):",
min = 20, max = 100, value = 55, step = 5),
sliderInput("triglycerides", "Trigliceridos (mg/dL):",
min = 50, max = 400, value = 150, step = 5)
)
),
tabPanel("Sintomas",
wellPanel(
h5("⚠️ Sintomas Reportados"),
radioButtons("confusion", "Confusion:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("disorientation", "Desorientacion:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("personality_changes", "Cambios de Personalidad:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("difficulty_tasks", "Dificultad para Completar Tareas:",
choices = c("No" = 0, "Si" = 1), inline = TRUE),
radioButtons("forgetfulness", "Olvidos Frecuentes:",
choices = c("No" = 0, "Si" = 1), inline = TRUE)
)
)
)
)
)
)
# Servidor
server <- function(input, output, session) {
# Coeficientes del modelo (según tu output)
coefficients <- c(
"(Intercept)" = 5.2975685,
"Age" = -0.0103173,
"Gender" = -0.0478707,
"Ethnicity" = -0.0374298,
"EducationLevel" = -0.0879941,
"BMI" = -0.0043681,
"Smoking" = -0.2138144,
"AlcoholConsumption" = -0.0086747,
"PhysicalActivity" = -0.0073020,
"DietQuality" = 0.0099982,
"SleepQuality" = -0.0553598,
"FamilyHistoryAlzheimers" = -0.1106383,
"CardiovascularDisease" = 0.1675867,
"Diabetes" = 0.0153462,
"Depression" = 0.0660755,
"HeadInjury" = -0.3271763,
"Hypertension" = 0.1979382,
"SystolicBP" = -0.0007089,
"DiastolicBP" = 0.0018620,
"CholesterolTotal" = 0.0002350,
"CholesterolLDL" = -0.0029345,
"CholesterolHDL" = 0.0047261,
"CholesterolTriglycerides" = 0.0007356,
"MMSE" = -0.1071384,
"FunctionalAssessment" = -0.4482242,
"MemoryComplaints" = 2.5967150,
"BehavioralProblems" = 2.5053468,
"ADL" = -0.4215732,
"Confusion" = -0.1542108,
"Disorientation" = -0.1205590,
"PersonalityChanges" = -0.0711435,
"DifficultyCompletingTasks" = 0.1007715,
"Forgetfulness" = 0.0035713
)
# Calcular probabilidad
calculate_probability <- reactive({
# Calcular logit
logit <- coefficients["(Intercept)"] +
coefficients["Age"] * input$age +
coefficients["Gender"] * as.numeric(input$gender) +
coefficients["Ethnicity"] * as.numeric(input$ethnicity) +
coefficients["EducationLevel"] * as.numeric(input$education) +
coefficients["BMI"] * input$bmi +
coefficients["Smoking"] * as.numeric(input$smoking) +
coefficients["AlcoholConsumption"] * input$alcohol +
coefficients["PhysicalActivity"] * input$physical_activity +
coefficients["DietQuality"] * input$diet_quality +
coefficients["SleepQuality"] * input$sleep_quality +
coefficients["FamilyHistoryAlzheimers"] * as.numeric(input$family_history) +
coefficients["CardiovascularDisease"] * as.numeric(input$cardiovascular) +
coefficients["Diabetes"] * as.numeric(input$diabetes) +
coefficients["Depression"] * as.numeric(input$depression) +
coefficients["HeadInjury"] * as.numeric(input$head_injury) +
coefficients["Hypertension"] * as.numeric(input$hypertension) +
coefficients["SystolicBP"] * input$systolic_bp +
coefficients["DiastolicBP"] * input$diastolic_bp +
coefficients["CholesterolTotal"] * input$cholesterol_total +
coefficients["CholesterolLDL"] * input$cholesterol_ldl +
coefficients["CholesterolHDL"] * input$cholesterol_hdl +
coefficients["CholesterolTriglycerides"] * input$triglycerides +
coefficients["MMSE"] * input$mmse +
coefficients["FunctionalAssessment"] * input$functional_assessment +
coefficients["MemoryComplaints"] * as.numeric(input$memory_complaints) +
coefficients["BehavioralProblems"] * as.numeric(input$behavioral_problems) +
coefficients["ADL"] * input$adl +
coefficients["Confusion"] * as.numeric(input$confusion) +
coefficients["Disorientation"] * as.numeric(input$disorientation) +
coefficients["PersonalityChanges"] * as.numeric(input$personality_changes) +
coefficients["DifficultyCompletingTasks"] * as.numeric(input$difficulty_tasks) +
coefficients["Forgetfulness"] * as.numeric(input$forgetfulness)
# Convertir a probabilidad
probability <- 1 / (1 + exp(-logit))
return(probability * 100) # Convertir a porcentaje
})
# Output de diagnóstico (binario con umbral del 50%)
output$diagnosis_output <- renderUI({
prob <- calculate_probability()
if(prob >= 50) {
div(class = "diagnosis-positive", "DIAGNOSTICO: ALZHEIMER")
} else {
div(class = "diagnosis-negative", "DIAGNOSTICO: NO ALZHEIMER")
}
})
# Output de probabilidad numérica
output$probability_output <- renderUI({
prob <- calculate_probability()
div(
h4(sprintf("Probabilidad calculada: %.1f%%", prob)),
style = "margin: 10px 0;"
)
})
# Gráfico de medidor con umbral del 50%
output$probability_gauge <- renderPlotly({
prob <- calculate_probability()
plot_ly(
type = "indicator",
mode = "gauge+number",
value = prob,
number = list(suffix = "%", font = list(size = 24)),
gauge = list(
axis = list(range = list(0, 100), tickwidth = 1, tickcolor = "darkblue"),
bar = list(color = "darkblue"),
bgcolor = "white",
borderwidth = 2,
bordercolor = "gray",
steps = list(
list(range = c(0, 50), color = "lightgreen"),
list(range = c(50, 100), color = "red")
),
threshold = list(
line = list(color = "red", width = 4),
thickness = 0.75,
value = 50
)
)
) %>%
layout(
margin = list(l=20, r=30),
font = list(color = "darkblue", family = "Arial")
)
})
# Gráfico de factores importantes
output$important_factors_plot <- renderPlotly({
# Factores más importantes basados en coeficientes
important_factors <- data.frame(
Factor = c("MMSE", "Evaluacion Funcional", "Problemas Conductuales",
"Quejas de Memoria", "Actividades Vida Diaria", "Historia Familiar"),
Impacto = c(13.073, 16.916, 13.540, 15.574, 16.221, 0.745) # Valores absolutos de z-value
)
plot_ly(important_factors, x = ~Impacto, y = ~reorder(Factor, Impacto),
type = 'bar', orientation = 'h',
marker = list(color = '#667eea')) %>%
layout(title = "Factores con Mayor Impacto en el Diagnostico",
xaxis = list(title = "Impacto (valor absoluto z-score)"),
yaxis = list(title = ""))
})
}
# Ejecutar la aplicación
shinyApp(ui = ui, server = server)En suma, el análisis estadístico demuestra que las variables cognitivas y funcionales son los predictores más robustos para diferenciar entre pacientes con y sin diagnóstico de Alzheimer. Las variables que presentan un efecto significativo para esta predicción incluyen:
El puntaje obtenido en la prueba del Mini-Mental (MMSE).
La evaluación funcional y el puntaje de la prueba de evaluación de actividades de la vida diaria (AVD).
La presencia de síntomas asociados a quejas en la memoria y la presencia de problemas conductuales.
La aplicación de este modelo, que incorpora estas variables, permite obtener un alto porcentaje de predicción, lo cual es fundamental para el diagnóstico diferencial y para abordar oportunamente a los pacientes de alto riesgo.
No obstante, la principal limitación de este modelo es su temporalidad: las variables predictivas más relevantes (MMSE, AVD, y síntomas conductuales) son marcadores de un daño cognitivo y neuronal ya establecido. Por lo tanto, el modelo se queda limitado para una predicción verdaderamente temprana.
Futuras investigaciones deberán indagar más variables biológicas relevantes que logren geenrar una predicción acertada etapas tempranas del desarrollo de la enfermedad de Alzheimer.