Estadística con R

author: Javier Ballesteros, UPV/EHU date: Agosto - Septiembre 2015

Objetivos generales del curso

Requisitos para optimizar un curso de bioestadística

¿Qué es lo que no va a desarrollar este curso?

Estadística con R: contenidos

¿Para qué sirven los conocimientos de bioestadística? Bradford Hill: Principles of Medical Statistics, 1937

Statistics are curious things…(They) tend to induce a strong emotional reaction in non-mathematical minds…It is exasperating, when we have studied a problem by methods that we have spent laborious years in mastering, to find our conclusions questioned, and perhaps refuted…There seems to be to me only one way of escape. The worker in medical problems, in the field of clinical as well as preventive medicine, must himself know something of statistical technique, both in experimental arrangements and in the interpretation of figures

Algunas ideas sobre la (bio)estadística

El proceso de investigación

  1. Dominio teórico
  2. Hipótesis
  3. Operacionalización / medición de conceptos
  4. Selección de sujetos
  5. Diseño del estudio (observacional / experimental)
  6. Recogida de datos
  7. Análisis de resultados (univariados / bivariados / multivariados)
  8. Presentación y diseminación de resultados

Tipos de datos / variables en cuanto a su medida

Tipos de datos / variables en cuanto a su papel en el diseño

Estadística descriptiva: funciones generales

En toda la presentación se asume que las variables a analizar son vectores, o están incluidas en una base de datos rectangular (individuos por variables)

Estadística descriptiva: nombres y clases de las variables

data(iris)
names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
[5] "Species"     
class(iris$Species); class(iris$Sepal.Length) # estructura "datos$variable"
[1] "factor"
[1] "numeric"

Estadística descriptiva: visualización de los primeros registros

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Estadística descriptiva: visualización de los últimos registros

tail(iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica

Estadística descriptiva: resumen de los estadísticos para cada variable

summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
       Species  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                

Estadística descriptiva: identificación de observaciones

data(mtcars)
which(mtcars$mpg > median(mtcars$mpg)) # identificación de valores extremos
 [1]  1  2  3  4  8  9 18 19 20 21 26 27 28 30 32

Visualización gráfica de los datos

Objetivos:

Gráficos descriptivos: variables continuas

“Las reglas más importantes en estadística son utilizar el sentido común, y visualizar gráficamente los datos y asociaciones de interés”

Gráficos para variables continuas: función stem()

stem(mtcars$mpg) # distribución valores observados

  The decimal point is at the |

  10 | 44
  12 | 3
  14 | 3702258
  16 | 438
  18 | 17227
  20 | 00445
  22 | 88
  24 | 4
  26 | 03
  28 | 
  30 | 44
  32 | 49

Gráficos para variables continuas: función hist()

hist(mtcars$mpg) # forma de la distribución, tendencia central, y variabilidad

plot of chunk unnamed-chunk-7

Gráficos para variables continuas: función boxplot()

boxplot(mtcars$mpg) # mediana, IQR, máximos-mínimos según IQR, y observaciones extremas

plot of chunk unnamed-chunk-8

Gráficos para variables continuas: funciones qqnorm() y qqline()

qqnorm(mtcars$mpg); qqline(mtcars$mpg) # ajuste a distribución normal

plot of chunk unnamed-chunk-9

Descripción de variables continuas

Descripción de variables continuas: funciones summary(), y fivenum()

summary(mtcars$mpg)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.40   15.42   19.20   20.09   22.80   33.90 
fivenum(mtcars$mpg)
[1] 10.40 15.35 19.20 22.80 33.90

Descripción de variables continuas: funciones mean(), y median()

mean(mtcars$mpg)
[1] 20.09062
median(mtcars$mpg)
[1] 19.2

Características de la media y la mediana

Ambas son medidas de la tendencia central de la distribución de una variable cuantitativa. La media se afecta por valores extremos, no así la mediana

\[\large{\bar {X} = \frac {\sum_{i=1}^n {x_i}}{n}}\]

Mientras que la \(\bar x\), está afectada por valores extremos de \(x_i\), la mediana al ser el punto medio de los valores ordenados por rangos no se afecta

Descripción de variables continuas: funciones sd(), y var()

var(mtcars$mpg); sd(mtcars$mpg)
[1] 36.3241
[1] 6.026948

\[\large{S^2 = \frac{\sum_{i=1}^n (x_i - \bar{X})^2}{n-1}}\]

\[\large{S = \sqrt{S^2}}\]

Características de la desviación estándar

La \(S^2\) presenta unidades al cuadrado lo que no es fácilmente interpretable. la \(S\) está en las mismas unidades que la \(\bar {X}\) lo que facilita su interpretación

La \(S\) al igual que la \(\bar {X}\) se afecta por valores extremos. Debido a la elevación al cuadrado de las distancias entre cada observación y la media de la distribución, los valores más alejados de la media contribuyen más a la desviación estándar que los valores cercanos a la media

Descripción de variables continuas: funciones mad() e IQR()

mad(mtcars$mpg)
[1] 5.41149
IQR(mtcars$mpg)
[1] 7.375

Características de los estadísticos de dispersión de datos basados en percentiles

Se basan en el ordenamiento de datos (de menor a mayor) y al igual que la mediana (percentil 50) no se afectan por valores extremos

El rango intercuartil (IQR) recoge los valores del primer al tercer cuartil de la distribución, el 50% de los datos (el box del gráfico boxplot), y no está afectado por valores extremos o outliers

Distribución normal en variables numéricas

Si una variable continua sigue una distribución normal, el 68% de los datos estarán comprendidos entre la media y 1 DE, el 95% entre la media y 2 DE, y el 99.7% entre la media y 3 DE

Un valor que presente más de 3 DE con respecto a la media puede ser un valor aberrante

Gráficos para variables categóricas: función genérica plot()

group <- rep(1:2, each=10)
groupf <- factor(group)
plot(groupf)

plot of chunk unnamed-chunk-14

Gráficos para variables categóricas: funciones table() y barplot()

table(groupf) # frecuencia de observaciones por grupo
groupf
 1  2 
10 10 

Gráficos para variables categóricas: funciones table() y barplot()

barplot(table(groupf))

plot of chunk unnamed-chunk-16

Inferencia estadística

Inducción desde los valores de la muestra a los parámetros de la población. Tiene 2 posibles objetivos:

Símbolos a utilizar

Desde la muestra a la población: SD a SE

El \(SE\) depende del estadístico, y disminuye al aumentar el tamaño muestral, y aumenta cuando se incrementa la variabilidad

Desde la muestra a la población: SD a SE

El \(SE\) depende del estadístico, y disminuye al aumentar el tamaño muestral, y aumenta cuando se incrementa la variabilidad

Distribuciones de estadísticos ~ teorema central del límite

Distribución normal

\[\large{f(x; \mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}}{e^{-{\frac{(x -\mu)^2}{2\sigma^2}}}}}\]

