Làm thế nào để vẽ biểu đồ được trang bị và biểu đồ phân phối gamma thực tế trong một ô?


10

Tải gói cần thiết.

library(ggplot2)
library(MASS)

Tạo 10.000 số được trang bị để phân phối gamma.

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

Vẽ hàm mật độ xác suất, giả sử chúng ta không biết phân phối x nào phù hợp.

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

Từ biểu đồ, chúng ta có thể biết rằng phân phối của x khá giống phân phối gamma, vì vậy chúng ta sử dụng fitdistr()trong gói MASSđể có được các tham số về hình dạng và tốc độ phân phối gamma.

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

Vẽ điểm thực tế (chấm đen) và biểu đồ được trang bị (đường màu đỏ) trong cùng một ô, và đây là câu hỏi, vui lòng xem sơ đồ trước.

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

đồ thị phù hợp

Tôi có hai câu hỏi:

  1. Các tham số thực là shape=2, rate=0.2và các tham số tôi sử dụng hàm fitdistr()để có được shape=2.01, rate=0.20. Hai biểu đồ này gần giống nhau, nhưng tại sao biểu đồ được trang bị không khớp với điểm thực tế, phải có điều gì đó sai trong biểu đồ được trang bị hoặc cách tôi vẽ biểu đồ được trang bị và các điểm thực tế là hoàn toàn sai, tôi nên làm gì ?

  2. Sau khi tôi nhận được các tham số của mô hình tôi thành lập, trong đó cách tôi đánh giá các mô hình, một cái gì đó như RSS (dư tổng vuông) cho mô hình tuyến tính, hoặc p-giá trị shapiro.test(), ks.test()và thử nghiệm khác?

Tôi kém về kiến ​​thức thống kê, bạn có thể vui lòng giúp tôi không?

ps: Tôi đã tìm kiếm trong Google, stackoverflow và CV nhiều lần, nhưng không tìm thấy gì liên quan đến vấn đề này


1
Lần đầu tiên tôi hỏi câu hỏi này trong stackoverflow, nhưng dường như câu hỏi này thuộc về CV, người bạn nói tôi đã hiểu nhầm hàm xác suất và hàm mật độ xác suất, tôi không thể nắm bắt được hoàn toàn, vì vậy hãy tha thứ cho tôi vì đã trả lời lại câu hỏi này CV
Ling Zhang

1
Tính toán mật độ của bạn là không chính xác. Một cách đơn giản để tính toán là h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density).

@Pascal bạn nói đúng, tôi đã giải quyết Q1, cảm ơn bạn!
Ling Zhang

Xem câu trả lời dưới đây, densitychức năng là một trong những hữu ích.

Tôi hiểu rồi, cảm ơn bạn lần nữa vì đã chỉnh sửa và giải quyết câu hỏi của tôi
Ling Zhang

Câu trả lời:


11

Câu hỏi 1

Cách bạn tính mật độ bằng tay có vẻ sai. Không cần làm tròn số ngẫu nhiên từ phân phối gamma. Như @Pascal đã lưu ý, bạn có thể sử dụng biểu đồ để vẽ mật độ của các điểm. Trong ví dụ dưới đây, tôi sử dụng hàm densityđể ước tính mật độ và vẽ nó dưới dạng các điểm. Tôi trình bày sự phù hợp cả với các điểm và với biểu đồ:

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

Mật độ gamma

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

Mật độ gamma phù hợp

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

Biểu đồ phù hợp

Đây là giải pháp mà @Pascal cung cấp:

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

Điểm mật độ biểu đồ

Câu hỏi 2

Để đánh giá mức độ tốt của sự phù hợp, tôi khuyên bạn nên gói fitdistrplus. Dưới đây là cách nó có thể được sử dụng để phù hợp với hai bản phân phối và so sánh sự phù hợp của chúng về mặt đồ họa và số. Lệnh gofstatin ra một số biện pháp, chẳng hạn như AIC, BIC và một số thống kê gof như Kiểm tra KS, v.v. Chúng chủ yếu được sử dụng để so sánh sự phù hợp của các bản phân phối khác nhau (trong trường hợp này là gamma so với Weibull). Thêm thông tin có thể được tìm thấy trong câu trả lời của tôi ở đây :

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 khuyên một cách đúng đắn rằng QQ-Plot (bảng trên bên phải) là biểu đồ đơn tốt nhất để đánh giá và so sánh sự phù hợp. Mật độ được trang bị là khó để so sánh. Tôi bao gồm các đồ họa khác cũng vì mục đích hoàn chỉnh.

So sánh phù hợp

# 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
Tôi không thể sửa đổi, nhưng bạn gặp vấn đề với backtick cho fitdistrplusgofstattrong ansewer của bạn

2
Đề xuất một dòng: biểu đồ lượng tử - lượng tử là biểu đồ đơn tốt nhất cho mục đích này. So sánh mật độ quan sát và trang bị là khó để làm tốt. Ví dụ, thật khó để phát hiện những sai lệch có hệ thống ở các giá trị cao mà về mặt khoa học và thực tế thường rất quan trọng.
Nick Cox

1
Vui mừng chúng tôi đồng ý. OP bắt đầu với 10.000 điểm. Nhiều vấn đề bắt đầu với ít hơn rất nhiều và sau đó nhận được một ý tưởng tốt về mật độ có thể là vấn đề.
Nick Cox

1
@LingZhang Để so sánh sự phù hợp, bạn có thể xem giá trị của AIC. Phù hợp với AIC thấp nhất được ưa thích. Ngoài ra, tôi không đồng ý rằng bản phân phối Weibull và Gamma hoàn toàn giống nhau trong QQ-Plot. Các điểm của phù hợp Weibull gần với đường thẳng hơn so với phù hợp Gamma, đặc biệt là ở đuôi. Tương ứng, AIC cho phù hợp Weibull nhỏ hơn so với phù hợp Gamma.
COOLSerdash

1
Dây đai tốt hơn. Ngoài ra, hãy xem stats.stackexchange.com/questions/111010/ Khăn Các nguyên tắc là như nhau. Độ lệch hệ thống từ tuyến tính là một vấn đề.
Nick Cox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.