Levene使用平方残差进行测试

时间:2014-03-14 05:01:59

标签: r r-car

Levene的测试如何使用平方残差而不是绝对值来执行?

我在levene.test包中尝试了lawstat,在leveneTest包中尝试了car,它们都使用绝对残差。

目的是重现SAS输出,默认情况下使用平方残差。

1 个答案:

答案 0 :(得分:3)

iris.lm <- lm(Petal.Width ~ Species, data = iris)
anova(lm(residuals(iris.lm)^2 ~ iris$Species))
## Analysis of Variance Table
## 
## Response: residuals(iris.lm)^2
##               Df Sum Sq Mean Sq F value  Pr(>F)    
## iris$Species   2  0.100  0.0500    14.8 1.4e-06 ***
## Residuals    147  0.497  0.0034                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

或许有助于了解其工作原理。

正如here指出的那样,Levene的测试只是每个观察与其中心之间距离的ANOVA。 Levene测试的不同实现因“距离”和“中心”的定义而不同。

“距离”可以表示绝对差异,或平均差异。

“中心”可以表示平均值或中位数。

SAS默认使用平方差异和平均值。 R的leveneTest包中的car仅使用绝对差异,默认使用中位数。 levene.test包中的lawstat也是如此。

所有四种可能的组合都可以手动完成,如下所示。

require(plyr)
x <- ddply(iris, .(Species), summarize
            , abs.mean = abs(Petal.Width - mean(Petal.Width))
            , abs.median = abs(Petal.Width - median(Petal.Width))
            , squared.mean = (Petal.Width - mean(Petal.Width))^2
            , squared.median = (Petal.Width - median(Petal.Width))^2)

anova(lm(abs.mean ~ Species, data = x)) # Levene's test
## Analysis of Variance Table
## 
## Response: abs.mean
##            Df Sum Sq Mean Sq F value  Pr(>F)    
## Species     2   0.53  0.2648    19.6 2.7e-08 ***
## Residuals 147   1.98  0.0135                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

anova(lm(abs.median ~ Species, data = x)) # Brown-Forsythe test
## Analysis of Variance Table
## 
## Response: abs.median
##            Df Sum Sq Mean Sq F value  Pr(>F)    
## Species     2  0.642   0.321    19.9 2.3e-08 ***
## Residuals 147  2.373   0.016                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

anova(lm(squared.mean ~ Species, data = x)) # default SAS Levene's Test
## Analysis of Variance Table
## 
## Response: squared.mean
##            Df Sum Sq Mean Sq F value  Pr(>F)    
## Species     2  0.100  0.0500    14.8 1.4e-06 ***
## Residuals 147  0.497  0.0034                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

anova(lm(squared.median ~ Species, data = x)) # Who-Knows-Whose Test
## Analysis of Variance Table
## 
## Response: squared.median
##            Df Sum Sq Mean Sq F value  Pr(>F)    
## Species     2  0.096  0.0478    13.6 3.7e-06 ***
## Residuals 147  0.515  0.0035                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

要显示上面的前两个重现leveneTest:

require(car)
leveneTest(Petal.Width ~ Species, data = iris, center = mean)
## Levene's Test for Homogeneity of Variance (center = mean)
##        Df F value  Pr(>F)    
## group   2    19.6 2.7e-08 ***
##       147                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

leveneTest(Petal.Width ~ Species, data = iris, center = median)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value  Pr(>F)    
## group   2    19.9 2.3e-08 ***
##       147                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

由于人们通常会有一个线性模型来处理准备好的残差(平均值),所以它通常更方便

iris.lm <- lm(Petal.Width ~ Species, data = iris)
anova(lm(residuals(iris.lm)^2 ~ iris$Species))
## Analysis of Variance Table
## 
## Response: residuals(iris.lm)^2
##               Df Sum Sq Mean Sq F value  Pr(>F)    
## iris$Species   2  0.100  0.0500    14.8 1.4e-06 ***
## Residuals    147  0.497  0.0034                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

因此顶部的答案。