Distribusi yang memiliki rentang dari 0 hingga 1 dan dengan puncak di antara mereka?


13

Apakah ada distribusi atau dapatkah saya bekerja dari distribusi lain untuk membuat distribusi seperti itu pada gambar di bawah (permintaan maaf untuk gambar yang buruk)?

distribusi di mana saya memberikan angka (0,2, 0,5 dan 0,9 dalam contoh) untuk di mana puncak seharusnya dan standar deviasi (sigma) yang membuat fungsi lebih lebar atau kurang lebar.

PS: Ketika angka yang diberikan adalah 0,5 distribusi adalah distribusi normal.



19
perhatikan bahwa 0,5 case tidak akan menjadi distribusi normal karena kisaran distribusi normal adalah ±

8
Jika Anda mengambil foto Anda secara harfiah maka tidak ada distribusi yang terlihat seperti itu karena area dalam semua kasus sangat kurang dari 1. Jika Anda akan membatasi dukungan untuk [0,1]maka Anda tidak dapat membatasi jangkauan pdf [0,1]juga (Selain dalam kasus seragam sepele).
John Coleman

Jawaban:


29

Salah satu pilihan yang mungkin adalah distribusi beta , tetapi parametrized kembali dalam hal mean dan presisi ϕ , yaitu, "untuk fixed μ , semakin besar nilai ϕ , semakin kecil varians y " (lihat Ferrari, dan Cribari- Neto, 2004). Fungsi kepadatan probabilitas dibangun dengan mengganti parameter standar distribusi beta dengan α = ϕ μ dan β = ϕ ( 1 - μ )μϕμϕyα=ϕμβ=ϕ(1-μ)

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

di mana dan V a r ( Y ) = μ ( 1 - μ )E(Y)=μ .Var(Y)=μ(1μ)1+ϕ

Atau, Anda dapat menghitung parameter dan β yang sesuai yang akan mengarah ke distribusi beta dengan mean dan varians yang ditentukan sebelumnya. Namun, perhatikan bahwa ada batasan nilai varians yang mungkin berlaku untuk distribusi beta. Bagi saya pribadi, parametrization menggunakan presisi lebih intuitif (pikirkan xαβ proporsi dalam X yang didistribusikan secara binerial, dengan ukuran sampel ϕ dan probabilitas keberhasilan μ ).x/ϕ Xϕμ

Distribusi Kumaraswamy adalah distribusi kontinu terbatas lainnya, tetapi akan lebih sulit untuk menentukan ulang parameter seperti di atas.

Seperti yang diketahui orang lain, itu tidak normal karena distribusi normal memiliki dukungan , jadi paling baik Anda bisa menggunakan normal terpotong sebagai perkiraan.(,)

Ferrari, S., & Cribari-Neto, F. (2004). Regresi beta untuk tingkat pemodelan dan proporsi. Jurnal Statistik Terapan, 31 (7), 799-815.


Saya suka jawaban Anda, saya sudah membuat beberapa grafik darinya. Satu-satunya masalah yang saya miliki adalah saya tidak bisa mengontrol lebar (sigma dalam distribusi normal kurva). Saya ingin memiliki formula yang menghitung nilai phi ketika nilai sigma tertentu diberikan. Masalah yang saya miliki adalah bahwa kurva terbalik atau mengambil bentuk yang aneh, itulah perilaku yang ingin saya hindari.
Stan Callewaert

Singkatnya: Saya ingin memberikan mu dan sigma ke fungsi dan kemudian mendapatkan distribusi yang lebar ketika sigma besar dan tipis (tetapi tidak terbalik atau menunjukkan perilaku aneh) ketika sigma kecil .
Stan Callewaert

1
Ketepatan dan deviasi standar terkait: . Juga, Distribusi Beta adalah unimodal (tidak akan menunjukkan perilaku aneh) ketika α dan β yang lebih besar dari 1. Ini berarti bahwa ketika μ = 1 / 2 , Anda harus memilih φ > 2 atau ekuivalen σ < 0,707 . ϕ=μ(1-μ)/σ2-1αβμ=1/2ϕ>2σ<0,707
Knrumsey

2
Hal lain yang perlu disebutkan adalah bahwa Anda tentu saja dapat menggunakan campuran distribusi beta, jika distribusi beta tunggal tidak cukup fleksibel.
Björn

