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")

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)
# multicentric <- read.delim("datos/multicentric.txt")
multicentric <- read.delim(url("https://raw.githubusercontent.com/Crisben/uleam-stat24/main/datos/multicentric.txt"))

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)
## Variable(s) ignored: ident, edad, edad1sex, edinico, edfinco, durco, edademba, edad1pap
## 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
## 
## multicentric$regcompa  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##           1   2147    74.39    74.39
##           2    553    19.16    93.56
##           3    142     4.92    98.48
##           4     32     1.11    99.58
##           5      8     0.28    99.86
##           6      4     0.14   100.00
##       Total   2886   100.00   100.00
## 
## multicentric$totcompa  
## 
##               Freq         %    % Cum.
## ----------- ------ --------- ---------
##       >=100      7     0.246     0.246
##           1   1947    68.508    68.754
##       11-20      9     0.317    69.071
##         2-3    749    26.355    95.426
##       21-50      7     0.246    95.672
##        4-10    122     4.293    99.965
##       51-99      1     0.035   100.000
##       Total   2842   100.000   100.000
## 
## multicentric$ets  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##          no   1763    64.65    64.65
##          si    964    35.35   100.00
##       Total   2727   100.00   100.00
## 
## multicentric$co  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##          no   1977    67.94    67.94
##          si    933    32.06   100.00
##       Total   2910   100.00   100.00
## 
## multicentric$condon  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##          no   2540    87.29    87.29
##          si    370    12.71   100.00
##       Total   2910   100.00   100.00
## 
## multicentric$embara  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##          no    109     3.75     3.75
##          si   2801    96.25   100.00
##       Total   2910   100.00   100.00
## 
## multicentric$nembara  
## 
##               Freq         %    % Cum.
## ----------- ------ --------- ---------
##           1    155     5.546     5.546
##           2    322    11.521    17.066
##           3    383    13.703    30.769
##           4    373    13.345    44.114
##           5    338    12.093    56.208
##           6    299    10.698    66.905
##           7    257     9.195    76.100
##           8    195     6.977    83.077
##           9    138     4.937    88.014
##          10    105     3.757    91.771
##          11     71     2.540    94.311
##          12     63     2.254    96.565
##          13     32     1.145    97.710
##          14     23     0.823    98.533
##          15     21     0.751    99.284
##          16      8     0.286    99.571
##          17      6     0.215    99.785
##          18      3     0.107    99.893
##          20      1     0.036    99.928
##          22      1     0.036    99.964
##          25      1     0.036   100.000
##       Total   2795   100.000   100.000
## 
## multicentric$pap  
## 
##               Freq        %   % Cum.
## ----------- ------ -------- --------
##          no   1291    45.05    45.05
##          si   1575    54.95   100.00
##       Total   2866   100.00   100.00
## 
## multicentric$vph  
## 
##                  Freq        %   % Cum.
## -------------- ------ -------- --------
##       negativo   1077    44.23    44.23
##       positivo   1358    55.77   100.00
##          Total   2435   100.00   100.00

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%)
## --------- ----- -------------- -------------- ---------------

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)
## Non-numerical variable(s) ignored: pais, status, niveledu, fumar, totcompa, ets, co, condon, embara, pap, vph
## Descriptive Statistics  
## multicentric  
## N: 2910  
## 
##                      durco      edad   edad1pap   edad1sex   edademba   edfinco   edinico      ident
## ----------------- -------- --------- ---------- ---------- ---------- --------- --------- ----------
##              Mean     6.40     48.86      39.91      19.73      21.32     33.72     26.75   11550.22
##           Std.Dev     6.16     11.92      13.66       4.73       4.80      7.76      6.64     993.30
##               Min     1.00     20.00      14.00       5.00      10.00     15.00     11.00   10001.00
##                Q1     1.00     40.00      29.00      16.00      18.00     28.00     22.00   10728.00
##            Median     4.00     49.00      38.00      19.00      20.00     33.00     26.00   11455.50
##                Q3     9.00     58.00      50.00      22.00      24.00     39.00     31.00   12183.00
##               Max    34.00     84.00      80.00      52.00      52.00     62.00     48.00   13701.00
##               MAD     4.45     13.34      14.83       4.45       4.45      7.41      7.41    1078.59
##               IQR     8.00     18.00      21.00       6.00       6.00     11.00      9.00    1454.50
##                CV     0.96      0.24       0.34       0.24       0.23      0.23      0.25       0.09
##          Skewness     1.53      0.12       0.46       1.10       1.02      0.32      0.50       0.42
##       SE.Skewness     0.08      0.05       0.06       0.05       0.05      0.08      0.08       0.05
##          Kurtosis     2.43     -0.66      -0.58       2.44       1.50     -0.16     -0.16      -0.72
##           N.Valid   923.00   2910.00    1519.00    2889.00    2795.00    923.00    931.00    2910.00
##         Pct.Valid    31.72    100.00      52.20      99.28      96.05     31.72     31.99     100.00
## 
## Table: Table continues below
## 
##  
## 
##                     nembara   regcompa
## ----------------- --------- ----------
##              Mean      5.55       1.34
##           Std.Dev      3.24       0.67
##               Min      1.00       1.00
##                Q1      3.00       1.00
##            Median      5.00       1.00
##                Q3      7.00       2.00
##               Max     25.00       6.00
##               MAD      2.97       0.00
##               IQR      4.00       1.00
##                CV      0.58       0.50
##          Skewness      0.99       2.42
##       SE.Skewness      0.05       0.05
##          Kurtosis      1.21       7.44
##           N.Valid   2795.00    2886.00
##         Pct.Valid     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)
## Non-numerical variable(s) ignored: pais, status, niveledu, fumar, totcompa, ets, co, condon, embara, pap, vph
## 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
##       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
##       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 21
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%)

Generated by summarytools 1.0.1 (R version 4.3.3)
2024-05-04