La distribución de los valores observados \(x\), depende sólo de la media de su distribución teórica \(\mu\), y de su desviación estándar \(\sigma\)

La ecuación contiene 3 clásicos números irracionales:

Tests de hipótesis

El p-valor informa sobre la probabilidad de que el efecto observado (u otro más extremo) pudiera haber aparecido por azar si la hipótesis nula fuera cierta

\(\large{p = \Pr{(datos|H_0)}}\)

Pasos en un test de hipótesis

Intervalos de confianza (IC)

IC asumiendo una distribución normal

Intervalos de confianza (IC) proporcionan:

Corespondencia entre p-valores e IC

\[P_{valor} = Z = \frac{Efecto - H_0}{SE}\]

\[IC_{1-\alpha{2}} = Efecto \mp{Z_{\alpha{2}}} \times({SE})\]

Factores que afectan la significación estadística de un contraste de hipótesis

\[Significance \propto{\frac{Effect \times{Sample}}{Variability}}\]

Comparar los tamaños del efecto, no los p-valores

¿Qué es un valor estadísticamente significativo?

Tome 3 DE como definitivamente significativo

¿De donde procede que p < 0.05 sea estadísticamente significativo?

RA Fisher en su libro Statistical methods for research workers, con una primera edición en 1925, en el capítulo V titulado Tests of significance of means, differences of means, and regression coefficients, dice:

If the difference is many times greater than the standard error, it is certainly significant, and it is a convenient convention to take twice the standard error as the limit of significance; this is roughly equivalent to the corresponding limit \(\small{P = .05}\), already used for the \(\small{\chi^2}\) distribution

Más Fisher y p-valores

RA Fisher (1925): SMRW, sobre la tabla de la distribución \(\small{\chi^2}\):

In preparing this table we have borne in mind that in practice we do not want to know the exact value of \(\small{P}\) for any observed \(\small{\chi^2}\), but in the first place, whether or not the observed value is open to suspicion. If \(\small{P}\) is between 0.1 and 0.9 there is certainly no reason to suspect the hypothesis tested. If it is below 0.02 it is strongly indicated that the hypothesis fails to account for the whole of the facts. We shall not often be astray if we draw a conventional line at 0.05 and consider that higher values of \(\small{\chi^2}\) indicate a real discrepancy

Más Fisher y p-valores

RA Fisher (1929). The statistical method in psychical research. Proceedings of the Society for Psychical Research, xxxix:189-92

In the investigation of living beings by biological methods, statistical tests of significance are essential. Their function is to prevent us being deceived by accidental occurrences…It is a common practice to judge a result significant, if it is of such magnitude that it would have been produced by chance not more frequently than once in twenty trials

Interpretación usual de p-valores

Cuanto más pequeño sea el p-valor menos probable es que el valor observado en el experimento sea generado por la distribución de la hipótesis nula. Es un indicador de la sorpresa del resultado versus \(H_0\)

En base a su valor se rechaza o no se rechaza \(H_0\) en favor de \(H_1\)

Problemas con los p-valores: falacias en su interpretación

  1. Falacia de la probabilidad inversa
  1. Falacia del tamaño del efecto
  1. Falacia de la significación clínica o práctica

Problemas con los p-valores: significación vs relevancia

Significación versus relevancia del hallazgo

Significación estadística versus significación clínica

plot of chunk unnamed-chunk-17

En resumen

