範囲が0〜1で、それらの間にピークがある分布ですか?


13

ディストリビューションはありますか、または下の画像のようなディストリビューションを作成するために別のディストリビューションから作業できますか(悪い描画の謝罪)?

分布 ここで、ピークが存在する場所の数値(例では0.2、0.5、0.9)と、関数をより広くまたはより小さくする標準偏差(シグマ)を指定します。

PS:与えられた数が0.5の場合、分布は正規分布です。



19
正規分布の範囲はあるため、0.5の場合は正規分布ではないことに注意してください±

8
あなたの写真を撮る場合は、文字通り、あなたがするサポートを制限しようとしている場合は、そのように見えるが、すべてのケースで面積が厳密に1未満であるため、というディストリビューションはありません[0,1]、あなたはPDFの範囲を制限することができない[0,1]だけでなく、は、 (些細な均一の場合を除く)。
ジョンコールマン

回答:


29

一つの可能な選択であるベータ分布が、再パラメータ化平均の点で精密φであり、「固定のためのμの値が大きいφ、小さいの分散yは」(フェラーリを参照し、Cribari- Neto、2004)。確率密度関数を用いてベータ分布の標準パラメータを置換することによって構築されるα = φ μ及びβ = φ 1 - μ μϕμϕyα=ϕμβ=ϕ(1μ)

f(y)=1B(ϕμ,ϕ(1μ))yϕμ1(1y)ϕ(1μ)1

ここで、V RY = μ 1 - μ EY=μVarY=μ1μ1+ϕ

または、事前に定義された平均と分散を使用してベータ分布につながる適切なαおよびβパラメータを計算できます。ただし、ベータ分布に有効な分散の可能な値には制限があることに注意してください。個人的には、精度を使用したパラメーター化はより直感的です(xαβにおける割合二項分布する Xサンプルサイズと、 φと成功の確率 μ)。バツ/ϕ バツϕμ

クマラスワミー分布は別の有界連続分布ですが、上記のように再パラメータ化することはより困難です。

他の人が気づいてきたように、それはありません正規分布を有しているため、通常ののサポートをあなたが使用できるので、最高の状態で、切り捨て通常の近似として。

フェラーリ、S。、およびCribari-Neto、F。(2004)。モデリング率と比率のベータ回帰。Journal of Applied Statistics、31(7)、799-815。


あなたの答えが好きです、それからいくつかのグラフを作成しました。唯一の問題は、幅を制御できないように見えることです(曲線の正規分布のシグマ)。特定のシグマ値が与えられたときにファイ値を計算する式が欲しいです。私が抱えている問題は、カーブが逆さまになったり、奇妙な形をとったりすることです。これが避けたい動作です。
スタンCallewaert

要するに、関数にミューとシグマを与えて、シグマが大きいときに幅が広く、シグマが小さいときに分布が逆になったり、奇妙な振る舞いを見せたりしないようにしたい。
スタンCallewaert

1
精度と標準偏差が関連している:。また、ベータ版の配布は、とき(奇妙な振る舞いは表示されません)単峰性であるαβが 1よりも大きい。この手段があるときにはμ = 1 / 2は、あなたが選択する必要がありφ > 2または同等σ < 0.707をϕ=μ(1μ)/σ21αβμ=1/2ϕ>2σ<0.707
knrumsey

2
言及すべきもう1つのことは、単一のベータ分布の柔軟性が十分でない場合、もちろんベータ分布の混合を使用できることです。
ビョルン

@knrumsey phiに同じ式を使用しましたが、唯一の問題は、シグマが大きな数である場合、phiが負の数になることです。つまり、alphaも負の数になります。ウィキペディアによると、アルファはマイナスになることはありません。これに対する解決策はありますか?
スタンCallewaert

5

ベータ版の分布を試してください。範囲は0〜1です。これを試しましたか?平均値はα(α+β)


1
非常に興味深いように見えますが、どうすれば数値(ピーク値)とシグマをアルファ値とベータ値に変換できますか?
スタンCallewaert

1
ウィキペディアで調べてみてください...それは2つのパラメータ分布です。2つの間で、ピーク値に合わせて調整できます(追加の自由度があります)。

5

この種の変数を作成するために変換します。(通常のように)実行全体をサポートするランダム変数xで開始し、それを変換して新しいランダム変数。プレスト、ユニット間隔に分布するランダム変数があります。この特定の変換が増加しているため、xの平均/中央値/モードを移動することにより、yの平均/中央値/モードを移動できます。yをもっと分散させたい(四分位範囲について)ただ、作るxは、より分散しました。y=exp(x)1+exp(x)yx

関数e x p x )に関して特別なものはありません。累積分布関数は、単位間隔で定義された新しいランダム変数を生成するように機能します。exp(x)1+exp(x)

y=F(x)F()yF()xxyxy

yxF()


0

誰かが私がPythonでパラメータとして与えられた数に近いランダムな値を生成するために使用したソリューションに興味があるなら。私のソリューションには4つの段階があります。各段階では、生成された数値が指定された数値に近くなる可能性が大きくなります。

解決策は1つのディストリビューションを使用するほど美しくないことは知っていますが、これが私の問題を解決することができた方法でした:

number_factory.py:

import random
import numpy as np

class NumberFactory:
    def __init__(self):
        self.functions = [self.__linear, self.__exponential_point_four, self.__exponential_point_three, self.__exponential_point_twenty_five]  
        self.stage = 0

    def next_stage(self):
        self.stage += 1

    def get_mutated_number(self, number):
         # True if the generated number will be higher than the given number
         # False if the generated number will be lower than the given number
        add = bool(np.random.choice([0,1], p=[number, 1-number]))

        # Generate a number between 0 and 1 that will be used
        # to multiply the new number by which the number parameter will be substracted or added
        # The bigger the stage number (0-3) the more change that the mutated number is close to the number parameter
        multiply_number_seed = random.uniform(0, 1)
        multiply_number = self.functions[self.stage](multiply_number_seed)

        if (add):
            return number+((1-number)*multiply_number)
        else:
            return number-(number*multiply_number)

    def __linear(self, x):
        return -x+1

    def __exponential_point_four(self, x):
        return 0.4*x**2 - 1.4*x + 1

    def __exponential_point_three(self, x):
        return 0.8*x**2 - 1.8*x + 1

    def __exponential_point_twenty_five(self, x):
        return x**2 - 2*x + 1

    def get_stage(self):
        return self.stage

main.py:

import matplotlib.pyplot as plt
import numpy as np

factory = NumberFactory()
numbers = []

factory.next_stage()
factory.next_stage()
factory.next_stage()

for _ in range(100000):
    numbers.append(factory.get_mutated_number(0.3))

bins = 100

plt.hist(numbers, bins, normed=True)
plt.plot(1, np.ones_like(bins))
plt.show()

このコードを実行したときの結果は、次の図に示されています。 Graph


0

「ジョンソン曲線」をご覧ください。NL Johnson:翻訳の方法によって生成された周波数曲線のシステムを参照してください。1949 Biometrika Volume 36 pp 149-176。Rは、それらを任意の曲線に当てはめることをサポートしています。特に、彼のSB(有界)曲線は役に立つかもしれません。

私がそれらを使用してから40年が経過しましたが、それらは当時私にとって非常に有用であり、あなたのために働くと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.