Capítulo 1 Trayectorias de sintomatología depresiva. Modelo Optimal-Matching

1.1 Secuencia de depresión con 4 categorías:

# Crear objeto con secuencias
seq.depr4 <- TraMineR::seqdef(elsoc_salud_wide, 
                             var = c('depr4_w01', 'depr4_w02', 'depr4_w03', 'depr4_w04'), 
                             states = c('Sin síntomas', 'Síntomas medios', 'Síntomas moderados', 'Síntomas severos'), 
                             labels = c('Sin síntomas', 'Síntomas medios', 'Sintomas moderados', 'Síntomas severos'),
                             weights = elsoc_salud_wide$ponderador02_w01,
                             cpal = c('lightgreen', 'mediumturquoise', 'skyblue3', 'slateblue4'))

1.1.1 Gráfico de secuencias:

Muestra todas las secuencias, ordenadas según la suma total del indice phq9 (sumando las 5 olas)

TraMineR::seqIplot(seq.depr4, border = NA, xtlab = 2016:2019,
                   space = 0, sortv = elsoc_salud_wide$phq_sum)

1.1.2 Frecuencia de estados y transiciones

seqstatd(seq.depr4)
##                                     [State frequencies]
##                    depr4_w01 depr4_w02 depr4_w03 depr4_w04
## Sin síntomas           0.481      0.49     0.435      0.37
## Síntomas medios        0.307      0.29     0.329      0.39
## Síntomas moderados     0.138      0.11     0.137      0.15
## Síntomas severos       0.075      0.11     0.099      0.10
## 
##                                      [Valid states]
##                    depr4_w01 depr4_w02 depr4_w03 depr4_w04
## N                       1728      1728      1728      1728
## 
##                                      [Entropy index]
##                    depr4_w01 depr4_w02 depr4_w03 depr4_w04
## H                       0.85      0.86      0.89       0.9
seqtrate(seq.depr4)
##                         [-> Sin síntomas] [-> Síntomas medios]
## [Sin síntomas ->]               0.6038410            0.2922604
## [Síntomas medios ->]            0.3438261            0.4239771
## [Síntomas moderados ->]         0.1729046            0.3531208
## [Síntomas severos ->]           0.1978647            0.2363666
##                         [-> Síntomas moderados] [-> Síntomas severos]
## [Sin síntomas ->]                     0.0594495            0.04444910
## [Síntomas medios ->]                  0.1467422            0.08545468
## [Síntomas moderados ->]               0.2571979            0.21677672
## [Síntomas severos ->]                 0.2669224            0.29884634

1.1.3 Clusters de secuencias:

# Medir distancias entre secuencias usando analisis de secuencias usando optimal matching analysis

# Se define matriz de costos de sustitución basados en valores medios de indice phq9
substitution_cost_matrix <- as.matrix(rbind(c(0, 5, 10, 19),
                                            c(5, 0, 5, 14),
                                            c(10, 5, 0, 9),
                                            c(19, 14, 9, 0)))

dist.depr4 <- TraMineR::seqdist(seq.depr4,
                               method = "OM",
                               sm = substitution_cost_matrix)

# Construir tipos de trayectorias con analisis de cluster jerarquico Ward
ward.depr4 <- cluster::agnes(dist.depr4, diss = TRUE, method = 'ward')

Indicadores de calidad de partición:

Se evalúa según los indicadores:

kableExtra::kbl(data.frame(indicador = c('Point Biserial Correlation', "Hubert's Somers' D", 
                                 "Hubert's C", "Average Silhouette Width (weighted)"),
                   abreviacion = c('PBC', 'HGSD', 'HC', 'ASWw'),
                   interpretacion = c('Mide la capacidad de la clusterización de reproducir las distancias',
                                      'Mide la capacidad de la clusterización de reproducir las distancias tomando en cuenta empates en distancias',
                                      'Mide la brecha entre la clusterización obtenida y la mejor partición teóricamente posible con este número de grupos y distancias',
                                      'Mide la coherencia de asignaciones. Alta coherencia indica una alta distancia entre grupos y fuerte homogeneidad inter-grupal')))
indicador abreviacion interpretacion
Point Biserial Correlation PBC Mide la capacidad de la clusterización de reproducir las distancias
Hubert’s Somers’ D HGSD Mide la capacidad de la clusterización de reproducir las distancias tomando en cuenta empates en distancias
Hubert’s C HC Mide la brecha entre la clusterización obtenida y la mejor partición teóricamente posible con este número de grupos y distancias
Average Silhouette Width (weighted) ASWw Mide la coherencia de asignaciones. Alta coherencia indica una alta distancia entre grupos y fuerte homogeneidad inter-grupal
# Comparar soluciones con diferentes numeros de trayectorias (se prueban de 2 a 10 clusters)
ward.range.depr4 <- WeightedCluster::as.clustrange(ward.depr4,
                                                  diss = dist.depr4, 
                                                  ncluster = 10)


# Visualizar clusters:
ward.range.depr4$stats %>%
  mutate(clusters = 2:10) %>%
  pivot_longer(cols = c(ASWw, HG, PBC, HC),
               names_to = 'indicador',
               values_to = 'value') %>%
  group_by(indicador) %>%
  mutate(value = (value - mean(value, na.rm = TRUE)) / sd(value, na.rm = TRUE)) %>%
  ggplot(aes(y = value, x = clusters, color = indicador, group = indicador)) +
  geom_line() +
  scale_x_continuous(breaks = 2:10)

Para ASWw, HG y PBC, mientras más alto el valor indica una mejor calidad en la partición. Para HC mientras más bajo es mejor. Los mejores valores parecen estar entre 4 y 5 clusters.

1.1.4 Graficos de secuencias por clusters

Pruebas con 4-6 clusters

TraMineR::seqfplot(seq.depr4, group = stats::cutree(ward.depr4, k = 4),
                   border = NA, 
                   space = 0, idxs = 0, xtlab = 2016:2019)

TraMineR::seqdplot(seq.depr4, group = stats::cutree(ward.depr4, k = 4),
                   border = NA, 
                   space = 0)

TraMineR::seqfplot(seq.depr4, group = stats::cutree(ward.depr4, k = 5),
                   border = NA, 
                   space = 0, idxs = 0, xtlab = 2016:2019)

TraMineR::seqdplot(seq.depr4, group = stats::cutree(ward.depr4, k = 5),
                   border = NA, 
                   space = 0)

TraMineR::seqfplot(seq.depr4, group = stats::cutree(ward.depr4, k = 6),
                   border = NA, 
                   space = 0, idxs = 0, xtlab = 2016:2019)

TraMineR::seqdplot(seq.depr4, group = stats::cutree(ward.depr4, k = 6),
                   border = NA, 
                   space = 0)