@ Knrumsey Saya telah menggunakan rumus yang sama untuk phi, satu-satunya masalah yang tampaknya saya miliki adalah bahwa ketika sigma adalah angka besar, phi menjadi angka negatif yang berarti alpha juga menjadi angka negatif. Alpha tidak boleh negatif menurut Wikipedia. Apakah ada solusi untuk ini?
Stan Callewaert

5

Coba distribusi beta, kisarannya dari 0 hingga 1. Sudahkah Anda mencoba ini? Nilai rata-rata adalah α(α+β)


1
Terlihat sangat menarik, tetapi bagaimana saya bisa mengubah nomor saya (nilai puncak) dan sigma saya ke nilai alpha dan beta?
Stan Callewaert

1
Lihat saja di wikipedia ... ini adalah distribusi dua parameter. Di antara keduanya, mereka dapat menyesuaikan dengan nilai puncak Anda (dengan tingkat kebebasan ekstra).

5

Saya mengubah untuk membuat variabel semacam ini. Mulailah dengan variabel acak, x, yang memiliki dukungan pada seluruh baris nyata (seperti normal), dan kemudian ubah untuk membuat variabel acak baru . Presto, Anda memiliki variabel acak yang didistribusikan pada interval unit. Karena transformasi khusus ini meningkat, Anda dapat memindahkan mean / median / mode y sekitar dengan memindahkan mean / median / mode x sekitar. Ingin membuatylebih tersebar (dalam hal jangkauan antar-kuartil, mengatakan)? Jadikanxlebih tersebar.y=exhal(x)1+exhal(x)yx

Tidak ada yang istimewa tentang fungsi . Setiap fungsi distribusi kumulatif berfungsi untuk menghasilkan variabel acak baru yang didefinisikan pada interval unit.exhal(x)1+exhal(x)

Jadi, setiap variabel acak ditransformasikan dengan memasukkannya ke dalam cdf apa pun ( ) melakukan apa yang Anda inginkan --- membuat rv didistribusikan pada interval unit yang propertinya dapat Anda sesuaikan dengan menyesuaikan parameter variabel acak yang tidak diubah dengan cara yang intuitif. Selama F ( ) benar-benar monoton, variabel yang diubah akan, dalam beberapa hal, terlihat seperti yang tidak diubah. Misalnya, Anda ingin y menjadi variabel acak unimodal pada interval unit. Selama F ( ) benar-benar meningkat dan x adalah unimodal, Anda mendapatkannya. Meningkatkan median / mean / mode xy=F(x)F()yF()xx meningkatkan median / rata-rata / mode . Meningkatkan kisaran interkuartil x (dengan menggerakkan persentil ke-25 ke bawah dan persentil ke-75 ke atas) meningkatkan kisaran interkuartil dari y . Monotonitas yang ketat adalah hal yang baik.yxy

Rumus untuk menghitung mean dan sd mungkin tidak mudah ditemukan, tetapi itulah tujuan simulasi Monte Carlo. Untuk mendapatkan distribusi yang relatif cantik seperti yang Anda gambar, Anda ingin x dan F ( ) menjadi variabel acak kontinu (cdf dari variabel acak kontinu) dengan dukungan di garis nyata.yxF()


0

Jika seseorang tertarik pada solusi yang saya gunakan di Python untuk menghasilkan nilai acak dekat dengan angka yang diberikan sebagai parameter. Solusi saya ada empat tahap. Setiap tahap peluang bahwa jumlah yang dihasilkan lebih dekat ke jumlah yang diberikan lebih besar.

Saya tahu solusinya tidak seindah menggunakan satu distribusi tetapi ini adalah cara saya dapat menyelesaikan masalah saya:

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

hasil ketika mengeksekusi kode ini ditunjukkan pada gambar di bawah: Grafik


0

Anda mungkin ingin melihat 'Kurva Johnson'. Lihat NL Johnson: Sistem Kurva Frekuensi yang dihasilkan oleh metode penerjemahan. 1949 Biometrika Volume 36 hal. 149-176. R memiliki dukungan untuk menyesuaikannya dengan kurva sewenang-wenang. Secara khusus kurva SB-nya (dibatasi) mungkin bermanfaat.

Sudah 40 tahun sejak saya menggunakannya, tetapi mereka sangat berguna bagi saya saat itu, dan saya pikir mereka akan bekerja untuk Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.