Verteilung mit einem Bereich von 0 bis 1 und einer Spitze dazwischen?

13

Gibt es eine Distribution oder kann ich mit einer anderen Distribution arbeiten, um eine Distribution wie die im Bild unten zu erstellen (Entschuldigung für die schlechten Zeichnungen)?

Verteilung Dabei gebe ich eine Zahl (0,2, 0,5 und 0,9 in den Beispielen) für die Position des Peaks und eine Standardabweichung (Sigma) an, die die Funktion breiter oder weniger breit macht.

PS: Wenn die angegebene Zahl 0,5 ist, ist die Verteilung eine Normalverteilung.

Stan Callewaert
quelle
19
Beachten Sie, dass der 0,5 Fall würde die Normalverteilung , da der Bereich der Normalverteilung nicht ist & ±
8
Wenn Sie Ihre Bilder wörtlich nehmen , dann gibt es keine Ausschüttungen , die aussehen wie das , da der Bereich , in allen Fällen sind streng kleiner als 1. Wenn Sie die Unterstützung beschränken werden [0,1]dann Sie den Bereich des pdf nicht beschränken kann [0,1]auch (anders als im einfachen Uniformfall).
John Coleman

Antworten:

29

Eine mögliche Wahl ist die Beta-Verteilung , die jedoch in Bezug auf den Mittelwert μ und die Genauigkeit param neu parametrisiert wird , d. H. "Für feste μ ist der Wert von ϕ umso größer , je kleiner die Varianz von y ist " (siehe Ferrari und Cribari). Neto, 2004). Die Wahrscheinlichkeitsdichtefunktion wird konstruiert, indem die Standardparameter der Betaverteilung durch α = ϕ μ und β = ϕ ( 1 - μ ) ersetzt werden.μϕμϕyα=ϕμβ=ϕ(1μ)

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

wobei und V a r ( Y ) = μ ( 1 - μ )E(Y)=μ .Var(Y)=μ(1μ)1+ϕ

Alternativ können Sie geeignete und β- Parameter berechnen , die zu einer Beta-Verteilung mit vordefiniertem Mittelwert und Varianz führen würden. Beachten Sie jedoch, dass es Einschränkungen für mögliche Varianzwerte gibt, die für die Betaverteilung gelten. Für mich persönlich ist die Parametrisierung mit Präzision intuitiver (denken Sie an xαβ Anteile inbinomial verteiltem X mit Stichprobengröße ϕ und Erfolgswahrscheinlichkeit μ ).x/ϕ Xϕμ

Die Kumaraswamy-Verteilung ist eine andere beschränkte kontinuierliche Verteilung, aber es wäre schwieriger, sie wie oben beschrieben neu zu parametrisieren.

Wie andere bemerkt haben, ist dies nicht normal, da die Normalverteilung die Unterstützung , so dass Sie bestenfalls die abgeschnittene Normalen als Annäherung verwenden können.(,)

Ferrari, S. & Cribari-Neto, F. (2004). Beta-Regression für die Modellierung von Raten und Anteilen. Journal of Applied Statistics, 31 (7), 799-815.

Tim
quelle
Ich mag Ihre Antwort, ich habe einige Grafiken daraus erstellt. Das einzige Problem, das ich habe, ist, dass ich die Breite scheinbar nicht kontrollieren kann (Sigma in einer Normalverteilung der Kurve). Ich hätte gerne eine Formel, die den Phi-Wert berechnet, wenn ein bestimmter Sigma-Wert angegeben wird. Das Problem, das ich habe, ist, dass sich die Kurve auf den Kopf stellt oder eine seltsame Form annimmt, das ist das Verhalten, das ich vermeiden möchte.
Stan Callewaert
Kurz gesagt: Ich möchte der Funktion ein mu und ein Sigma geben und dann eine Verteilung erhalten, die breit ist, wenn das Sigma groß und dünn ist (aber nicht auf den Kopf gestellt wird oder merkwürdiges Verhalten zeigt), wenn das Sigma klein ist .
Stan Callewaert
1
Die Genauigkeit und die Standardabweichung hängen zusammen: . Auch die Beta Distribution ist unimodal (wird nicht seltsames Verhalten zeigen) , wenn α und β größer als 1. Dies bedeutet , dass , wenn μ = 1 / 2 , sollten Sie wählen , φ > 2 oder äquivalent σϕ=μ(1-μ)/σ2-1αβμ=1/2ϕ>2 . σ<0,707
Knrumsey
2
Ebenfalls zu erwähnen ist, dass Sie natürlich auch Mischungen von Betaverteilungen verwenden können, wenn eine einzelne Betaverteilung nicht flexibel genug ist.
Björn
@knrumsey Ich habe die gleiche Formel für Phi verwendet. Das einzige Problem, das ich zu haben scheint, ist, dass wenn das Sigma eine große Zahl ist, Phi eine negative Zahl wird, was bedeutet, dass Alpha auch eine negative Zahl wird. Alpha darf laut Wikipedia nicht negativ sein. Gibt es dafür eine Lösung?
Stan Callewaert
5

