Як виконати двопробові t-тести в R шляхом введення вибіркової статистики, а не необроблених даних?


32

Скажімо, у нас є наведена нижче статистика

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

Як ви проводите тест-випробування на двох зразках (щоб побачити, чи є значна різниця між засобами чоловіків і жінок у певній змінній), використовуючи подібну статистику, а не фактичні дані?

Я не міг знайти в Інтернеті, як це зробити. Більшість навчальних посібників і навіть посібник стосуються тесту лише з фактичними наборами даних.


2
Ця стаття у Вікіпедії разом із довідковою сторінкою для функцій розповсюдження t-каналу R (отримано від ?pt) - див. Особливо pt()- чи є у вас вся інформація, яку вам потрібно зробити для цього самостійно. І ви дізнаєтесь багато про статистику та R, якщо це зробите.
Josh O'Brien

2
Тут вже є хороші відповіді, і справді написати функцію для цього одночасно дуже просто (і хороша практика); однак я просто додам, що ви можете поглянути на tsum.testфункцію в пакеті BSDA , який реалізує t-тест (два зразка; Welch або рівна дисперсія та також один зразок) із зведених даних, які ви надаєте. Це в основному працює як тест t у ванілі R, але на підсумковій інформації.
Glen_b -Встановіть Моніку

1
Якщо чесно, коли я вчився програмувати, мій вчитель завжди говорив: "Не вигадуйте колесо заново". Тому найбільш логічною функцією було б tsum.test()те, BSDA libraryяк заявлено @Nick Cox. Це робить саме те, що написав @macro в рядках коду. Якщо питання задається, яке розуміння фонового обчислення для обчислення статистики t-тесту в R, тоді Марко було б більш доречною відповіддю. Зауважте, я не намагаюся когось образити, просто висловлюючи свою особисту думку, пов’язану з моїм професійним досвідом. І @marco - це якесь чітке кодування :)
tcratius

Відповіді:


37

Ви можете написати власну функцію на основі того, що ми знаємо про механіку двопробного -testt . Наприклад, це зробить роботу:

# 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"]]
Макс Ghenis

20

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

Очікувана різниця, ймовірно, дорівнює нулю.

Якщо ви хочете р-значення, просто скористайтеся 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

Це передбачає однакові відхилення, що очевидно, оскільки вони мають однакове стандартне відхилення.


Rp

Ступінь свободи, що надається в цьому випадку, невірна! Ви використовуєте неочищену дисперсію, яка передбачає неоднакові відхилення. Таким чином, ступінь свободи є більш точним за допомогою наближення Скаттервайта.
lzstat

7

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


Коли ви говорите "ви можете генерувати випадкові дані, які мають зазначені властивості", ви маєте на увазі моделювання даних із середньою сукупністю та стандартним відхиленням, що дорівнює вибірковим значенням, або моделювання за обмеженням, що середнє значення вибірки та стандартне відхилення дорівнюють попередньому вказане значення?
Макрос

2
Ви хочете, щоб у змодельованих даних були такі самі середні значення та значення (var), як зазначено в проблемі. Один із способів зробити це (є багато інших) - використовувати mvrnormфункцію в MASSпакеті (потрібно встановити емпіричний аргумент на TRUE).
Грег Сніг,

2

Питання задається питанням про R, але це може виникнути з будь-яким іншим статистичним програмним забезпеченням. Наприклад, у Stata є різні так звані безпосередні команди, які дозволяють проводити розрахунки лише з підсумкової статистики. Дивіться http://www.stata.com/manuals13/rttest.pdf для конкретного випадку ttestiкоманди, яка застосовується тут.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.