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