R 统计学和算法

独立 t 检验

2019-11-16  本文已影响0人  热衷组培的二货潜

很荣幸能参与学习小组组织的书籍《 DISCOVERING STATISTICS USING R 》这一书籍的第九章的其中第五节的学习 ( 翻译 ),在今天截止的最后几十分钟,我们小组也成功的完成了内容的简化提炼分享,而这里记录的是我对第五节的原文初始翻译译文。加油!还有很长的时间学习。

9.5. 独立 t 检验


9.5.1. 独立 t 检验方程的解释


我们将坚持在您实验的不同条件下测试不同实体的情况。这是一种使用独立 t 检验的情况。

如果你选择不考虑 t 检验和计算 t 统计量作为回归的一种形式,那么你可以根据两个方程来考虑它,这两个方程取决于样本是否包含相同数量的人。我们可以通过使用方程( 9.1 )的数值形式来计算 t 统计量;换句话说,我们正在将模型或效果与错误进行比较。当不同的参与者在不同的条件下参与时,分数对将会不同,不仅仅是因为实验操作,还因为其他差异的来源(例如参与者动机之间的个体差异,IQ 等。)。因此,我们在每个条件的基础上进行比较( 通过查看条件中的整体效果 ):

我们现在看的不是两两得分之间的差异,而是两个样本的总体平均值之间的差异,并将它们与我们期望得到的两个样本来自的两个总体的平均值之间的差异进行比较。如果零假设为真,则样本来自同一总体。因此,在零假设下,μ1=μ2,因此,μ1−μ2=0。因此,在零假设下,方程变为:

对于独立 t 检验,我们查看组之间的差异,因此我们除以组之间差异的标准差。我们可以将抽样分布的逻辑应用于这种情况。现在,假设我们取了几对样本 —— 每对样本都包含来自两个不同群体的一个样本 —— 并比较了这些样本的平均值。从我们对抽样分布的了解中,我们知道来自一个总体的大多数样本将具有相当相似的均值。因此,如果我们采取几对样本( 来自不同的总体 ),样本均值之间的差异在不同对之间将是相似的。然而,一对样本平均值之间的差值通常会偏离很小,并且偶尔会偏离很大。如果我们可以绘制每对样本均值之间的差值的抽样分布,那么我们会发现它呈正态分布,其均值等于总体均值之间的差值 ( μ1 − μ2 ) 。抽样分布将告诉我们可以期望两个( 或更多 )样本的平均值有多大差异。和之前一样,抽样分布的标准差( 标准误差 )告诉我们样本均值之间的差异发生偶然有多大的变异。如果标准差高,那么样本均值之间的大差异可能会偶然出现;如果标准差小,则只期望样本均值之间的微小差异。因此,我们使用抽样分布的标准误差来评估两个样本均值之间的差异在统计上是有意义的还是仅仅是一个偶然结果。具体地说,我们将样本均值之间的差除以抽样分布的标准差。

那么,我们如何获得样本均值之间差异的抽样分布的标准差呢?我们使用方差和定律,它规定两个独立变量之间的差值的方差等于它们的方差之和( 例如:Howell, 2006 )。这句话的意思是,抽样分布的方差等于抽样所来自的两个总体的方差之和。我们之前看到,标准误差是总体抽样分布的标准差。我们可以使用样本标准偏差来计算每个总体的抽样分布的标准误差:

因此,记住方差只是标准差平方,我们可以计算每个抽样分布的方差:

方差和定律表示为了求差异的抽样分布的方差,我们只需将两个总体的抽样分布的方差相加:

要找出差异的抽样分布的标准误差,我们只需取方差的平方根( 因为方差是标准差的平方 ):

因此,方程式( 9.4 )变为:

只有当样本量相等时,方程式 ( 9.5 ) 才为真。在科研中,通常不可能收集相同大小的样本( 例如,因为人们可能无法完成实验 )。当我们想要比较包含不同数量参与者的两组时,方程( 9.5 )是不合适的。取而代之的是使用合并方差估计 t 检验,它通过加权每个样本的方差来考虑样本大小的差异。我们在第一章中看到,大样本比小样本好,因为它们更接近总体;因此,我们根据它所基于的样本大小来加权方差( 我们实际上是按自由度数加权,即样本大小减1 )。因此,合并方差估计为:

