यह कैसे निर्धारित किया जाए कि कौन सा वितरण मेरे डेटा को सबसे उपयुक्त बनाता है?


133

मेरे पास एक डेटासेट है और यह पता लगाना चाहूंगा कि कौन सा वितरण मेरे डेटा को सबसे उपयुक्त मानता है।

मैंने fitdistr()ग्रहण किए गए वितरण का वर्णन करने के लिए आवश्यक मापदंडों का अनुमान लगाने के लिए फ़ंक्शन का उपयोग किया (यानी वीबुल, कॉची, सामान्य)। उन मापदंडों का उपयोग करके मैं कोलमोगोरोव-स्मिर्नोव टेस्ट का अनुमान लगा सकता हूं कि क्या मेरा नमूना डेटा मेरे वितरण के समान वितरण से है।

यदि पी-मान है> 0.05 मैं मान सकता हूं कि नमूना डेटा समान वितरण से तैयार किया गया है। लेकिन पी-वैल्यू फिट होने की भगवान के बारे में कोई जानकारी नहीं देता है, है ना?

इसलिए यदि मेरे सैंपल डेटा का पी-वैल्यू सामान्य वितरण के साथ-साथ एक वीबुल वितरण के लिए 0.05 है, तो मुझे कैसे पता चलेगा कि कौन सा वितरण मेरे डेटा को बेहतर ढंग से फिट करता है?

यह मूल रूप से मैंने क्या किया है:

> mydata
 [1] 37.50 46.79 48.30 46.04 43.40 39.25 38.49 49.51 40.38 36.98 40.00
[12] 38.49 37.74 47.92 44.53 44.91 44.91 40.00 41.51 47.92 36.98 43.40
[23] 42.26 41.89 38.87 43.02 39.25 40.38 42.64 36.98 44.15 44.91 43.40
[34] 49.81 38.87 40.00 52.45 53.13 47.92 52.45 44.91 29.54 27.13 35.60
[45] 45.34 43.37 54.15 42.77 42.88 44.26 27.14 39.31 24.80 16.62 30.30
[56] 36.39 28.60 28.53 35.84 31.10 34.55 52.65 48.81 43.42 52.49 38.00
[67] 38.65 34.54 37.70 38.11 43.05 29.95 32.48 24.63 35.33 41.34

# estimate shape and scale to perform KS-test for weibull distribution
> fitdistr(mydata, "weibull")
     shape        scale   
   6.4632971   43.2474500 
 ( 0.5800149) ( 0.8073102)

# KS-test for weibull distribution
> ks.test(mydata, "pweibull", scale=43.2474500, shape=6.4632971)

        One-sample Kolmogorov-Smirnov test

data:  mydata
D = 0.0686, p-value = 0.8669
alternative hypothesis: two-sided

# KS-test for normal distribution
> ks.test(mydata, "pnorm", mean=mean(mydata), sd=sd(mydata))

        One-sample Kolmogorov-Smirnov test

data:  mydata
D = 0.0912, p-value = 0.5522
alternative hypothesis: two-sided

वेइबुल वितरण के लिए पी-मान 0.8669 और सामान्य वितरण के लिए 0.5522 हैं। इस प्रकार मैं मान सकता हूं कि मेरा डेटा एक वेइबुल के साथ-साथ एक सामान्य वितरण का अनुसरण करता है। लेकिन कौन सा वितरण फ़ंक्शन मेरे डेटा का बेहतर वर्णन करता है?


का जिक्र करते हुए elevendollar मैं निम्नलिखित कोड मिल गया, लेकिन परिणामों की व्याख्या करने के लिए कैसे पता नहीं है:

fits <- list(no = fitdistr(mydata, "normal"),
             we = fitdistr(mydata, "weibull"))
sapply(fits, function(i) i$loglik)
       no        we 
-259.6540 -257.9268 

5
आप यह क्यों पता लगाना चाहेंगे कि कौन सा वितरण आपके डेटा को सबसे उपयुक्त मानता है?
रोलैंड

6
क्योंकि मैं दिए गए वितरण के बाद छद्म यादृच्छिक संख्या उत्पन्न करना चाहता हूं।
टोबिबो

6
आप यह जांचने के लिए KS का उपयोग नहीं कर सकते कि क्या डेटासेट से मिले मापदंडों का वितरण डेटासेट से मेल खाता है या नहीं। उदाहरण के लिए इस पृष्ठ पर # 2 देखें , प्लस विकल्प (और केएस परीक्षण भ्रामक हो सकता है अन्य तरीके)।
tpg2114

