4 Estadística descriptiva

Ahora empezaremos a ver la potencia de R. No sólo se hacen librerías para el análisis estadístico de datos, también se hacen librerías para visualizar resultados de forma gráfica, hacer análisis descriptivos rápidos o crear tablas de artículos de forma sencilla. Algunas de estas librerías las iremos viendo durante el curso. Empecemos con algunas librerías para resumir de forma rápida nuestras variables. Para ello necesitamos instalar las siguientes librerías que iremos viendo a lo largo del curso

install.packages("summarytools", "compareGroups")

4.1 Variables categóricas

La librería summarytools es muy potente. Por ejemplo, podemos obtener un resumen para las variables categóricas (por ejemplo para saber cuantos casos y controles tenemos) con la función freq()

library(summarytools)
freq(multicentric$status)
Frequencies  
multicentric$status  
Type: Character  

                Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
------------- ------ --------- -------------- --------- --------------
         Caso   1489     51.17          51.17     51.17          51.17
      Control   1421     48.83         100.00     48.83         100.00
         <NA>      0                               0.00         100.00
        Total   2910    100.00         100.00    100.00         100.00

Notemos que antes hay que cargar la librería para que R encuentre la función freq(), no es suficiente con instalar la librería, luego hay que cargarla. También vemos que esta función no describe las variables categóricas (ver warning).

Podemos evitar que salgan los missings (NA) y hacer más compacta la tabla con la instrucción

freq(multicentric$status, report.nas = FALSE, headings = FALSE)

                Freq        %   % Cum.
------------- ------ -------- --------
         Caso   1489    51.17    51.17
      Control   1421    48.83   100.00
        Total   2910   100.00   100.00

Si queremos que lo haga para todas las variables categóricas, funciona así de simple

freq(multicentric, report.nas = FALSE, headings = FALSE)
multicentric$pais  

                  Freq        %   % Cum.
--------------- ------ -------- --------
         Brasil    347    11.92    11.92
       Colombia    323    11.10    23.02
         Espana    376    12.92    35.95
      Filipinas    636    21.86    57.80
      Marruecos    332    11.41    69.21
           Peru    312    10.72    79.93
      Tailandia    584    20.07   100.00
          Total   2910   100.00   100.00

multicentric$status  

                Freq        %   % Cum.
------------- ------ -------- --------
         Caso   1489    51.17    51.17
      Control   1421    48.83   100.00
        Total   2910   100.00   100.00

multicentric$niveledu  

                      Freq        %   % Cum.
------------------- ------ -------- --------
            ninguno    681    23.40    23.40
           primaria   1446    49.69    73.09
         secundaria    673    23.13    96.22
            ticnico     62     2.13    98.35
      universitario     48     1.65   100.00
              Total   2910   100.00   100.00

multicentric$fumar  

                   Freq        %   % Cum.
---------------- ------ -------- --------
      ex-fumador    223     7.66     7.66
         fumador    292    10.03    17.70
      no fumador   2395    82.30   100.00
           Total   2910   100.00   100.00