\[SMD=\frac{\widehat x_1 - \widehat x_2}{SD_{pooled}}\]

2 escuelas de pensamiento

\[\large{P(datos|H_0)}\]

\[\large{P(H_0|datos)}\]

Falacia de la simetría condicional en la interpretación de los p-valores

Por supuesto no es cierto que:

\[\large{P(datos|H_0) \ne P(H_0|datos)}\]

Lo que es curioso ya que bastantes veces se interpreta el p-valor bajo un punto de vista bayesiano en vex de frecuentista (falacia de la probabilidad inversa)

Estadística clásica: asociación entre variables

Preliminares: ¿son mis datos “normales”?

Algunos de los tests estadísticos que vamos a ver en este curso asumen distribuciones normales, y esto es especialmente importante en el caso de muestras pequeñas.

No todos los datos continuos se distribuyen normalmente!

Evaluación de la distribución

Asunciones de los modelos lineales

Comparación de medias y varianzas - 2 grupos

Comparación de medias de datos emparejados (antes - después): datos

?sleep # mejora en horas de sueño tras tratamiento
pre <- c(0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0)
post <- c(1.9, 0.8, 1.1, 0.1, -0.1, 4.4, 5.5, 1.6, 4.6, 3.4)

Comparación de medias de datos emparejados (antes - después): t-test

t.test(pre, post, paired = TRUE)

    Paired t-test

data:  pre and post
t = -4.0621, df = 9, p-value = 0.002833
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -2.4598858 -0.7001142
sample estimates:
mean of the differences 
                  -1.58 

Comparación de medias de datos emparejados (antes - después): wilcoxon

wilcox.test(pre, post, paired = TRUE)

    Wilcoxon signed rank test with continuity correction

data:  pre and post
V = 0, p-value = 0.009091
alternative hypothesis: true location shift is not equal to 0

Comparación de medias de datos emparejados (antes - después): diferencia frente a 0

Se podría haber analizado de otra forma que reduce el problema a contrastar la diferencia frente a un valor teórico

diff <- pre - post
hist(diff)

plot of chunk unnamed-chunk-21

Comparación de medias de datos emparejados (antes - después): t-test

t.test(diff, mu = 0)

    One Sample t-test

data:  diff
t = -4.0621, df = 9, p-value = 0.002833
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -2.4598858 -0.7001142
sample estimates:
mean of x 
    -1.58 

Comparación de medias de datos emparejados (antes - después): wilcoxon

wilcox.test(diff, mu = 0)

    Wilcoxon signed rank test with continuity correction

data:  diff
V = 0, p-value = 0.009091
alternative hypothesis: true location is not equal to 0

Comparación de medias entre 2 grupos independientes: datos

data(sleep)
boxplot(extra ~ factor(group), data = sleep)

plot of chunk unnamed-chunk-24

Comparación de medias entre 2 grupos independientes: igualdad de varianzas

bartlett.test(extra ~ factor(group), data = sleep) # igualdad de varianzas

    Bartlett test of homogeneity of variances

data:  extra by factor(group)
Bartlett's K-squared = 0.10789, df = 1, p-value = 0.7426

Comparación de medias entre 2 grupos independientes: t-test asumiendo varianzas iguales

t.test(extra ~ factor(group), data = sleep, var.equal = TRUE)

    Two Sample t-test

data:  extra by factor(group)
t = -1.8608, df = 18, p-value = 0.07919
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.363874  0.203874
sample estimates:
mean in group 1 mean in group 2 
           0.75            2.33 

Comparación de medias entre 2 grupos independientes: t-test sin asumir igualdad de varianzas

t.test(extra ~ factor(group), data = sleep)

    Welch Two Sample t-test

data:  extra by factor(group)
t = -1.8608, df = 17.776, p-value = 0.07939
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.3654832  0.2054832
sample estimates:
mean in group 1 mean in group 2 
           0.75            2.33 

Comparación de medias entre 2 grupos independientes: wilcoxon

wilcox.test(extra ~ factor(group), data = sleep)

    Wilcoxon rank sum test with continuity correction

data:  extra by factor(group)
W = 25.5, p-value = 0.06933
alternative hypothesis: true location shift is not equal to 0

Fórmulas t-test

\[\large{t_{n-1 gl} = \frac{\bar{D} - \mu_D}{S_{\bar{D}}}} \]

\[\large{t_{n_1 + n_2 -1 gl} = \frac{(\bar{X_1} - \bar{X_2}) - (\mu_1 - \mu_2)}{S_{(\bar{X_1}- \bar{X_2})}}} \]

Diferencia de medias entre más de 2 grupos: ANOVA

ANOVA

\[\large{F_{n, m} \sim \frac{\sigma^2_{between}}{\sigma^2_{witin}}}\]

ANOVA: datos

# Índice de pulsatilidad en la arteria cerebral media según exposición a cannabis
grupo <- c("control", "control", "control", "control", "control", "control", "activo", "activo", "activo", "activo", "activo", "activo", "ex", "ex", "ex", "ex", "ex", "ex")
index <- c(.9, .9, .9, .8, .8, NA, 1, 1, 1, 1, .9, NA, 1, 1, 1, 1, .9, .9)
pulsatilidad <- data.frame(grupo, index)
pulsatilidad
     grupo index
