1 Introducción

Con mucha frecuencia se va a querer evaluar cómo esta evolucionando la terapia antiretroviral (ART) durante un periodo de tiempo con el que se cuente información estadística. Por ejemplo, en las aplicaciones, se pueden abordar las siguientes preguntas:

¿Las observaciones de cada paciente son similares entre sí?

¿Las muestras de una misma agrupación tienen señales similares con todas las observaciones de pacientes?

Para pacientes con recuentos de T CD4 similares, ¿se tiene un perfil de comportamiento a lo largo del tiempo similar?

Para responder algunas de estas interrogantes se necesitan definir métricas de distancia o similitud entre perfiles de expresión de cada paciente y usar esa métrica para encontrar agrupaciones de pacientes que sean más similares entre sí. Dada una métrica de distancia, se emplea una metodología para encontrar agrupaciones auto-similares. La agrupación es un procedimiento presente en cualquier campo que se ocupe de datos de alta dimensión, como lo es la información generada por biomarcadores dentro de un contexto clínico.

2 Análisis de aglomeración

La métrica de distancia es simplemente una medida de cuán similares son las expresiones entre sí. Hay muchas opciones para las métricas de distancia y la elección de la métrica es bastante importante para la agrupación. Por ejemplo, se cuenta con observaciones de \(124\) pacientes de \(2018\) a \(2021\), y como se muestra en la Tabla 1, y se desean encontrar similitudes en función de sus recuentos de T CD4 durante el periodo de estudio.

Table 1: Agrupación por k-medias. Las columnas muestran los centros, el tamaño la suma de cuadrados y la etiqueta para cada cluster.
x1 size withinss cluster
1.522613 98 126.5418 1
39.050622 1 0.0000 2
6.916049 27 251.0462 3

La Tabla 2 devuelve métricas del modelo. Una de ellas es tot.withinss, que es la suma de cuadrados total dentro del conglomerado que se busca minimizar al realizar el conglomerado de k-medias.

Table 2: Métricas del modelo de agrupación por k-medias. Las columnas muestran la suma de cuadrados totales, la suma de cuadrados totales dentro de cada cluster, la suma de cuadrados entre conglomerados y el número de iteraciones.
totss tot.withinss betweenss iter
2305.123 377.588 1927.535 2

Por último, se puede ver a qué agrupación pertenece cada observación en la Tabla 3.

Table 3: Agrupaciones de linfocitos T CD4 en pacientes con VIH durante el periodo 2018-2021.
.cluster 2018 cd4 2019 cd4 2021 cd4
1 525 738 708
1 338 344 403
1 648 736 522
1 186 424 319
1 462 256 701
3 764 764 249
3 52 8 55
3 1180 974 867
1 722 532 631
1 635 635 798
1 398 435 669
1 293 612 856
1 490 490 670
1 513 513 429
1 526 633 591
1 595 497 603
3 178 94 35
1 768 605 343
1 134 290 238
1 540 749 708
1 397 235 480
3 565 833 1485
3 781 344 689
1 376 376 813
1 490 591 453
3 121 643 634
1 592 559 967
3 339 592 1125
1 447 610 625
1 623 582 423
1 649 530 464
3 680 705 166
1 647 647 522
1 532 772 926
1 404 492 441
1 530 507 562
1 403 264 285
1 472 452 447
1 745 545 540
1 690 607 971
1 311 416 307
3 148 619 268
3 856 1484 1153
3 1022 935 908
3 996 1068 932
1 180 138 112
3 418 818 327
1 549 589 446
1 541 675 570
1 764 513 713
1 237 224 304
1 389 291 673
1 471 716 576
1 279 565 342
1 575 509 609
1 781 609 628
3 1037 924 565
1 318 563 600
1 306 608 611
1 395 490 380
1 210 150 163
3 339 105 527
1 552 602 749
3 529 808 1343
1 320 411 318
1 845 968 848
1 287 550 445
1 514 544 597
1 277 254 182
3 533 393 971
1 613 721 597
1 63 241 253
1 415 526 707
1 341 479 528
2 1643 432 655
3 344 569 1036
1 334 88 260
1 382 490 657
3 512 684 268
1 463 420 476
1 299 342 331
1 405 347 320
1 660 619 679
1 802 471 683
3 674 1001 873
1 532 407 507
1 419 423 454
3 706 665 1113
1 420 363 703
1 554 684 817
1 68 294 464
1 413 447 800
3 539 980 992
1 577 603 616
1 579 504 653
1 292 356 459
3 459 807 450
1 189 279 506
1 720 616 809
1 711 653 605
1 293 370 521
1 513 776 845
1 242 242 298
3 72 56 75
1 152 91 117
1 63 178 192
1 662 905 724
1 527 527 533
1 156 156 65
1 248 239 295
1 518 682 730
3 1098 777 1090
1 617 558 666
1 338 406 486
1 307 368 390
1 253 259 379
1 537 644 712
1 520 513 518
1 803 677 747
1 416 601 537
1 297 385 380
3 1074 1074 852
1 298 327 198
1 450 246 256
1 903 903 676
1 694 354 477

