如何通过输入样本统计数据而不是原始数据在R中执行两次样本t检验?


32

假设我们有以下统计数据

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

您如何使用此类统计数据而非实际数据进行两次抽样的t检验(以查看在某些变量中男人和女人的均值之间是否存在显着差异)?

我在互联网上找不到任何方法。大多数教程甚至手册都只使用实际数据集来处理测试。


2
这篇Wikipedia文章以及R的t分布函数的帮助页面(由来获取?pt)-尤其是pt()-确实拥有您自己需要执行的所有信息。如果您这样做的话,您将学到很多关于stats和R的知识。
Josh O'Brien 2012年

2
这里已经有了很好的答案,确实,为此自己编写一个函数非常容易(并且是很好的实践)。但是,我只是补充一下,您可以看一下BSDAtsum.test包中的函数,该函数从提供的摘要数据中实现t检验(两个样本; Welch或等方差,还有一个样本)。它基本上像香草R中的t检验一样工作,但是在摘要信息上。
Glen_b-恢复莫妮卡

1
老实说,当我学习编程时,我的老师总是说:“不要重新发明轮子”。因此,最合逻辑的功能将tsum.test()来自BSDA library@Nick Cox所说的。它与@macro在代码行中编写的内容完全相同。如果问题被问到,那么在计算R中的t检验统计量时对背景计算的理解是什么,那么Marco将是更合适的答案。请注意,我并不是要冒犯任何人,只是说出与我的专业背景有关的个人见解。而@marco则是一些简洁的编码:)
tcratius

Answers:


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"]]
最大Ghenis

20

Ť=意思F-意思-预期差异小号Ë  小号Ë=sdF2ñF+sd2ñ  哪里,    dF=ñ+ñF-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

这假定方差相等,这很明显,因为它们具有相同的标准偏差。


有两件事:这个“中R”如何?测试统计量的分布是什么(即您如何从此变为p-值)?
2012年

在这种情况下提供的自由度是错误的!您使用假定不等方差的未池化方差。因此,使用Scatterwaite近似可以使自由度更加准确。
lzstat

7

您可以基于书中的公式(在网页上)进行计算,或者可以生成具有所述属性的随机数据(请参阅包中的mvrnorm函数MASS),并t.test在模拟数据上使用常规函数。


当您说“您可以生成具有所述属性的随机数据”时,是指模拟总体均值和标准偏差等于样本值的数据,还是在样本均值和标准偏差等于预样本的约束下进行模拟。指定值?
2012年

2
You want the simulated data to have the exact same mean(s) and var(s) as stated in the problem. One way to do this (there are many others) is to use the mvrnorm function in the MASS package (you need to set the empirical argument to TRUE).
Greg Snow

2

The question asks about R, but the issue can arise with any other statistical software. Stata for example has various so-called immediate commands, which allow calculations from summary statistics alone. See http://www.stata.com/manuals13/rttest.pdf for the particular case of the ttesti command, which applies here.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.