1  control   0.9
2  control   0.9
3  control   0.9
4  control   0.8
5  control   0.8
6  control    NA
7   activo   1.0
8   activo   1.0
9   activo   1.0
10  activo   1.0
11  activo   0.9
12  activo    NA
13      ex   1.0
14      ex   1.0
15      ex   1.0
16      ex   1.0
17      ex   0.9
18      ex   0.9

ANOVA: boxplot

boxplot(index ~ grupo, data = pulsatilidad)

plot of chunk unnamed-chunk-30

ANOVA: igualdad de varianzas

bartlett.test(index ~ grupo, data = pulsatilidad)

    Bartlett test of homogeneity of variances

data:  index by grupo
Bartlett's K-squared = 0.15376, df = 2, p-value = 0.926

ANOVA: omnibus test

oneway.test(index ~ grupo, data = pulsatilidad)

    One-way analysis of means (not assuming equal variances)

data:  index and grupo
F = 7.4891, num df = 2.0000, denom df = 8.4798, p-value = 0.01338

ANOVA: corrección para múltiples tests

pairwise.t.test(pulsatilidad$index, pulsatilidad$grupo)

    Pairwise comparisons using t tests with pooled SD 

data:  pulsatilidad$index and pulsatilidad$grupo 

        activo control
control 0.0073 -      
ex      0.6708 0.0082 

P value adjustment method: holm 

ANOVA: omnibus test con la función aov()

aov.res <- aov(index ~ grupo, data = pulsatilidad) # ANOVA clásico
summary(aov.res)
            Df  Sum Sq  Mean Sq F value  Pr(>F)   
grupo        2 0.04417 0.022083   8.613 0.00415 **
Residuals   13 0.03333 0.002564                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
2 observations deleted due to missingness

ANOVA: corrección para múltiples tests

TukeyHSD(aov.res)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = index ~ grupo, data = pulsatilidad)

$grupo
                      diff         lwr         upr     p adj
control-activo -0.12000000 -0.20456166 -0.03543834 0.0064223
ex-activo      -0.01333333 -0.09429496  0.06762830 0.9017863
ex-control      0.10666667  0.02570504  0.18762830 0.0105962

ANOVA: gráfico para múltiples tests

plot(TukeyHSD(aov.res))

plot of chunk unnamed-chunk-36

ANOVA: prueba no paramétrica

kruskal.test(index ~ grupo, data = pulsatilidad)

    Kruskal-Wallis rank sum test

data:  index by grupo
Kruskal-Wallis chi-squared = 8.3714, df = 2, p-value = 0.01521

ANOVA no paramétrico: corrección para múltiples tests

pairwise.wilcox.test(index, grupo, data = pulsatilidad)

    Pairwise comparisons using Wilcoxon rank sum test 

data:  index and grupo 

        activo control
control 0.057  -      
ex      0.724  0.057  

P value adjustment method: holm 

Correlación: una larga historia

Covarianza y correlación

\[cov_{x,y} = \frac{\sum_{i=1} ^n{(x_i - \bar{x})(y_i - \bar{y})}}{n-1}\]

\[Var_x = cov_{x,x} = \frac{\sum_{i=1} ^n{(x_i - \bar{x})(x_i - \bar{x})}}{n-1}\]

\[r = \frac{cov_{x,y}}{S_x * S_y}\]

La covarianza tiene unidades que pueden ser difíciles de interpretar, mientras que la correlación es una covarianza estandarizada, y por lo tanto sin unidades

Correlación

\[\large{\hat r = \frac{cov_{x,y}}{S_x * S_y} = \frac{\frac{\sum_{i=1} ^n (x_i - \bar x)(y_i - \bar y)}{n-1}}{\sqrt{\frac{\sum_{i=1} ^n (x_i - \bar x)^2}{n-1}}{\sqrt{\frac{\sum_{i=1} ^n (y_i - \bar y)^2}{n-1}}}}}\]

\(R^2 = \hat r ^2\) es una medida del ajuste del modelo, y refleja la proporción de variabilidad en la variable resultado que es explicada por la variable o variables explicativas

Correlación: funciones en R

La obtención de correlaciones paramétrica/no paramétrica depende de sus argumentos:

Propiedades del coeficiente de correlación

El coeficiente de correlación es un número adimensional que presenta un rango entre -1 y +1, e indica la fortaleza de la relación lineal entre 2 variables numéricas. Gráficos de dispersión para valorar esa relación lineal antes de estimar su magnitud mediante los coeficientes de correlación aopropiados:

Correlación lineal: Anscombe 1

?anscombe # base de datos histórica en **R**
data(anscombe)
cor.test(anscombe$x1, anscombe$y1)

    Pearson's product-moment correlation

data:  anscombe$x1 and anscombe$y1
t = 4.2415, df = 9, p-value = 0.00217
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4243912 0.9506933
sample estimates:
      cor 
0.8164205 

Correlación lineal: Anscombe 1

plot(anscombe$x1, anscombe$y1)
abline(lm(y1 ~ x1, data=anscombe))

plot of chunk unnamed-chunk-40