这只是一个加权平均值,其中每个方差乘以( 加权 )其自由度,然后我们除以权重之和( 或两个自由度之和 )。然后在 t 检验方程中替换得到的加权平均方差:

我们可以将获得的 t 值与我们期望单独在具有相同自由度的t 分布中偶然获得的最大值进行比较( 这些值可以在附录中找到 );如果我们获得的值超过这个临界值,我们可以确信这反映了我们的自变量的影响。从计算 t 的方程式中应该很明显的一件事是:对于计算它,你实际上不需要任何原始数据。你需要的就是平均值、标准差和样本量。

t 统计量的推导只是为了在我们使用 R 进行 t 检验时提供对我们正在做的事情的概念性把握。因此,如果你不知道我到底在说什么,那就别担心( 只需为我的猫想想:它必须一直听这些垃圾 ),因为 R 知道怎么做,这才是最重要的。

小插曲:

方差齐性的假设?

你可能已经读到关于方差的均匀性是由独立的 t 检验做出的假设。这是我们在回归中遇到的相同假设,如同方差假设,统计学家过去常常建议对它进行检验( 使用 Levene 检验 ),如果不符合假设,则使用调整来纠正它。然而,最近统计学家已经停止使用这种方法,原因有两个。首先,只有当您的组大小不相等时,不符合这个假设才会有影响;如果您没有不相等的组大小,那么这个假设几乎是不相关的,可以忽略不计。其次,当您有相同的群体大小和大样本时,方差的同质性检验往往非常有效( 如果你不符合假设,这并不是很重要 ),而对于不同的群体大小和较小的样本,则不能很好地工作——这正是它的重要性所在。

另外,还有一种调整( 称为 Welch’s t-test ),它能够纠正不符合这个假设的情况——如果你必须用手做这件事,这很难做到,但如果你有一台电脑,那就很容易做到了。如果你不符合假设,就会进行修正——如果你符合假设,就不会进行修正,所以你最好总是做 Welch’s t-test,忘记这个假设。如果你真的对此感兴趣,请阅读 Zimmerman(2004) 的文章。

9.5.2. 进行 独立 t 检验


我可能已经厌倦了你们中的大多数,到现在都想吃自己的腿了。方程式很无聊,这就是为什么 R 被发明来帮助我们尽量减少与它们的接触。再次使用我们的 spider 数据( spiderLong.dat ),我们有12 个蜘蛛恐惧者,他们接触了一张蜘蛛的图片,还有12个不同的蜘蛛恐惧者,他们接触到了现实生活中的狼蛛( 这些组是使用变量 Group 编码的 )。他们的焦虑是在每种情况下测量的。我已经描述了数据是如何安排的( 参见第 9.2 节 ),所以我们可以直接进行测试本身。

R’ s Soul s ’ Tip 9.2: 从均值、SDs 和 Ns 计算 t


您可以仅从两组均值、两组标准差和两组大小计算 R 中的 t检验。我们将计算:

x1 <- mean(spiderLong[spiderLong$Group=="Real Spider",]$Anxiety)

x2 <- mean(spiderLong[spiderLong$Group=="Picture",]$Anxiety)

sd1 <- sd(spiderLong[spiderLong$Group=="Real Spider",]$Anxiety)

sd2 <- sd(spiderLong[spiderLong$Group=="Picture",]$Anxiety)

n1 <- length(spiderLong[spiderLong$Group=="Real Spider",]$Anxiety)

n2 <- length(spiderLong[spiderLong$Group=="Picture",]$Anxiety)

现在我们可以通过编写和执行函数来计算 t 检验( 参见 R‘s Souls’Tip 6.2 ):

