实际上,当数据不完全符合假设时,人们如何处理方差分析?

机器算法验证 方差分析 异方差 假设
2022-01-18 18:40:38

这不是一个严格的统计问题——我可以阅读所有关于方差分析假设的教科书——我试图弄清楚实际工作的分析师如何处理不完全符合假设的数据。我在这个网站上经历了很多问题来寻找答案,我一直在寻找关于何时不使用 ANOVA(在抽象的、理想化的数学环境中)或如何做我在 R 中描述的一些事情的帖子。 '我真的很想弄清楚人们实际上做出了什么决定以及为什么。

我正在对来自四组树(实际树,而不是统计树)的分组数据进行分析。我已经为每棵树获得了大约 35 个属性的数据,并且我正在检查每个属性以确定组在该属性上是否存在显着差异。但是,在某些情况下,由于方差不相等(根据 Levene 检验,使用 alpha=.05),稍微违反了 ANOVA 假设。

在我看来,我的选择是: 1. 对数据进行功率转换,看看它是否会改变 Levene p-val。2. 使用像 Wilcoxon 这样的非参数检验(如果是,是哪一个?)。3. 对 ANOVA 结果进行某种修正,例如 Bonferroni(我实际上不确定是否存在这样的东西?)。我已经尝试了前两个选项,得到的结果略有不同——在某些情况下,一种方法很重要,而另一种方法则不然。我害怕陷入 p 值钓鱼陷阱,我正在寻找可以帮助我证明使用哪种方法的建议。

我还阅读了一些内容,表明异方差对于方差分析来说并不是什么大问题,除非均值和方差是相关的(即它们一起增加),所以也许我可以忽略 Levene 的结果,除非我看到一个像这样的图案?如果是这样,是否对此进行了测试?

最后,我应该补充一点,我正在为发表在同行评审期刊上做这个分析,所以无论我决定采用哪种方法,都必须通过审稿人的认可。因此,如果有人可以提供指向类似的已发布示例的链接,那就太好了。

4个回答

我试图弄清楚实际工作的分析师如何处理不完全符合假设的数据。

这取决于我的需求、违反了哪些假设、以何种方式违反、有多严重、影响推理的程度,有时还取决于样本量。

我正在对来自四组树的分组数据进行分析。我已经为每棵树获得了大约 35 个属性的数据,并且我正在检查每个属性以确定组在该属性上是否存在显着差异。但是,在某些情况下,由于方差不相等(根据 Levene 检验,使用 alpha=.05),稍微违反了 ANOVA 假设。

1)如果样本量相等,那么您没有太大问题。如果 n 相等,则 ANOVA 对不同的方差非常(水平)稳健。

2)在决定是否假设它被许多研究推荐之前测试方差相等。如果您对它们是否接近相等有任何真正的疑问,最好简单地假设它们是不相等的。

一些参考资料:

Zimmerman, DW (2004),
“关于方差相等性初步检验的说明”。
兄弟。J.数学。统计。心理学。,五月; 57(第 1 部分):173-81。
http://www.ncbi.nlm.nih.gov/pubmed/15171807

Henrik在这里给出了三个参考

3)重要的是效果大小,而不是您的样本是否足够大以告诉您它们有显着差异。因此,在大样本中,Levene 检验表明方差的微小差异非常显着,但对其影响基本上没有影响。如果样本很大并且影响大小(方差比率或方差差异)非常接近应有的值,则 p 值无关紧要。(另一方面,在小样本中,一个好的大 p 值并不能让人感到舒服。无论哪种方式,测试都没有回答正确的问题。)

请注意,方差分析中对残差标准误差和 df 的估计有 Welch-Satterthwaite 类型调整,就像在两个样本 t 检验中一样。

  1. 使用像 Wilcoxon 这样的非参数测试(如果是,是哪一个?)。

