フィットしたグラフとガンマ分布の実際のグラフを1つのプロットで描画する方法は?


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

適合グラフ

2つの質問があります。

  1. 実際のパラメータがありshape=2rate=0.2と私は機能を使用するパラメータfitdistr()を取得することがありますshape=2.01rate=0.20。これら2つはほぼ同じですが、フィットされたグラフが実際のポイントにうまくフィットしない理由、フィットされたグラフに問題がある、またはフィットしたグラフと実際のポイントを描画する方法がまったく間違っている、どうすればよいですか?

  2. 確立したモデルのパラメーターを取得した後、線形モデルのRSS(残差二乗和)のようなモデルを評価する方法、またはのp値shapiro.test()ks.test()およびその他のテスト

統計の知識が乏しいので、手伝ってくれませんか?

PS:Google、stackoverflow、CVで何度も検索しましたが、この問題に関連するものは何も見つかりませんでした


1
私は最初にこの質問をスタックオーバーフローで質問しましたが、この質問はCVに属しているようです、友人は確率質量関数と確率密度関数を誤解しているので、完全に把握できなかったので、この質問にもう一度回答したことを許してくださいCV
Ling Zhang

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。これは、2つの分布を近似し、それらの近似をグラフと数値で比較するために使用する方法です。このコマンドgofstatは、AIC、BIC、KS-Testなどのgof-statisticsなどのいくつかのメジャーを出力します。これらは主に、異なる分布の適合(この場合はガンマとワイブル)を比較するために使用されます。詳細については、こちらの回答をご覧ください

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プロット(右上のパネル)が適合を判断および比較するための最良の単一グラフであることを正しくアドバイスしています。適合密度は比較が困難です。完全を期すために、他のグラフィックも含めています。

はめあいを比較する

# 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
私は、改訂することはできませんが、ためにバッククォートに問題があるfitdistrplusgofstat、あなたのansewerに

2
1行の推奨:変位値-変位値プロットは、この目的に最適な単一グラフです。観測された密度と適合された密度を比較することは困難です。たとえば、体系的偏差を科学的にも実際的にも非常に重要であることが多い高い値で見つけることは困難です。
Nick Cox

1
同意してくれてうれしい。OPは10,000ポイントから始まります。多くの問題ははるかに少ない数から始まり、次に密度の良いアイデアを得ることは問題になる可能性があります。
Nick Cox

1
@LingZhangはめあいを比較するには、AICの値を確認します。最も低いAICでの適合が優先されます。また、ワイブル分布とガンマ分布がQQプロットでまったく同じであることに同意しません。ワイブルフィットのポイントは、ガンマフィットと比較して、特に尾部でラインに近くなります。同様に、ワイブルフィットのAICは、ガンマフィットに比べて小さくなっています。
COOLSerdash 2016年

1
まっすぐな方が良いです。また、stats.stackexchange.com / questions / 111010 /…も参照してください。原則は同じです。線形性からの体系的な偏差が問題です。
Nick Cox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.