Aslında var olmayan (örneğin, tek veya ANOVA benzeri modeller iki yönlü) basit doğrusal modellerde sap varyans çok zor.
ANOVA'nın Sağlamlığı
Birincisi, diğerlerinin de belirttiği gibi, ANOVA, özellikle yaklaşık olarak dengeli verileriniz varsa (her grupta eşit sayıda gözlem), eşit varyans varsayımından sapmalara karşı inanılmaz derecede sağlamdır. Diğer taraftan, eşit varyanslar üzerindeki ön testler değildir (Levene'nin testi ders kitaplarında yaygın olarak öğretilen F testinden çok daha iyi olsa da ). George Box'un dediği gibi:
Varyanslar üzerinde ön test yapmak, bir okyanus gemisinin limandan ayrılması için koşulların yeterince sakin olup olmadığını öğrenmek için bir kürek teknesinde denize koymak gibidir!
ANOVA çok sağlam olmasına rağmen, heterossedatikliği hesaba katmak çok kolay olduğu için, bunu yapmamak için çok az neden var.
Parametrik olmayan testler
Ortalamalar arasındaki farklılıklarla gerçekten ilgileniyorsanız, parametrik olmayan testler (örneğin, Kruskal-Wallis testi) gerçekten hiçbir işe yaramaz. Onlar gruplar arasında deney farklılıkları, ama yaptıkları değil araçlarında genel deney farklılıklara yol.
Örnek veriler
Birinin ANOVA kullanmak istediği, ancak eşit varyans varsayımının doğru olmadığı basit bir veri örneği oluşturalım.
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)
Hem araçlarda hem de varyanslarda (açık) farklılıklar içeren üç grubumuz var:
stripchart(x ~ group, data=d)
ANOVA
Şaşırtıcı olmayan bir şekilde, normal bir ANOVA bunu oldukça iyi idare ediyor:
> 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
Peki, hangi gruplar farklı? Tukey'nin HSD yöntemini kullanalım:
> 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
Bir ile P 0.26-değeri, biz grup A ve B Ve biz bile arasına (araçlarında) herhangi bir fark talep edemez vermedi biz üç karşılaştırmalar yaptığını dikkate almak, bir düşük almak değildir P - değeri ( 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
Neden? Arsa dayanarak, orada olan oldukça net bir fark vardır. Bunun nedeni, ANOVA'nın her grupta eşit varyanslar alması ve ortak bir standart sapma 2.77 (tabloda 'Kalan standart hata' olarak gösterilmektedir) tahmin etmesi summary.lm
veya artık ortalama karenin kare kökünü alarak elde edebilmenizdir (7.66) ANOVA tablosunda).
Ancak A grubunun (popülasyon) standart sapması 1'dir ve 2.77'nin bu fazla tahmini, istatistiksel olarak anlamlı sonuçlar almayı (gereksiz) zorlaştırır, yani (çok) düşük güçle bir testimiz var.
Eşit olmayan varyanslara sahip 'ANOVA'
Peki, varyanslardaki farklılıkları dikkate alan uygun bir modele nasıl uyulur? R'de kolay:
> 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
Dolayısıyla, eşit sapmalar varsaymadan R'de tek yönlü basit bir 'ANOVA' çalıştırmak istiyorsanız, bu işlevi kullanın. Temelde t.test()
eşit olmayan varyanslara sahip iki örnek için (Welch) 'in bir uzantısıdır .
Ne yazık ki, çalışmaz TukeyHSD()
(veya çoğu diğer işlevleri üzerinde kullanmak aov
nesneleri) biz oldukça emin oradayız yüzden bile vardır grup farklılıkları, biz bilmiyoruz nerede olduklarını.
Değişkenliği modelleme
En iyi çözüm varyansları açıkça modellemektir. Ve R'de çok kolay:
> 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
Tabii ki hala önemli farklılıklar. Ancak şimdi A ve B grubu arasındaki farklar da istatistiksel olarak anlamlı hale gelmiştir ( 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
Yani uygun bir model kullanmak yardımcı olur! Ayrıca (göreceli) standart sapmaların tahminlerini aldığımızı da unutmayın. A grubu için tahmini standart sapma, sonuçların altında, 1.02'de bulunabilir. B grubunun tahmini standart sapması bunun 2.44 katı veya 2.48'dir ve C grubunun tahmini standart sapması benzer şekilde 3.97'dir ( intervals(mod.gls)
B ve C gruplarının bağıl standart sapmaları için güven aralıkları elde etmek için tip ).
Birden çok test için düzeltme
Ancak, çoklu testler için gerçekten düzeltmeliyiz. Bu 'multcomp' kitaplığını kullanmak kolaydır. Ne yazık ki, 'gls' nesneleri için yerleşik bir desteği yoktur, bu nedenle önce bazı yardımcı işlevler eklememiz gerekir:
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),...)
Şimdi işe başlayalım:
> 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 grubu ile B grubu arasında hala istatistiksel olarak anlamlı fark var! ☺ Ve grup araçları arasındaki farklar için (eşzamanlı) güven aralıkları bile alabiliriz:
> 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
Yaklaşık (burada tam olarak) doğru bir model kullanarak bu sonuçlara güvenebiliriz!
Bu basit örnek için, C grubuna ait verilerin A ve B grupları arasındaki farklar hakkında gerçekten herhangi bir bilgi eklemediğine dikkat edin, çünkü her grup için hem ayrı ortalamaları hem de standart sapmaları modelliyoruz. Birden fazla karşılaştırma için düzeltilmiş ikili t testlerini kullanabilirdik:
> 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
Bununla birlikte, daha karmaşık modeller, örneğin, iki yönlü modeller veya birçok öngörücüye sahip doğrusal modeller için GLS (genelleştirilmiş en küçük kareler) kullanmak ve varyans fonksiyonlarını açıkça modellemek en iyi çözümdür.
Ve varyans fonksiyonunun her grupta farklı bir sabit olması gerekmez; üzerine yapı dayatabiliriz. Örneğin, varyansı her bir grubun ortalamasının gücü olarak modelleyebiliriz (ve bu nedenle sadece bir parametreyi, üs değerini tahmin etmeliyiz ) veya belki de modeldeki yordayıcılardan birinin logaritması olarak modelleyebiliriz. Bütün bunlar GLS (ve gls()
R'de) ile çok kolaydır .
Genelleştirilmiş en küçük kareler IMHO'nun çok az kullanılan bir istatistiksel modelleme tekniğidir. Model varsayımlarından sapmalar hakkında endişelenmek yerine, bu sapmaları modelleyin !
R
, cevabımı burada okumanız size fayda sağlayabilir: Heterossedastik veriler için tek yönlü ANOVA'ya alternatifler .