7.6 变量同质性

7.6.1 问题

你想要(精确)检验样本的方差同质性(同方差,方差齐性)。许多统计检验假设总体同方差

7.6.2 方案

有许多检验方差同质性的方式,下面列出三种:

  • Bartlett’s test - 如果数据服从正态分布,这是最好地检验方法。该方法对非正态数据非常敏感,如果数据不是正态的很可能返回假阳性的结果。
  • Levene’s test - 数据偏离正态性时比 Bartlett 检验更稳定(鲁棒性更好),内置于 car
  • Fligner-Killeen test - 这是一个非参数检验,数据偏离正态是非常稳定适用。

对于所有的检验,零假设为总体方差相同(同质;不是相等的意思);备择假设是至少两组样本(总体方差)不同。

7.6.2.1 样例数据

这里的例子使用了 InsectSpraysToothGrowth 数据集。InsectSprays 数据集有一个独立变量,而 ToothGrowth 数据集有两个独立变量。

  1. head(InsectSprays)
  2. #> count spray
  3. #> 1 10 A
  4. #> 2 7 A
  5. #> 3 20 A
  6. #> 4 14 A
  7. #> 5 14 A
  8. #> 6 12 A
  9. tg <- ToothGrowth
  10. tg$dose <- factor(tg$dose) # Treat this column as a factor, not numeric
  11. head(tg)
  12. #> len supp dose
  13. #> 1 4.2 VC 0.5
  14. #> 2 11.5 VC 0.5
  15. #> 3 7.3 VC 0.5
  16. #> 4 5.8 VC 0.5
  17. #> 5 6.4 VC 0.5
  18. #> 6 10.0 VC 0.5

快速绘制数据集的箱线图:

  1. plot(count ~ spray, data = InsectSprays)

7.6 变量同质性 - 图1

  1. plot(len ~ interaction(dose, supp), data = ToothGrowth)

7.6 变量同质性 - 图2

初一看好像数据集的方差都不同质,但这需要像下面一样进行合适的检验。

7.6.2.2 Bartlett 检验

有一个独立变量:

  1. bartlett.test(count ~ spray, data = InsectSprays)
  2. #>
  3. #> Bartlett test of homogeneity of variances
  4. #>
  5. #> data: count by spray
  6. #> Bartlett's K-squared = 26, df = 5, p-value =
  7. #> 9e-05

有多个独立变量,必须使用 interaction() 函数将这些独立变量包裹为含所有因子组合的单个变量。如果不适应,那么会得到错误的自由度,因而 p 值也将是错误的。

  1. bartlett.test(len ~ interaction(supp, dose), data = ToothGrowth)
  2. #>
  3. #> Bartlett test of homogeneity of variances
  4. #>
  5. #> data: len by interaction(supp, dose)
  6. #> Bartlett's K-squared = 6.9, df = 5, p-value =
  7. #> 0.2
  8. bartlett.test(len ~ dose, data = ToothGrowth)
  9. #>
  10. #> Bartlett test of homogeneity of variances
  11. #>
  12. #> data: len by dose
  13. #> Bartlett's K-squared = 0.67, df = 2, p-value =
  14. #> 0.7

7.6.2.3 Levene 检验

leveneTest() 函数是 car 包的一部分。

有一个独立变量:

  1. library(car)
  2. #> Loading required package: carData
  3. leveneTest(count ~ spray, data = InsectSprays)
  4. #> Levene's Test for Homogeneity of Variance (center = median)
  5. #> Df F value Pr(>F)
  6. #> group 5 3.82 0.0042 **
  7. #> 66
  8. #> ---
  9. #> Signif. codes:
  10. #> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

有两个独立变量。注意这里 interaction() 函数不需要,因为该函数用于其他两个检验。

  1. leveneTest(len ~ supp * dose, data = tg)
  2. #> Levene's Test for Homogeneity of Variance (center = median)
  3. #> Df F value Pr(>F)
  4. #> group 5 1.71 0.15
  5. #> 54

7.6.2.4 Fligner-Killeen 检验

有一个独立变量:

  1. fligner.test(count ~ spray, data = InsectSprays)
  2. #>
  3. #> Fligner-Killeen test of homogeneity of
  4. #> variances
  5. #>
  6. #> data: count by spray
  7. #> Fligner-Killeen:med chi-squared = 14, df = 5,
  8. #> p-value = 0.01

当处理多个独立变量时,这个 fligner.test() 函数有跟 bartlett.test() 相同的行为。必须使用 interaction() 函数。

  1. fligner.test(len ~ interaction(supp, dose), data = ToothGrowth)
  2. #>
  3. #> Fligner-Killeen test of homogeneity of
  4. #> variances
  5. #>
  6. #> data: len by interaction(supp, dose)
  7. #> Fligner-Killeen:med chi-squared = 7.7, df = 5,
  8. #> p-value = 0.2
  9. fligner.test(len ~ dose, data = ToothGrowth)
  10. #>
  11. #> Fligner-Killeen test of homogeneity of
  12. #> variances
  13. #>
  14. #> data: len by dose
  15. #> Fligner-Killeen:med chi-squared = 1.4, df = 2,
  16. #> p-value = 0.5