वास्तव में सरल रैखिक मॉडल (जैसे, एक- या दो-तरफ़ा एनोवा-जैसे मॉडल) में विषमलैंगिकता को संभालना बहुत मुश्किल नहीं है ।
एनोवा की लूट
सबसे पहले, जैसा कि दूसरों ने नोट किया है, ANOVA समान रूप से भिन्नताओं की धारणा से विचलन के लिए आश्चर्यजनक रूप से मजबूत है, खासकर यदि आपके पास लगभग संतुलित डेटा (प्रत्येक समूह में टिप्पणियों की समान संख्या) है। बराबर प्रसरण पर प्रारंभिक परीक्षण, अन्य दूसरी ओर, कर रहे हैं नहीं है (हालांकि Levene के परीक्षण बहुत से बेहतर है एफ -Test आमतौर पर पाठ्य पुस्तकों में पढ़ाया जाता है)। जॉर्ज बॉक्स के रूप में इसे रखा:
भिन्नताओं पर प्रारंभिक परीक्षण करने के लिए बल्कि समुद्र में एक नाव खेने के लिए समुद्र में डालने जैसा है ताकि यह पता लगाया जा सके कि क्या बंदरगाह को छोड़ने के लिए समुद्र लाइनर के लिए स्थितियां पर्याप्त रूप से शांत हैं!
हालांकि एनोवा बहुत मजबूत है, क्योंकि विषमता को ध्यान में रखना बहुत आसान है, ऐसा न करने का बहुत कम कारण है।
गैर पैरामीट्रिक परीक्षण
यदि आप वास्तव में साधनों में अंतर में रुचि रखते हैं , तो गैर-पैरामीट्रिक परीक्षण (जैसे, क्रुस्कल-वालिस परीक्षण) वास्तव में किसी काम के नहीं हैं। वे समूहों के बीच अंतर का परीक्षण करते हैं, लेकिन वे सामान्य परीक्षण अंतरों में नहीं करते हैं ।
उदाहरण डेटा
आइए डेटा का एक सरल उदाहरण उत्पन्न करते हैं जहां कोई एनोवा का उपयोग करना चाहेगा, लेकिन जहां समान भिन्नताओं की धारणा सही नहीं है।
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)
एनोवा
आश्चर्य की बात नहीं, एक सामान्य एनोवा इसे अच्छी तरह से संभालती है:
> 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
0.26 के P -value के साथ , हम समूह 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 तालिका में)।
लेकिन समूह ए की जनसंख्या (जनसंख्या) 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' चलाना चाहते हैं, तो समान रूपांतरों के बिना, इस फ़ंक्शन का उपयोग करें। यह मूल रूप 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
अभी भी महत्वपूर्ण अंतर, निश्चित रूप से। लेकिन अब समूह ए और बी के बीच के अंतर भी सांख्यिकीय रूप से महत्वपूर्ण हो गए हैं ( 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
तो एक उपयुक्त मॉडल का उपयोग करने से मदद मिलती है! यह भी ध्यान दें कि हमें (सापेक्ष) मानक विचलन का अनुमान मिलता है। समूह ए के लिए अनुमानित मानक विचलन, परिणाम, 1.02 के नीचे पाया जा सकता है। समूह बी का अनुमानित मानक विचलन यह 2.44 गुना या 2.48 गुना है, और समूह सी का अनुमानित मानक विचलन समान रूप से 3.97 है ( intervals(mod.gls)
समूह बी और सी के सापेक्ष मानक विचलन के लिए आत्मविश्वास अंतराल प्राप्त करने का प्रकार )।
कई परीक्षण के लिए सही है
हालांकि, हमें वास्तव में कई परीक्षण के लिए सही होना चाहिए। Comp मल्टीकम्प ’पुस्तकालय का उपयोग करना आसान है। दुर्भाग्य से, इसमें '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 *
अभी भी समूह ए और समूह बी के बीच सांख्यिकीय रूप से महत्वपूर्ण अंतर है! Inter और हम समूह साधनों के बीच अंतर के लिए (एक साथ) विश्वास अंतराल भी प्राप्त कर सकते हैं:
> 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 -ests का उपयोग कर सकते हैं :
> 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()
R में) के साथ बहुत आसान है ।
सामान्यीकृत कम से कम वर्ग IMHO एक बहुत ही अप्रयुक्त सांख्यिकीय मॉडलिंग तकनीक है। मॉडल मान्यताओं से विचलन के बारे में चिंता करने के बजाय, उन विचलन को मॉडल करें !
R
, यह आपको मेरा जवाब पढ़ने के लिए लाभ दे सकता है: विषम डेटा के लिए एक तरफ़ा एनोवा के विकल्प , जो इनमें से कुछ मुद्दों पर चर्चा करता है।