¿Cómo realizar pruebas t de dos muestras en R ingresando estadísticas de muestra en lugar de los datos sin procesar?

32

Digamos que tenemos las estadísticas que figuran 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) usando estadísticas como esta en lugar de datos reales?

No pude encontrar en ningún lugar de Internet cómo hacer esto. La mayoría de los tutoriales e incluso el manual tratan la prueba solo con el conjunto de datos real.

Alby
fuente
2
Este artículo de Wikipedia más la página de ayuda para las funciones de distribución t de R (superado ?pt), vea especialmente pt(), tiene toda la información que necesitaría para hacerlo usted mismo. Y aprenderás mucho sobre estadísticas y R si haces eso.
Josh O'Brien
2
Aquí ya hay buenas respuestas, y de hecho es muy fácil (y una buena práctica) escribir una función para esto usted mismo; sin embargo, solo agregaré que puede echar un vistazo a la tsum.testfunción en el paquete BSDA , que implementa una prueba t (dos muestras; Welch o varianza igual y también una muestra) a partir de los datos de resumen que proporcione. Básicamente funciona como la prueba t en vainilla R pero en la información de resumen.
Glen_b -Reinstate Monica el
1
Para ser honesto, cuando estaba aprendiendo a programar, mi maestro siempre decía "no reinventes la rueda". Por lo tanto, la función más lógica sería tsum.test()la BSDA libraryindicada por @Nick Cox. Hace exactamente lo mismo que escribió @macro en líneas de código. Si se formula la pregunta, ¿cuál es la comprensión del cálculo de fondo para calcular el estadístico de la prueba t en R, entonces Marco sería una respuesta más apropiada? Tenga en cuenta que no estoy tratando de ofender a nadie, solo declaro mi opinión personal relacionada con mi experiencia profesional. Y @marco que es una codificación ordenada :)
tcratius

Respuestas:

37

Puede escribir su propia función en función de lo que sabemos sobre la mecánica de la prueba dos muestrast . 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) 
}
x1 = rnorm(100)
x2 = rnorm(200) 
# you'll find this output agrees with that of t.test when you input x1,x2
t.test2( mean(x1), mean(x2), sd(x1), sd(x2), 100, 200)
Difference of means       Std Error               t         p-value 
        -0.05692268      0.12192273     -0.46687500      0.64113442 
Macro
fuente
1
Mi edición en comparación con t.testfue rechazada, así que aquí hay un código para confirmar:(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"]]
Max Ghenis
20

Simplemente calcule a mano:

t=(meanfmeanm)expected differenceSE  SE=sdf2nf+sdm2nm  where,    df=nm+nf2

La diferencia esperada es probablemente cero.

Si desea el valor p simplemente use la pt()función:

pt(t, df)

Por lo tanto, poniendo 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 variaciones iguales, lo cual es obvio porque tienen la misma desviación estándar.

gung - Restablece a Monica
fuente
Un par de cosas: ¿Cómo es esto "en R"? ¿Cuál es la distribución del estadístico de prueba (es decir, cómo se pasa de esto a los valores )? p
Macro
¡El grado de libertad proporcionado en este caso es incorrecto! Utiliza una varianza no agrupada que supone variaciones desiguales. Por lo tanto, el grado de libertad es más preciso utilizando la Aproximación Scatterwaite.
lzstat
7

Puede hacer los cálculos basados ​​en la fórmula del libro (en la página web), o puede generar datos aleatorios que tengan las propiedades indicadas (ver la mvrnormfunción en el MASSpaquete) y usar la t.testfunción regular en los datos simulados.

Greg Snow
fuente
Cuando dice "puede generar datos aleatorios que tienen las propiedades indicadas", ¿quiere decir simular datos con media poblacional y desviación estándar igual a los valores de la muestra o simular bajo la restricción de que la media muestral y la desviación estándar son iguales a ¿valor específico?
Macro
2
Desea que los datos simulados tengan exactamente la misma media (s) y var (s) como se indica en el problema. Una forma de hacer esto (hay muchas otras) es usar la mvrnormfunción en el MASSpaquete (debe establecer el argumento empírico en VERDADERO).
Greg Snow
2

La pregunta se refiere a R, pero el problema puede surgir con cualquier otro software estadístico. Stata, por ejemplo, tiene varios llamados comandos inmediatos, que permiten realizar cálculos únicamente a partir de estadísticas resumidas. Consulte http://www.stata.com/manuals13/rttest.pdf para ver el caso particular del ttesticomando, que se aplica aquí.

Nick Cox
fuente