Error in if (data_info$Data.type == trs("numeric")) {: argumento tiene longitud cero

4.2 Tabla de contingencia

Para crear una tabla de contingencia y ver cómo se distribuyen los casos y controles según su infección por vph podríamos usar la función ctable()

ctable(multicentric$status, multicentric$vph, prop="r")
Cross-Tabulation, Row Proportions  
status * vph  
Data Frame: multicentric  

--------- ----- -------------- -------------- ------------- ---------------
            vph       negativo       positivo          <NA>           Total
   status                                                                  
     Caso           81 ( 5.4%)   1190 (79.9%)   218 (14.6%)   1489 (100.0%)
  Control          996 (70.1%)    168 (11.8%)   257 (18.1%)   1421 (100.0%)
    Total         1077 (37.0%)   1358 (46.7%)   475 (16.3%)   2910 (100.0%)
--------- ----- -------------- -------------- ------------- ---------------

el argumento prop nos sirve para indicar si queremos las proporciones por fila (‘r’) o columna (‘c’). Podmeos eliminar la columna de missings indicando que el argumento useNA sea “no”

ctable(multicentric$status, multicentric$vph, useNA="no", prop="r")
Cross-Tabulation, Row Proportions  
status * vph  
Data Frame: multicentric  

--------- ----- -------------- -------------- ---------------
            vph       negativo       positivo           Total
   status                                                    
     Caso           81 ( 6.4%)   1190 (93.6%)   1271 (100.0%)
  Control          996 (85.6%)    168 (14.4%)   1164 (100.0%)
    Total         1077 (44.2%)   1358 (55.8%)   2435 (100.0%)
--------- ----- -------------- -------------- ---------------

4.3 Variables continuas

Para las variables continuas podemos usar la función descr(). Por ejemplo, si queremos ver los principales estadísticos de la variable edad de la primera relación sexual (variable edad1sex) escribiríamos

descr(multicentric$edad1sex)
Descriptive Statistics  
multicentric$edad1sex  
N: 2910  

                    edad1sex
----------------- ----------
             Mean      19.73
          Std.Dev       4.73
              Min       5.00
               Q1      16.00
           Median      19.00
               Q3      22.00
              Max      52.00
              MAD       4.45
              IQR       6.00
               CV       0.24
         Skewness       1.10
      SE.Skewness       0.05
         Kurtosis       2.44
          N.Valid    2889.00
        Pct.Valid      99.28

Una de las principales ventajas de R es que usa un lenguaje de programación orientado a objetos. En palabras sencillas, esto implica que una misma función se puede aplicar a distintos tipos de objetos y la función ya sabe qué hacer. En este caso, si aplicamos la función desrc() a toda nuestra base de datos, lo que hace es buscar todas las variables continuas, y resumirlas.

descr(multicentric)
Descriptive Statistics  
multicentric  
N: 2910  

                     durco      edad   edad1pap   edad1sex   edad1sex2   edad1sex3   edademba
----------------- -------- --------- ---------- ---------- ----------- ----------- ----------
             Mean     6.40     48.86      39.91      19.73        1.73        0.52      21.32
          Std.Dev     6.16     11.92      13.66       4.73        4.73        0.50       4.80
              Min     1.00     20.00      14.00       5.00      -13.00        0.00      10.00
               Q1     1.00     40.00      29.00      16.00       -2.00        0.00      18.00
           Median     4.00     49.00      38.00      19.00        1.00        1.00      20.00
               Q3     9.00     58.00      50.00      22.00        4.00        1.00      24.00
              Max    34.00     84.00      80.00      52.00       34.00        1.00      52.00
              MAD     4.45     13.34      14.83       4.45        4.45        0.00       4.45
              IQR     8.00     18.00      21.00       6.00        6.00        1.00       6.00
               CV     0.96      0.24       0.34       0.24        2.74        0.96       0.23
         Skewness     1.53      0.12       0.46       1.10        1.10       -0.09       1.02
      SE.Skewness     0.08      0.05       0.06       0.05        0.05        0.05       0.05
         Kurtosis     2.43     -0.66      -0.58       2.44        2.44       -1.99       1.50
          N.Valid   923.00   2910.00    1519.00    2889.00     2889.00     2889.00    2795.00
        Pct.Valid    31.72    100.00      52.20      99.28       99.28       99.28      96.05

Table: Table continues below

 

                    edfinco   edinico      ident   nembara   regcompa
----------------- --------- --------- ---------- --------- ----------
             Mean     33.72     26.75   11550.22      5.55       1.34
          Std.Dev      7.76      6.64     993.30      3.24       0.67
              Min     15.00     11.00   10001.00      1.00       1.00
               Q1     28.00     22.00   10728.00      3.00       1.00
           Median     33.00     26.00   11455.50      5.00       1.00
               Q3     39.00     31.00   12183.00      7.00       2.00
              Max     62.00     48.00   13701.00     25.00       6.00
              MAD      7.41      7.41    1078.59      2.97       0.00
              IQR     11.00      9.00    1454.50      4.00       1.00
               CV      0.23      0.25       0.09      0.58       0.50
         Skewness      0.32      0.50       0.42      0.99       2.42
      SE.Skewness      0.08      0.08       0.05      0.05       0.05
         Kurtosis     -0.16     -0.16      -0.72      1.21       7.44
          N.Valid    923.00    931.00    2910.00   2795.00    2886.00
        Pct.Valid     31.72     31.99     100.00     96.05      99.18

Si queremos tener esta descriptiva según una segunda variable categórica como es habitual en la mayoría de análisis estadísticos (por ejemplo entre grupos de comparación o para casos y controles) podemos hacerlo también. Supongamos que queremos tener una descriptiva de las variables categóricas según la variable caso-control (status). Para ello, deberíamos usar la función stby() e indicar en el argumento INDICES nuestra variable por la que queremos separar los análisis.

stby(multicentric, INDICES = multicentric$status,
     FUN = descr, stats = "common", transpose = TRUE)
Descriptive Statistics  
multicentric  
Group: status = Caso  
N: 1489  

                      Mean   Std.Dev        Min     Median        Max   N.Valid   Pct.Valid
--------------- ---------- --------- ---------- ---------- ---------- --------- -----------
          durco       7.14      6.25       1.00       5.00      31.00    490.00       32.91
           edad      49.53     11.85      20.00      49.00      84.00   1489.00      100.00
       edad1pap      42.95     14.56      14.00      42.00      80.00    825.00       55.41
       edad1sex      18.72      4.34       6.00      18.00      52.00   1486.00       99.80
      edad1sex2       0.72      4.34     -12.00       0.00      34.00   1486.00       99.80
      edad1sex3       0.42      0.49       0.00       0.00       1.00   1486.00       99.80
       edademba      20.36      4.41      10.00      20.00      52.00   1453.00       97.58
        edfinco      33.99      7.78      16.00      34.00      58.00    490.00       32.91
        edinico      26.12      6.66      13.00      25.00      48.00    492.00       33.04
          ident   11581.04    966.97   10002.00   11505.00   13581.00   1489.00      100.00
        nembara       5.95      3.26       1.00       5.00      25.00   1453.00       97.58
       regcompa       1.45      0.75       1.00       1.00       6.00   1484.00       99.66

Group: status = Control  
N: 1421  

                      Mean   Std.Dev        Min     Median        Max   N.Valid   Pct.Valid
--------------- ---------- --------- ---------- ---------- ---------- --------- -----------
          durco       5.57      5.96       1.00       3.00      34.00    433.00       30.47
           edad      48.16     11.97      20.00      48.00      82.00   1421.00      100.00
       edad1pap      36.29     11.52      16.00      35.00      75.00    694.00       48.84
       edad1sex      20.80      4.89       5.00      20.00      46.00   1403.00       98.73
      edad1sex2       2.80      4.89     -13.00       2.00      28.00   1403.00       98.73
      edad1sex3       0.63      0.48       0.00       1.00       1.00   1403.00       98.73
       edademba      22.36      4.99      13.00      22.00      41.00   1342.00       94.44
        edfinco      33.41      7.74      15.00      33.00      62.00    433.00       30.47
        edinico      27.46      6.56      11.00      27.00      47.00    439.00       30.89
          ident   11517.93   1019.50   10001.00   11404.00   13701.00   1421.00      100.00
        nembara       5.12      3.15       1.00       4.00      20.00   1342.00       94.44
       regcompa       1.23      0.55       1.00       1.00       5.00   1402.00       98.66

El argumento stats="common" lo ponemos para que saque menos estadísticos (sólo los más comunes), pero si no ponemos nada los saca todos y el argumento transpose = TRUE sirve para trasnponer la tabla de resultados.

NOTA: cuando hablemos de informes reproducibles y de Rmarkdown veremos que estas tablas quedarán mucho mejor cuando mostremos nuestros resultados con HTML o incluso PDFs o documentos Word … pero eso será al final del curso.

Podríamos pensar que este tipo de descriptivas también las obtenemos con SPSS o Stata, pero …. tenemos más opciones que nos facilitan mucho la vida como estadísticos. En este caso, podemos resumir toda nuestra base de datos (tanto variables continuas como categóricas) con la función dfSummary() y obtendríamos este output

dfSummary(multicentric)

Data Frame Summary

multicentric

Dimensions: 2910 x 26
Duplicates: 0
No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
1 ident [integer] Mean (sd) : 11550.2 (993.3) min < med < max: 10001 < 11455.5 < 13701 IQR (CV) : 1454.5 (0.1) 2910 distinct values 2910 (100.0%) 0 (0.0%)
2 pais [character] 1. Brasil 2. Colombia 3. Espana 4. Filipinas 5. Marruecos 6. Peru 7. Tailandia
347(11.9%)
323(11.1%)
376(12.9%)
636(21.9%)
332(11.4%)
312(10.7%)
584(20.1%)
2910 (100.0%) 0 (0.0%)
3 status [character] 1. Caso 2. Control
1489(51.2%)
1421(48.8%)
2910 (100.0%) 0 (0.0%)
4 edad [integer] Mean (sd) : 48.9 (11.9) min < med < max: 20 < 49 < 84 IQR (CV) : 18 (0.2) 62 distinct values 2910 (100.0%) 0 (0.0%)
5 niveledu [character] 1. ninguno 2. primaria 3. secundaria 4. ticnico 5. universitario
681(23.4%)
1446(49.7%)
673(23.1%)
62(2.1%)
48(1.6%)
2910 (100.0%) 0 (0.0%)
6 fumar [character] 1. ex-fumador 2. fumador 3. no fumador
223(7.7%)
292(10.0%)
2395(82.3%)
2910 (100.0%) 0 (0.0%)
7 edad1sex [integer] Mean (sd) : 19.7 (4.7) min < med < max: 5 < 19 < 52 IQR (CV) : 6 (0.2) 40 distinct values 2889 (99.3%) 21 (0.7%)
8 regcompa [integer] Mean (sd) : 1.3 (0.7) min < med < max: 1 < 1 < 6 IQR (CV) : 1 (0.5)
1:2147(74.4%)
2:553(19.2%)
3:142(4.9%)
4:32(1.1%)
5:8(0.3%)
6:4(0.1%)
2886 (99.2%) 24 (0.8%)
9 totcompa [character] 1. >=100 2. 1 3. 11-20 4. 2-3 5. 21-50 6. 4-10 7. 51-99
7(0.2%)
1947(68.5%)
9(0.3%)
749(26.4%)
7(0.2%)
122(4.3%)
1(0.0%)
2842 (97.7%) 68 (2.3%)
10 ets [character] 1. no 2. si
1763(64.6%)
964(35.4%)
2727 (93.7%) 183 (6.3%)
11 co [character] 1. no 2. si
1977(67.9%)
933(32.1%)
2910 (100.0%) 0 (0.0%)
12 edinico [integer] Mean (sd) : 26.8 (6.6) min < med < max: 11 < 26 < 48 IQR (CV) : 9 (0.2) 37 distinct values 931 (32.0%) 1979 (68.0%)
13 edfinco [integer] Mean (sd) : 33.7 (7.8) min < med < max: 15 < 33 < 62 IQR (CV) : 11 (0.2) 45 distinct values 923 (31.7%) 1987 (68.3%)
14 durco [integer] Mean (sd) : 6.4 (6.2) min < med < max: 1 < 4 < 34 IQR (CV) : 8 (1) 33 distinct values 923 (31.7%) 1987 (68.3%)
15 condon [character] 1. no 2. si
2540(87.3%)
370(12.7%)
2910 (100.0%) 0 (0.0%)
16 embara [character] 1. no 2. si
109(3.7%)
2801(96.3%)
2910 (100.0%) 0 (0.0%)
17 edademba [integer] Mean (sd) : 21.3 (4.8) min < med < max: 10 < 20 < 52 IQR (CV) : 6 (0.2) 34 distinct values 2795 (96.0%) 115 (4.0%)
18 nembara [integer] Mean (sd) : 5.6 (3.2) min < med < max: 1 < 5 < 25 IQR (CV) : 4 (0.6) 21 distinct values 2795 (96.0%) 115 (4.0%)
19 pap [character] 1. no 2. si
1291(45.0%)
1575(55.0%)
2866 (98.5%) 44 (1.5%)
20 edad1pap [integer] Mean (sd) : 39.9 (13.7) min < med < max: 14 < 38 < 80 IQR (CV) : 21 (0.3) 65 distinct values 1519 (52.2%) 1391 (47.8%)
21 vph [character] 1. negativo 2. positivo
1077(44.2%)
1358(55.8%)
2435 (83.7%) 475 (16.3%)
22 edad1sex2 [numeric] Mean (sd) : 1.7 (4.7) min < med < max: -13 < 1 < 34 IQR (CV) : 6 (2.7) 40 distinct values 2889 (99.3%) 21 (0.7%)
23 edad1sex3 [numeric] Min : 0 Mean : 0.5 Max : 1
0:1379(47.7%)
1:1510(52.3%)
2889 (99.3%) 21 (0.7%)
24 edad1sex4 [factor] 1. (5,16] 2. (16,19] 3. (19,22] 4. (22,52]
736(25.5%)
872(30.2%)
596(20.6%)
684(23.7%)
2888 (99.2%) 22 (0.8%)
25 edad1sex5 [factor] 1. <14 2. 15-18 3. 19+
257(8.9%)
1122(38.8%)
1510(52.3%)
2889 (99.3%) 21 (0.7%)
26 fumarNewCat [character] 1. No 2. Si
2618(90.0%)
292(10.0%)
2910 (100.0%) 0 (0.0%)

Generated by summarytools 0.9.8 (R version 4.0.2)
2021-03-15