질문 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 및 KS-Test와 같은 일부 gof 통계와 같은 여러 측정 값을 인쇄합니다. 이들은 주로 다른 분포 (이 경우 감마 대 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