如果您对位置转移替代方案感兴趣,那么您仍然假设不断传播。如果您对更通用的替代方案感兴趣,那么您可能会考虑它;与 Wilcoxon 检验等效的 k 样本是 Kruskal-Wallis 检验。

对方差分析结果进行某种校正

请参阅我上面关于考虑 Welch-Satterthwaite 的建议,这是一种“修正”。

(或者,您可以将 ANOVA 转换为一组成对的 Welch 型 t 检验,在这种情况下,您可能希望查看 Bonferroni 或类似的东西)

我还阅读了一些内容,表明异方差性对于 ANOVA 来说并不是什么大问题,除非均值和方差是相关的(即它们都一起增加)

你必须引用类似的东西。用 t-tests 查看了许多情况,我认为这不是很明显,所以我想看看他们为什么这么认为;也许这种情况在某种程度上受到了限制。不过,如果是这样就好了,因为通常广义的线性模型可以帮助解决这种情况。

最后,我应该补充一点,我正在为发表在同行评审期刊上做这个分析,所以无论我决定采用哪种方法,都必须通过审稿人的认可。

很难预测什么会让你的评论者满意。我们大多数人不使用树木。

在简单的线性模型(例如,单向或双向方差分析模型)中处理异方差实际上并不是很困难。

ANOVA 的稳健性

首先,正如其他人所指出的那样,ANOVA 对于与等方差假设的偏差具有惊人的鲁棒性,特别是如果您有大致平衡的数据(每组中的观察数量相等)。另一方面,等方差的初步测试则不是(尽管 Levene 的测试比教科书中通常教授的F测试要好得多)。正如乔治·博克斯所说:

对方差进行初步测试,就像乘划艇出海,看看情况是否足够平静,可以让一艘远洋客轮离开港口!

尽管 ANOVA 非常稳健,因为很容易考虑异方差性,但没有理由不这样做。

非参数检验

如果您真的对均值的差异感兴趣,那么非参数检验(例如,Kruskal-Wallis 检验)实际上没有任何用处。他们确实测试了组间的差异,但他们通常测试均值的差异。

示例数据

让我们生成一个简单的数据示例,其中希望使用方差分析,但方差相等的假设不成立。

set.seed(1232)
pop = data.frame(group=c("A","B","C"),
                 mean=c(1,2,5),
                 sd=c(1,3,4))
d = do.call(rbind, rep(list(pop),13))
d$x = rnorm(nrow(d), d$mean, d$sd)

我们分为三组,均值和方差都有(明显)差异:

stripchart(x ~ group, data=d)

显示示例数据的条形图。

方差分析

毫不奇怪,普通的 ANOVA 可以很好地处理这个问题:

> mod.aov = aov(x ~ group, data=d)
> summary(mod.aov)
            Df Sum Sq Mean Sq F value  Pr(>F)    
group        2  199.4   99.69   13.01 5.6e-05 ***
Residuals   36  275.9    7.66                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

那么,哪些群体不同呢?让我们使用 Tukey 的 HSD 方法:

> TukeyHSD(mod.aov)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = x ~ group, data = d)

$group
        diff        lwr      upr     p adj
B-A 1.736692 -0.9173128 4.390698 0.2589215
C-A 5.422838  2.7688327 8.076843 0.0000447
C-B 3.686146  1.0321403 6.340151 0.0046867

P值为 0.26,我们不能声称 A 组和 B 组之间有任何差异(均值)。即使我们考虑我们进行了三次比较,我们也不会得到低P -值(P  = 0.12):

> summary.lm(mod.aov)
[…]
Coefficients:
            Estimate Std. Error t value  Pr(>|t|)    
(Intercept)   0.5098     0.7678   0.664     0.511    
groupB        1.7367     1.0858   1.599     0.118    
groupC        5.4228     1.0858   4.994 0.0000153 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.768 on 36 degrees of freedom

这是为什么?根据情节,有一个非常明显的区别。原因是方差分析假设每组的方差相等,并估计一个共同的标准差为 2.77(在summary.lm表中显示为“残差标准误差”,或者您可以通过取残差均方 (7.66) 的平方根得到它)在 ANOVA 表中)。

