Los datos del archivo “depresion.csv” que se encuentra en la plataforma, corresponden a la información de 294 pacientes estudiados para evaluar si sufrian o no de depresion. Dentro de las variables que se estudiaron se encuentran las siguientes:
Sí el objetivo del estudio es el predecir si los pacientes sufren o no de depresión, considerando para ello las variables en estudio, que método emplearía, evalúe si cumple los supuestos (si es necesario transforme u organice la información), ejecútelo y discuta los resultados.
Sí el objetivo del estudio es el de clasificar los pacientes en grupos, que método emplearía, evalúe si cumple los supuestos (si es necesario transforme u organice la información), ejecútelo y discuta los resultados.
Sí el objetivo del estudio es el caracterizar estos pacientes a través de sus categorías de respuesta, que método emplearía, evalúe si cumple los supuestos (si es necesario transforme u organice la información), ejecútelo y discuta los resultados.
library(readr)
datos <- read_csv("depresion.csv")
str(datos)
summary(datos)
table(datos$sexo)
datos$sexo <- factor(datos$sexo, levels = 1:2, labels = c('Masculino', 'Femenino'))
table(unclass(datos$sexo), datos$sexo)
datos$sexo = relevel(datos$sexo, ref=1)
table(datos$estcivil)
datos$estcivil <- factor(datos$estcivil, levels = 1:5,
labels = c('Soltero', 'Casado', 'Divorciado', 'Separado', 'Viudo'))
table(unclass(datos$estcivil), datos$estcivil)
datos$estcivil = relevel(datos$estcivil, ref=1)
table(datos$niveleducat)
datos$niveleducat <- factor(datos$niveleducat, levels = 1:7,
labels = c('Primaria Incompleta', 'Primaria Completa', 'Bachillerato incompleto', 'Bachillerato Completo', 'Pregrado', 'Maestría', 'Doctorado'))
table(unclass(datos$niveleducat), datos$niveleducat)
table(datos$ocupacion)
datos$ocupacion <- factor(datos$ocupacion, levels = 1:7,
labels = c('Tiempo Completo', 'Medio Tiempo', 'Desempleado', 'Pensionado', 'Ama de Casa', 'Estudiante', 'Otro'))
table(unclass(datos$ocupacion), datos$ocupacion)
datos$ocupacion = relevel(datos$ocupacion, ref=1)
table(datos$religion)
datos$religion <- factor(datos$religion, levels = c(1:4,6),
labels = c('Protestante', 'Catolico', 'Judio', 'Ninguna', 'Otra'))
table(unclass(datos$religion), datos$religion)
datos$religion = relevel(datos$religion, ref=1)
table(datos$depresion)
datos$depresion <- factor(datos$depresion, levels = 0:1, labels = c('No', 'Sí'))
table(unclass(datos$depresion), datos$depresion)
datos$depresion = relevel(datos$depresion, ref=1)
table(datos$alcohol)
datos$alcohol <- factor(datos$alcohol, levels = 2:1, labels = c('No', 'Sí'))
table(unclass(datos$alcohol), datos$alcohol)
datos$alcohol = relevel(datos$alcohol, ref=1)
table(datos$est_salud)
datos$est_salud <- factor(datos$est_salud, levels = 1:4,
labels = c('Excelente', 'Bueno', 'Regular', 'Malo'))
table(unclass(datos$est_salud), datos$est_salud)
datos$est_salud = relevel(datos$est_salud, ref=1)
table(datos$medico_reg)
datos$medico_reg <- factor(datos$medico_reg, levels = 2:1, labels = c('No', 'Sí'))
table(unclass(datos$medico_reg), datos$medico_reg)
datos$medico_reg = relevel(datos$medico_reg, ref=1)
table(datos$tratamiento)
datos$tratamiento <- factor(datos$tratamiento, levels = 1:2, labels = c('No', 'Sí'))
table(unclass(datos$tratamiento), datos$tratamiento)
datos$tratamiento = relevel(datos$tratamiento, ref=1)
table(datos$diascama)
datos$diascama <- factor(datos$diascama, levels = 0:1, labels = c('No', 'Sí'))
table(unclass(datos$diascama), datos$diascama)
datos$diascama = relevel(datos$diascama, ref=1)
table(datos$aguda)
datos$aguda <- factor(datos$aguda, levels = 0:1, labels = c('No', 'Sí'))
table(unclass(datos$aguda), datos$aguda)
datos$aguda = relevel(datos$aguda, ref=1)
table(datos$cronica)
datos$cronica <- factor(datos$cronica, levels = 0:1, labels = c('No', 'Sí'))
table(unclass(datos$cronica), datos$cronica)
datos$cronica = relevel(datos$cronica, ref=1)
summary(datos)
id sexo edad estcivil
Min. : 1.00 Masculino:111 Min. :18.00 Soltero : 73
1st Qu.: 74.25 Femenino :183 1st Qu.:28.00 Casado :127
Median :147.50 Median :42.50 Divorciado: 43
Mean :147.50 Mean :44.41 Separado : 13
3rd Qu.:220.75 3rd Qu.:59.00 Viudo : 38
Max. :294.00 Max. :89.00
niveleducat ocupacion religion
Primaria Incompleta : 5 Tiempo Completo:167 Protestante:155
Primaria Completa : 61 Medio Tiempo : 42 Catolico : 51
Bachillerato incompleto:114 Desempleado : 14 Judio : 30
Bachillerato Completo : 48 Pensionado : 38 Ninguna : 56
Pregrado : 43 Ama de Casa : 27 Otra : 2
Maestría : 14 Estudiante : 2
Doctorado : 9 Otro : 4
depresion alcohol est_salud medico_reg tratamiento diascama
No:244 No: 60 Excelente:130 No: 55 No:148 No:231
Sí: 50 Sí:234 Bueno :115 Sí:239 Sí:146 Sí: 63
Regular : 35
Malo : 14
aguda cronica
No:207 No:145
Sí: 87 Sí:149
by(datos[-1],datos$depresion,summary)
datos$depresion: No
sexo edad estcivil
Masculino:101 Min. :18.00 Soltero : 57
Femenino :143 1st Qu.:29.00 Casado :110
Median :43.50 Divorciado: 36
Mean :45.24 Separado : 9
3rd Qu.:59.00 Viudo : 32
Max. :89.00
niveleducat ocupacion religion
Primaria Incompleta : 5 Tiempo Completo:147 Protestante:134
Primaria Completa :45 Medio Tiempo : 31 Catolico : 43
Bachillerato incompleto:93 Desempleado : 8 Judio : 23
Bachillerato Completo :44 Pensionado : 34 Ninguna : 43
Pregrado :35 Ama de Casa : 20 Otra : 1
Maestría :14 Estudiante : 1
Doctorado : 8 Otro : 3
depresion alcohol est_salud medico_reg tratamiento diascama
No:244 No: 51 Excelente:113 No: 42 No:118 No:202
Sí: 0 Sí:193 Bueno : 97 Sí:202 Sí:126 Sí: 42
Regular : 25
Malo : 9
aguda cronica
No:176 No:126
Sí: 68 Sí:118
--------------------------------------------------------
datos$depresion: Sí
sexo edad estcivil
Masculino:10 Min. :18.00 Soltero :16
Femenino :40 1st Qu.:26.00 Casado :17
Median :34.50 Divorciado: 7
Mean :40.38 Separado : 4
3rd Qu.:51.00 Viudo : 6
Max. :79.00
niveleducat ocupacion religion
Primaria Incompleta : 0 Tiempo Completo:20 Protestante:21
Primaria Completa :16 Medio Tiempo :11 Catolico : 8
Bachillerato incompleto:21 Desempleado : 6 Judio : 7
Bachillerato Completo : 4 Pensionado : 4 Ninguna :13
Pregrado : 8 Ama de Casa : 7 Otra : 1
Maestría : 0 Estudiante : 1
Doctorado : 1 Otro : 1
depresion alcohol est_salud medico_reg tratamiento diascama aguda
No: 0 No: 9 Excelente:17 No:13 No:30 No:29 No:31
Sí:50 Sí:41 Bueno :18 Sí:37 Sí:20 Sí:21 Sí:19
Regular :10
Malo : 5
cronica
No:19
Sí:31
library(ggplot2); require(gridExtra)
# Edad
with(datos,boxplot(edad ~ depresion , main="Edad vs Depresión", las=2))
# sexo
tabla <- with(datos,table(sexo,depresion))
p1 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=sexo, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs sexo")+
theme(legend.position="none")
# Estado civil
tabla <- with(datos,table(estcivil,depresion))
p2 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=estcivil, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs estcivil")+
theme(legend.position="none")
# niveleducat
tabla <- with(datos,table(niveleducat,depresion))
p3 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=niveleducat, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs niveleducat")
grid.arrange(p1, p2, p3, ncol=3)
# ocupacion
tabla <- with(datos,table(ocupacion,depresion))
p1 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=ocupacion, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs ocupacion")+
theme(legend.position="none")
# religion
tabla <- with(datos,table(religion,depresion))
p2 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=religion, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs religion")+
theme(legend.position="none")
# alcohol
tabla <- with(datos,table(alcohol,depresion))
p3 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=alcohol, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs alcohol")
grid.arrange(p1, p2, p3, ncol=3)
# est_salud
tabla <- with(datos,table(est_salud,depresion))
p1 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=est_salud, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs est_salud")+
theme(legend.position="none")
# medico_reg
tabla <- with(datos,table(medico_reg,depresion))
p2 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=medico_reg, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs medico_reg")+
theme(legend.position="none")
# tratamiento
tabla <- with(datos,table(tratamiento,depresion))
p3 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=tratamiento, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs tratamiento")
grid.arrange(p1, p2, p3, ncol=3)
# diascama
tabla <- with(datos,table(diascama,depresion))
p1 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=diascama, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs diascama")+
theme(legend.position="none")
# aguda
tabla <- with(datos,table(aguda,depresion))
p2 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=aguda, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs aguda")+
theme(legend.position="none")
# cronica
tabla <- with(datos,table(cronica,depresion))
p3 <- ggplot(as.data.frame(prop.table(tabla,1)), aes(x=cronica, y = Freq, fill=depresion)) +
geom_bar(stat="identity") +
theme(axis.text.x=element_text(angle=45,hjust=1))+
labs(title = "% Depresión vs cronica")
grid.arrange(p1, p2, p3, ncol=3)
La proporción de personas con depresión es mayor en mujeres, seperados, personas con primaria completa, estudiantes y desempleados; Judíos, ninguna u otras religiones, consumidores de alcohol, personas con un mal estado de salud, cuando no se cuenta con un médico regular o que le recete sus tratamientos; en aquellos con dos meses en cama, con una enfermedad aguda o crónica
Una alternativa es usar árboles de clasificación. No necesitamos algún supuesto en particular. Los datos ya han sido formateados adecuadamente al momento del análisis exploratorio. Por ahora, usamos como muestra de entrenamiento todos los datos y no utilizamos una data de validación.
Ajustamos un árbol de clasificación para la depresión considerando las demás variables (edad continua) ecepto el id. Se obtiene el siguiente árbol:
# Classification Tree with rpart
library(rpart)
# grow tree
set.seed(17)
fit <- rpart(depresion ~ .,
method="class", data=datos[-1])
# plot tree
library(rattle)
fancyRpartPlot(fit, cex=.8)
La importancia de las variables, a continuación, es calculada como la suma de los decrecimientos en la impureza.
# variable importance
library(knitr)
kable(fit$variable.importance, digits = 2)
| diascama | 4.27 |
| religion | 4.10 |
| ocupacion | 3.88 |
| niveleducat | 3.25 |
| est_salud | 2.16 |
| sexo | 1.78 |
| edad | 1.53 |
| estcivil | 1.34 |
| tratamiento | 0.76 |
| cronica | 0.25 |
Estar los últimos dos meses en cama es el mejor predictor.
Bajo esta muestra de modelamiento (100%), obtenemos la matriz de confusión
pred = predict(fit, type="class")
library(caret)
confusionMatrix(pred, datos$depresion)
Confusion Matrix and Statistics
Reference
Prediction No Sí
No 228 26
Sí 16 24
Accuracy : 0.8571
95% CI : (0.8118, 0.8951)
No Information Rate : 0.8299
P-Value [Acc > NIR] : 0.1207
Kappa : 0.4502
Mcnemar's Test P-Value : 0.1649
Sensitivity : 0.9344
Specificity : 0.4800
Pos Pred Value : 0.8976
Neg Pred Value : 0.6000
Prevalence : 0.8299
Detection Rate : 0.7755
Detection Prevalence : 0.8639
Balanced Accuracy : 0.7072
'Positive' Class : No
Este árbol no es muy preciso (86%). Con un p-valor=0.1207, no podemos asegurar que la precisión sea mayor a la tasa de no información.
El árbol anterior puede ser podado con base al parámetro de complejidad,
# printcp(fit) # display the results
# summary(fit) # detailed summary of splits
library(knitr)
kable(fit$cptable, digits=3)
| CP | nsplit | rel error | xerror | xstd |
|---|---|---|---|---|
| 0.027 | 0 | 1.00 | 1.00 | 0.129 |
| 0.020 | 3 | 0.92 | 1.16 | 0.136 |
| 0.010 | 7 | 0.84 | 1.26 | 0.141 |
plotcp(fit) # visualize cross-validation results
# prune the tree
pfit<- prune(fit, cp= fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])
# summary(pfit)
# plot the pruned tree
# fancyRpartPlot(pfit)
La siguiente es la matriz de confusión para el árbol podado,
pred = predict(pfit, type="class")
library(caret)
confusionMatrix(pred, datos$depresion)
Confusion Matrix and Statistics
Reference
Prediction No Sí
No 244 50
Sí 0 0
Accuracy : 0.8299
95% CI : (0.782, 0.8711)
No Information Rate : 0.8299
P-Value [Acc > NIR] : 0.5377
Kappa : 0
Mcnemar's Test P-Value : 4.219e-12
Sensitivity : 1.0000
Specificity : 0.0000
Pos Pred Value : 0.8299
Neg Pred Value : NaN
Prevalence : 0.8299
Detection Rate : 0.8299
Detection Prevalence : 1.0000
Balanced Accuracy : 0.5000
'Positive' Class : No
Este árbol no es útil ya que predice todos los casos como no-drepresión. El ábol definitivo es el primero ajustado.
El árbol no tiene buenas medidas. Su precisión, sensibilidad y valor predictivo negativos son demasiado bajos. Se recomienda usar otra técnica, por ejemplo regresión logística y comparar los resultados.
La técnica adecuada en este caso es análisis de conglomerados. Para el agrupamiento usamos todas las variables.
Dado que tenomos datos mixtos usamos la distancia Gower.
library(cluster)
gower_dist <- daisy(datos[,-1],
metric = "gower")
summary(gower_dist)
43071 dissimilarities, summarized :
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.001006 0.382290 0.501010 0.487480 0.584510 0.977870
Metric : mixed ; Types = N, I, N, N, N, N, N, N, N, N, N, N, N, N
Number of objects : 294
hist(gower_dist, main="Distancia de Gower")
gower_mat <- as.matrix(gower_dist)
# Output most similar pair
datos[
which(gower_mat == min(gower_mat[gower_mat != min(gower_mat)]),
arr.ind = TRUE)[1, ], ]
| id | sexo | edad | estcivil | niveleducat | ocupacion | religion | depresion | alcohol | est_salud | medico_reg | tratamiento | diascama | aguda | cronica |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 214 | Masculino | 25 | Casado | Bachillerato incompleto | Tiempo Completo | Protestante | No | Sí | Bueno | Sí | Sí | No | No | No |
| 204 | Masculino | 26 | Casado | Bachillerato incompleto | Tiempo Completo | Protestante | No | Sí | Bueno | Sí | Sí | No | No | No |
# Output most dissimilar pair
datos[
which(gower_mat == max(gower_mat[gower_mat != max(gower_mat)]),
arr.ind = TRUE)[1, ], ]
| id | sexo | edad | estcivil | niveleducat | ocupacion | religion | depresion | alcohol | est_salud | medico_reg | tratamiento | diascama | aguda | cronica |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 227 | Femenino | 89 | Viudo | Doctorado | Medio Tiempo | Protestante | No | Sí | Excelente | No | Sí | No | No | No |
| 211 | Masculino | 47 | Casado | Primaria Completa | Otro | Catolico | Sí | No | Regular | Sí | No | Sí | Sí | Sí |
library(seriation)
dissplot(gower_mat)
library(NbClust)
clusters <- 2:6
Medidas <- data.frame(clusters,
frey= NA,mcclain= NA,cindex= NA,silhouette= NA,dunn= NA
)
Medidas <- rbind(Medidas, c("Best.nc", rep(NA,5)))
indices <- c('frey', 'mcclain', 'cindex', 'silhouette', 'dunn')
for (i in seq_along(indices)) {
res<-NbClust(diss=gower_dist, distance = NULL,
min.nc=min(clusters), max.nc=max(clusters),
method = "ward.D2",
index = indices[i])
res$All.index
res$Best.nc
res$All.CriticalValues
res$Best.partition
Medidas[i+1] <- c(res$All.index,res$Best.nc[1])
}
Only frey, mcclain, cindex, sihouette and dunn can be computed. To compute the other indices, data matrix is needed
Only frey, mcclain, cindex, sihouette and dunn can be computed. To compute the other indices, data matrix is needed
Only frey, mcclain, cindex, sihouette and dunn can be computed. To compute the other indices, data matrix is needed
Only frey, mcclain, cindex, sihouette and dunn can be computed. To compute the other indices, data matrix is needed
Only frey, mcclain, cindex, sihouette and dunn can be computed. To compute the other indices, data matrix is needed
Medidas
| clusters | frey | mcclain | cindex | silhouette | dunn |
|---|---|---|---|---|---|
| 2 | 0.3498 | 0.8110 | 0.4921 | 0.1591 | 0.0910 |
| 3 | 0.5614 | 1.4793 | 0.4706 | 0.1215 | 0.0916 |
| 4 | 0.3289 | 1.9685 | 0.4934 | 0.0978 | 0.0946 |
| 5 | 0.0413 | 2.8227 | 0.4911 | 0.0940 | 0.0917 |
| 6 | 0.7905 | 3.1569 | 0.4826 | 0.0908 | 0.0927 |
| Best.nc | 1.0000 | 2.0000 | 3.0000 | 2.0000 | 4.0000 |
# Calculate silhouette width for many k using PAM
sil_width <- c(NA)
for(i in 2:10){
pam_fit <- pam(gower_dist,
diss = TRUE,
k = i)
sil_width[i] <- pam_fit$silinfo$avg.width
}
# Plot sihouette width (higher is better)
plot(1:10, sil_width,
xlab = "Number of clusters",
ylab = "Silhouette Width")
lines(1:10, sil_width)
hier <- hclust(gower_dist, method = 'ward.D2')
plot(hier)
segmento <- cutree(hier,2)
rect.hclust(hier, k=2)
# Medidas
sil <- silhouette(segmento,dist = gower_dist)
summary(sil)
Silhouette of 294 units in 2 clusters from silhouette.default(x = segmento, dist = gower_dist) :
Cluster sizes and average silhouette widths:
169 125
0.113978 0.220132
Individual silhouette widths:
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.29694 0.08279 0.18940 0.15911 0.24465 0.35729
clValid::connectivity(clusters = as.integer(segmento), distance = as.matrix(gower_dist), neighbSize=10)
[1] 107.179
clValid::dunn(distance = as.matrix(gower_dist), clusters = as.integer(segmento))
[1] 0.09100999
Las medidas conseguidas son consideradas como pobres. La técnica de clustering ha conseguido una probre discrimiación en grupos homogéneos al interior y heterogéneos entre ellos.
library(FactoMineR)
catdes(donnee = data.frame(as.factor(segmento), datos),1)
$test.chi2
p.value df
cronica 8.602794e-34 1
tratamiento 2.939923e-33 1
est_salud 7.241488e-09 3
sexo 1.117061e-07 1
diascama 2.369520e-04 1
ocupacion 1.846419e-03 6
estcivil 2.024419e-03 4
medico_reg 9.151696e-03 1
aguda 9.826645e-03 1
alcohol 1.273732e-02 1
depresion 4.938771e-02 1
$category
$category$`1`
Cla/Mod Mod/Cla Global p.value
cronica=Sí 91.94631 81.065089 50.680272 4.156006e-37
tratamiento=No 91.89189 80.473373 50.340136 1.693820e-36
sexo=Femenino 69.39891 75.147929 62.244898 1.277113e-07
est_salud=Regular 94.28571 19.526627 11.904762 4.067925e-07
diascama=Sí 77.77778 28.994083 21.428571 1.871601e-04
est_salud=Malo 100.00000 8.284024 4.761905 3.386438e-04
aguda=Sí 68.96552 35.502959 29.591837 9.782981e-03
medico_reg=Sí 61.08787 86.390533 81.292517 1.028672e-02
alcohol=No 71.66667 25.443787 20.408163 1.243669e-02
ocupacion=Pensionado 73.68421 16.568047 12.925170 3.004435e-02
estcivil=Viudo 73.68421 16.568047 12.925170 3.004435e-02
depresion=Sí 70.00000 20.710059 17.006803 4.970163e-02
depresion=No 54.91803 79.289941 82.993197 4.970163e-02
alcohol=Sí 53.84615 74.556213 79.591837 1.243669e-02
medico_reg=No 41.81818 13.609467 18.707483 1.028672e-02
aguda=No 52.65700 64.497041 70.408163 9.782981e-03
ocupacion=Medio Tiempo 35.71429 8.875740 14.285714 2.459458e-03
estcivil=Soltero 41.09589 17.751479 24.829932 1.256471e-03
diascama=No 51.94805 71.005917 78.571429 1.871601e-04
est_salud=Excelente 43.07692 33.136095 44.217687 9.337406e-06
sexo=Masculino 37.83784 24.852071 37.755102 1.277113e-07
tratamiento=Sí 22.60274 19.526627 49.659864 1.693820e-36
cronica=No 22.06897 18.934911 49.319728 4.156006e-37
v.test
cronica=Sí 12.727565
tratamiento=No 12.617371
sexo=Femenino 5.282100
est_salud=Regular 5.065751
diascama=Sí 3.735745
est_salud=Malo 3.583790
aguda=Sí 2.583407
medico_reg=Sí 2.566039
alcohol=No 2.499505
ocupacion=Pensionado 2.169505
estcivil=Viudo 2.169505
depresion=Sí 1.962523
depresion=No -1.962523
alcohol=Sí -2.499505
medico_reg=No -2.566039
aguda=No -2.583407
ocupacion=Medio Tiempo -3.028285
estcivil=Soltero -3.225741
diascama=No -3.735745
est_salud=Excelente -4.431974
sexo=Masculino -5.282100
tratamiento=Sí -12.617371
cronica=No -12.727565
$category$`2`
Cla/Mod Mod/Cla Global p.value v.test
cronica=No 77.931034 90.4 49.319728 4.156006e-37 12.727565
tratamiento=Sí 77.397260 90.4 49.659864 1.693820e-36 12.617371
sexo=Masculino 62.162162 55.2 37.755102 1.277113e-07 5.282100
est_salud=Excelente 56.923077 59.2 44.217687 9.337406e-06 4.431974
diascama=No 48.051948 88.8 78.571429 1.871601e-04 3.735745
estcivil=Soltero 58.904110 34.4 24.829932 1.256471e-03 3.225741
ocupacion=Medio Tiempo 64.285714 21.6 14.285714 2.459458e-03 3.028285
aguda=No 47.342995 78.4 70.408163 9.782981e-03 2.583407
medico_reg=No 58.181818 25.6 18.707483 1.028672e-02 2.566039
alcohol=Sí 46.153846 86.4 79.591837 1.243669e-02 2.499505
depresion=No 45.081967 88.0 82.993197 4.970163e-02 1.962523
depresion=Sí 30.000000 12.0 17.006803 4.970163e-02 -1.962523
ocupacion=Pensionado 26.315789 8.0 12.925170 3.004435e-02 -2.169505
estcivil=Viudo 26.315789 8.0 12.925170 3.004435e-02 -2.169505
alcohol=No 28.333333 13.6 20.408163 1.243669e-02 -2.499505
medico_reg=Sí 38.912134 74.4 81.292517 1.028672e-02 -2.566039
aguda=Sí 31.034483 21.6 29.591837 9.782981e-03 -2.583407
est_salud=Malo 0.000000 0.0 4.761905 3.386438e-04 -3.583790
diascama=Sí 22.222222 11.2 21.428571 1.871601e-04 -3.735745
est_salud=Regular 5.714286 1.6 11.904762 4.067925e-07 -5.065751
sexo=Femenino 30.601093 44.8 62.244898 1.277113e-07 -5.282100
tratamiento=No 8.108108 9.6 50.340136 1.693820e-36 -12.617371
cronica=Sí 8.053691 9.6 50.680272 4.156006e-37 -12.727565
$quanti.var
Eta2 P-value
edad 0.04765825 0.0001613887
$quanti
$quanti$`1`
v.test Mean in category Overall mean sd in category Overall sd
edad 3.736826 47.80473 44.41497 17.2638 18.05466
p.value
edad 0.000186358
$quanti$`2`
v.test Mean in category Overall mean sd in category Overall sd
edad -3.736826 39.832 44.41497 18.08855 18.05466
p.value
edad 0.000186358
attr(,"class")
[1] "catdes" "list "
by(datos, segmento, summary, na.rm=T)
segmento: 1
id sexo edad estcivil
Min. : 1.0 Masculino: 42 Min. :18.0 Soltero :30
1st Qu.: 70.0 Femenino :127 1st Qu.:33.0 Casado :71
Median :146.0 Median :47.0 Divorciado:30
Mean :145.3 Mean :47.8 Separado :10
3rd Qu.:216.0 3rd Qu.:60.0 Viudo :28
Max. :294.0 Max. :83.0
niveleducat ocupacion religion
Primaria Incompleta : 2 Tiempo Completo:96 Protestante:97
Primaria Completa :36 Medio Tiempo :15 Catolico :26
Bachillerato incompleto:73 Desempleado : 5 Judio :18
Bachillerato Completo :26 Pensionado :28 Ninguna :27
Pregrado :21 Ama de Casa :20 Otra : 1
Maestría : 7 Estudiante : 1
Doctorado : 4 Otro : 4
depresion alcohol est_salud medico_reg tratamiento diascama
No:134 No: 43 Excelente:56 No: 23 No:136 No:120
Sí: 35 Sí:126 Bueno :66 Sí:146 Sí: 33 Sí: 49
Regular :33
Malo :14
aguda cronica
No:109 No: 32
Sí: 60 Sí:137
--------------------------------------------------------
segmento: 2
id sexo edad estcivil
Min. : 8.0 Masculino:69 Min. :18.00 Soltero :43
1st Qu.: 77.0 Femenino :56 1st Qu.:24.00 Casado :56
Median :149.0 Median :34.00 Divorciado:13
Mean :150.5 Mean :39.83 Separado : 3
3rd Qu.:232.0 3rd Qu.:52.00 Viudo :10
Max. :293.0 Max. :89.00
niveleducat ocupacion religion
Primaria Incompleta : 3 Tiempo Completo:71 Protestante:58
Primaria Completa :25 Medio Tiempo :27 Catolico :25
Bachillerato incompleto:41 Desempleado : 9 Judio :12
Bachillerato Completo :22 Pensionado :10 Ninguna :29
Pregrado :22 Ama de Casa : 7 Otra : 1
Maestría : 7 Estudiante : 1
Doctorado : 5 Otro : 0
depresion alcohol est_salud medico_reg tratamiento diascama aguda
No:110 No: 17 Excelente:74 No:32 No: 12 No:111 No:98
Sí: 15 Sí:108 Bueno :49 Sí:93 Sí:113 Sí: 14 Sí:27
Regular : 2
Malo : 0
cronica
No:113
Sí: 12
En el grupo 1 están principalmente los sujetos con enfermedades crónica, que no tienen un doctor que les asigne un tratamiento y cuyo estado de salud está entre regular y malo. En el grupo 2 están principalmente los sujetos sin enfermedades crónica, que sí tienen un doctor que les asigne un tratamiento y cuyo estado de salud está entre bueno y excelente. Esta representación tiene pobres medidas. Dado que la mayoría de variables son categóricas quizá sea más conveniente observar esta población desde el punto de vista de dichas categorías utilizando un análisis de correspondencias como en el siguiente punto.
Empleamos una Análisis de Correspondencias Múltiple. Previamente debemos categorizar las variables continuas (edad)
library(reshape2)
df2 = melt(datos[-1], id.vars = c('edad'),
variable.name ='Variable', value.name = "Valor")
library(ggplot2)
p <- ggplot(data = df2, aes(x=Valor, y=edad))+
geom_boxplot() +
theme(axis.text.x=element_text(angle=45,hjust=1))
p + facet_wrap( ~ Variable, ncol = 3, scales="free")
Para categorizar la edad nos fijamos en las diferencias por estados civil, nivel educativo y ocupación. Así creamos las categorías “<18”, “[18,40)”, “[40,60)” y “>60”
datos$edad_cut <- cut(datos$edad, breaks = c(-Inf,18,40,60,Inf),include.lowest = T, ordered_result = T,
labels = c("<18", "[18,40)", "[40,60)", ">60"))
summary(datos$edad_cut)
<18 [18,40) [40,60) >60
5 132 96 61
class_df <- as.data.frame(sapply(datos, class))
var_categoricas <- unlist(class_df[1,]) %in% c("ordered","factor")
library(ca)
res.mca <- mjca(datos[,var_categoricas], lambda="adjusted")
summary(res.mca, scree = TRUE)
Principal inertias (eigenvalues):
dim value % cum% scree plot
1 0.023704 39.7 39.7 *************
2 0.008685 14.5 54.2 *****
3 0.004737 7.9 62.1 ***
4 0.001977 3.3 65.4 *
5 0.001658 2.8 68.2 *
6 0.001246 2.1 70.3 *
7 0.000835 1.4 71.7
8 0.000562 0.9 72.6
9 0.000259 0.4 73.1
10 0.000235 0.4 73.5
11 8.8e-050 0.1 73.6
12 6.8e-050 0.1 73.7
13 4.1e-050 0.1 73.8
14 00000000 0.0 73.8
-------- -----
Total: 0.059755
Columns:
name mass qlt inr k=1 cor ctr
1 | sexo:Masculino | 27 608 19 | -143 454 23 |
2 | sexo:Femenino | 44 608 11 | 87 454 14 |
3 | estcivil:Soltero | 18 593 24 | -243 566 44 |
4 | estcivil:Casado | 31 16 15 | 15 13 0 |
5 | estcivil:Divorciado | 10 144 21 | -65 122 2 |
6 | estcivil:Separado | 3 358 25 | 110 44 2 |
7 | estcivil:Viudo | 9 764 32 | 455 628 81 |
8 | niveleducat:Primaria Incompleta | 1 115 26 | 87 8 0 |
9 | niveleducat:Primaria Completa | 15 516 25 | 258 511 41 |
10 | niveleducat:Bachillerato incompleto | 28 135 15 | 39 121 2 |
11 | niveleducat:Bachillerato Completo | 12 184 20 | -78 175 3 |
12 | niveleducat:Pregrado | 10 676 23 | -261 676 30 |
13 | niveleducat:Maestría | 3 311 24 | -222 226 7 |
14 | niveleducat:Doctorado | 2 304 24 | -281 273 7 |
15 | ocupacion:Tiempo Completo | 41 624 16 | -155 620 41 |
16 | ocupacion:Medio Tiempo | 10 52 21 | -50 51 1 |
17 | ocupacion:Desempleado | 3 113 25 | -111 44 2 |
18 | ocupacion:Pensionado | 9 696 36 | 504 562 99 |
19 | ocupacion:Ama de Casa | 7 562 26 | 344 528 33 |
20 | ocupacion:Estudiante | 0 173 26 | -343 56 2 |
21 | ocupacion:Otro | 1 468 25 | 439 241 8 |
22 | religion:Protestante | 38 227 13 | 64 226 7 |
23 | religion:Catolico | 12 14 21 | -24 13 0 |
24 | religion:Judio | 7 60 22 | 0 0 0 |
25 | religion:Ninguna | 14 320 22 | -148 317 12 |
26 | religion:Otra | 0 27 27 | -243 26 1 |
27 | depresion:No | 59 479 5 | -12 35 0 |
28 | depresion:Sí | 12 479 24 | 60 35 2 |
29 | alcohol:No | 15 551 23 | 203 492 25 |
30 | alcohol:Sí | 57 551 6 | -52 492 7 |
31 | est_salud:Excelente | 32 775 18 | -189 772 47 |
32 | est_salud:Bueno | 28 442 16 | 56 180 4 |
33 | est_salud:Regular | 9 737 26 | 308 515 34 |
34 | est_salud:Malo | 3 604 28 | 522 550 39 |
35 | medico_reg:No | 13 509 23 | -204 503 23 |
36 | medico_reg:Sí | 58 509 5 | 47 503 5 |
37 | tratamiento:No | 36 731 18 | 169 587 43 |
38 | tratamiento:Sí | 35 731 18 | -171 587 44 |
39 | diascama:No | 56 639 7 | -8 5 0 |
40 | diascama:Sí | 15 639 27 | 28 5 0 |
41 | aguda:No | 50 613 9 | 21 37 1 |
42 | aguda:Sí | 21 613 22 | -50 37 2 |
43 | cronica:No | 35 714 19 | -170 567 43 |
44 | cronica:Sí | 36 714 18 | 166 567 42 |
45 | edad_cut:<18 | 1 127 28 | -71 4 0 |
46 | edad_cut:[18,40) | 32 755 21 | -226 728 69 |
47 | edad_cut:[40,60) | 23 174 19 | 60 89 3 |
48 | edad_cut:>60 | 15 701 36 | 401 540 101 |
k=2 cor ctr
1 -84 155 22 |
2 51 155 13 |
3 53 27 6 |
4 -7 3 0 |
5 28 23 1 |
6 294 314 31 |
7 -211 136 48 |
8 -312 106 14 |
9 25 5 1 |
10 -14 14 1 |
11 19 10 0 |
12 -8 1 0 |
13 137 85 7 |
14 -95 31 2 |
15 12 4 1 |
16 9 2 0 |
17 140 69 8 |
18 -246 134 64 |
19 87 34 6 |
20 496 117 14 |
21 427 228 20 |
22 4 1 0 |
23 8 1 0 |
24 -60 60 3 |
25 15 3 0 |
26 -46 1 0 |
27 -44 444 13 |
28 214 444 64 |
29 71 59 8 |
30 -18 59 2 |
31 -12 3 1 |
32 -68 262 15 |
33 202 222 40 |
34 165 55 11 |
35 22 6 1 |
36 -5 6 0 |
37 84 144 29 |
38 -85 144 29 |
39 -83 633 45 |
40 305 633 164 |
41 -83 576 40 |
42 198 576 95 |
43 -87 147 30 |
44 84 147 30 |
45 400 123 22 |
46 44 27 7 |
47 59 86 9 |
48 -219 161 82 |
# Inertia percentage
library(factoextra)
fviz_screeplot(res.mca)
# Biplots
plot(res.mca, map='symbiplot', contrib='relative', main='Correspondencias múltiple (inercias ajustadas)')
# number of categories per variable
cats = apply(datos[,var_categoricas], 2, function(x) nlevels(as.factor(x)))
library(ggplot2)
# data frame with variable coordinates
mca1_vars_df = data.frame(res.mca$colcoord, Variable = rep(names(cats), cats))
rownames(mca1_vars_df) = res.mca$levelnames
# plot of variable categories
ggplot(data=mca1_vars_df,
aes(x = X1, y=X2, label = abbreviate(rownames(mca1_vars_df),20))) +
geom_hline(yintercept = 0, colour = "gray70") +
geom_vline(xintercept = 0, colour = "gray70") +
geom_text(aes(colour=Variable)) +
ggtitle("MCA biplot")
Con el método de inercias ajustadas las representación en dos dimensiones de las categorías apena alcanza el 54.2% de la inercia total.
library(ca)
res.mca <- mjca(datos[,var_categoricas], lambda="JCA")
summary(res.mca, scree = TRUE)
Principal inertias (eigenvalues):
dim value
1 0.029938
2 0.011457
3 0.004554
4 0.002405
5 0.001717
6 0.001331
7 0.001070
8 0.000784
9 5e-04000
10 0.000308
11 0.000190
12 0.000141
13 8.8e-050
14 2.3e-050
--------
Total: 0.063280
Diagonal inertia discounted from eigenvalues: 0.0077926
Percentage explained by JCA in 2 dimensions: 60.6%
(Eigenvalues are not nested)
[Iterations in JCA: 23 , epsilon = 8.08e-05]
Columns:
name mass inr k=1 k=2 cor ctr
1 | sexo:Masculino | 27 19 | -128 98 | 582 20
2 | sexo:Femenino | 44 11 | 77 -60 | 582 12
3 | estcivil:Soltero | 18 24 | -268 -43 | 643 33
4 | estcivil:Casado | 31 15 | 12 6 | 10 0
5 | estcivil:Divorciado | 10 21 | -77 -31 | 179 2
6 | estcivil:Separado | 3 25 | 67 -284 | 322 8
7 | estcivil:Viudo | 9 32 | 538 196 | 895 75
8 | niveleducat:Primaria Incompleta | 1 26 | 149 291 | 123 4
9 | niveleducat:Primaria Completa | 15 25 | 257 -41 | 520 28
10 | niveleducat:Bachillerato incompleto | 28 15 | 39 4 | 122 1
11 | niveleducat:Bachillerato Completo | 12 20 | -86 -15 | 219 2
12 | niveleducat:Pregrado | 10 23 | -258 40 | 675 20
13 | niveleducat:Maestría | 3 24 | -236 -110 | 315 6
14 | niveleducat:Doctorado | 2 24 | -260 120 | 284 5
15 | ocupacion:Tiempo Completo | 41 16 | -185 -12 | 734 32
16 | ocupacion:Medio Tiempo | 10 21 | -62 -1 | 64 1
17 | ocupacion:Desempleado | 3 25 | -155 -123 | 114 3
18 | ocupacion:Pensionado | 9 36 | 663 243 | 885 102
19 | ocupacion:Ama de Casa | 7 26 | 365 -95 | 560 23
20 | ocupacion:Estudiante | 0 26 | -495 -469 | 183 5
21 | ocupacion:Otro | 1 25 | 400 -479 | 485 10
22 | religion:Protestante | 38 13 | 55 -10 | 184 3
23 | religion:Catolico | 12 21 | -18 -1 | 8 0
24 | religion:Judio | 7 22 | 12 53 | 53 1
25 | religion:Ninguna | 14 22 | -135 -3 | 282 7
26 | religion:Otra | 0 27 | -227 92 | 28 1
27 | depresion:No | 59 5 | -7 45 | 480 3
28 | depresion:Sí | 12 24 | 36 -218 | 480 17
29 | alcohol:No | 15 23 | 182 -86 | 503 17
30 | alcohol:Sí | 57 6 | -47 22 | 503 4
31 | est_salud:Excelente | 32 18 | -199 52 | 849 34
32 | est_salud:Bueno | 28 16 | 63 53 | 405 5
33 | est_salud:Regular | 9 26 | 315 -260 | 808 35
34 | est_salud:Malo | 3 28 | 550 -264 | 677 31
35 | medico_reg:No | 13 23 | -188 2 | 454 14
36 | medico_reg:Sí | 58 5 | 43 0 | 454 3
37 | tratamiento:No | 36 18 | 170 -122 | 817 39
38 | tratamiento:Sí | 35 18 | -172 124 | 817 40
39 | diascama:No | 56 7 | 1 97 | 728 12
40 | diascama:Sí | 15 27 | -3 -356 | 728 45
41 | aguda:No | 50 9 | 31 87 | 679 11
42 | aguda:Sí | 21 22 | -73 -207 | 679 27
43 | cronica:No | 35 19 | -170 127 | 803 40
44 | cronica:Sí | 36 18 | 166 -124 | 803 39
45 | edad_cut:<18 | 1 28 | -200 -427 | 138 6
46 | edad_cut:[18,40) | 32 21 | -281 -52 | 893 56
47 | edad_cut:[40,60) | 23 19 | 43 -68 | 167 4
48 | edad_cut:>60 | 15 36 | 557 254 | 914 111
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
# Biplots
plot(res.mca, map='symbiplot', contrib='relative', main='Correspondencias múltiple Conjunto')
# number of categories per variable
cats = apply(datos[,var_categoricas], 2, function(x) nlevels(as.factor(x)))
library(ggplot2)
# data frame with variable coordinates
mca1_vars_df = data.frame(res.mca$colcoord, Variable = rep(names(cats), cats))
rownames(mca1_vars_df) = res.mca$levelnames
# plot of variable categories
ggplot(data=mca1_vars_df,
aes(x = X1, y=X2, label = abbreviate(rownames(mca1_vars_df),20))) +
geom_hline(yintercept = 0, colour = "gray70") +
geom_vline(xintercept = 0, colour = "gray70") +
geom_text(aes(colour=Variable)) +
ggtitle("MCA biplot")
Con la solución por análisis conjunto el porcentaje de inercia estimada por la dosprimeras dimensiones es del 60.6% (inercias no anidadas). La calidad de varias categorías mejora considerablemente, siendo en algunos casos superior a 800.
Personas mayores de 60 años de edad, viudos y pensionados. Este grupo podría ser subdividido en aquellos que completaron la primaria y los que no.
Aquellos con un estado de salud regular o malo
Estudiantes menores de edad
Los deprimidos, separados, con enfermedades agudas y dos meses en cama
El resto de los pacientes.