एक और चर्चा यहाँ कोड नमूने के साथ कैसे एस परीक्षण लागू करने के लिए जब पैरामीटर नमूना से अनुमान लगाया गया है पर।
अक्कल ५

1
I used the fitdistr() function ..... क्या fitdistrकार्य है? एक्सेल से कुछ? या कुछ आपने अपने आप को C में लिखा है?
भेड़िया

जवाबों:


162

सबसे पहले, यहाँ कुछ त्वरित टिप्पणियां हैं:

  • के साथ एक Kolmovorov-स्मिर्नोव-टेस्ट (एस-टेस्ट) की -values अनुमान मापदंडों काफी गलत हो जाएगा। इसलिए दुर्भाग्य से, आप सिर्फ एक वितरण फिट नहीं कर सकते हैं और फिर अपने नमूने का परीक्षण करने के लिए कोलमोगोरोव-स्मिर्नोव-टेस्ट में अनुमानित मापदंडों का उपयोग कर सकते हैं।p
  • आपका नमूना कभी भी एक विशिष्ट वितरण का बिल्कुल पालन नहीं करेगा । तो यहां तक ​​कि अगर केएस-टेस्ट से आपके वैल्यू मान्य होंगे और , तो इसका मतलब सिर्फ यह होगा कि आप इस बात से इंकार नहीं कर सकते कि आपका डेटा इस विशिष्ट वितरण का अनुसरण करता है। एक और सूत्रीकरण यह होगा कि आपका नमूना एक निश्चित वितरण के साथ संगत है। लेकिन सवाल का जवाब "क्या मेरा डेटा वितरण xy का बिल्कुल पालन करता है?" हमेशा नहीं है।p>0.05
  • यहाँ लक्ष्य यह निर्धारित करने के लिए नहीं हो सकता है कि आपका नमूना किस वितरण का अनुसरण करता है। लक्ष्य वह है जो @whuber (टिप्पणियों में) डेटा के पारमार्थिक अनुमानित विवरण कहता है । एक विशिष्ट पैरामीट्रिक वितरण डेटा के एक मॉडल के रूप में उपयोगी हो सकता है।

लेकिन चलो कुछ खोजबीन करते हैं। मैं उत्कृष्ट fitdistrplusपैकेज का उपयोग करूंगा जो वितरण फिटिंग के लिए कुछ अच्छे कार्य प्रदान करता है। हम descdistसंभावित उम्मीदवार वितरण के बारे में कुछ विचार प्राप्त करने के लिए फ़ंक्शन का उपयोग करेंगे ।

library(fitdistrplus)
library(logspline)

x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00,
38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40,
42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40,
49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60,
45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30,
36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00,
38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34)

अब उपयोग करने देता है descdist:

descdist(x, discrete = FALSE)

Descdist

आपके नमूने के कुर्तोसिस और चौड़े तिरछेपन को "ऑब्जर्वेशन" नामक एक नीले बिंदु के रूप में प्लॉट किया गया है। ऐसा लगता है कि संभावित वितरणों में वेइबुल, लोगनॉर्मल और संभवतः गामा वितरण शामिल हैं।

आइए एक वेइबुल वितरण और एक सामान्य वितरण फिट करें:

fit.weibull <- fitdist(x, "weibull")
fit.norm <- fitdist(x, "norm")

अब सामान्य के लिए फिट का निरीक्षण करें:

plot(fit.norm)

सामान्य फिट

और वीबुल फिट के लिए:

plot(fit.weibull)

वेइबुल फिट

दोनों अच्छे दिखते हैं, लेकिन क्यूक्यू-प्लॉट को देखते हुए, वेइबुल शायद थोड़ा बेहतर दिखता है, खासकर पूंछ पर। सामान्य फिट की तुलना में, वाइबुल फिट का AIC कम है:

fit.weibull$aic
[1] 519.8537

fit.norm$aic
[1] 523.3079

कोलमोगोरोव-स्मिरनोव परीक्षण सिमुलेशन

मैं n के तहत KS-आँकड़ा अनुकरण करने के लिए यहाँ समझाया गया @ अक्षल की प्रक्रिया का उपयोग करूँगा ।

n.sims <- 5e4

