감마 분포의 적합 그래프와 실제 그래프를 한 플롯에 그리는 방법은 무엇입니까?


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. 나는 선형 모델, 또는 P 값의 모델, RSS (잔류 평방 합) 같은 것을 평가하는 방법으로 내가 설정 모델의 매개 변수를 얻을 후 shapiro.test(), ks.test()다른 테스트를?

통계 지식이 부족합니다. 친절하게 도와 주실 수 있습니까?

추신 : Google, stackoverflow 및 CV에서 여러 번 검색했지만이 문제와 관련이 없습니다.


1
나는 처음 에이 질문을 stackoverflow에서 물었지만,이 질문은 CV에 속한 것처럼 보였고, 친구는 확률 질량 함수와 확률 밀도 함수를 잘못 이해했다고 말하면서 완전히 이해할 수는 없었 으므로이 질문에 다시 대답 해 주셔서 용서하십시오. CV
Ling Zhang

1
밀도 계산이 잘못되었습니다. 계산하는 간단한 방법은 h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density)입니다.

@Pascal 당신이 맞아, 나는 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 및 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

1
나는 개정 할 수 없습니다,하지만 당신은의 역 따옴표에 문제가 fitdistrplus그리고 gofstat당신의 ansewer에

2
한 줄 권장 사항 : Quantile-quantile 플롯은이 목적에 가장 적합한 단일 그래프입니다. 관찰 된 밀도와 적합 밀도를 비교하는 것은 어려운 일입니다. 예를 들어, 과학적으로 그리고 실제로는 종종 중요한 높은 값에서 체계적인 편차를 찾기가 어렵습니다.
Nick Cox

1
우리는 동의합니다. OP는 10,000 포인트로 시작합니다. 많은 문제는 훨씬 적은 것으로 시작하여 밀도에 대한 좋은 아이디어를 얻는 것은 문제가 될 수 있습니다.
Nick Cox

1
@LingZhang 적합을 비교하기 위해 AIC의 가치를 볼 수 있습니다. AIC가 가장 낮은 맞춤이 선호됩니다. 또한 Weibull과 Gamma 분포가 QQ-Plot에서 상당히 동일하다는 데 동의하지 않습니다. 와 이블 피트의 점은 특히 꼬리에서 감마 피트와 비교하여 선에 더 가깝습니다. 이에 따라,와 이블 피트에 대한 AIC는 감마 피트에 비해 작습니다.
COOLSerdash

1
똑바로 좋습니다. stats.stackexchange.com/questions/111010/… 도 참조하십시오 . 원칙은 동일합니다. 선형성과의 체계적인 편차는 문제입니다.
Nick Cox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.