ttestfromMeans <- function(x1, x2, sd1, sd2, n1, n2)
{
df <- n1 + n2 - 2
    
poolvar <- (((n1-1)*sd1^2) + ((n2-1)*sd2^2))/df
    
t <- (x1-x2)/sqrt(poolvar*((1/n1) + (1/n2)))
    
sig <- 2*(1-(pt(abs(t),df)))
    
paste("t(df = ", df, ") = ", t, ", p = ", sig, sep = "")
}

执行这些命令创建一个名为 ttestfromMeans 的函数,该函数获取两组的均值、标准差和样本大小,并输出结果 t 检验以比较这两个均值。让我们看看函数的内容:

# 计算自由度
df <- n1 + n2 - 2 

# 计算合并方差
poolvar <- (((n1-1)*sd1^2) + ((n2-1)*sd2^2))/df 

# 计算 t 统计量
t <- (x1-x2)/sqrt(poolvar*((1/n1) + (1/n2))) 

# 计算 p-value 值
sig <- 2*(1-(pt(abs(t),df))) 

# 将结果合并到一起,并且输出到终端
paste("t(df = ", df, ") = ", t, ", p = ", sig, sep = "") 

我们现在可以对前面计算的平均值、标准偏差和样本量使用此函数:

ttestfromMeans(x1, x2, sd1, sd2, n1, n2)

结果与我们从原始数据中计算出来的结果相同( 请参见输出 9.3 ):

[1] "t(df = 22) = 1.68134561495341, p = 0.106839192382597"

9.5.2.1 独立 t 检验的一般程序


要进行独立t检验,您应该遵循以下一般程序:

我们将依次完成这些步骤。

9.5.2.2 输入数据


使用 R 进行 t 检验的奇怪之处之一是,如果您使用 t.test() 函数,实际上输入数据的方式并不重要:您可以以宽格式或长格式输入数据:这根本无关紧要,因为函数包含选项 paired = TRUE/FALSE ,这告诉它是将数据视为从属还是独立。然而,R 并不关心,所以我们将坚持惯例并以较长的格式输入数据,这是 R 所期望的。如果您在本章前面完成了自助测试,您应该已经输入了数据;如果没有,您可以输入数据,如下所示:

Group <- gl(2, 12, labels = c( "Picture", "Real Spider"))

Anxiety <- c(30, 35, 45, 40, 50, 35, 55, 25, 30, 45, 40, 50, 40, 35, 50, 55, 65, 55, 50, 35, 30, 50, 60, 39)

数据输入两列( 一列称为 Group,指定使用的是真实的蜘蛛或图片,另一列称为焦虑,表示面对图片/真实蜘蛛时的人的焦虑 )。这些命令创建了一个名为 Anxiety 的变量,其中包含 24 个焦虑分数,以及一个名为 Group 的变量,该变量使用 gl() 函数创建一个因子变量,每个组包含 12个参与者。最后,我们可以通过执行以下命令将这些变量合并到名为 spiderLongDataFrame 中:

spiderLong <- data.frame(Group, Anxiety)

9.5.2.3. 使用 R 命令器进行独立 t 检验


首先输入数据 Data → Import data → from txt file,clipboard, or URL 这个路径加载数据,点击 OK 并且选择文件 spiderLong.dat

要运行独立 t 检验,请选择统计⇒表示⇒独立样本 t 检验。详情见图 9.4 。在左侧,在标签为组的列表( 选择一个 )中,选择一个变量来区分您的两个试验组。R 期望这个变量是一个因素——在我们的数据集中只有一个,所以这个变量已经被突出显示了( 组 )。在右侧的标签为 Response Variable ( Pick One ) 的列表中,选择结果变量。R 希望这个变量是数字的,并突出显示了我们数据集中唯一的变量 Anxiety

我们的假设是双面( 或双尾 ),因此选项可以保持原样,我们希望 95% 的置信区间——尽管如果我们想要不同的置信水平,我们可以将 0.95 更改为不同的值( 例如,0.99,以获得99%的置信区间 )。最后,我们不想做出相等方差的假设:如果我们做出假设,并且我们错了,那么我们的 p值将是错误的;然而,如果我们没有在可以做出假设的时候做出假设,这并不重要,因为 p 值不会改变。要运行分析,请单击 OK 。输出在 9.5.2.6 节中描述。