Correlación lineal: Anscombe 2

cor.test(anscombe$x2, anscombe$y2)

    Pearson's product-moment correlation

data:  anscombe$x2 and anscombe$y2
t = 4.2386, df = 9, p-value = 0.002179
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4239389 0.9506402
sample estimates:
      cor 
0.8162365 

Correlación lineal: Anscombe 2

plot(anscombe$x2, anscombe$y2)
abline(lm(y2 ~ x2, data=anscombe))

plot of chunk unnamed-chunk-42

Correlación lineal: Anscombe 3

cor.test(anscombe$x3, anscombe$y3)

    Pearson's product-moment correlation

data:  anscombe$x3 and anscombe$y3
t = 4.2394, df = 9, p-value = 0.002176
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4240623 0.9506547
sample estimates:
      cor 
0.8162867 

Correlación lineal: Anscombe 3

plot(anscombe$x3, anscombe$y3)
abline(lm(y3 ~ x3, data=anscombe))

plot of chunk unnamed-chunk-44

Correlación lineal: Anscombe 4

cor.test(anscombe$x4, anscombe$y4)

    Pearson's product-moment correlation

data:  anscombe$x4 and anscombe$y4
t = 4.243, df = 9, p-value = 0.002165
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4246394 0.9507224
sample estimates:
      cor 
0.8165214 

Correlación lineal: Anscombe 4

plot(anscombe$x4, anscombe$y4)
abline(lm(y4 ~ x4, data=anscombe))

plot of chunk unnamed-chunk-46

Correlación no implica causación: nidos de cigüeñas y nacimientos

births <- c(4, 20, 60, 30, 7, 6, 14, 20, 18) # número de nacimientos
nests <- c(2, 6, 8, 7, 0, 1, 2, 2, 3) # número de nidos
plot(nests, births) # ¿hay asociación?

plot of chunk unnamed-chunk-47

Correlación no implica causación: r de Pearson

cor.test(nests, births) # correlación de Pearson por defecto

    Pearson's product-moment correlation

data:  nests and births
t = 4.1991, df = 7, p-value = 0.00404
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4152802 0.9668960
sample estimates:
      cor 
0.8460611 

Correlación no implica causación: rho de Spearman

cor.test(nests, births, method = "spearman")

    Spearman's rank correlation rho

data:  nests and births
S = 20.928, p-value = 0.006122
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.8255992 

Correlación no implica causación: tau de Kendall

cor.test(nests, births, method = "kendall")

    Kendall's rank correlation tau

data:  nests and births
z = 2.5669, p-value = 0.01026
alternative hypothesis: true tau is not equal to 0
sample estimates:
      tau 
0.7061879 

Correlación no implica causación

Interpretación del coeficiente de correlación

\(r\): 0.50 - 0.70 - 0.90

\(r^2\): 0.25 - 0.49 - 0.81

\(1-r^2\): 0.75 - 0.51 - 0.19

Guía general valores absolutos correlación

Coeficiente de correlación

\[\large{r = \frac {\sum (x_i - \bar x)(y_i - \bar y)}{\sqrt{\sum(x_i - \bar x)^2 \sum(y_i - \bar y)^2}}}\]

\[\large{r = \frac {S_{xy}}{S_x S_y}}\]

Test de significación estadística de r

\[\large{t_{n-2} = \frac{r \sqrt{n-2}}{\sqrt{1-r^2}}}\]

Test de significación estadística de r e IC: transformación z de Fisher

\[\large{z = \frac{1}{2} [\ln{(1+r)} - \ln{(1-r)}]}\]

\[\large{\sigma_z = \frac{1}{\sqrt{n-3}}}\]

Regresión lineal

Un modelo de regresión implica la existencia de una variable dependiente o resultado \(y\), y otra variable independiente o explicativa \(x\), (o un conjunto de variables explicativas), en un modelo \(y \sim x\)

Un modelo de regresión no es más que un modelo de diferencia de medias. Los coeficientes de regresión se interpretan como (a) la diferencia de medias en la variable resultado cuando se incrementa en 1 punto el valor de la variable explicativa cuando esta es numérica, o (b) la media del grupo de referencia \(b_0\), o la diferencia de medias entre el grupo de referencia y el de contraste \(b_1\) cuando la variable explicativa es categórica

Ecuaciones de la regresión

\[\large{E(y_i|x_i) = \alpha + \beta x_i}\]

\(\alpha\) es el intercepto, el valor de \(y\), cuando \(x = 0\)

\(\beta\) es la pendiente que refleja el cambio en \(y\) por cada cambio de 1 unidad en \(x\)

\[\large{\hat y_i = \alpha + \beta x_i + \epsilon_i}\]

\(\hat y_i\) es el valor predicho para una observación en base al valor \(x_i\)

\(\epsilon_i\) es el error aleatorio (residual) que sigue una distribución normal

Estimación del intercepto y de la pendiente, y relación con la correlación

\[\large{\hat \beta = \frac{cov_{x,y}}{Var_x}}\]

\[\large{\hat \alpha = \bar y - \hat \beta \bar x}\]

La línea de regresión siempre cruza por el punto \((\bar x, \bar y)\)

