วิธีการวาดกราฟที่พอดีและกราฟที่แท้จริงของการกระจายแกมม่าในหนึ่งแปลง?


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()

ไฟล์ PDF

จากกราฟเราสามารถเรียนรู้ว่าการแจกแจงของ 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. หลังจากที่ผมได้รับพารามิเตอร์ของรูปแบบที่ผมสร้างซึ่งในทางที่ฉันประเมินรูปแบบบางอย่างเช่น RSS (เหลือตารางรวม) สำหรับรูปแบบเชิงเส้นหรือ p-value ของshapiro.test(), ks.test()และการทดสอบอื่น ๆ ?

ฉันยากจนในความรู้ทางสถิติคุณช่วยฉันออกได้ไหม

ps: ฉันมีการค้นหาใน Google, stackoverflow และ CV หลายครั้ง แต่ไม่พบสิ่งใดที่เกี่ยวข้องกับปัญหานี้


1
ฉันถามคำถามนี้เป็นครั้งแรกใน stackoverflow แต่ดูเหมือนว่าคำถามนี้เป็นของ CV เพื่อนบอกว่าฉันเข้าใจผิดว่าฟังก์ชันความน่าจะเป็นมวลและฟังก์ชันความหนาแน่นของความน่าจะเป็นฉันเข้าใจผิดโดยสิ้นเชิงฉันไม่สามารถเข้าใจได้อย่างสมบูรณ์ CV
หลิงจาง

1
การคำนวณความหนาแน่นของคุณไม่ถูกต้อง h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density)วิธีง่ายๆในการคำนวณคือ

@ ปาสกาลคุณพูดถูกฉันได้แก้ไข Q1 แล้วขอบคุณ!
Ling Zhang

ดูคำตอบด้านล่างdensityฟังก์ชั่นเป็นประโยชน์อย่างหนึ่ง

ฉันเข้าใจแล้วขอบคุณอีกครั้งสำหรับการแก้ไขและแก้ไขคำถามของฉัน
Ling Zhang

คำตอบ:


11

คำถามที่ 1

วิธีที่คุณคำนวณความหนาแน่นด้วยมือดูเหมือนผิด ไม่จำเป็นต้องปัดเศษตัวเลขสุ่มจากการแจกแจงแกมม่า ตามที่ @Pascal ระบุไว้คุณสามารถใช้ฮิสโตแกรมเพื่อพล็อตความหนาแน่นของคะแนน ในตัวอย่างด้านล่างฉันใช้ฟังก์ชัน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()

ฮิสโตแกรมพอดี

นี่คือวิธีแก้ปัญหาที่ @Pascal จัดหาให้:

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พิมพ์มาตรการหลายอย่างเช่น AIC, BIC และ gof- สถิติบางอย่างเช่นการทดสอบ KS ฯลฯ สิ่งเหล่านี้ส่วนใหญ่จะใช้เพื่อเปรียบเทียบความเหมาะสมของการแจกแจงที่แตกต่างกัน (ในกรณีนี้แกมมากับ Weibull) ข้อมูลเพิ่มเติมสามารถพบได้ในคำตอบของฉันที่นี่ :

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)

@NickCox อย่างถูกต้องให้คำแนะนำว่า QQ-Plot (แผงด้านบนขวา) เป็นกราฟเดี่ยวที่ดีที่สุดสำหรับการตัดสินและเปรียบเทียบความพอดี ความหนาแน่นที่ติดตั้งนั้นยากที่จะเปรียบเทียบ ฉันรวมกราฟิกอื่น ๆ ด้วยเพื่อความสมบูรณ์

เปรียบเทียบพอดี

# 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
ฉันไม่สามารถแก้ไขได้ แต่คุณมีปัญหากับ backtick สำหรับfitdistrplusและgofstatใน ansewer ของคุณ

2
คำแนะนำหนึ่งบรรทัด: พล็อตควอนไทล์ควอนไทล์เป็นกราฟเดี่ยวที่ดีที่สุดสำหรับจุดประสงค์นี้ การเปรียบเทียบความหนาแน่นที่สังเกตและติดตั้งยากที่จะทำได้ดี ตัวอย่างเช่นมันยากที่จะสังเกตเห็นการเบี่ยงเบนอย่างเป็นระบบที่ค่าสูงซึ่งทางวิทยาศาสตร์และทางปฏิบัติมักมีความสำคัญมาก
Nick Cox

1
ดีใจที่เราเห็นด้วย OP เริ่มต้นด้วย 10,000 คะแนน ปัญหามากมายเริ่มต้นด้วยน้อยกว่ามากและจากนั้นรับความคิดที่ดีของความหนาแน่นอาจเป็นปัญหาได้
Nick Cox

1
@LingZhang เพื่อเปรียบเทียบความพอดีคุณสามารถดูค่าของ AIC เหมาะสมกับ AIC ที่ต่ำที่สุดเป็นที่ต้องการ นอกจากนี้ฉันไม่เห็นด้วยที่การกระจาย Weibull และ Gamma ค่อนข้างเหมือนกันใน QQ-Plot คะแนนของ Weibull นั้นอยู่ใกล้กับเส้นมากที่สุดเมื่อเทียบกับ Gamma โดยเฉพาะที่ส่วนท้าย ตามลำดับ AIC สำหรับ Weibull พอดีมีขนาดเล็กกว่าเมื่อเทียบกับ Gamma fit
COOLSerdash

1
ตรงกว่าจะดีกว่า นอกจากนี้โปรดดูstats.stackexchange.com/questions/111010/…หลักการก็เหมือนกัน ความเบี่ยงเบนเชิงระบบจากเส้นตรงเป็นปัญหา
Nick Cox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.