Jak przeprowadzić dwupróbkowe testy T w R, wprowadzając przykładowe statystyki zamiast surowych danych?

32

Powiedzmy, że mamy podane poniżej statystyki

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

W jaki sposób przeprowadzasz dwupróbkowy test t (aby sprawdzić, czy istnieje znacząca różnica między średnimi mężczyzn i kobiet w niektórych zmiennych) przy użyciu takich statystyk, a nie rzeczywistych danych?

Nie mogłem znaleźć nigdzie w Internecie, jak to zrobić. Większość samouczków, a nawet podręcznik dotyczy testu z samym zestawem danych.

Alby
źródło
2
W tym artykule w Wikipedii oraz na stronie pomocy dla funkcji T-dystrybucji (uzyskanych ?pt) - patrz zwłaszcza pt()- masz wszystkie informacje, których potrzebujesz, aby zrobić to sam. Nauczysz się wiele o statystykach i R. Jeśli to zrobisz.
Josh O'Brien
2
Istnieją już dobre odpowiedzi i rzeczywiście bardzo łatwo (i dobra praktyka) jest napisanie dla tego funkcji; dodam jednak, że możesz rzucić okiem na tsum.testfunkcję w pakiecie BSDA , która implementuje test t (dwie próbki; Welch lub równość wariancji, a także jedna próbka) z dostarczonych danych podsumowujących. Zasadniczo działa jak test t w wanilii R, ale w podsumowaniu.
Glen_b
1
Szczerze mówiąc, kiedy uczyłem się programować, mój nauczyciel zawsze mówił: „nie wymyślaj na nowo koła”. Dlatego funkcja najbardziej logiczne byłoby tsum.test()od BSDA libraryjak stwierdził @Nick Cox. Robi dokładnie to samo, co napisał @macro w liniach kodu. Gdyby zadać pytanie, jakie jest rozumienie obliczeń tła dla obliczenia statystyki testu t w R, Marco byłby bardziej odpowiednią odpowiedzią. Pamiętaj, że nie próbuję nikogo urazić, tylko stwierdzając moją osobistą opinię związaną z moim doświadczeniem zawodowym. I @marco to porządne kodowanie :)
tcratius

Odpowiedzi:

37

Możesz napisać własną funkcję na podstawie tego, co wiemy o mechanice testu z dwoma próbkamit . Na przykład spełni to zadanie:

# 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 
Makro
źródło
1
Moja edycja w porównaniu do t.testzostała odrzucona, więc oto kod do potwierdzenia:(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

Po prostu obliczasz to ręcznie:

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

Oczekiwana różnica wynosi prawdopodobnie zero.

Jeśli chcesz wartość p, po prostu użyj pt()funkcji:

pt(t, df)

Tak więc, łącząc kod razem:

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

Zakłada to jednakowe wariancje, co jest oczywiste, ponieważ mają one takie samo odchylenie standardowe.

gung - Przywróć Monikę
źródło
Kilka rzeczy: jak to jest „w R”? Jaki jest rozkład statystyki testowej (tj. Jak przejść od tego do wartości )? p
Makro
Zakres swobody podany w tym przypadku jest nieprawidłowy! Używasz niepasowanej wariancji, która zakłada nierówne wariancje. Zatem stopień swobody jest dokładniejszy przy użyciu przybliżenia Scatterwaite.
lzstat
7

Możesz wykonać obliczenia na podstawie wzoru w książce (na stronie internetowej) lub wygenerować losowe dane o określonych właściwościach (patrz mvrnormfunkcja w MASSpakiecie) i użyć t.testfunkcji regularnej na danych symulowanych.

Greg Snow
źródło
Kiedy mówisz „możesz wygenerować losowe dane o podanych właściwościach”, masz na myśli symulację danych ze średnią populacji i odchyleniem standardowym równym wartościom próbki lub symulacją pod warunkiem, że średnia próbki i odchylenie standardowe są równe określona wartość?
Makro
2
Chcesz, aby symulowane dane miały dokładnie takie same średnie i zmienne jak podane w problemie. Jednym ze sposobów, aby to zrobić (jest wiele innych), jest użycie mvrnormfunkcji w MASSpakiecie (musisz ustawić argument empiryczny na PRAWDA).
Greg Snow,
2

Pytanie dotyczy R, ale problem może pojawić się w każdym innym oprogramowaniu statystycznym. Na przykład Stata ma różne tak zwane polecenia natychmiastowe, które umożliwiają obliczenia na podstawie samych statystyk podsumowujących. Zobacz http://www.stata.com/manuals13/rttest.pdf dla konkretnego przypadku ttestipolecenia, które ma zastosowanie tutaj.

Nick Cox
źródło