\[\large{\hat r = \hat \beta \frac{SD_x}{SD_y}}\]

Regresión lineal y los tests para diferencia de medias

Dos tratamientos analgésicos y tiempo de latencia (segundos) en placa caliente

ind <- c(1:20)
arm <- rep(0:1, each = 10)
jump.time <- c(6.7, 3.8, 5.2, 4.2, 5.3, 3.2, 7.6, 7.4, 3.1, 4.2, 5.9, 6, 5.2, 6.8, 14.7, 15.5, 4.2, 14, 4.7, 4.7)
rats <- data.frame(ind, arm, jump.time)
head(rats)
  ind arm jump.time
1   1   0       6.7
2   2   0       3.8
3   3   0       5.2
4   4   0       4.2
5   5   0       5.3
6   6   0       3.2

Resultados según el t-test

t.test(jump.time ~ factor(arm), data = rats, var.equal = T)

    Two Sample t-test

data:  jump.time by factor(arm)
t = -2.0019, df = 18, p-value = 0.0606
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -6.3533931  0.1533931
sample estimates:
mean in group 0 mean in group 1 
           5.07            8.17 

Resultados según regresión lineal

print(lm(jump.time ~ factor(arm), data = rats))

Call:
lm(formula = jump.time ~ factor(arm), data = rats)

Coefficients:
 (Intercept)  factor(arm)1  
        5.07          3.10  

Pulsatilidad arteria cerebral y consumo cannabis (3 grupos)

ind <- c(1:18)
arm <- rep(0:2, each = 6) # 0:control, 1:ex-usuarios, 2:usuarios activos
pulse <- c(.9, .9, .9, .8, .8, NA, 1, 1, 1, 1, .9, .9, 1, 1, 1, 1, .9, NA)
drug <- data.frame(ind, arm, pulse)
head(drug)
  ind arm pulse
1   1   0   0.9
2   2   0   0.9
3   3   0   0.9
4   4   0   0.8
5   5   0   0.8
6   6   0    NA

Resultados según ANOVA

summary(aov(pulse ~ factor(arm), data = drug))
            Df  Sum Sq  Mean Sq F value  Pr(>F)   
factor(arm)  2 0.04417 0.022083   8.612 0.00415 **
Residuals   13 0.03333 0.002564                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
2 observations deleted due to missingness

Resultados según regresión lineal - ANOVA

anova(lm(pulse ~ factor(arm), data = drug))
Analysis of Variance Table

Response: pulse
            Df   Sum Sq   Mean Sq F value   Pr(>F)   
factor(arm)  2 0.044167 0.0220833  8.6125 0.004152 **
Residuals   13 0.033333 0.0025641                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Resultados según regresión lineal

print(lm(pulse ~ factor(arm), data = drug))

Call:
lm(formula = pulse ~ factor(arm), data = drug)

Coefficients:
 (Intercept)  factor(arm)1  factor(arm)2  
      0.8600        0.1067        0.1200  

Regresión y regresión a la media

Francis Galton: Law of universal regression

“Each peculiarity in a man is shared by his kinsman, but on the average in a less degree”

Un ejemplo de regresión ecológica sin falacia (Doll, 1955)

En Friedman, Pisani & Purves (1978). smoke es el número de cigarrillos per capita consumidos en 1930. lungcancer.deaths son las muertes por cáncer de pulmon (por 106) en 1950

pais <- c("Australia", "Canada", "Dinamarca", "Finlandia", "Inglaterra",
          "Holanda", "Islandia", "Noruega", "Suecia", "Suiza", "USA")
smoke <- c(480, 500, 380, 1100, 1100, 490, 230, 250, 300, 510, 1300)
lungcancer.deaths <- c(180, 150, 170, 350, 460, 240, 60, 90, 110, 250, 200)
Doll1955 <- data.frame(pais, smoke, lungcancer.deaths, stringsAsFactors = FALSE)

Regresión ecológica

Doll1955
         pais smoke lungcancer.deaths
1   Australia   480               180
2      Canada   500               150
3   Dinamarca   380               170
4   Finlandia  1100               350
5  Inglaterra  1100               460
6     Holanda   490               240
7    Islandia   230                60
8     Noruega   250                90
9      Suecia   300               110
10      Suiza   510               250
11        USA  1300               200

Regresión ecológica

fit <- lm(lungcancer.deaths ~ smoke, data = Doll1955)
plot(Doll1955$smoke, Doll1955$lungcancer.deaths)
abline(coef(fit))

plot of chunk unnamed-chunk-60

Análisis de frecuencias y proporciones: datos categóricos

Retención en tratamiento con heroína vs metadona: análisis de proporciones (binom.test)

binom.test(x=22, n=31, p=0.61) # 22/31 es el éxito en DAM; 0.61 es el exito en MET

    Exact binomial test

data:  22 and 31
number of successes = 22, number of trials = 31, p-value = 0.2761
alternative hypothesis: true probability of success is not equal to 0.61
95 percent confidence interval:
 0.5196393 0.8577715
sample estimates:
probability of success 
             0.7096774 

Retención en tratamiento con heroína vs metadona: análisis de proporciones (prop.test)

