INICIO

Píldoras_R. Material de formación

[mi_blog] https://agustincastro.es

library(openxlsx)

¿QUÉ ES LA T DE STUDENT?

La conocida como “t de Student” es una prueba estadística que se utiliza para comparar las medias de una o dos muestras con el objetivo de determinar si hay evidencia significativa de que las medias son diferentes entre sí. Dependiendo de la situación, se pueden usar diferentes variantes de la prueba t.

  1. Prueba t para una muestra. Determinar si la media de una muestra es significativamente diferente de un valor específico, que generalmente es una media teórica o conocida de la población.

  2. Prueba t para dos muestras independientes. Comparar las medias de dos muestras independientes para ver si hay una diferencia significativa entre ellas.

  3. Prueba t para muestras pareadas. Comparar las medias de dos muestras relacionadas o pareadas, como las medidas antes y después en el mismo grupo de sujetos.

  4. Pruebas de hipótesis. Se utiliza comúnmente en pruebas de hipótesis donde la hipótesis nula (H0) afirma que no hay diferencia entre las medias, y la hipótesis alternativa (H1) sugiere que sí la hay.

\[ \\ \]

SUPUESTOS

NORMALIDAD

Prueba t para una muestra: Los datos deben provenir de una población que sigue una distribución normal. Este supuesto es especialmente importante cuando el tamaño de la muestra es pequeño (n < 30). Sin embargo, si la muestra es grande, la prueba t es robusta frente a desviaciones moderadas de la normalidad.

Prueba t para dos muestras independientes: Se asume que ambas poblaciones de las que provienen las muestras siguen una distribución normal.

  • Test de Shapiro-Wilk. Muestras pequeñas/medianas (3 a 50 muestras).

  • Test de Kolmogorov-Smirnov (K-S). Adecuado para muestras grandes (50 a 100). Tamaños más grandes pueden detectar desviaciones de la normalidad que no resultan prácticas.

  • Test de Lilliefors. Una variación del test de Kolmogorov-Smirnov ajustada para distribuciones con media y desviación estándar desconocidas.

  • Test de Anderson-Darling. Cualquier tamaño de muestra. Evalúa la adecuación de la muestra a una distribución normal y es más sensible en los extremos de la distribución.

  • Test de Jarque-Bera. Más común en muestras grandes (de 50 a 100). Basado en los momentos de la distribución (asimetría y curtosis) para evaluar la normalidad.

  • Histograma. Visualizar la distribución de los datos para evaluar si se asemeja a una distribución normal.

  • Gráfico Q-Q (Quantile-Quantile). Comparar los cuantiles de la muestra con los cuantiles de una distribución normal. Los puntos deben seguir aproximadamente una línea recta. Desviaciones significativas de esta línea indican desviaciones de la normalidad.

  • Gráfico P-P (Probability-Probability). Similar al gráfico Q-Q, compara las probabilidades acumuladas de la muestra con las de una distribución normal. Los puntos deben alinearse a lo largo de la línea diagonal.

HOMOCEDASTICIDAD

Prueba t para dos muestras independientes: Se asume que las varianzas de las dos poblaciones son iguales (homocedasticidad). Existen variantes de la prueba t que no requieren este supuesto (por ejemplo, la prueba t de Welch), pero la prueba t estándar lo presupone.

  • Test de Bartlett. Evaluar si las varianzas de dos o más grupos son iguales. Es más sensible a la normalidad de los datos en comparación con el test de Levene. Un valor p bajo indica que las varianzas entre los grupos son significativamente diferentes, lo que sugiere heterocedasticidad.

  • Test de Levene. Evaluar la igualdad de varianzas entre dos o más grupos. Es menos sensible a las desviaciones de la normalidad en comparación con el test de Bartlett.Un valor p bajo (por debajo del nivel de significancia, como 0.05) indica que las varianzas entre los grupos son significativamente diferentes,lo que sugiere heterocedasticidad.

  • Test de Fligner-Killeen. Evaluar la igualdad de varianzas entre dos o más grupos, especialmente cuando los datos no se distribuyen normalmente.Menos sensible a las desviaciones de la normalidad y más robusto en presencia de datos que no cumplen con el supuesto de normalidad.

