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)