r <- c(22, 19); tot <- c(31, 31) # DAM/MET
prop.test(r, tot)

    2-sample test for equality of proportions with continuity
    correction

data:  r out of tot
X-squared = 0.28804, df = 1, p-value = 0.5915
alternative hypothesis: two.sided
95 percent confidence interval:
 -0.1698584  0.3634068
sample estimates:
   prop 1    prop 2 
0.7096774 0.6129032 

Retención en tratamiento con heroína vs metadona: tabulación de datos

heroin <- matrix(c(22, 19, 9, 12), nrow = 2, byrow = T)
colnames(heroin) <- c("DAM", "MET")
rownames(heroin) <- c("success", "failure")
heroin
        DAM MET
success  22  19
failure   9  12

Retención en tratamiento con heroína vs metadona: gráfico

barplot(heroin)

plot of chunk unnamed-chunk-64

Retención en tratamiento con heroína vs metadona: test Ji al cuadrado

chisq.test(heroin)

    Pearson's Chi-squared test with Yates' continuity correction

data:  heroin
X-squared = 0.28804, df = 1, p-value = 0.5915

Retención en tratamiento con heroína vs metadona: test exacto de Fisher

fisher.test(heroin)

    Fisher's Exact Test for Count Data

data:  heroin
p-value = 0.5921
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.4723836 5.1300383
sample estimates:
odds ratio 
  1.532994 

Retención en tratamiento con heroína vs metadona: RD

p1 <- 22/31; p0 <- 19/31
n1 <- 31; n0 <- 31
RD <- p1 - p0
SE.RD <- sqrt(((p1*(1-p1))/n1) + ((p0*(1-p0))/n0))
CI95.RD <- RD + c(-1, 1) * (1.96 * SE.RD)
RD; CI95.RD
[1] 0.09677419
[1] -0.1376046  0.3311530

Retención en tratamiento con heroína vs metadona: lnRR

p1 <- 22/31; p0 <- 19/31
lnRR <- log(p1 / p0)
SE.lnRR <- sqrt((1/22)-(1/31)+(1/19)-(1/31))
CI95.lnRR <- lnRR + c(-1, 1) * (1.96 * SE.lnRR)
lnRR; CI95.lnRR
[1] 0.1466035
[1] -0.212510  0.505717

Retención en tratamiento con heroína vs metadona: RR

RR <- exp(0.1466035)
RR95.low <- exp(-0.212510)
RR95.high <- exp(0.505717)
RR; RR95.low; RR95.high
[1] 1.157895
[1] 0.8085522
[1] 1.658174

Retención en tratamiento con heroína vs metadona: lnOR

odds1 <- 22/9; odds0 <- 19/12
lnOR <- log(odds1 / odds0)
SE.lnOR <- sqrt((1/22)+(1/9)+(1/19)+(1/12))
CI95.lnOR <- lnOR + c(-1, 1) * (1.96 * SE.lnOR)
lnOR; CI95.lnOR
[1] 0.4342855
[1] -0.6258019  1.4943730

Retención en tratamiento con heroína vs metadona: OR

OR <- exp(0.4342855)
OR95.low <- exp(-0.6258019)
OR95.high <- exp(1.4943730)
OR; OR95.low; OR95.high
[1] 1.54386
[1] 0.5348324
[1] 4.456541

Eficacia vacuna Salk contra la polio (Snedecor & Cochran, 1980)

paralisis <- c(33, 115) # casos de parálisis en vacuna / placebo respectivamente
N <- c(200745, 201229) # Número total de sujetos aleatorizados a vacuna / placebo
(risk.vacuna <- 33 / 200745 * 100000)
[1] 16.43877
(risk.placebo <- 115 / 201229 * 100000)
[1] 57.14882

Eficacia vacuna Salk contra la polio (Snedecor & Cochran, 1980)

(RD <- risk.placebo - risk.vacuna)
[1] 40.71005
(NNT <- ceiling(1/RD))
[1] 1

Eficacia vacuna Salk contra la polio (Snedecor & Cochran, 1980)

prop.test(paralisis, N)

    2-sample test for equality of proportions with continuity
    correction

data:  paralisis out of N
X-squared = 44.153, df = 1, p-value = 3.038e-11
alternative hypothesis: two.sided
95 percent confidence interval:
 -0.0005306031 -0.0002835980
sample estimates:
      prop 1       prop 2 
0.0001643877 0.0005714882 

Más allá del bien y del mal: de la regresión lineal simple a los modelos multivariados

Variables de confusión

Problemas de sobreajuste en modelos multivariados

Modelos lineales generales (GLMs)

El modelo de regresión lineal para una variable numérica de resultado, el modelo de regresión logística para una variable binaria/dicotómica de resultado, y el modelo de regresión de Poisson para contajes, no son más que aspectos específicos del modelo lineal general(GLM). En R se pueden ajustar con la función glm() que tiene el argumento family que describe la distribución del error y el argumento link que define la unión entre el resultado y la parte explicativa del modelo

Modelos y sintáxis general de GLM´s

Regresiones binomiales

Análisis de supervivencia