INDEPENDENCIA

Las observaciones deben ser independientes unas de otras, es decir, el valor de una observación no debe influir en el valor de otra. Este supuesto es crucial en todas las variantes de la prueba t (una muestra, dos muestras independientes, muestras pareadas).

VARIABLES CONTINUAS

Escala de Medición. La variable dependiente debe ser continua (es decir, debe estar medida en una escala de intervalo o de razón).

ALEATORIEDAD

Los datos deben haber sido seleccionados de manera aleatoria de la población, lo que ayuda a garantizar que las conclusiones sean generalizables a toda la población.

PRUEBA T PARA UNA MUESTRA

# caso 1
x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
t.test(x, mu = 5) 
## 
##  One Sample t-test
## 
## data:  x
## t = 0.52223, df = 9, p-value = 0.6141
## alternative hypothesis: true mean is not equal to 5
## 95 percent confidence interval:
##  3.334149 7.665851
## sample estimates:
## mean of x 
##       5.5
# p = 0.6141, 
# Ho = la media es igual a 5.
# No se rechaza H0. La media es igual a 5.

# caso 2
x <- c(1, 2, 3, 4, 5)
t.test(x, mu = 10) 
## 
##  One Sample t-test
## 
## data:  x
## t = -9.8995, df = 4, p-value = 0.0005844
## alternative hypothesis: true mean is not equal to 10
## 95 percent confidence interval:
##  1.036757 4.963243
## sample estimates:
## mean of x 
##         3
# p = 0.0005844
# Ho = la media es igual a 10.
# Se rechaza Ho. La media no es igual a 10. 