Y se puede visualizar qué tan bien funcionó la agrupación en los dos primeros años en la Figura 1.

Nube de puntos de recuento en T CD4 por número de conglomerado. 2018 vs 2019

Figure 1: Nube de puntos de recuento en T CD4 por número de conglomerado
2018 vs 2019

La comparación con un año de desfase al inicio del estudio (\(2018-2021\)) se visualiza en la Figura 2.

Nube de puntos de recuento en T CD4 por número de conglomerado. 2018 vs 2021.

Figure 2: Nube de puntos de recuento en T CD4 por número de conglomerado
2018 vs 2021.

El comportamiento una vez iniciado el estudio durante un periodo de análisis (\(2019-2021\)) es mostrado en la Figura 3.

Nube de puntos de recuento en T CD4 por número de conglomerado. 2019 vs 2021.

Figure 3: Nube de puntos de recuento en T CD4 por número de conglomerado
2019 vs 2021.

Se puede distinguir una nube de puntos con distintos niveles de dispersión, por lo que es deseable poder probar varias agrupaciones diferentes y luego encontrar la mejor. Se ajustan múltiples modelos y se extrae información de ellos en la Tabla 4.

Table 4: Sumas de cuadrados del número de agrupaciones.
k tot.withinss
1 2305.12276
2 971.23053
3 377.58801
4 204.04221
5 77.04267
6 51.28912
7 34.10725
8 28.66945
9 23.72909
10 20.59510

Al contar con la suma de cuadrados total dentro del conglomerado, se grafican contra \(k\) en la Figura 4, de modo que se pueda usar el método del codo para encontrar el número óptimo de conglomerados.

Gráfica de codo

Figure 4: Gráfica de codo

Se observa un codo en \(k=3\), lo que indica la creación específica para tener \(3\) agrupaciones.

Session info

## R version 4.2.3 (2023-03-15)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.2 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=es_MX.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=es_MX.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=es_MX.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=es_MX.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] kableExtra_1.3.4   knitr_1.42         yardstick_1.1.0    workflowsets_1.0.0
##  [5] workflows_1.1.3    tune_1.0.1         rsample_1.1.1      recipes_1.0.5     
##  [9] parsnip_1.0.4      modeldata_1.1.0    infer_1.0.4        dials_1.1.0       
## [13] scales_1.2.1       broom_1.0.4        tidymodels_1.0.0   magrittr_2.0.3    
## [17] lubridate_1.9.2    forcats_1.0.0      stringr_1.5.0      dplyr_1.1.1       
## [21] purrr_1.0.1        readr_2.1.4        tidyr_1.3.0        tibble_3.2.1      
## [25] ggplot2_3.4.1      tidyverse_2.0.0    BiocStyle_2.26.0  
## 
## loaded via a namespace (and not attached):
##  [1] bit64_4.0.5         webshot_0.5.4       httr_1.4.5         
##  [4] DiceDesign_1.9      tools_4.2.3         backports_1.4.1    
##  [7] bslib_0.4.2         utf8_1.2.3          R6_2.5.1           
## [10] rpart_4.1.16        colorspace_2.1-0    nnet_7.3-17        
## [13] withr_2.5.0         tidyselect_1.2.0    bit_4.0.5          
## [16] compiler_4.2.3      rvest_1.0.3         cli_3.6.1          
## [19] xml2_1.3.3          labeling_0.4.2      bookdown_0.33      
## [22] sass_0.4.5          systemfonts_1.0.4   digest_0.6.31      
## [25] svglite_2.1.1       rmarkdown_2.21      pkgconfig_2.0.3    
## [28] htmltools_0.5.5     parallelly_1.35.0   lhs_1.1.6          
## [31] highr_0.10          fastmap_1.1.1       rlang_1.1.0        
## [34] rstudioapi_0.14     farver_2.1.1        jquerylib_0.1.4    
## [37] generics_0.1.3      jsonlite_1.8.4      vroom_1.6.1        
## [40] Matrix_1.5-3        Rcpp_1.0.10         munsell_0.5.0      
## [43] fansi_1.0.4         GPfit_1.0-8         lifecycle_1.0.3    
## [46] furrr_0.3.1         stringi_1.7.12      yaml_2.3.7         
## [49] MASS_7.3-55         grid_4.2.3          parallel_4.2.3     
## [52] listenv_0.9.0       crayon_1.5.2        lattice_0.20-45    
## [55] splines_4.2.3       hms_1.1.3           pillar_1.9.0       
## [58] future.apply_1.10.0 codetools_0.2-18    glue_1.6.2         
## [61] evaluate_0.20       BiocManager_1.30.20 vctrs_0.6.1        
## [64] tzdb_0.3.0          foreach_1.5.2       gtable_0.3.3       
## [67] future_1.32.0       cachem_1.0.7        xfun_0.38          
## [70] gower_1.0.1         prodlim_2019.11.13  viridisLite_0.4.1  
## [73] class_7.3-20        survival_3.2-13     timeDate_4022.108  
## [76] iterators_1.0.14    hardhat_1.2.0       lava_1.7.2.1       
## [79] timechange_0.2.0    globals_0.16.2      ipred_0.9-14