47 votos

¿Cómo realizar pruebas t de dos muestras en R introduciendo los estadísticos de la muestra en lugar de los datos brutos?

Digamos que tenemos las estadísticas que se indican a continuación

gender mean sd n
f 1.666667 0.5773503 3
m 4.500000 0.5773503 4

¿Cómo se realiza una prueba t de dos muestras (para ver si hay una diferencia significativa entre las medias de hombres y mujeres en alguna variable) utilizando estadísticas como ésta en lugar de datos reales?

No he podido encontrar en ningún sitio de Internet cómo hacerlo. La mayoría de los tutoriales e incluso el manual tratan de la prueba con el conjunto de datos reales solamente.

2 votos

Este artículo de Wikipedia además de la página de ayuda de las funciones de distribución t de R (obtenida por ?pt ) -- ver especialmente pt() -- tienen toda la información que necesitas para hacerlo tú mismo. Y aprenderás un lote sobre estadísticas y R si lo haces.

4 votos

Ya hay buenas respuestas aquí, y de hecho es muy fácil (y una buena práctica) escribir una función para esto usted mismo; sin embargo, sólo añadiré que podría echar un vistazo al tsum.test función en el paquete BSDA que implementa una prueba t (de dos muestras; Welch o de igual varianza y también de una muestra) a partir de los datos de resumen que usted proporciona. Básicamente funciona como la prueba t en vanilla R pero en la información de resumen.

3 votos

Para ser honesto, cuando aprendía a programar mi profesor siempre decía: "no reinventes la rueda". Por lo tanto, la función más lógica sería tsum.test() de la BSDA library como dijo @Nick Cox. Hace exactamente lo mismo que escribió @macro en líneas de código. Si la pregunta se hizo, lo que es la comprensión del cálculo de fondo para el cálculo de la estadística de la prueba t en R entonces Marco sería más apropiado una respuesta. Tenga en cuenta, no estoy tratando de ofender a nadie, sólo exponer mi opinión personal relacionada con mi formación profesional. Y @marco que es un poco de codificación aseado :)

60voto

Niall Puntos 51

Puedes escribir tu propia función basándote en lo que sabemos sobre la mecánica de las dos muestras $t$ -prueba . Por ejemplo, esto hará el trabajo:

# m1, m2: the sample means
# s1, s2: the sample standard deviations
# n1, n2: the same sizes
# m0: the null value for the difference in means to be tested for. Default is 0. 
# equal.variance: whether or not to assume equal variance. Default is FALSE. 
t.test2 <- function(m1,m2,s1,s2,n1,n2,m0=0,equal.variance=FALSE)
{
    if( equal.variance==FALSE ) 
    {
        se <- sqrt( (s1^2/n1) + (s2^2/n2) )
        # welch-satterthwaite df
        df <- ( (s1^2/n1 + s2^2/n2)^2 )/( (s1^2/n1)^2/(n1-1) + (s2^2/n2)^2/(n2-1) )
    } else
    {
        # pooled standard deviation, scaled by the sample sizes
        se <- sqrt( (1/n1 + 1/n2) * ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2) ) 
        df <- n1+n2-2
    }      
    t <- (m1-m2-m0)/se 
    dat <- c(m1-m2, se, t, 2*pt(-abs(t),df))    
    names(dat) <- c("Difference of means", "Std Error", "t", "p-value")
    return(dat) 
}

Ejemplo de uso:

set.seed(0)
x1 <- rnorm(100)
x2 <- rnorm(200) 
# you'll find this output agrees with that of t.test when you input x1,x2
(tt2 <- t.test2(mean(x1), mean(x2), sd(x1), sd(x2), length(x1), length(x2)))

Difference of means       Std Error               t         p-value 
        -0.05692268      0.12192273     -0.46687500      0.64113442 

Esto coincide con el resultado de t.test :

(tt <- t.test(x1, x2))

#         Welch Two Sample t-test
#   
#   data:  x1 and x2
#   t = 0.10427, df = 223.18, p-value = 0.917
#   alternative hypothesis: true difference in means is not equal to 0
#   95 percent confidence interval:
#    -0.2118062  0.2354734
#   sample estimates:
#    mean of x  mean of y 
#   0.02266845 0.01083487 

tt$statistic == tt2[["t"]]
#        t 
#     TRUE 