R tiene la librería survival para realizar análisis de supervivencia, con funciones para obtener estimaciones de Kaplan-Meier (survfit()), log-rank test (survdiff()), regresión de Cox (coxph()), y para modelos paramétricos de supervivencia con la función survreg()

Resumen: test de hipótesis en R

Resumen: test de hipótesis en R

Resumen: modelos lineales en R

Los modelos se estructuran en base a una fórmula, que es una descripción simbólica del modelo, y representa algebraicamente los efectos aditivos de acuerdo a los objetos que almacenan los datos:

Resumen modelos lineales en R

Funciones para el ajuste de modelos lineales, y para extraer información de ellos

Resumen modelos lineales en R

Funciones para el ajuste de modelos lineales, y para extraer información de ellos

Libreria lessR() y funciones estándar de R

La librería lessR() tiene como lema menos código, más resultados. Presenta funciones útiles para el análisis descriptivo y para tests estadísticos clásicos. Es recomendable tanto como herramienta de análisis como herrramienta de docencia

Como para cualquier package en CRAN, primero habría que descargarlo (install.packages(“lessR”)), y luego cargarlo en memoria (library(lessR)), para poder trabajar con él

t-test en la función estándar de R

data(sleep)
t.test(extra ~ factor(group), data = sleep, var.equal = TRUE)

    Two Sample t-test

data:  extra by factor(group)
t = -1.8608, df = 18, p-value = 0.07919
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.363874  0.203874
sample estimates:
mean in group 1 mean in group 2 
           0.75            2.33 

t-test en la función de la libreria lessR - versión breve

library(lessR)
ttest(extra ~ group, data=sleep, brief=TRUE)

------------------------------------------------------------
Compare extra across group levels 2 and 1 
------------------------------------------------------------

extra for group 2:  n.miss = 0,  n = 10,  mean = 2.33,  sd = 2.00
extra for group 1:  n.miss = 0,  n = 10,  mean = 0.75,  sd = 1.79

---
t-cutoff: tcut =  2.101 
Standard Error of Mean Difference: SE =  0.85 

Hypothesis Test of 0 Mean Diff:  t = 1.861,  df = 18,  p-value = 0.079

Margin of Error for 95% Confidence Level:  1.78
95% Confidence Interval for Mean Difference:  -0.20 to 3.36

Sample Mean Difference of extra:  1.58
Standardized Mean Difference of extra, Cohen's d:  0.83
95% Confidence Interval for smd:  -0.10 to 1.74
--------------------------------------------------

plot of chunk unnamed-chunk-76

Comparación entre los resultados del t-test en R y en la librería lessR

Comparación entre los resultados del t-test en R y en la librería lessR

La función ttest() de lessR, versión extendida, añade además (1) un análisis de las asunciones subyacentes (distribución normal de la variable resultado en cada grupo, igualdad de varianzas entre los grupos en comparación), (2) los resultados asumiendo - y sin asumir - igualdad de varianzas, y (3) un análisis de la importancia práctica de la diferencia de medias, y de la diferencia estandarizada de medias, en caso de que se hubieran establecido previamente

Relación entre las funciones de R y de la libreria lessR

Relación entre las funciones de R y de la librería lessR

Relación entre las funciones de R y de la librería lessR

Algunos consejos finales sobre el trabajo con R

A diferencia de otros programas, R tiene una curva de aprendizaje larga. Aprender R es utilizarlo, cometer errores y resolverlos, sea por uno mismo, o con el apoyo de la muy extensa comunidad de R. En mi experiencia, la mejor forma de aprender los rudimentos de un nuevo programa ha sido siempre el utilizarlo en un proyecto nuevo, y desarrollarlo enteramente con ese programa

Continuar con R

El objetivo de este curso ha sido introducir R como herramienta de análisis estadístico y como tal no ha desarrollado contenidos de estadística teórica (teorema central del límite, probabilidad y pruebas de hipótesis), ni contenidos aplicados de interés para estudiantes de ramas biomédicas (regresión logística, análisis de supervivencia…). Tampoco ha presentado los aspectos de programación y simulación que son uno de los principales recursos de R en el trabajo académico. Para quién quiera profundizar en esos aspectos, las referencias bibliográficas del curso son un buen camino a seguir…

Referencias

Referencias para usuarios de otros paquetes estadísticos

Anexo: ¿Cómo “pasar” de la estadística al preparar un manuscrito (Med Clin 1999; 113:138-49)

Anexo: ¿Como “pasar” de la estadística al preparar un manuscrito (Cont.)

Anexo: ¿Como “pasar” de la estadística al preparar un manuscrito (Cont.)

Anexo: Aspectos a tener en cuenta en los análisis de datos

Anexo: Relación entre pruebas paramétricas y no paramétricas

Anexo: Múltiples pruebas de hipótesis

Se realizan múltiples pruebas de hipótesis cuando:

Anexo: Múltiples pruebas de hipótesis

Anexo: Análisis secundarios no protocolizados

Enjoy the result you have found by exploratory data analysis, for you will not find it again

Stephen Senn

Anexo: Análisis de resultados para desenlaces cuantitativos

Anexo: Análisis de resultados para desenlaces dicotómicos (0/1)

Anexo: Análisis de resultados para desenlaces de tiempo hasta evento