Comment effectuer des tests t à deux échantillons dans R en saisissant des statistiques d'échantillon plutôt que des données brutes?

32

Disons que nous avons les statistiques ci-dessous

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

Comment effectuez-vous un test t à deux échantillons (pour voir s'il y a une différence significative entre les moyennes des hommes et des femmes dans certaines variables) en utilisant des statistiques comme celle-ci plutôt que des données réelles?

Je n'ai trouvé nulle part sur Internet comment procéder. La plupart des didacticiels et même le manuel traitent du test avec l'ensemble de données réel uniquement.

Alby
la source
2
Cet article Wikipedia plus la page d'aide pour les fonctions de distribution t de R (obtenu ?pt) - voir en particulier pt()- ont toutes les informations dont vous auriez besoin pour le faire vous-même. Et vous en apprendrez beaucoup sur les statistiques et R si vous faites cela.
Josh O'Brien
2
Il y a déjà de bonnes réponses ici, et en effet, il est à la fois très facile (et une bonne pratique) d'écrire une fonction pour cela vous-même; Cependant, j'ajouterai simplement que vous pourriez jeter un œil à la tsum.testfonction du package BSDA , qui implémente un test t (deux échantillons; Welch ou à variance égale et également un échantillon) à partir des données récapitulatives que vous fournissez. Cela fonctionne essentiellement comme le test t dans vanilla R mais sur les informations de résumé.
Glen_b -Reinstate Monica
1
Pour être honnête, lorsque j'apprenais à programmer, mon professeur disait toujours: "ne réinventez pas la roue". Par conséquent, la fonction la plus logique serait tsum.test()de l' BSDA librarycomme indiqué par Cox @ Nick. Cela fait exactement la même chose que ce que @macro a écrit en lignes de code. Si la question posée, quelle est la compréhension du calcul de fond pour calculer la statistique du test t dans R, alors Marco serait une réponse plus appropriée. Veuillez noter que je n'essaie pas d'offenser qui que ce soit, mais simplement d'exprimer mon opinion personnelle liée à mes antécédents professionnels. Et @marco c'est du codage soigné :)
tcratius

Réponses:

37

Vous pouvez écrire votre propre fonction sur la base de ce que nous savons sur la mécanique du test deux échantillonst . Par exemple, cela fera le travail:

# 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
la source
1
Mon montage comparé à a t.testété rejeté, alors voici un code pour confirmer:(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

t=(signifierF-signifierm)-différence attendueSE  SE=sF2nF+sm2nm  où,    F=nm+nF-2

La différence attendue est probablement nulle.

Si vous voulez la valeur p, utilisez simplement la pt()fonction:

pt(t, df)

Ainsi, assembler le code:

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

Cela suppose des variances égales, ce qui est évident car ils ont le même écart-type.

gung - Réintégrer Monica
la source
Rp
La liberté de degré fournie dans ce cas est incorrecte! Vous utilisez la variance non regroupée qui suppose des variances inégales. Ainsi, le degré de liberté est plus précis en utilisant l'approximation de Scatterwaite.
lzstat
7

Vous pouvez effectuer les calculs en fonction de la formule dans le livre (sur la page Web), ou vous pouvez générer des données aléatoires qui ont les propriétés indiquées (voir la mvrnormfonction dans le MASSpackage) et utiliser la t.testfonction régulière sur les données simulées.

Greg Snow
la source
Lorsque vous dites "vous pouvez générer des données aléatoires ayant les propriétés indiquées", voulez-vous dire simuler des données avec une moyenne de population et un écart-type égaux aux valeurs de l'échantillon ou simuler sous la contrainte que la moyenne de l'échantillon et l'écart-type sont égaux à un valeur spécifiée?
Macro
2
Vous voulez que les données simulées aient exactement les mêmes moyenne (s) et var (s) que celles indiquées dans le problème. Une façon de le faire (il y en a beaucoup d'autres) est d'utiliser la mvrnormfonction dans le MASSpackage (vous devez définir l'argument empirique sur TRUE).
Greg Snow
2

La question concerne R, mais le problème peut survenir avec tout autre logiciel statistique. Stata, par exemple, dispose de diverses commandes dites immédiates, qui permettent des calculs à partir des seules statistiques récapitulatives. Voir http://www.stata.com/manuals13/rttest.pdf pour le cas particulier de la ttesticommande, qui s'applique ici.

Nick Cox
la source