どの分布がデータに最も適しているかを判断する方法は?


133

データセットがあり、どの分布がデータに最も適しているかを把握したいと思います。

fitdistr()関数を使用して、必要なパラメーターを推定し、想定される分布(つまり、ワイブル、コーシー、正規)を記述しました。これらのパラメーターを使用して、コルモゴロフ・スミルノフ検定を実施して、サンプルデータが想定分布と同じ分布からのものかどうかを推定できます。

p値が0.05より大きい場合、サンプルデータは同じ分布から引き出されたと仮定できます。しかし、p値は適合度に関する情報を提供しませんよね?

したがって、サンプルデータのp値がワイブル分布と同様に正規分布で0.05を超える場合、どの分布がデータに適合するかをどのように知ることができますか?

これは基本的に私がやったことです:

> mydata
 [1] 37.50 46.79 48.30 46.04 43.40 39.25 38.49 49.51 40.38 36.98 40.00
[12] 38.49 37.74 47.92 44.53 44.91 44.91 40.00 41.51 47.92 36.98 43.40
[23] 42.26 41.89 38.87 43.02 39.25 40.38 42.64 36.98 44.15 44.91 43.40
[34] 49.81 38.87 40.00 52.45 53.13 47.92 52.45 44.91 29.54 27.13 35.60
[45] 45.34 43.37 54.15 42.77 42.88 44.26 27.14 39.31 24.80 16.62 30.30
[56] 36.39 28.60 28.53 35.84 31.10 34.55 52.65 48.81 43.42 52.49 38.00
[67] 38.65 34.54 37.70 38.11 43.05 29.95 32.48 24.63 35.33 41.34

# estimate shape and scale to perform KS-test for weibull distribution
> fitdistr(mydata, "weibull")
     shape        scale   
   6.4632971   43.2474500 
 ( 0.5800149) ( 0.8073102)

# KS-test for weibull distribution
> ks.test(mydata, "pweibull", scale=43.2474500, shape=6.4632971)

        One-sample Kolmogorov-Smirnov test

data:  mydata
D = 0.0686, p-value = 0.8669
alternative hypothesis: two-sided

# KS-test for normal distribution
> ks.test(mydata, "pnorm", mean=mean(mydata), sd=sd(mydata))

        One-sample Kolmogorov-Smirnov test

data:  mydata
D = 0.0912, p-value = 0.5522
alternative hypothesis: two-sided

p値は、ワイブル分布では0.8669、正規分布では0.5522です。したがって、私のデータはワイブル分布と正規分布に従うと仮定できます。しかし、どの分布関数が私のデータをよりよく説明していますか?


elevendollarを参照すると、次のコードが見つかりましたが、結果の解釈方法がわかりません。

fits <- list(no = fitdistr(mydata, "normal"),
             we = fitdistr(mydata, "weibull"))
sapply(fits, function(i) i$loglik)
       no        we 
-259.6540 -257.9268 

5
どの分布がデータに最も適しているかを知りたいのはなぜですか?
ローランド

6
与えられた分布に従って擬似乱数を生成したいからです。
トビボ

6
KSを使用して、データセットから見つかったパラメーターを持つ分布がデータセットと一致するかどうかを確認することはできません。たとえば、このページの#2に加えて、代替手段(およびKSテストが誤解を招く可能性がある他の方法)を参照してください。
tpg2114

別の議論ここでのパラメータはサンプルから推定されたときKSテストを適用する方法のコードサンプルで。
アクサカル

1
I used the fitdistr() function ..... fitdistr機能は何ですか?Excelからの何か?それとも、Cで自分で書いたものですか?
wolfies

回答:


162

まず、簡単なコメントを次に示します。

  • 推定パラメーターを使用したKolmovorov-Smirnov-Test(KS-Test)の値は非常に間違っています。残念ながら、分布を近似してから、Kolmogorov-Smirnov-Testの推定パラメーターを使用してサンプルをテストすることはできません。p
  • サンプルが特定の分布に正確に従うことはありません。したがって、KSテストの値が有効でを場合でも、データがこの特定の分布に従うことを除外できないことを意味します。別の定式化は、サンプルが特定の分布と互換性があることです。しかし、「私のデータは分布xyに正確に従っていますか?」という質問に対する答えは?常にノーです。p>0.05
  • ここでの目標は、サンプルがどの分布に従うかを確実に決定することではありません。目標は、@ whuber(コメント内)がデータの控えめな近似説明と呼ぶものです。特定のパラメトリック分布を持つことは、データのモデルとして役立ちます。

しかし、いくつかの調査をしましょう。fitdistrplus分布フィッティングにいくつかの素晴らしい機能を提供する優れたパッケージを使用します。この関数descdistを使用して、可能な候補の分布に関するいくつかのアイデアを獲得します。

library(fitdistrplus)
library(logspline)

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)

今すぐ使用できますdescdist

