Saltar al contenido principal
LibreTexts Español

6.6: Simulación de datos para pruebas t

  • Page ID
    150337
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    Un tema “avanzado” para\(t\) -pruebas es la idea de usar R para simulaciones para\(t\) -pruebas.

    Si recuerda,\(t\) es propiedad de una muestra. Calculamos\(t\) a partir de nuestra muestra. La\(t\) distribución es el comportamiento hipotético de nuestra muestra. Es decir, si hubiéramos tomado miles y miles de muestras, y calculado\(t\) para cada una, y luego miramos la distribución de esas,\(t\) ¡tendríamos la distribución de muestreo de\(t\)!

    Puede ser muy útil adquirir el hábito de usar R para simular datos bajo ciertas condiciones, para ver cómo se\(t\) comportan tus datos de muestra, y cosas como. ¿Por qué es útil esto? Principalmente te prepara con algunas intuiciones sobre cómo el error de muestreo (probabilidad aleatoria) puede influir en tus resultados, dados los parámetros específicos de tu diseño, como el tamaño de la muestra, el tamaño de la diferencia media que esperas encontrar en tus datos y la cantidad de variación que podrías encontrar. Estos métodos pueden ser utilizados formalmente para realizar análisis de poder. O más informalmente para el sentido de datos.

     

    Simulación de una prueba t de una muestra

    Estos son los pasos que podría seguir para simular datos para una\(t\) prueba de una muestra.

    1. Haz algunas suposiciones sobre cómo podría ser tu muestra (que podrías estar planeando recolectar). Por ejemplo, podrías estar planeando recolectar 30 sujetos por valor de datos. Las puntuaciones de esos puntos de datos podrían provenir de una distribución normal (media = 50, DE = 10).
    2. muestrear números simulados de la distribución, luego realizar una\(t\) prueba de los números simulados. Guarde las estadísticas que desee (como\(t\) s y\(p\) s), y luego vea cómo se comportan las cosas.

    Hagamos esto un par de veces diferentes. Primero, simulemos muestras con N = 30, tomadas de una normal (media= 50, DE =25). Haremos una simulación con 1000 simulaciones. Para cada simulación, compararemos la media muestral con una media poblacional de 50. Aquí no debería haber diferencia en promedio, esta es la distribución nula que estamos simulando. La distribución de no diferencias

    # steps to create fake data from a distribution 
    # and conduct t-tests on the simulated data
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      my_sample <- rnorm(n=30, mean =50, sd =25)
      t_test <- t.test (my_sample, mu = 50)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    #plot histograms of t and p values for 1000 simulations
    hist(save_ts)
    Figura\(\PageIndex{1}\): La distribución de los valores p es plana bajo el nulo.
    # steps to create fake data from a distribution 
    # and conduct t-tests on the simulated data
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      my_sample <- rnorm(n=30, mean =50, sd =25)
      t_test <- t.test (my_sample, mu = 50)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    #plot histograms of t and p values for 1000 simulations
    hist(save_ps)
    Figura\(\PageIndex{2}\): La distribución de los valores p es plana bajo el nulo.

    Ordenado. Vemos tanto una\(t\) distribución, esa parece\(t\) distribución como debería. Y vemos la\(p\) distribución. Esto nos muestra con qué frecuencia obtenemos\(t\) valores de tamaños particulares. Puede resultarle interesante que la\(p\) distribución -sea plana bajo el nulo, que estamos simulando aquí. Esto significa que tienes las mismas posibilidades de obtener una\(t\) con un valor p entre 0 y 0.05, como lo harías para obtener una\(t\) con un valor p entre .90 y .95. Esos rangos son ambos rangos del 5%, por lo que hay una cantidad igual de\(t\) valores en ellos por definición.

    Aquí hay otra forma de hacer la misma simulación en R, usando la función replicar, en lugar de un bucle for:

    simulated_ts <- replicate(1000,
                              t.test(rnorm(30,50,25))$statistic)
    hist(simulated_ts)
    Figura\(\PageIndex{3}\): Simulando ts en R.
    simulated_ps <- replicate(1000,
                              t.test(rnorm(30,50,25))$p.value)
    hist(simulated_ps)
    Figura\(\PageIndex{4}\): Simulando ps en R.

     

    Simulación de una prueba t de muestras pareadas

    El siguiente código está configurado para muestrear 10 puntuaciones para la condición A y B de la misma distribución normal. La simulación se realiza 1000 veces, y los\(t\) s y\(p\) s se guardan y trazan para cada uno.

    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(10,10,5)
      condition_B <- rnorm(10,10,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    hist(save_ts)
    Figura\(\PageIndex{5}\): 1000 ts simulados a partir de la distribución nula.
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(10,10,5)
      condition_B <- rnorm(10,10,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    hist(save_ps)
    Figura\(\PageIndex{6}\): 1000 ps simulados a partir de la distribución nula.

    Según la simulación. Cuando no hay diferencias entre las condiciones, y las muestras están siendo extraídas de la misma distribución, obtienes estas dos distribuciones para\(t\) y\(p\). Estos muestran de nuevo cómo se comporta la distribución nula de no diferencias.

    Para cualquiera de estas simulaciones, si rechazabas la hipótesis nula (que tu diferencia era sólo por casualidad), estarías cometiendo un error tipo I. Si establece sus criterios alfa en\(\alpha = .05\), podemos preguntar cuántos errores tipo I se cometieron en estas 1000 simulaciones. La respuesta es:

    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(10,10,5)
      condition_B <- rnorm(10,10,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    length(save_ps[save_ps<.05])
    58
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(10,10,5)
      condition_B <- rnorm(10,10,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    length(save_ps[save_ps<.05])/1000
    0.054

    Pasó a hacer 55. La expectativa a largo plazo es de 5% de tasas de error tipo I (si tu alfa es .05).

    ¿Qué sucede si realmente hay una diferencia en los datos simulados? Vamos a establecer una condición para tener una media mayor que la otra:

    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(10,10,5)
      condition_B <- rnorm(10,13,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    hist(save_ts)
    Figura\(\PageIndex{7}\): 1000 ts cuando hay una verdadera diferencia.
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(10,10,5)
      condition_B <- rnorm(10,13,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    hist(save_ps)
    Figura\(\PageIndex{8}\): 1000 ps cuando hay una verdadera diferencia.

    Ahora puedes ver que la distribución\(p\) -value está sesgada a la izquierda. Esto se debe a que cuando hay un efecto verdadero, obtendrá valores p que son menores que .05 más a menudo. O, más bien, obtienes\(t\) valores más grandes de lo que normalmente harías si no hubiera diferencias.

    En este caso, no estaríamos cometiendo un error de tipo I si rechazáramos el nulo cuando p era menor que .05. ¿Cuántas veces haríamos eso de nuestros 1000 experimentos?

    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(10,10,5)
      condition_B <- rnorm(10,13,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    length(save_ps[save_ps<.05])
    210
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(10,10,5)
      condition_B <- rnorm(10,13,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    length(save_ps[save_ps<.05])/1000
    0.21

    Ocurrió que obtuvimos 210 simulaciones donde p era inferior a .05, eso es solo 0.21 experimentos. Si fueras el investigador, ¿te gustaría ejecutar un experimento que solo tendría éxito 0.21 de las veces? Yo no lo haría, haría un mejor experimento.

    ¿Cómo realizarías un mejor experimento simulado? Bueno, podrías aumentar\(n\), el número de sujetos en el experimento. Aumentemos\(n\) de 10 a 100, y veamos qué sucede con el número de experimentos simulados “significativos”.

    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(100,10,5)
      condition_B <- rnorm(100,13,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    hist(save_ts)
    Figura\(\PageIndex{9}\): 1000 ts para n =100, cuando hay un efecto verdadero.
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(100,10,5)
      condition_B <- rnorm(100,13,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    hist(save_ps)
    Figura\(\PageIndex{10}\): 1000 ps para n =100, cuando hay un efecto verdadero.
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(100,10,5)
      condition_B <- rnorm(100,13,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    length(save_ps[save_ps<.05])
    985
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      condition_A <- rnorm(100,10,5)
      condition_B <- rnorm(100,13,5)
      differences <- condition_A - condition_B
      t_test <- t.test(differences, mu=0)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    length(save_ps[save_ps<.05])/1000
    0.985

    Genial, ahora casi todos los experimentos muestran un\(p\) -valor de menos de .05 (usando una prueba de dos colas, ese es el valor predeterminado en R). Verás, podrías usar este proceso de simulación para determinar cuántos sujetos necesitas para encontrar tu efecto de manera confiable.

     

    Simulación de una prueba t de muestras independientes

    Simplemente cambie la función t.test así... esto es para el nulo, asumiendo que no hay diferencia entre grupos.

    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      group_A <- rnorm(10,10,5)
      group_B <- rnorm(10,10,5)
      t_test <- t.test(group_A, group_B, paired=FALSE, var.equal=TRUE)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    hist(save_ts)
    Figura\(\PageIndex{11}\): 1000 ts para n =100, cuando hay un efecto verdadero.
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      group_A <- rnorm(10,10,5)
      group_B <- rnorm(10,10,5)
      t_test <- t.test(group_A, group_B, paired=FALSE, var.equal=TRUE)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    hist(save_ps)
    Figura\(\PageIndex{12}\): 1000 ps para n =100, cuando hay un efecto verdadero.
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      group_A <- rnorm(10,10,5)
      group_B <- rnorm(10,10,5)
      t_test <- t.test(group_A, group_B, paired=FALSE, var.equal=TRUE)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    length(save_ps[save_ps<.05])
    41
    save_ps <- length(1000)
    save_ts <- length(1000)
    for ( i in 1:1000 ){
      group_A <- rnorm(10,10,5)
      group_B <- rnorm(10,10,5)
      t_test <- t.test(group_A, group_B, paired=FALSE, var.equal=TRUE)
      save_ps[i] <- t_test$p.value
      save_ts[i] <- t_test$statistic
    }
    length(save_ps[save_ps<.05])/1000
    0.041

    This page titled 6.6: Simulación de datos para pruebas t is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Matthew J. C. Crump via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.