Как выполнить t-тесты с двумя выборками в R, введя выборочную статистику, а не необработанные данные?

32

Допустим, у нас есть статистика, приведенная ниже

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

Как выполнить t-тест из двух выборок (чтобы увидеть, есть ли значительная разница между средними значениями для мужчин и женщин в некоторой переменной), используя статистику, подобную этой, а не фактические данные?

Я нигде не мог найти в интернете, как это сделать. Большинство учебных пособий и даже руководство имеют дело с тестом только с фактическим набором данных.

Alby
источник
2
Эта статья в Википедии, а также страница справки по функциям t-распределения R (найдены ?pt) - смотрите подробнее pt()- действительно содержат всю информацию, необходимую для того, чтобы сделать это самостоятельно. И вы многое узнаете о статистике и R, если сделаете это.
Джош О'Брайен
2
Здесь уже есть хорошие ответы, и действительно, очень легко (и хорошая практика) написать функцию для этого самостоятельно; однако я просто добавлю, что вы можете взглянуть на tsum.testфункцию в пакете BSDA , которая реализует t-тест (два образца; Уэлч или равная дисперсия, а также один образец) из предоставленных вами сводных данных. Это в основном работает как t-тест в vanilla R, но на сводной информации.
Glen_b
1
Честно говоря, когда я учился программировать, мой учитель всегда говорил: «Не изобретай велосипед». Таким образом, наиболее логическая функция будет tsum.test()от BSDA libraryкак заявлено @Nick Кокс. Он делает то же самое, что и @macro, записанный в строках кода. Если задан вопрос, каково понимание фонового вычисления для вычисления статистики t-критерия в R, тогда Марко был бы более уместным ответом. Пожалуйста, обратите внимание, я не пытаюсь никого обидеть, просто излагаю свое личное мнение относительно моего профессионального опыта. И @marco, это немного аккуратное кодирование :)
tcratius

Ответы:

37

Вы можете написать свою собственную функцию, основываясь на том, что мы знаем о механике теста с двумя выборкамиt . Например, это сделает работу:

# 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
Мои изменения сравниваются с t.testотклоненными, поэтому вот код для подтверждения:(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"]]
Макс Генис
20

Tзнак равно(означатье-означатьм)-ожидаемая разницаSЕ  SЕзнак равноsdе2Nе+sdм2Nм  где,    dезнак равноNм+Nе-2

Ожидаемая разница, вероятно, равна нулю.

Если вы хотите p-значение, просто используйте pt()функцию:

pt(t, df)

Таким образом, составляя код:

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

Это предполагает равные отклонения, что очевидно, поскольку они имеют одинаковое стандартное отклонение.

Gung - Восстановить Монику
источник
Rп
Степень свободы, предоставленная в этом случае, неверна! Вы используете неуправляемую дисперсию, которая предполагает неравные отклонения. Таким образом, степень свободы более точна с помощью Scatterwaite Approximation.
lzstat
7

Вы можете выполнять вычисления на основе формулы в книге (на веб-странице) или генерировать случайные данные с указанными свойствами (см. mvrnormФункцию в MASSпакете) и использовать обычную t.testфункцию для смоделированных данных.

Грег Сноу
источник
Когда вы говорите «вы можете генерировать случайные данные с указанными свойствами», подразумеваете ли вы имитацию данных со средним значением популяции и стандартным отклонением, равным значениям выборки, или симуляцией в условиях ограничения, что среднее значение выборки и стандартное отклонение равны предварительно указанное значение?
Макро
2
Вы хотите, чтобы моделируемые данные имели те же средние значения и переменные, как указано в задаче. Один из способов сделать это (есть много других) - это использовать mvrnormфункцию в MASSпакете (вам нужно установить эмпирический аргумент в значение ИСТИНА).
Грег Сноу
2

Вопрос задается о R, но проблема может возникнуть с любым другим статистическим программным обеспечением. Например, Stata имеет различные так называемые непосредственные команды, которые позволяют выполнять вычисления только из сводной статистики. См. Http://www.stata.com/manuals13/rttest.pdf для конкретного случая ttestiкоманды, которая применяется здесь.

Ник Кокс
источник