descdist(x, discrete = FALSE)

Descdist

サンプルの尖度と二乗の歪度は、「観測」という名前の青い点としてプロットされます。可能な分布には、ワイブル分布、対数正規分布、およびおそらくガンマ分布が含まれているようです。

ワイブル分布と正規分布を適合させましょう:

fit.weibull <- fitdist(x, "weibull")
fit.norm <- fitdist(x, "norm")

次に、法線の適合を検査します。

plot(fit.norm)

ノーマルフィット

そして、ワイブル近似の場合:

plot(fit.weibull)

ワイブルフィット

どちらも見た目は良いが、QQプロットで判断すると、ワイブルは、特に尾部で少し良く見えるかもしれません。同様に、ワイブル近似のAICは通常の近似と比較して低くなります。

fit.weibull$aic
[1] 519.8537

fit.norm$aic
[1] 523.3079

コルモゴロフ-スミルノフテストシミュレーション

ここで説明する @Aksakalの手順を使用して、ヌルの下でKS統計をシミュレートします。

n.sims <- 5e4

stats <- replicate(n.sims, {      
  r <- rweibull(n = length(x)
                , shape= fit.weibull$estimate["shape"]
                , scale = fit.weibull$estimate["scale"]
  )
  estfit.weibull <- fitdist(r, "weibull") # added to account for the estimated parameters
  as.numeric(ks.test(r
                     , "pweibull"
                     , shape= estfit.weibull$estimate["shape"]
                     , scale = estfit.weibull$estimate["scale"])$statistic
  )      
})

シミュレートされたKS統計のECDFは次のようになります。

plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7)
grid()

シミュレートされたKS統計

最後に、KS統計のシミュレートされたヌル分布を使用した値は次のとおりです。p

fit <- logspline(stats)

1 - plogspline(ks.test(x
                       , "pweibull"
                       , shape= fit.weibull$estimate["shape"]
                       , scale = fit.weibull$estimate["scale"])$statistic
               , fit
)

[1] 0.4889511

これは、サンプルがワイブル分布と互換性があるというグラフィカルな結論を確認します。

ここで説明したように、ブートストラップを使用して、推定ワイブルPDFまたはCDFに点ごとの信頼区間を追加できます。

xs <- seq(10, 65, len=500)

true.weibull <- rweibull(1e6, shape= fit.weibull$estimate["shape"]
                         , scale = fit.weibull$estimate["scale"])

boot.pdf <- sapply(1:1000, function(i) {
  xi <- sample(x, size=length(x), replace=TRUE)
  MLE.est <- suppressWarnings(fitdist(xi, distr="weibull"))  
  dweibull(xs, shape=MLE.est$estimate["shape"],  scale = MLE.est$estimate["scale"])
}
)

boot.cdf <- sapply(1:1000, function(i) {
  xi <- sample(x, size=length(x), replace=TRUE)
  MLE.est <- suppressWarnings(fitdist(xi, distr="weibull"))  
  pweibull(xs, shape= MLE.est$estimate["shape"],  scale = MLE.est$estimate["scale"])
}
)   

#-----------------------------------------------------------------------------
# Plot PDF
#-----------------------------------------------------------------------------

par(bg="white", las=1, cex=1.2)
plot(xs, boot.pdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.pdf),
     xlab="x", ylab="Probability density")
for(i in 2:ncol(boot.pdf)) lines(xs, boot.pdf[, i], col=rgb(.6, .6, .6, .1))

# Add pointwise confidence bands

quants <- apply(boot.pdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.pdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.pdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)

CI_密度

#-----------------------------------------------------------------------------
# Plot CDF
#-----------------------------------------------------------------------------

par(bg="white", las=1, cex=1.2)
plot(xs, boot.cdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.cdf),
     xlab="x", ylab="F(x)")
for(i in 2:ncol(boot.cdf)) lines(xs, boot.cdf[, i], col=rgb(.6, .6, .6, .1))

# Add pointwise confidence bands

quants <- apply(boot.cdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.cdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.cdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)
#lines(xs, min.point, col="purple")
#lines(xs, max.point, col="purple")

CI_CDF


GAMLSSを使用した自動分布フィッティング

gamlss以下のためのパッケージはR、多くの異なるディストリビューションを試してみて、GAIC(一般赤池情報量基準)によると、「最高」を選択する機能を提供しています。主な機能はfitDistです。この関数の重要なオプションは、試行される分布のタイプです。たとえば、設定type = "realline"すると、実ライン全体で定義されたすべての実装された分布が試行type = "realsplus"されますが、実際の正ラインで定義された分布のみが試行されます。もう1つの重要なオプションは、GAICのペナルティであるパラメーターです。以下の例では、パラメータを設定します。これは、古典的なAICに従って「最適な」分布が選択されることを意味します。次のように、を任意の値に設定できます。kk=2klog(n)BICの。

