Distribuzione che ha un intervallo da 0 a 1 e con un picco tra di loro?


13

Esiste una distribuzione o posso lavorare da un'altra distribuzione per creare una distribuzione come quella nell'immagine qui sotto (scuse per i cattivi disegni)?

distribuzione dove do un numero (0,2, 0,5 e 0,9 negli esempi) per dove dovrebbe essere il picco e una deviazione standard (sigma) che rende la funzione più ampia o meno ampia.

PS: quando il numero dato è 0,5 la distribuzione è una distribuzione normale.



19
si noti che il caso 0,5 non sarebbe la distribuzione normale poiché l'intervallo della distribuzione normale è ±∞

8
Se si prende le immagini letteralmente allora non ci sono distribuzioni che aspetto così da quando la zona in tutti i casi sono strettamente minore di 1. Se avete intenzione di limitare il supporto per [0,1]allora non si può limitare la portata del pdf a [0,1]pure (tranne che nel banale caso uniforme).
— John Coleman,

Risposte:


29

Una possibile scelta è la distribuzione beta , ma parametrizzata in termini di media e precisione ϕμϕ , ovvero "per fisso , maggiore è il valore di ϕ , minore è la varianza di y " (vedi Ferrari e Cribari- Neto, 2004). La funzione di densità di probabilità viene costruita sostituendo i parametri standard della distribuzione beta con α = ϕ μ e β = ϕ ( 1 - μ )μϕyα=ϕμβ=ϕ(1−μ)

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

dove e V a r ( Y ) = μ ( 1 - μ )E(Y)=μ .Vun'r(Y)=μ(1-μ)1+φ

In alternativa, è possibile calcolare i parametri e β appropriati che porterebbero alla distribuzione beta con media e varianza predefinite. Tuttavia, si noti che esistono restrizioni sui possibili valori di varianza validi per la distribuzione beta. Per me personalmente, la parametrizzazione usando la precisione è più intuitiva (pensate a xαβ proporzioni in X binomialmente distribuita, con dimensione del campione ϕ e probabilità di successo μ ).X/φ Xφμ

La distribuzione di Kumaraswamy è un'altra distribuzione continua limitata, ma sarebbe più difficile ri-parametrizzare come sopra.

Come altri hanno notato, è non è normale, poiché distribuzione normale ha il di supporto, così al meglio è possibile utilizzare il normale troncato come approssimazione.(-∞,∞)

Ferrari, S., e Cribari-Neto, F. (2004). Regressione beta per tassi e proporzioni di modellazione. Journal of Applied Statistics, 31 (7), 799-815.


Mi piace la tua risposta, ho costruito alcuni grafici da essa. L'unico problema che ho è che non riesco a controllare la larghezza (sigma in una normale distribuzione della curva). Vorrei avere una formula che calcoli il valore phi quando viene dato un certo valore sigma. Il problema che ho è che la curva si capovolge o prende una forma strana, questo è il comportamento che voglio evitare.
— Stan Callewaert,

In breve: vorrei dare un mu e un sigma alla funzione e quindi ottenere una distribuzione che è ampia quando il sigma è grande ed è sottile (ma non capovolge o mostra un comportamento strano) quando il sigma è piccolo .
— Stan Callewaert,

1
La precisione e la deviazione standard sono correlate: . Inoltre, la distribuzione Beta è unimodale (non mostrare un comportamento strano) se α e β sono maggiori di 1. Ciò significa che quando μ = 1 / 2 , si dovrebbe scegliere φ > 2 o equivalentemente σ < 0,707φ=μ(1-μ)/σ2-1αβμ=1/2φ>2σ<0.707 .
— Knrumsey,

2
Un'altra cosa da menzionare è che potresti ovviamente usare miscele di distribuzioni beta, se una singola distribuzione beta non è abbastanza flessibile.
— Björn

@knrumsey Ho usato la stessa formula per phi, l'unico problema che sembra avere è che quando il sigma è un numero elevato, il phi diventa un numero negativo, il che significa che anche l'alfa diventa un numero negativo. Alpha non può essere negativo secondo Wikipedia. C'è una soluzione per questo?
— Stan Callewaert,

5

Prova la distribuzione beta, la sua gamma va da 0 a 1. Hai già provato questo? Il valore medio è α(α+β)


1
Sembra molto interessante, ma come posso convertire il mio numero (il valore di picco) e il mio sigma in valori alfa e beta?
— Stan Callewaert

1
Basta cercarlo su Wikipedia ... è una distribuzione a due parametri. Tra i due, possono sintonizzarsi sul valore di picco (con un ulteriore grado di libertà).

5

y=eXp(X)1+eXp(X)yX

eXp(X)1+eXp(X)

y=F(X)F()yF()XXyXy

yXF()


0

Se qualcuno è interessato alla soluzione che ho usato in Python per generare un valore casuale vicino al numero dato come parametro. La mia soluzione esiste in quattro fasi. Ogni fase è maggiore la possibilità che il numero generato sia più vicino al numero indicato.

So che la soluzione non è bella come usare una distribuzione, ma questo è stato il modo in cui sono stato in grado di risolvere il mio problema:

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

risultato quando si esegue questo codice è mostrato nella figura seguente: Grafico


0

Potresti dare un'occhiata a "Johnson curve". Vedi NL Johnson: Sistemi di curve di frequenza generati dai metodi di traduzione. 1949 Biometrika Volume 36 pp 149-176. R ha il supporto per adattarli a curve arbitrarie. In particolare, le sue curve SB (limitate) potrebbero essere utili.

Sono passati 40 anni da quando li ho usati, ma in quel momento mi sono stati molto utili e penso che funzioneranno per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.