stats <- replicate(n.sims, {      
  r <- rweibull(n = length(x)
                , shape= fit.weibull$estimate["shape"]
                , scale = fit.weibull$estimate["scale"]
  )
  estfit.weibull <- fitdist(r, "weibull") # added to account for the estimated parameters
  as.numeric(ks.test(r
                     , "pweibull"
                     , shape= estfit.weibull$estimate["shape"]
                     , scale = estfit.weibull$estimate["scale"])$statistic
  )      
})

नकली केएस-सांख्यिकी का ईसीडीएफ निम्न प्रकार है:

plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7)
grid()

केएस-सांख्यिकी का अनुकरण किया

अंत में, हमारी एस-आँकड़ों के नकली अशक्त वितरण का उपयोग कर -value है:p

fit <- logspline(stats)

1 - plogspline(ks.test(x
                       , "pweibull"
                       , shape= fit.weibull$estimate["shape"]
                       , scale = fit.weibull$estimate["scale"])$statistic
               , fit
)

[1] 0.4889511

यह हमारे चित्रमय निष्कर्ष की पुष्टि करता है कि नमूना एक वीबुल वितरण के साथ संगत है।

जैसा कि यहाँ बताया गया है , हम अनुमानित वाइबुल पीडीएफ या सीडीएफ में पॉइंटवाइज़ विश्वास अंतराल जोड़ने के लिए बूटस्ट्रैपिंग का उपयोग कर सकते हैं:

xs <- seq(10, 65, len=500)

true.weibull <- rweibull(1e6, shape= fit.weibull$estimate["shape"]
                         , scale = fit.weibull$estimate["scale"])

boot.pdf <- sapply(1:1000, function(i) {
  xi <- sample(x, size=length(x), replace=TRUE)
  MLE.est <- suppressWarnings(fitdist(xi, distr="weibull"))  
  dweibull(xs, shape=MLE.est$estimate["shape"],  scale = MLE.est$estimate["scale"])
}
)

boot.cdf <- sapply(1:1000, function(i) {
  xi <- sample(x, size=length(x), replace=TRUE)
  MLE.est <- suppressWarnings(fitdist(xi, distr="weibull"))  
  pweibull(xs, shape= MLE.est$estimate["shape"],  scale = MLE.est$estimate["scale"])
}
)   

#-----------------------------------------------------------------------------
# Plot PDF
#-----------------------------------------------------------------------------

par(bg="white", las=1, cex=1.2)
plot(xs, boot.pdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.pdf),
     xlab="x", ylab="Probability density")
for(i in 2:ncol(boot.pdf)) lines(xs, boot.pdf[, i], col=rgb(.6, .6, .6, .1))

# Add pointwise confidence bands

quants <- apply(boot.pdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.pdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.pdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)

CI_Density

#-----------------------------------------------------------------------------
# Plot CDF
#-----------------------------------------------------------------------------

par(bg="white", las=1, cex=1.2)
plot(xs, boot.cdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.cdf),
     xlab="x", ylab="F(x)")
for(i in 2:ncol(boot.cdf)) lines(xs, boot.cdf[, i], col=rgb(.6, .6, .6, .1))

# Add pointwise confidence bands

quants <- apply(boot.cdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.cdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.cdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)
#lines(xs, min.point, col="purple")
#lines(xs, max.point, col="purple")

CI_CDF


GAMLSS के साथ स्वचालित वितरण फिटिंग

gamlssके लिए पैकेज Rप्रदान करता है कई अलग अलग वितरण कोशिश करते हैं और "सर्वश्रेष्ठ" GAIC (सामान्यीकृत Akaike जानकारी कसौटी) के अनुसार चयन करने की क्षमता। मुख्य कार्य है fitDist। इस फ़ंक्शन में एक महत्वपूर्ण विकल्प वितरण के प्रकार हैं जिन्हें आज़माया जाता है। उदाहरण के लिए, सेटिंग type = "realline"पूरे वास्तविक रेखा पर परिभाषित सभी कार्यान्वित वितरणों को आज़माएगी जबकि type = "realsplus"केवल वास्तविक सकारात्मक रेखा पर परिभाषित वितरणों को आज़माएगी। एक अन्य महत्वपूर्ण विकल्प पैरामीटर , जो GAIC के लिए दंड है। नीचे दिए गए उदाहरण में, मैंने पैरामीटर सेट किया है जिसका अर्थ है कि क्लासिक एआईसी के अनुसार "सर्वश्रेष्ठ" वितरण का चयन किया गया है। आप अपनी पसंद के किसी भी चीज़ को सेट कर सकते हैं, जैसे किkk=2klog(n)बीआईसी के लिए ।

