平均、SD、スキュー、および尖度がわかっているRで分布を生成することは可能ですか? これまでのところ、乱数を作成し、それに応じて変換するのが最善の方法のようです。適応できる特定のディストリビューションを生成するように調整されたパッケージがある場合、私はまだそれを見つけていません。ありがとう
8 に答える
SuppDists パッケージには Johnson ディストリビューションがあります。ジョンソンは、モーメントまたは分位数のいずれかに一致する分布を提供します。他のコメントは、4 の瞬間が配信を行わないことは正しいです。しかし、ジョンソンは確かに試みます。
Johnson をいくつかのサンプル データに適合させる例を次に示します。
require(SuppDists)
## make a weird dist with Kurtosis and Skew
a <- rnorm( 5000, 0, 2 )
b <- rnorm( 1000, -2, 4 )
c <- rnorm( 3000, 4, 4 )
babyGotKurtosis <- c( a, b, c )
hist( babyGotKurtosis , freq=FALSE)
## Fit a Johnson distribution to the data
## TODO: Insert Johnson joke here
parms<-JohnsonFit(babyGotKurtosis, moment="find")
## Print out the parameters
sJohnson(parms)
## add the Johnson function to the histogram
plot(function(x)dJohnson(x,parms), -20, 20, add=TRUE, col="red")
最終的なプロットは次のようになります。
4 つのモーメントが分布を完全にキャプチャしない方法について他の人が指摘する問題の一部を見ることができます。
幸運を!
編集
ハドリーがコメントで指摘したように、ジョンソンのフィット感は見栄えが悪い. 私は簡単なテストを行いmoment="quant"
、4 つのモーメントの代わりに 5 つの分位数を使用してジョンソン分布に適合するジョンソン分布を適合させました。結果ははるかに良く見えます:
parms<-JohnsonFit(babyGotKurtosis, moment="quant")
plot(function(x)dJohnson(x,parms), -20, 20, add=TRUE, col="red")
これにより、次のものが生成されます。
瞬間を使用するのに適しているときに、ジョンソンが偏見を持っているように見える理由を誰か知っていますか?
これは興味深い質問ですが、実際には良い解決策はありません。他の瞬間はわからなくても、ディストリビューションがどのようになるかはわかっていると思います。たとえば、それは単峰性です。
この問題に取り組むには、いくつかの異なる方法があります。
基礎となる分布を想定し、モーメントを一致させます。これを行うための多くの標準Rパッケージがあります。1つの欠点は、多変量の一般化が不明確になる可能性があることです。
サドルポイント近似。本論文で:
Gillespie、CSおよびRenshaw、E .改良されたサドルポイント近似。 Mathematical Biosciences、2007年。
最初の数秒間だけ与えられたときにpdf/pmfを回復することを検討します。このアプローチは、歪度がそれほど大きくない場合に機能することがわかりました。
Laguerre拡張:
Mustapha、H.およびDimitrakopoulosa、R .モーメントを伴う多変量確率密度の一般化されたLaguerre展開。Computers&Mathematics with Applications、2010年。
この論文の結果はより有望に思えますが、私はそれらをコード化していません。
この質問は 3 年以上前に尋ねられたものなので、回答が遅すぎないことを願っています。
いくつかの瞬間を知っている場合、分布を一意に識別する方法があります。その方法がMaximum Entropyの方法です。この方法から得られる分布は、知っていることを前提として、分布の構造に関する無知を最大化する分布です。指定したモーメントを持つが、MaxEnt 分布ではないその他の分布は、入力したものよりも多くの構造を暗示的に想定しています。最大化する汎関数は、シャノンの情報エントロピー $S[p(x)] = - \int p(x)log p(x) dx$ です。平均、標準偏差、歪度、尖度がわかれば、それぞれ分布の 1、2、3、4 番目のモーメントに対する制約として変換されます。
問題は、次の制約に従ってSを最大化することです: 1) $\int xp(x) dx = "first moment"$, 2) $\int x^2 p(x) dx = "second moment"$, 3 ) ... 等々
「Harte, J., Maximum Entropy and Ecology: A Theory of Abundance, Distribution, and Energetics (Oxford University Press, New York, 2011)」という本をお勧めします。
Rでこれを実装しようとするリンクは次のとおりです: https://stats.stackexchange.com/questions/21173/max-entropy-solver-in-r
解決策の 1 つとして、PearsonDS ライブラリが挙げられます。最初の 4 つのモーメントの組み合わせを、尖度 > 歪度 ^2 + 1 という制限付きで使用できます。
その分布から 10 個のランダムな値を生成するには、次を試してください。
library("PearsonDS")
moments <- c(mean = 0,variance = 1,skewness = 1.5, kurtosis = 4)
rpearson(10, moments = moments)
分布を複製するには密度推定が必要であることに同意します。ただし、モンテカルロ シミュレーションでよくあるように、数百の変数がある場合は、妥協する必要があります。
1 つの推奨されるアプローチは次のとおりです。
- Fleishman 変換を使用して、指定された歪みと尖度の係数を取得します。Fleishman はスキューと尖度を取り、係数を提供します
- N 個の正規変数を生成します (平均 = 0、標準 = 1)
- (2) のデータを Fleishman 係数で変換して、正規データを指定されたスキューと尖度に変換します。
- このステップでは、ステップ (3) のデータを使用し、new_data = 必要な平均値 + (ステップ 3 のデータ)* 必要な標準偏差を使用して、目的の平均値と標準偏差 (std) に変換します。
ステップ 4 の結果のデータには、目的の平均値、標準偏差、歪度、および尖度が含まれます。
警告:
- Fleishman は、歪度と尖度のすべての組み合わせに対して機能するわけではありません
- 上記の手順では、相関関係のない変数を想定しています。相関データを生成する場合は、Fleishman 変換の前に手順が必要になります。
これらのパラメーターは、実際には分布を完全に定義しているわけではありません。そのためには、密度または同等の分布関数が必要です。
@Davidと@Carlが上で書いたように、さまざまな分布を生成するための専用のパッケージがいくつかあります。たとえば、CRANの確率分布タスクビューを参照してください。
理論(特定のパラメーターを使用して特定の分布に適合する数値のサンプルを描画する方法)に興味がある場合は、適切な式を探してください。たとえば、Wikiのガンマ分布を参照し、スケールと形状を計算するためのパラメータを提供しました。
ここで具体的な例を参照してください。ここでは、平均と標準偏差に基づいて、必要なベータ分布のアルファとベータのパラメーターを計算しました。