9.5.2.4 探索数据和测试假设


在第 4 章中,我们看到查看数据图表总是一个好主意。在这种情况下,我们将生成一个带有误差条的折线图。

条形图应如图 9.2 所示,箱式图如图 9.5 所示。条形图显示误差条重叠,表明在数值上组间没有差异。箱式图显示,两组的分数分布相当相似,尽管真实的蜘蛛状况显示出低于中位数的分数分布比高于中位数的分数分布更宽。

要获取每个组的一些描述性统计信息,我们可以使用第 5 章中遇到的 by() 函数。请记住,此函数采用一般形式:

by(variable, group, output)

其中变量是您想要总结的东西( 在这种情况下是焦虑 ),group 是定义您想要组织输出的组( 在这种情况下是Group )的变量,而 output 是一个函数,它告诉 R 您希望看到什么输出( 即平均值 )。如果我们使用来自Pastecs 包的函数 stat.desc(),那么 R 将输出大量有用的描述性统计数据。因此,通过组合 by()stat.desc(),我们可以在单行代码中获得每个组的描述符表:

by(spiderLong$Anxiety, spiderLong$Group, stat.desc, basic = FALSE, norm =
TRUE)

输出 9.2 显示了生成的描述性统计数据。从这个输出中,我们可以看到看到蜘蛛图片的那组人的平均焦虑为 40,标准差为 9.29。此外,该组的标准误差( 抽样分布的标准偏差 )为2.68( SE = 9.293/√12 = 9.293/3.464 = 2.68)。此外,该表告诉我们,展示了真实蜘蛛的参与者的平均焦虑水平为47,标准偏差为 11.03,标准误差为 3.18( SE = 11.029/√12 = 11.029/3.464 = 3.18 )。此外,两个正态性测试都是不显著的( 对于图片组,p= 0.852,对于真实组,p = 0.621 ),这意味着我们可能可以假设模型中误差的正态性。

Output 9.2

spiderLong$Group: Picture
median mean SE.mean CI.mean.0.95 var std.dev coef.var
40.000 40.000 2.683 5.905 86.364 9.293 0.232

skewness skew.2SE kurtosis kurt.2SE normtest.W normtest.p
0.000 0.000 -1.394 -0.566 0.965 0.852
-------------------------------------------------------------------
:
spiderLong$Group: Real Spider
median mean SE.mean CI.mean.0.95 var std.dev coef.var
50.000 47.000 3.1834 7.007 121.636 11.029 0.235

skewness skew.2SE kurtosis kurt.2SE normtest.W normtest.p
-0.006 -0.004 -1.460 -0.592 0.949 0.621

9.5.2.5. 使用 R 进行独立 t 检验


使用函数 t.test() 进行 t 检验。有两种不同的方法可以使用此函数,这取决于您的组数据是位于单个列中( 如spiderLong.dat 中 ),还是位于两个不同的列中( 如spiderWide.dat 中 )。如果将不同组的数据存储在单个列中,则 t.test() 函数的使用方式与 lm() 函数类似( 换句话说,类似于回归 ):

newModel <- t.test(outcome ~ predictor, data = dataFrame, paired = FALSE/TRUE)

但是,如果将不同组的数据存储在两列中,则 t.test() 函数采用以下形式:

newModel <- t.test(scores group 1, scores group 2, paired = FALSE/TRUE)

其中,选项与以前相同,除了以下:

在这两种形式的函数中,都可以指定其他选项,但如果您愿意使用默认值,则不需要指定这些选项。它们是:

因此,我们可以对 spiderLong ( 如下所示 )中的数据执行独立的 t 检验:

  Group Anxiety