library(gamlss)
library(gamlss.dist)
library(gamlss.add)

x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00,
       38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40,
       42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40,
       49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60,
       45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30,
       36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00,
       38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34)

fit <- fitDist(x, k = 2, type = "realplus", trace = FALSE, try.gamlss = TRUE)

summary(fit)

*******************************************************************
Family:  c("WEI2", "Weibull type 2") 

Call:  gamlssML(formula = y, family = DIST[i], data = sys.parent()) 

Fitting method: "nlminb" 


Coefficient(s):
             Estimate  Std. Error  t value   Pr(>|t|)    
eta.mu    -24.3468041   2.2141197 -10.9962 < 2.22e-16 ***
eta.sigma   1.8661380   0.0892799  20.9021 < 2.22e-16 ***

एआईसी के अनुसार, वेइबुल वितरण (अधिक विशेष रूप से WEI2, इसका एक विशेष पैरामीरीज़ेशन) डेटा को सबसे अच्छा फिट बैठता है। वितरण WEI2का सटीक पैरामीरिजेशन इस दस्तावेज में पृष्ठ 279 पर अलग किया गया है। आइए एक कृमि साजिश (मूल रूप से एक डी-ट्रेंड क्यूक्यू-प्लॉट) में अवशेषों को देखकर फिट का निरीक्षण करें :

WormPlot

हम अवशिष्ट के मध्य क्षैतिज रेखा के करीब होने की उम्मीद करते हैं और उनमें से 95% ऊपरी और निचले बिंदीदार वक्रों के बीच झूठ बोलते हैं, जो 95% बिंदुवार विश्वास अंतराल के रूप में कार्य करते हैं। इस मामले में, कृमि प्लॉट मुझे ठीक लगता है, यह दर्शाता है कि वीबुल वितरण पर्याप्त रूप से फिट है।


1
+1 अच्छा विश्लेषण। एक सवाल, हालांकि। क्या किसी विशेष प्रमुख वितरण (इस मामले में वेइबुल) के साथ संगतता पर सकारात्मक निष्कर्ष, मिश्रण वितरण की उपस्थिति की संभावना को खारिज करने की अनुमति देता है? या हमें उस विकल्प का पता लगाने के लिए एक उचित मिश्रण विश्लेषण करने और GoF की जाँच करने की आवश्यकता है?
असेम्बली में Blekh

18
@AleksandrBlekh मिश्रण को नियंत्रित करने के लिए पर्याप्त शक्ति होना असंभव है: जब मिश्रण दो लगभग समान वितरणों का होता है तो इसका पता नहीं लगाया जा सकता है और जब सभी एक घटक में बहुत छोटे अनुपात होते हैं, तो इसका पता नहीं लगाया जा सकता है। आमतौर पर (एक सिद्धांत के अभाव में जो एक वितरण रूप का सुझाव दे सकता है), एक व्यक्ति डेटा के पार्सिमन अनुमानित विवरण प्राप्त करने के लिए पैरामीट्रिक वितरण को फिट बैठता है । मिश्रण उनमें से कोई भी नहीं है: उन्हें बहुत अधिक मापदंडों की आवश्यकता होती है और उद्देश्य के लिए बहुत लचीले होते हैं
whuber

4
@whuber: +1 आपकी उत्कृष्ट व्याख्या की सराहना करता है!
अलेक्सांद्र बेलेख '

1
@ लॉरेंको मैंने कलन और फे ग्राफ को देखा। नीला बिंदु हमारे नमूने को दर्शाता है। आप देखते हैं कि बिंदु वेइबुल, लोगनॉर्मल और गामा (जो वीबुल और गामा के बीच है) की पंक्तियों के करीब है। उन वितरणों में से प्रत्येक को फिट करने के बाद, मैंने फ़ंक्शन gofstatऔर एआईसी का उपयोग करते हुए अच्छाई के-फिट आंकड़ों की तुलना की । "सबसे अच्छा" वितरण निर्धारित करने का सबसे अच्छा तरीका क्या है, इसके बारे में एक आम सहमति नहीं है। मुझे ग्राफिकल तरीके और एआईसी पसंद हैं।
COOLSerdash