Probieren Sie die Beta-Distribution aus, deren Bereich zwischen 0 und 1 liegt. Haben Sie das schon versucht? Der Mittelwert ist α(α+β)


quelle
1
Sieht sehr interessant aus, aber wie kann ich meine Zahl (den Spitzenwert) und mein Sigma in die Alpha- und Beta-Werte umwandeln?
Stan Callewaert
1
Schlagen Sie es einfach in Wikipedia nach ... es ist eine Verteilung mit zwei Parametern. Zwischen den beiden können sie sich auf Ihren Spitzenwert einstellen (mit einem zusätzlichen Freiheitsgrad).
5

Ich transformiere, um diese Art von Variable zu erstellen. Beginnen Sie mit einer Zufallsvariablen x, die die gesamte reelle Linie unterstützt (wie normal), und transformieren Sie sie dann, um eine neue Zufallsvariable . Presto, Sie haben eine Zufallsvariable, die auf das Einheitsintervall verteilt ist. Da diese bestimmte Transformation zunimmt, können Sie den Mittelwert / Median / Modus von y verschieben, indem Sie den Mittelwert / Median / Modus von x verschieben. Machen wolleny=exp(x)1+exp(x) mehr dispergiert (in Bezug auf Inter-QuartilBereich, sagen)? Machen Sie einfach x mehr verteilt.yx

An der Funktion e x ist nichts Besonderes . Jede kumulative Verteilungsfunktion erzeugt eine neue Zufallsvariable, die für das Einheitsintervall definiert ist.exp(x)1+exp(x)

Jede Zufallsvariable, die durch Einfügen in ein beliebiges cdf ( ) transformiert wird, macht das, was Sie wollen - sie verteilt ein rv auf das Einheitsintervall, dessen Eigenschaften Sie bequem anpassen können, indem Sie die Parameter der nicht transformierten Zufallsvariablen anpassen auf intuitive Weise. Solange F ( ) streng monoton ist, sieht die transformierte Variable in mehrfacher Hinsicht wie die nicht transformierte aus. Sie möchten beispielsweise, dass y eine unimodale Zufallsvariable für das Einheitenintervall ist. Solange F ( ) den Median / Mittelwert / Modus von y erhöht . Erhöhen des Interquartilbereichs von xy=F(x)F()yF() streng ansteigt und unimodal ist, erhält man das. Erhöhen des Medians / Mittelwerts / Modus von xxxyx (durch Verschieben des 25. Perzentils nach unten und des 75. Perzentils nach oben) wird der Interquartilbereich von vergrößert . Strikte Monotonie ist eine schöne Sache.y

Die Formel zur Berechnung des Mittelwerts und des sd von ist vielleicht nicht leicht zu finden, aber dafür sind Monte-Carlo-Simulationen gedacht. Um relativ hübsche Verteilungen wie die von Ihnen gezeichneten zu erhalten , möchten Sie, dass x und F ( ) kontinuierliche Zufallsvariablen (cdf von kontinuierlichen Zufallsvariablen) mit Unterstützung für die reale Linie sind.yxF()

Rechnung
quelle
0

Wenn sich jemand für die Lösung interessiert, habe ich in Python einen Zufallswert in der Nähe der angegebenen Zahl als Parameter generiert. Meine Lösung besteht aus vier Stufen. In jedem Stadium ist die Chance, dass die generierte Zahl näher an der angegebenen Zahl liegt, größer.

Ich weiß, die Lösung ist nicht so schön wie die Verwendung einer Distribution, aber so konnte ich mein Problem lösen:

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

Das Ergebnis bei der Ausführung dieses Codes ist in der folgenden Abbildung dargestellt: Graph

Stan Callewaert
quelle
0

Vielleicht möchten Sie einen Blick auf "Johnson-Kurven" werfen. Siehe NL Johnson: Systeme von Frequenzkurven, die durch Übersetzungsmethoden erzeugt wurden. 1949 Biometrika, Band 36, Seiten 149-176. R unterstützt die Anpassung an beliebige Kurven. Insbesondere seine (begrenzten) SB-Kurven könnten nützlich sein.

Es ist 40 Jahre her, dass ich sie benutzt habe, aber sie waren zu dieser Zeit sehr nützlich für mich und ich denke, sie werden für Sie arbeiten.

Roger Hill
quelle