tt$p.value == tt2[["p-value"]]
# [1] TRUE

3 votos

Mi editar comparando con t.test fue rechazado, así que aquí hay un código para confirmarlo: (tt2 <- t.test2(mean(x1), mean(x2), sd(x1), sd(x2), length(x1), length(x2))); (tt <- t.test(x1, x2)); tt$statistic == tt2[["t"]]; tt$p.value == tt2[["p-value"]]

1 votos

@MaxGhenis He vuelto a añadir tu edición. Me pareció bien.

24voto

Lo calculas a mano: $$ t = \frac{(\text{mean}_f - \text{mean}_m) - \text{expected difference}}{SE} \\ ~\\ ~\\ SE = \sqrt{\frac{sd_f^2}{n_f} + \frac{sd_m^2}{n_m}} \\ ~\\ ~\\ \text{where, }~~~df = n_m + n_f - 2 $$

La diferencia esperada es probablemente cero.

Si desea el valor p, sólo tiene que utilizar la función pt() función:

pt(t, df)

Por lo tanto, poner el código juntos:

> p = pt((((1.666667 - 4.500000) - 0)/sqrt(0.5773503/3 + 0.5773503/4)), (3 + 4 - 2))
> p
[1] 0.002272053

Esto supone que las varianzas son iguales, lo cual es obvio porque tienen la misma desviación estándar.

8voto

Eero Puntos 1612

Puedes hacer los cálculos basándote en la fórmula del libro (en la página web), o puedes generar datos aleatorios que tengan las propiedades indicadas (ver el mvrnorm en la función MASS ) y utilizar el paquete regular t.test sobre los datos simulados.

0 votos

Cuando dice "se pueden generar datos aleatorios que tengan las propiedades indicadas", ¿se refiere a simular datos con la media y la desviación estándar de la población iguales a los valores de la muestra o a simular bajo la restricción de que la media y la desviación estándar de la muestra sean iguales a un valor preestablecido?

2 votos

Quieres que los datos simulados tengan exactamente las mismas medias y var(s) que se indican en el problema. Una forma de hacerlo (hay muchas otras) es utilizar la función mvrnorm en la función MASS (es necesario establecer el argumento empírico en TRUE).

2voto

Nick Cox Puntos 22819

La pregunta se refiere a R, pero el problema puede surgir con cualquier otro software estadístico. Stata, por ejemplo, tiene varios comandos denominados inmediatos, que permiten realizar cálculos a partir de estadísticas de resumen únicamente. Véase http://www.stata.com/manuals13/rttest.pdf para el caso particular del ttesti que se aplica en este caso.

2voto

David Liese Puntos 80

Otra posible solución es simular los conjuntos de datos y luego utilizar la función de prueba t estándar. Puede ser menos eficiente, computacionalmente hablando, pero es muy simple.

t.test.from.summary.data <- function(mean1, sd1, n1, mean2, sd2, n2, ...) {
    data1 <- scale(1:n1)*sd1 + mean1
    data2 <- scale(1:n2)*sd2 + mean2
    t.test(data1, data2, ...)
}

Dado que la prueba t sólo depende de los estadísticos de resumen de la muestra, pero no tiene en cuenta las distribuciones reales de la muestra, esta función dará exactamente los mismos resultados (excepto los nombres de las variables) que la función de prueba t:

x <- c(1.0, 1.2, 2.3, 4.2, 2.1, 3.0, 1.9, 2.0, 3.2, 1.6)
y <- c(3.5, 4.2, 3.3, 2.0, 1.7, 4.5, 2.7, 2.8, 3.3)
m_x <- mean(x)
m_y <- mean(y)
s_x <- sd(x)
s_y <- sd(y)
t.test.from.summary.data(m_x, s_x, 10, m_y, s_y, 9)

    Welch Two Sample t-test

data:  data1 and data2
t = -1.9755, df = 16.944, p-value = 0.06474
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.78101782  0.05879559
sample estimates:
mean of x mean of y 
 2.250000  3.111111 

t.test(x,y)

    Welch Two Sample t-test

data:  x and y
t = -1.9755, df = 16.944, p-value = 0.06474
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.78101782  0.05879559
sample estimates:
mean of x mean of y 
 2.250000  3.111111

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X