1
@Lourenco क्या आप लोगनॉर्मल मतलब है? लॉजिस्टिक डिस्ट्रीब्यूशन ("+" साइन) देखे गए डेटा से काफी दूर है। Lognormal भी एक उम्मीदवार होगा जिसे मैं सामान्य रूप से देखूंगा। इस ट्यूटोरियल के लिए, मैंने पोस्ट को छोटा रखने के लिए इसे नहीं दिखाना चुना है। वेनबॉर्न वेइबुल और नॉर्मल डिस्ट्रीब्यूशन दोनों की तुलना में एक बेहतर फिट दिखाता है। AIC 537.59 है और रेखांकन भी बहुत अच्छे नहीं लगते हैं।
COOLSerdash

15

प्लॉट ज्यादातर एक बेहतर तरीका है जिससे आप यह जान सकते हैं कि आपका डेटा कैसा दिखता है। आपके मामले में, मैं आपको सैद्धांतिक मानकों के साथ अनुभवजन्य संचयी वितरण समारोह (ecdf) की साजिश रचने की सलाह दूंगा, जो आपको फिटडेसर () से मिले मापदंडों के साथ है।

मैंने अपने डेटा के लिए एक बार और आत्मविश्वास के अंतराल को भी शामिल किया। यहाँ चित्र है जो मुझे ggplot2 () का उपयोग करके मिला है।

यहां छवि विवरण दर्ज करें

काली रेखा अनुभवजन्य संचयी वितरण कार्य है और रंगीन रेखाएँ विभिन्न वितरणों से cdfs हैं जो कि अधिकतम लाइकेलिएड पद्धति का उपयोग करके मुझे प्राप्त मापदंडों के उपयोग से होती हैं। कोई भी आसानी से देख सकता है कि घातांक और सामान्य वितरण डेटा के लिए एक अच्छा फिट नहीं है, क्योंकि लाइनों का एक अलग रूप है, जो कि ecdf से है और लाइनें ecdf से काफी दूर हैं। दुर्भाग्य से अन्य distribtions काफी करीब हैं। लेकिन मैं कहूंगा कि लॉजेनॉर्मल लाइन ब्लैक लाइन के सबसे करीब है। दूरी की माप का उपयोग करना (उदाहरण के लिए MSE) एक धारणा को मान्य कर सकता है।

यदि आपके पास केवल दो प्रतिस्पर्धी वितरण हैं (उदाहरण के लिए प्लॉट में सबसे अच्छा लगता है) को चुनने के लिए, आप इस बात की जांच करने के लिए एक संभावना-अनुपात-परीक्षण का उपयोग कर सकते हैं कि कौन से वितरण बेहतर हैं।


20
CrossValidated में आपका स्वागत है! आपका उत्तर अधिक उपयोगी हो सकता है यदि आप इसे शामिल करने के लिए संपादित कर सकते हैं (ए) आप जिस कोड का उपयोग ग्राफिक का उत्पादन करने के लिए करते थे, और (बी) ग्राफिक कैसे पढ़ेगा।
Stephan Kolassa

2
वहां क्या साजिश रची जा रही है? क्या यह किसी प्रकार की घातांक-साजिश है?
Glen_b

1
लेकिन आप यह कैसे तय करते हैं कि कौन सा वितरण आपके डेटा को सबसे बेहतर बनाता है? केवल ग्राफिक के अनुसार मैं आपको यह नहीं बता सकता कि लॉगऑनॉर्मल या वेइबुल आपके डेटा को सबसे अच्छी तरह से फिट करता है या नहीं।
टोबिबो

4
यदि आप एक छद्म यादृच्छिक संख्या जनरेटर बनाना चाहते हैं तो अनुभवजन्य सीएफडी का उपयोग क्यों नहीं किया जाता है? क्या आप उन संख्याओं को आकर्षित करना चाहते हैं जो आपके देखे गए वितरण से परे हैं?
ऊँचाई कॉलर

6
अपने ग्राफ को अंकित मूल्य पर लेते हुए, ऐसा प्रतीत होता है कि आपका कोई भी उम्मीदवार वितरण डेटा को अच्छी तरह से फिट नहीं करता है। इसके अलावा, आपका ecdf 0.03 से कम समय में एक क्षैतिज स्पर्शोन्मुख प्रतीत होता है, जिसका कोई मतलब नहीं है, इसलिए मुझे यकीन नहीं है कि यह वास्तव में पहली बार में एक ecdf है।
होंग ओई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.