Wie führe ich T-Tests mit zwei Stichproben in R durch, indem ich Stichprobenstatistiken anstelle der Rohdaten eingebe?


32

Nehmen wir an, wir haben die unten angegebenen Statistiken

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

Wie führt man einen T-Test mit zwei Stichproben durch (um festzustellen, ob bei einer Variablen ein signifikanter Unterschied zwischen Männern und Frauen besteht), wobei man Statistiken wie diese anstelle tatsächlicher Daten verwendet?

Ich konnte nirgendwo im Internet finden, wie das geht. Die meisten Tutorials und sogar das Handbuch behandeln den Test nur mit dem tatsächlichen Datensatz.


2
Dieser Wikipedia-Artikel sowie die Hilfeseite für Rs T-Verteilungsfunktionen (verstanden von ?pt) - siehe besonders pt()- enthalten alle Informationen, die Sie benötigen, um dies selbst zu tun. Und Sie werden eine Menge über Statistiken und R lernen, wenn Sie das tun.
Josh O'Brien

2
Hier gibt es bereits gute Antworten, und in der Tat ist es sowohl sehr einfach (als auch eine gute Übung), selbst eine Funktion dafür zu schreiben. Ich möchte jedoch hinzufügen, dass Sie einen Blick auf die tsum.testFunktion in Paket BSDA werfen , die einen t-Test (zwei Stichproben; Welch oder Gleichvarianz und auch eine Stichprobe) aus den von Ihnen bereitgestellten zusammenfassenden Daten implementiert. Es funktioniert im Grunde wie der T-Test in Vanille R, aber auf der Zusammenfassung Info.
Glen_b -Reinstate Monica

1
Um ehrlich zu sein, sagte mein Lehrer beim Programmieren immer: "erfinde das Rad nicht neu". Daher wäre die logischste Funktion sein tsum.test()von der , BSDA librarywie durch @ Nick Cox angegeben. Es macht genau das Gleiche wie das, was @macro in Codezeilen geschrieben hat. Wenn die Frage gestellt wird, wie ist das Verständnis der Hintergrundberechnung für die Berechnung der T-Test-Statistik in R, dann wäre Marco eine angemessenere Antwort. Bitte beachten Sie, ich versuche nicht, jemanden zu beleidigen, sondern nur meine persönliche Meinung zu meinem beruflichen Hintergrund zu äußern. Und @ Marco, das ist eine ordentliche Codierung :)
Tcratius

Antworten:


37

Sie können Ihre eigene Funktion schreiben, basierend auf dem, was wir über die Mechanik des Zwei-Stichproben- Testst wissen . Zum Beispiel erledigt dies die Arbeit:

# 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 

1
Meine Änderung im Vergleich zu t.testwurde abgelehnt. Hier ist ein Code zur Bestätigung:(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

Sie berechnen es einfach von Hand:

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

Die erwartete Differenz ist wahrscheinlich Null.

Wenn Sie den p-Wert wollen, benutzen Sie einfach die pt()Funktion:

pt(t, df)

So setzen Sie den Code zusammen:

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

Dies setzt gleiche Abweichungen voraus, was offensichtlich ist, da sie die gleiche Standardabweichung haben.


Ein paar Dinge: Wie ist das "in R"? Was ist die Verteilung der Teststatistik (dh , wie Sie von diesem gehen Sie -Werten)? p
Makro

Der hier angegebene Freiheitsgrad ist falsch! Sie verwenden ungepoolte Varianz, die ungleiche Varianzen voraussetzt. Somit ist der Freiheitsgrad unter Verwendung der Scatterwaite-Approximation genauer.
lzstat

7

Sie können die Berechnungen basierend auf der Formel im Buch (auf der Webseite) durchführen oder Sie können zufällige Daten mit den angegebenen Eigenschaften generieren (siehe die mvrnormFunktion im MASSPaket) und die reguläre t.testFunktion für die simulierten Daten verwenden.


Wenn Sie "Sie können zufällige Daten mit den angegebenen Eigenschaften generieren" sagen, meinen Sie damit, Daten mit einem Populationsmittelwert und einer Standardabweichung zu simulieren, die den Stichprobenwerten entsprechen, oder mit der Einschränkung, dass der Stichprobenmittelwert und die Standardabweichung einer Vorabweichung entsprechen. Spezifizierter Wert?
Makro

2
Sie möchten, dass die simulierten Daten genau die gleichen Mittelwerte und Var (s) haben, die im Problem angegeben sind. Eine Möglichkeit, dies zu tun (es gibt viele andere), besteht darin, die mvrnormFunktion im MASSPaket zu verwenden (Sie müssen das empirische Argument auf TRUE setzen).
Greg Snow

2

Die Frage fragt nach R, aber das Problem kann bei jeder anderen Statistiksoftware auftreten. Zum Beispiel verfügt Stata über verschiedene sogenannte Sofortbefehle, mit denen Berechnungen allein aus Summenstatistiken möglich sind. Unter http://www.stata.com/manuals13/rttest.pdf finden Sie den speziellen Fall des ttestiBefehls, der hier gilt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.