但是 A 组的(总体)标准差为 1,而这个 2.77 的高估使得(不必要地)难以获得具有统计意义的结果,即,我们有一个(太)低功效的检验。

方差不等的“方差分析”

那么,如何拟合一个合适的模型,一个考虑到方差差异的模型呢?在 R 中很容易:

> oneway.test(x ~ group, data=d, var.equal=FALSE)
    One-way analysis of means (not assuming equal variances)

data:  x and group
F = 12.7127, num df = 2.000, denom df = 19.055, p-value = 0.0003107

因此,如果您想在 R 中运行简单的单向“ANOVA”而不假设方差相等,请使用此函数。它基本上是 (Welch) 的扩展,t.test()适用于两个方差不等的样本。

不幸的是,它不适用于TukeyHSD()(或您在对象上使用的大多数其他功能aov),因此即使我们非常确定存在差异,我们也不知道它们在哪里

建模异方差

最好的解决方案是显式地对方差建模。在 R 中这很容易:

> library(nlme)
> mod.gls = gls(x ~ group, data=d,
                weights=varIdent(form= ~ 1 | group))
> anova(mod.gls)
Denom. DF: 36 
            numDF  F-value p-value
(Intercept)     1 16.57316  0.0002
group           2 13.15743  0.0001

当然,仍然存在显着差异。但是现在 A 组和 B 组之间的差异也变得静态显着(P  = 0.025):

> summary(mod.gls)
Generalized least squares fit by REML
  Model: x ~ group
  […]
Variance function:
 Structure: Different standard
            deviations per stratum
 Formula: ~1 | group 
 Parameter estimates:
       A        B        C 
1.000000 2.444532 3.913382 

Coefficients:
               Value Std.Error  t-value p-value
(Intercept) 0.509768 0.2816667 1.809829  0.0787
groupB      1.736692 0.7439273 2.334492  0.0253
groupC      5.422838 1.1376880 4.766542  0.0000
[…]
Residual standard error: 1.015564 
Degrees of freedom: 39 total; 36 residual

因此,使用合适的模型会有所帮助!另请注意,我们得到了(相对)标准偏差的估计值。可以在结果的底部找到 A 组的估计标准偏差 1.02。B 组的估计标准差是该值的 2.44 倍,即 2.48,C 组的估计标准差同样为 3.97(键入intervals(mod.gls)以获取 B 组和 C 组的相对标准差的置信区间)。

校正多个测试

但是,我们确实应该纠正多次测试。这很容易使用“multcomp”库。不幸的是,它没有对“gls”对象的内置支持,所以我们必须先添加一些辅助函数:

model.matrix.gls <- function(object, ...)
    model.matrix(terms(object), data = getData(object), ...)
model.frame.gls <- function(object, ...)
  model.frame(formula(object), data = getData(object), ...)
terms.gls <- function(object, ...)
  terms(model.frame(object),...)

现在让我们开始工作:

> library(multcomp)
> mod.gls.mc = glht(mod.gls, linfct = mcp(group = "Tukey"))
> summary(mod.gls.mc)
[…]
Linear Hypotheses:
           Estimate Std. Error z value Pr(>|z|)    
B - A == 0   1.7367     0.7439   2.334   0.0480 *  
C - A == 0   5.4228     1.1377   4.767   <0.001 ***
C - B == 0   3.6861     1.2996   2.836   0.0118 *  

A组和B组之间仍有统计学差异!☺ 我们甚至可以获得(同时)组均值差异的置信区间:

> confint(mod.gls.mc)
[…]
Linear Hypotheses:
           Estimate lwr     upr    
B - A == 0 1.73669  0.01014 3.46324
C - A == 0 5.42284  2.78242 8.06325
C - B == 0 3.68615  0.66984 6.70245