1 Picture 30
2 Picture 35
3 Picture 45
4 Picture 40
5 Picture 50
6 Picture 35
7 Picture 55
8 Picture 25
9 Picture 30
10 Picture 45
11 Picture 40
12 Picture 50
13 Real Spider 40
14 Real Spider 35
15 Real Spider 50
16 Real Spider 55
17 Real Spider 65
18 Real Spider 55
19 Real Spider 50
20 Real Spider 35
21 Real Spider 30
22 Real Spider 50
23 Real Spider 60
24 Real Spider 39

执行;

ind.t.test <- t.test(Anxiety ~ Group, data = spiderLong)

ind.t.test

它创建了一个名为 ind.t.test 的模型,该模型基于预测来自组成员( Group )的焦虑分数( Anxiety )。我们可以通过执行它的名称( 因此是第二个命令 )来查看这个模型。

或者,如果我们像 spiderWide 一样输入数据,如下所示:

  picture real
1 30 40
2 35 35
3 45 50
4 40 55
5 50 65
6 35 55
7 55 50
8 25 35
9 30 30
10 45 50
11 40 60
12 50 39

我们需要执行 t 检验:

ind.t.test <- t.test(spiderWide$real, spiderWide$picture)

ind.t.test

这些命令基于 spiderWide 数据框中的变量 realimage 创建名为 ind.t.test 的模型。和以前一样,我们通过执行它的名称来查看这个模型。

9.5.2.6 独立 t 检验的输出


无论您如何输入数据或指定 t.test() 函数,输出基本上是相同的:参见输出 9.3。首先给出 t 的值,自由度和 p 值。p 值大于 0.05,因此我们不能拒绝组之间没有差异的零假设。请注意,t 值和 p 值与我们在 9.4.2 节中作为线性模型运行分析时相同( 输出 9.1 )。p 值稍有不同,因为自由度已被调整以校正异方差。

置信区间给出了差异的范围,我们期望在 95% 的情况下包括真正的差异。间隔的范围是从−15.6 到 +1.65,这表示真正差异的可能值的范围相当宽。最后,我们给出了两组的平均值:−40 和 47( 我们已经从描述性统计中知道了这些 )。

你可能会注意到自由度很奇怪。前面我们说过,自由度是通过将两个样本大小相加,然后减去样本数量来计算的( df = N1 + N2 − 2 = 12 + 12 − 2 = 22 ); 然而,输出结果为 21.39。这种差异是因为这个函数使用 Welch’s t-test ,它不会假设方差的同质性。Welch 使用基于方差的同质性调整自由度的校正,因此我们有 21.39 个自由度,而不是22个自由度。这产生了将 p 值从 0.1068 更改为0.107 的效果,无论如何,我们都将报告为 0.107。当样本量相等时,调整不会产生太大差异。这个公式真的很大很复杂,对我来说也没什么意义,但如果你感兴趣,维基百科有它:Welch’s_t_test 的 wiki : Welch’s t test

Output 9.3

9.5.2.7 比较独立均值的精确方法


Wilcox(2005) 描述了一些比较独立团体的两种均值的精确程序。使用 5.8.4 节中的说明加载这些函数。完成此操作后,我们现在可以访问 Wilcox 的功能。无论您的数据来自相同还是不同的实体,这些函数都要求数据位于两个不同的列中( 每个实验条件对应一个列 )。我们在 spiderWide 数据中已经有了这种格式的数据。

这是 Wilcox 函数期望的格式。第一个精确函数 yuen() 基于修剪后的平均值。它采用一般形式:

yuen(scores group 1, scores group 2, tr = .2, alpha = .05)

其中:

因此,对于基于20% 修剪的独立均值检验,我们只需执行以下操作:

yuen(spiderWide$real, spiderWide$picture)

如果我们只想修剪 10% 的数据,那么我们可以执行:

yuen(spiderWide$real, spiderWide$picture, tr = .1)

如果您执行这个命令,您将看到输出 9.4,这表明基于这个精确的检验,两个蜘蛛组之间的焦虑分数没有显著差异,Ty(13.91) = 1.296,p = 0.216。

我们还可以比较修剪后的方法,但通过使用 yuenbt() 包括枚举程序,它采用一般形式:

yuenbt(scores group 1, scores group 2, tr = .2, nboot = 599, alpha = .05, side = F)

如您所见,此函数的形式与 yuen() 相同,但有两个额外的指令:

对于基于 20% 修整的独立均值的枚举检验,我们只需执行:

yuenbt(spiderWide$real, spiderWide$picture, nboot = 2000)

如果执行此命令,您将看到输出 9.4,这表明基于这个精确的检验,两个蜘蛛组之间的焦虑得分没有显著差异( 因为置信区间跨越零 ),Yt = 1.19(−5.40,17.87)。

输出 9.4

最后一种方法是通过应用 pb2gen() 函数使用 bootstrapM-estimator ( 而不是修剪后的均值 )。此函数具有一般形式:

pb2gen(spiderWide$real, spiderWide$picture, alpha = .05, nboot = 2000, est = mom)

这与 yuenbt() 相同,只是我们可以选择一个估计器 estimator ( mom 的默认值就可以)。因此,对于独立 M-estimators 的枚举检验,我们执行:

pb2gen(spiderWide$real, spiderWide$picture, nboot = 2000)

如果使用默认设置执行 pb2gen() 函数,您将看到输出9.4,这表明基于这个精确检验,两个蜘蛛组之间的焦虑得分没有显著差异(因为置信区间跨越零 ),p = 0.16。简而言之,三种强有力的方法都表明蜘蛛刺激的类型不会影响焦虑。

9.5.2.8 计算效应量


即使我们的 t 统计量在统计上不显着,这并不一定意味着我们的影响在实际中是不重要的。为了发现效果是否是实质性的,我们需要使用我们所知道的关于效应量的知识( 见第2.6.4 节 )。我将坚持使用效应量 r ,因为它被广泛理解和频繁使用。将 t 值转换为 r 值实际上非常容易;我们可以使用以下公式(例如,Rosenthal,1991;Rosnow & Rosenthal,2005):

我们从 R 输出中知道 tdf 的值,因此我们可以按如下方式计算 r

我们还可以使用 R 来计算 r ( 效应量 )。t 的值在我们的模型中存储为称为统计量 statistic[[1]] 的变量,而自由度则存储为参数 parameter[[1]] 。( 实际上,statisticparameter 可以包含许多内容,因此 ‘[[1]]’ 告诉 R 我们只想要第一个值 )。我们可以像访问任何其他变量一样访问这些值,我们告诉 R 在哪里可以找到它们( 即,模型的名称,在本例中是 ind.t.test ),然后附加一个美元符号 $ 和变量的名称。因此,我们可以通过执行以下命令来创建包含 t 值的变量 t:

t <- ind.t.test$statistic[[1]]

我们可以类似地创建一个名为 df 的变量,其中包含自由度,方法是执行以下命令:

df <- ind.t.test$parameter[[1]]

然后我们可以通过执行以下命令来计算 r

r <- sqrt(t^2/(t^2 + df))

这个命令只是上面的方程式,但在 R 语言中,它创建了一个名为 r 的变量。如果我们想要看到这个值,我们可以执行变量名,或者使用 round() 函数将它四舍五入到,比如 3位小数:

round(r, 3)

9.5.2.9 报告独立 t 检验


有一种相当标准的方式来报告任何检验统计数据:您通常声明与检验相关的发现,然后报告检验统计数据、其自由度和该检验统计数据的概率值。最近也有一项举措建议定期报告效应量的估计值。虽然效果量仍然相当零星地使用,我想让你养成良好的习惯,所以我们现在就开始考虑效应量。R 输出告诉我们,t 的值是 −1.68,它所基于的自由度数是21.39,并且在 p < 0.05 时它并不显著。我们还可以看到每个组的均值。我们可以这样写:

注意我们是如何像以前一样报告每个组中的平均值( 和标准误差 )的。对于检验统计数据,除了我必须报告 p > 0.05 之外,所有内容都与以前大致相同。

总结:独立 t 检验

上一篇下一篇

猜你喜欢

热点阅读