एक भूखंड में गामा वितरण का फिटेड ग्राफ और वास्तविक ग्राफ कैसे आकर्षित करें?


10

आवश्यक पैकेज लोड करें।

library(ggplot2)
library(MASS)

गामा वितरण के लिए फिट 10,000 संख्या उत्पन्न करें।

x <- round(rgamma(100000,shape = 2,rate = 0.2),1)
x <- x[which(x>0)]

संभावना घनत्व फ़ंक्शन ड्रा करें, माना जाता है कि हम नहीं जानते हैं कि कौन सा वितरण x फिट है।

t1 <- as.data.frame(table(x))
names(t1) <- c("x","y")
t1 <- transform(t1,x=as.numeric(as.character(x)))
t1$y <- t1$y/sum(t1[,2])
ggplot() + 
  geom_point(data = t1,aes(x = x,y = y)) + 
  theme_classic()

पीडीएफ

ग्राफ से, हम सीख सकते हैं कि x का वितरण काफी हद तक गामा वितरण की तरह है, इसलिए हम गामा वितरण के आकार और दर के मापदंडों को प्राप्त करने के लिए fitdistr()पैकेज में उपयोग करते हैं MASS

fitdistr(x,"gamma") 
##       output 
##       shape           rate    
##   2.0108224880   0.2011198260 
##  (0.0083543575) (0.0009483429)

एक ही प्लॉट में वास्तविक बिंदु (ब्लैक डॉट) और फिटेड ग्राफ (रेड लाइन) ड्रा करें, और यहां सवाल है, कृपया पहले प्लॉट देखें।

ggplot() + 
  geom_point(data = t1,aes(x = x,y = y)) +     
  geom_line(aes(x=t1[,1],y=dgamma(t1[,1],2,0.2)),color="red") + 
  theme_classic()

लगा हुआ ग्राफ

मेरे दो सवाल हैं:

  1. असली मापदंड हैं shape=2, rate=0.2, और पैरामीटर मैं फ़ंक्शन का उपयोग fitdistr()पाने के लिए कर रहे हैं shape=2.01, rate=0.20। ये दोनों लगभग समान हैं, लेकिन फिटेड ग्राफ वास्तविक बिंदु पर क्यों फिट नहीं होता है, फिट किए गए ग्राफ में कुछ गलत होना चाहिए, या जिस तरह से मैं फिट किए गए ग्राफ को खींचता हूं और वास्तविक बिंदु पूरी तरह से गलत है, मुझे क्या करना चाहिए ?

  2. बाद मैं मॉडल मैं स्थापित की पैरामीटर, जो रास्ते में मैं मॉडल, रेखीय मॉडल, या के पी-मूल्य के लिए राष्ट्रीय स्वयंसेवक संघ (अवशिष्ट वर्ग योग) की तरह कुछ का मूल्यांकन प्राप्त shapiro.test(), ks.test()और अन्य परीक्षण?

मैं सांख्यिकीय ज्ञान में गरीब हूं, क्या आप कृपया मेरी मदद कर सकते हैं?

पीएस: मैंने कई बार गूगल, स्टैकओवरफ्लो और सीवी में खोज की है, लेकिन इस समस्या से संबंधित कुछ भी नहीं मिला


1
मैंने पहली बार स्टैकओवरफ्लो में यह सवाल पूछा था, लेकिन ऐसा लग रहा था कि यह प्रश्न सीवी का है, मित्र ने कहा कि मैंने संभावना जन फ़ंक्शन और प्रायिकता घनत्व फ़ंक्शन को गलत समझा है, मैं इसे पूरी तरह से समझ नहीं सका, इसलिए मुझे इस प्रश्न का फिर से जवाब देने के लिए क्षमा करें CV
लिंग जांग

1
आपकी घनत्व की गणना गलत है। गणना करने का एक सरल तरीका है h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density)

@ पास्कल आप सही हैं, मैंने Q1 हल किया है, धन्यवाद!
लिंग जांग

नीचे उत्तर देखें, densityफ़ंक्शन एक उपयोगी है।

मैं इसे प्राप्त करता हूं, मेरे प्रश्न को संपादित करने और हल करने के लिए फिर से धन्यवाद
लिंग जांग

जवाबों:


11

प्रश्न 1

जिस तरह से आप हाथ से घनत्व की गणना करते हैं वह गलत लगता है। गामा वितरण से यादृच्छिक संख्याओं को गोल करने की कोई आवश्यकता नहीं है। जैसा कि @ पास्कल ने उल्लेख किया है, आप बिंदुओं के घनत्व की साजिश करने के लिए हिस्टोग्राम का उपयोग कर सकते हैं। नीचे दिए गए उदाहरण में, मैं फ़ंक्शन densityका उपयोग घनत्व का अनुमान लगाने और बिंदुओं के रूप में प्लॉट करने के लिए करता हूं । मैं दोनों बिंदुओं के साथ और हिस्टोग्राम के साथ फिट को प्रस्तुत करता हूं:

library(ggplot2)
library(MASS)

# Generate gamma rvs

x <- rgamma(100000, shape = 2, rate = 0.2)

den <- density(x)

dat <- data.frame(x = den$x, y = den$y)

# Plot density as points

ggplot(data = dat, aes(x = x, y = y)) + 
  geom_point(size = 3) +
  theme_classic()

गामा घनत्व

# Fit parameters (to avoid errors, set lower bounds to zero)

fit.params <- fitdistr(x, "gamma", lower = c(0, 0))

# Plot using density points

ggplot(data = dat, aes(x = x,y = y)) + 
  geom_point(size = 3) +     
  geom_line(aes(x=dat$x, y=dgamma(dat$x,fit.params$estimate["shape"], fit.params$estimate["rate"])), color="red", size = 1) + 
  theme_classic()

गामा घनत्व फिट

# Plot using histograms

ggplot(data = dat) +
  geom_histogram(data = as.data.frame(x), aes(x=x, y=..density..)) +
  geom_line(aes(x=dat$x, y=dgamma(dat$x,fit.params$estimate["shape"], fit.params$estimate["rate"])), color="red", size = 1) + 
  theme_classic()

फिट के साथ हिस्टोग्राम

यहाँ समाधान है कि @ पास्कल प्रदान किया गया है:

h <- hist(x, 1000, plot = FALSE)
t1 <- data.frame(x = h$mids, y = h$density)

ggplot(data = t1, aes(x = x, y = y)) + 
  geom_point(size = 3) +     
  geom_line(aes(x=t1$x, y=dgamma(t1$x,fit.params$estimate["shape"], fit.params$estimate["rate"])), color="red", size = 1) + 
  theme_classic()

हिस्टोग्राम घनत्व अंक

प्रश्न 2

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

library(fitdistrplus)

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.weibull <- fitdist(x, "weibull")
fit.gamma <- fitdist(x, "gamma", lower = c(0, 0))

# Compare fits 

graphically

par(mfrow = c(2, 2))
plot.legend <- c("Weibull", "Gamma")
denscomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)
qqcomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)
cdfcomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)
ppcomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)

@ न्यूकॉक्स सही सलाह देता है कि क्यूक्यू-प्लॉट (ऊपरी दाएं पैनल) फिट होने के लिए जज और तुलना करने के लिए सबसे अच्छा एकल ग्राफ है। सज्जित घनत्व की तुलना करना कठिन है। मैं अन्य ग्राफिक्स के रूप में अच्छी तरह से पूर्णता के लिए शामिल हैं।

फिट की तुलना करें

# Compare goodness of fit

gofstat(list(fit.weibull, fit.gamma))

Goodness-of-fit statistics
                             1-mle-weibull 2-mle-gamma
Kolmogorov-Smirnov statistic    0.06863193   0.1204876
Cramer-von Mises statistic      0.05673634   0.2060789
Anderson-Darling statistic      0.38619340   1.2031051

Goodness-of-fit criteria
                               1-mle-weibull 2-mle-gamma
Aikake's Information Criterion      519.8537    531.5180
Bayesian Information Criterion      524.5151    536.1795

1
मैं संशोधित नहीं कर सकता, लेकिन आपके लिए fitdistrplusऔर gofstatआपके एंकर में बैकटिक के साथ एक समस्या है

2
एक-पंक्ति की सिफारिश: क्वांटाइल-क्वांटाइल प्लॉट इस उद्देश्य के लिए सबसे अच्छा एकल ग्राफ है। मनाया और सज्जित घनत्वों की तुलना अच्छी तरह से करना कठिन है। उदाहरण के लिए, वैज्ञानिक और व्यावहारिक रूप से उच्च मूल्यों पर व्यवस्थित विचलन को देखना बहुत मुश्किल है।
निक कॉक्स

1
खुशी है कि हम सहमत हैं। ओपी की शुरुआत 10,000 अंकों से होती है। कई समस्याएं बहुत कम से शुरू होती हैं और फिर घनत्व का एक अच्छा विचार प्राप्त करना समस्याग्रस्त हो सकता है।
निक कॉक्स

1
@LingZhang फिट की तुलना करने के लिए, आप एआईसी के मूल्य को देख सकते हैं। सबसे कम एआईसी के साथ फिट को प्राथमिकता दी जाती है। इसके अलावा, मैं असहमत हूं कि क्यूब-प्लॉट में वीबुल और गामा वितरण काफी समान हैं। वेइबुल फिट के बिंदु गामा फिट के साथ लाइन के करीब हैं, खासकर पूंछ पर। इसके विपरीत, वेबुल फिट के लिए एआईसी गामा फिट की तुलना में छोटा है।
COOLSerdash

1
स्ट्रेटर बेहतर है। इसके अलावा, आँकड़े देखें ।stackexchange.com/questions/111010/ … सिद्धांत समान हैं। रैखिकता से व्यवस्थित विचलन एक समस्या है।
निक कॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.