# caso 3
# aplicamos intervalo de confianza del 95% y 99%
t.test(x, mu = 10, conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  x
## t = -9.8995, df = 4, p-value = 0.0005844
## alternative hypothesis: true mean is not equal to 10
## 95 percent confidence interval:
##  1.036757 4.963243
## sample estimates:
## mean of x 
##         3
t.test(x, mu = 10, conf.level = 0.99) 
## 
##  One Sample t-test
## 
## data:  x
## t = -9.8995, df = 4, p-value = 0.0005844
## alternative hypothesis: true mean is not equal to 10
## 99 percent confidence interval:
##  -0.2555867  6.2555867
## sample estimates:
## mean of x 
##         3

PRUEBA T PARA DOS MUESTRAS INDEPENDIENTES

# ejemplo 1
tratamiento <- c(120, 121, 133, 143, 123, 132, 120, 122, 143)
control <- c(90, 100, 110, 109, 124, 109, 80, 70, 77)

t.test(tratamiento, control)
## 
##  Welch Two Sample t-test
## 
## data:  tratamiento and control
## t = 4.666, df = 12.065, p-value = 0.0005375
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  17.06633 46.93367
## sample estimates:
## mean of x mean of y 
## 128.55556  96.55556
# p = 0,0005375
# Ho = Igualdad de medias. 
# Se rechaza Ho. Las medias no son iguales.

# ejemplo 2
t.test(tratamiento, control,
       mu = 0,
       alternative = "two.side", 
       paired = FALSE,
       var.equal = TRUE,
       conf.level = 0.95)
## 
##  Two Sample t-test
## 
## data:  tratamiento and control
## t = 4.666, df = 16, p-value = 0.0002582
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  17.46141 46.53859
## sample estimates:
## mean of x mean of y 
## 128.55556  96.55556
# alternative = "two side" (a dos colas): opción POR DEFECTO.
#  = "less" (evalua si la media de uno es MENOR que la del otro).
#  = "greater" (evalua si la media de uno es MAYOR que la del otro).

# paired = muestras pareadas. Opción FALSE por defecto. 

# objeto creado
t <- t.test(tratamiento, control) 
t$statistic
t$parameter
t$p.value
t$conf.int
t$estimate
t$null.value
t$method
t$alternative
t$stderr

CON DATOS EN COLUMNAS DE UN DATA FRAME

tratamiento <- c(120, 121, 133, 143, 123, 132, 120, 122, 143)
control <- c(90, 100, 110, 109, 124, 109, 80, 70, 77)

# creamos el dataframe
df <- data.frame(
  tratamiento = tratamiento,
  control = control
)
head(df)
##   tratamiento control
## 1         120      90
## 2         121     100
## 3         133     110
## 4         143     109
## 5         123     124
## 6         132     109
t.test(df$tratamiento, df$control)
## 
##  Welch Two Sample t-test
## 
## data:  df$tratamiento and df$control
## t = 4.666, df = 12.065, p-value = 0.0005375
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  17.06633 46.93367
## sample estimates:
## mean of x mean of y 
## 128.55556  96.55556
# p = 0,0005375
# Ho = Igualdad de medias. 
# Se rechaza Ho. Las medias no son iguales.

CON DATOS SITUADOS EN FILAS DE UN DATA FRAME

# cargamos el dataframe
df <- read.xlsx("DESeq2.xlsx", colNames = TRUE)
df
##         X1 CONTROL   X3   X4 TRATAMIENTO   X6   X7
## 1  gene_id    WT_1 WT_2 WT_3        MT_1 MT_2 MT_3
## 2        A     728  943  966         779  813  912
## 3        B    1873 1856 1972        2410 2189 2041
## 4        C       0    3    0          56   94   94
## 5        D     207  253  246         548  397  250
## 6        E      84   52  177         227  240  175
## 7        F     646  602  692         590  647  620
## 8        G     615  557  677         807  962  829
## 9        H       8    6   16           0    0    8
## 10       I    2942 2279 2590        3255 3071 2949
## 11       J      13   13    8          10    3    4
## 12       K     195  253  165         300  303  291
## 13       L     868  592  676         703  778  907
## 14       M     189  124  224         249  275  215
## 15       N    1685 1604 1312        2056 1488 1319
## 16       Ñ     107   82  132          39   71   69
## 17       O     162  253  335         290  290  338
## 18       P     131  295  184         360  279  312
## 19       Q      64  115  115         196  191  213
## 20       R     119  120  121           1    1    1
# dimensiones
dim(df)
## [1] 20  7
# observamos las 6 primeras filas
head(df)
##        X1 CONTROL   X3   X4 TRATAMIENTO   X6   X7
## 1 gene_id    WT_1 WT_2 WT_3        MT_1 MT_2 MT_3
## 2       A     728  943  966         779  813  912
## 3       B    1873 1856 1972        2410 2189 2041
## 4       C       0    3    0          56   94   94
## 5       D     207  253  246         548  397  250
## 6       E      84   52  177         227  240  175
# eliminamos el encabezado de las columnas
colnames(df) <- NULL
head(df)
##                                        
## 1 gene_id WT_1 WT_2 WT_3 MT_1 MT_2 MT_3
## 2       A  728  943  966  779  813  912
## 3       B 1873 1856 1972 2410 2189 2041
## 4       C    0    3    0   56   94   94
## 5       D  207  253  246  548  397  250
## 6       E   84   52  177  227  240  175
# ahora convertimos la primera línea en encabezado de las columnas 
colnames(df) <- df[1,]
head(df)
##   gene_id WT_1 WT_2 WT_3 MT_1 MT_2 MT_3
## 1 gene_id WT_1 WT_2 WT_3 MT_1 MT_2 MT_3
## 2       A  728  943  966  779  813  912
## 3       B 1873 1856 1972 2410 2189 2041
## 4       C    0    3    0   56   94   94
## 5       D  207  253  246  548  397  250
## 6       E   84   52  177  227  240  175
# elimino la primera fila de datos
df <- df[-1,]
head(df)
##   gene_id WT_1 WT_2 WT_3 MT_1 MT_2 MT_3
## 2       A  728  943  966  779  813  912
## 3       B 1873 1856 1972 2410 2189 2041
## 4       C    0    3    0   56   94   94
## 5       D  207  253  246  548  397  250
## 6       E   84   52  177  227  240  175
## 7       F  646  602  692  590  647  620
# reindexo
row.names(df) <- NULL
head(df)
##   gene_id WT_1 WT_2 WT_3 MT_1 MT_2 MT_3
## 1       A  728  943  966  779  813  912
## 2       B 1873 1856 1972 2410 2189 2041
## 3       C    0    3    0   56   94   94
## 4       D  207  253  246  548  397  250
## 5       E   84   52  177  227  240  175
## 6       F  646  602  692  590  647  620
# creo una copia para el segundo ejercicio
df2 <- df

Vamos a crear una función (prueba_t) que nos permita (1) agrupar las muestras wt y mt para cada una de las filas y (2) realizar un test de t-student a los grupos creados. Estudiaremos así la igualdad de medias entre ambos grupos, para cada fila y, añadiremos al dataframe el p_value obtenido.

prueba_t <- function(fila){
  wt_group <- as.numeric(fila[2:4])
  mt_group <- as.numeric(fila[5:7])
  ts <- t.test(wt_group, mt_group)
  return(ts$p.value)
}

# usamos apply para ejecutar la función prueba_t en cada una de las líneas
df$p_value <- apply(df, 1, prueba_t)

head(df)
##   gene_id WT_1 WT_2 WT_3 MT_1 MT_2 MT_3    p_value
## 1       A  728  943  966  779  813  912 0.64015574
## 2       B 1873 1856 1972 2410 2189 2041 0.08762739
## 3       C    0    3    0   56   94   94 0.02338946
## 4       D  207  253  246  548  397  250 0.19586295
## 5       E   84   52  177  227  240  175 0.08032730
## 6       F  646  602  692  590  647  620 0.42780001

Si queremos añadir a un dataframe dos o más parámetros, podemos hacerlo de la siguiente forma (en este ejemplo, vamos a añadir el valor del estadístico (t) y el p-value). La función prueba_t devolverá un vector con estos dos valores y con la función apply haremos que se ejecute la prueba para los grupos wt y mt de cada una de las líneas.

prueba_t <- function(fila){
  wt_group <- as.numeric(fila[2:4])
  mt_group <- as.numeric(fila[5:7])
  ts <- t.test(wt_group, mt_group)
  return(c(parametros = ts$statistic, ts$p.value))
}

# utilizamos t(apply...) para transponer los resultados y que las filas se
# conviertan en columnas. 
parametros_to_df2 <- t(apply(df2, 1, prueba_t))

colnames(parametros_to_df2) <- c("t", "p-value")

head(parametros_to_df2)
##               t    p-value
## [1,]  0.5176155 0.64015574
## [2,] -2.7662431 0.08762739
## [3,] -6.3224330 0.02338946
## [4,] -1.8690552 0.19586295
## [5,] -2.5850277 0.08032730
## [6,]  0.8994681 0.42780001
df2 <- cbind(df2, parametros_to_df2)

head(df2)
##   gene_id WT_1 WT_2 WT_3 MT_1 MT_2 MT_3          t    p-value
## 1       A  728  943  966  779  813  912  0.5176155 0.64015574
## 2       B 1873 1856 1972 2410 2189 2041 -2.7662431 0.08762739
## 3       C    0    3    0   56   94   94 -6.3224330 0.02338946
## 4       D  207  253  246  548  397  250 -1.8690552 0.19586295
## 5       E   84   52  177  227  240  175 -2.5850277 0.08032730
## 6       F  646  602  692  590  647  620  0.8994681 0.42780001

EOF