library(gamlss)
library(gamlss.dist)
library(gamlss.add)

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 <- fitDist(x, k = 2, type = "realplus", trace = FALSE, try.gamlss = TRUE)

summary(fit)

*******************************************************************
Family:  c("WEI2", "Weibull type 2") 

Call:  gamlssML(formula = y, family = DIST[i], data = sys.parent()) 

Fitting method: "nlminb" 


Coefficient(s):
             Estimate  Std. Error  t value   Pr(>|t|)    
eta.mu    -24.3468041   2.2141197 -10.9962 < 2.22e-16 ***
eta.sigma   1.8661380   0.0892799  20.9021 < 2.22e-16 ***

AICによれば、ワイブル分布(より具体的にはWEI2、その特別なパラメーター化)はデータに最もよく適合します。分布の正確なパラメータ化については、279ページのこのドキュメントWEI2詳しく説明します。ワームプロット(基本的にはトレンド除去されたQQプロット)の残差を見て、適合性を調べましょう。

ワームプロット

残差は中央の水平線に近く、95%が点線の上下曲線の間にあり、95%の点ごとの信頼区間として機能すると予想されます。この場合、ワームプロットは見た目が良く、ワイブル分布が適切に適合していることを示しています。


1
+1ニース分析。ただし、1つの質問です。特定の主要な分布(この場合はワイブル)との互換性に関する肯定的な結論により、混合分布が存在する可能性を排除できますか?または、適切な混合分析を実行し、GoFをチェックしてそのオプションを除外する必要がありますか?
アレクサンドルブレフ

18
@AleksandrBlekh混合物を除外するのに十分な力を持つことは不可能です:混合物が2つのほぼ同一の分布である場合、それは検出できず、1つを除くすべてのコンポーネントの割合が非常に小さい場合も検出できません。通常(分布形式を示唆する理論がない場合)、データのpar約的記述を達成するために、パラメトリック分布に適合します。混合物はそれらのどれでもありません:それらはあまりにも多くのパラメーターを必要とし、目的に対して柔軟性が高すぎます。
whuber

4
@whuber:+1 すばらしい説明を感謝します!
アレクサンドルブレフ

1
@Lourencoカレンとフェイのグラフを見ました。青い点はサンプルを示しています。ポイントは、ワイブル、対数正規、およびガンマ(ワイブルとガンマの間にある)の線に近いことがわかります。これらの各分布を近似した後、関数gofstatとAIC を使用して適合度統計を比較しました。「最良の」分布を決定するための最良の方法が何であるかについてのコンセンサスはありません。グラフィカルな方法とAICが好きです。
COOLSerdash

1
@Lourenco対数正規のことですか?ロジスティック分布(「+」記号)は、観測データからかなり離れています。対数正規分布は、私が通常見ている候補でもあります。このチュートリアルでは、投稿を短くするために表示しないことを選択しました。対数正規分布は、ワイブル分布と正規分布の両方に比べて適合度が低くなっています。AICは537.59であり、グラフも見栄えがよくありません。
COOLSerdash

15

プロットは、ほとんどの場合、データがどのように見えるかをよりよく理解するための良い方法です。あなたの場合、fitdistr()から取得したパラメーターを使用して、理論累積分布関数に対して経験累積分布関数(ecdf)をプロットすることをお勧めします。

私は自分のデータに対して一度それを行い、信頼区間も含めました。これは、ggplot2()を使用して得た写真です。

ここに画像の説明を入力してください

黒い線は経験的累積分布関数であり、色付きの線は最尤法を使用して取得したパラメーターを使用した異なる分布の累積分布関数です。指数分布と正規分布はデータに適していません。これは、線がecdfとは異なる形式であり、線がecdfからかなり離れているためです。残念ながら、他のディストリビューションは非常に近いものです。しかし、logNormalラインは黒いラインに最も近いと言えます。距離の尺度(MSEなど)を使用すると、仮定を検証できます。

競合する分布が2つしかない場合(たとえば、プロットに最適な分布を選択する場合)、Likelihood-Ratio-Testを使用して、どの分布がより適切かをテストできます。


20
CrossValidatedへようこそ!(a)グラフィックの作成に使用したコード、および(b)グラフィックの読み方を含めるように編集できる場合、答えはより便利です。
ステファンKolassa

2
そこで何がプロットされていますか?それはある種の指数プロットですか?
Glen_b

1
しかし、どの分布がデータに最も適しているかをどのように決定しますか?グラフィックによると、logNormalまたはweibullがデータに最も適しているかどうかはわかりません。
トビボ

4
疑似乱数ジェネレーターを作成する場合は、経験的なcdfを使用してください。観測された分布を超える数字を描きたいですか?
11ドル

6
グラフを額面どおりに取ると、候補となる分布はどれもデータにうまく適合しないように見えます。また、あなたのecdfは0.03未満の水平漸近線を持っているように見えますが、これは意味がありません。
大井紅
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.