使用近似(这里完全)正确的模型,我们可以相信这些结果!

请注意,对于这个简单的示例,C 组的数据并没有真正添加关于 A 组和 B 组之间差异的任何信息,因为我们对每个组的单独均值和标准差都进行了建模。我们可以只使用成对的t检验校正多重比较:

> pairwise.t.test(d$x, d$group, pool.sd=FALSE)
    Pairwise comparisons using t tests with non-pooled SD 

data:  d$x and d$group 

  A       B      
B 0.03301 -      
C 0.00098 0.02032

P value adjustment method: holm 

然而,对于更复杂的模型,例如双向模型或具有许多预测变量的线性模型,使用 GLS(广义最小二乘法)和显式建模方差函数是最佳解决方案。

并且方差函数不必简单地是每组中不同的常数;我们可以对其施加结构。例如,我们可以将方差建模为每组均值的幂(因此只需要估计一个参数,即指数),或者可能是模型中预测变量之一的对数。gls()使用 GLS(以及在 R 中),所有这些都非常容易。

广义最小二乘法是恕我直言,一种未被充分利用的统计建模技术。不必担心与模型假设的偏差,而是对这些偏差进行建模!

  1. 确实可能对您的数据进行了一些转换,从而产生可接受的正态分布。当然,现在您的推断是关于转换后的数据,而不是未转换的数据。

  2. 假设您谈论的是单向方差分析,Kruskal-Wallis检验是单向方差分析的适当非参数模拟。邓恩检验(不是普通等级和检验)可能是适用于事后成对多重比较的最常见的非参数检验,尽管还有其他检验,例如 Conover-Iman 检验(严格来说比拒绝后的邓恩检验更强大) kruskal-Wallis) 和 Dwass-Steele-Crichtlow-Fligner 检验。

  3. 多重比较程序(无论是全族错误率变化还是错误发现率变化)与您的特定测试假设(例如,数据的正态性)没有任何直接关系,而是与的含义有关(愿意对零假设做出错误的拒绝),因为您正在执行多个测试。α

ANOVA 基于组内和组间方差的比率。我不完全确定您在这种情况下所说的异方差是什么意思,但是如果您指的是组之间的不等方差,那么在我看来,这似乎从根本上打破了检验零假设的逻辑。

一个简单的 Google Scholar 查询“Dunn's test”以及您所在学科的通用术语应该会返回大量已发布的示例。


参考

Conover, WJ 和 Iman, RL (1979)。关于多重比较程序技术报告 LA-7677-MS,洛斯阿拉莫斯科学实验室。

Crichtlow, DE 和 Fligner, MA (1991)。关于单向方差分析中的无分布多重比较统计通讯——理论与方法,20(1):127。

邓恩,OJ (1964)。使用秩和的多重比较技术计量学,6(3):241-252

在我看来,你好像在做步法并尽力而为,但担心你的努力不足以让你的论文通过审稿人。非常现实世界的问题。我认为所有研究人员都在努力应对那些看似临界甚至坦率地不时违反假设的分析。毕竟有数以百万计的文章评估了例如在 3 小组小鼠中的治疗效果,每组大约有 6-7 只小鼠。如何知道在这样的论文中是否满足 Anova 假设!

我已经阅读了大量的论文,尤其是在心血管病理生理学领域,实际上我从来没有 100% 确定我是否可以相信我阅读的一篇文章中的数据。但对于我作为审稿人来说,我实际上倾向于认为问题可能出现在科学的许多层面上,以至于深入挖掘统计数据可能没有什么意义——毕竟,整个数据集都是可以捏造的,我永远不会一百万年后才能说出来。因此,在这一工作领域中始终存在信任元素,研究人员绝不能滥用。

我给出的最现实的建议是,您需要在提交之前仔细考虑所有内容,并确保您能够如实回答审稿人提出的任何问题。只要你尽力了,你的意图是诚实的,你晚上睡得很好,我认为你应该没问题。