Alışılmış bir programlama dili kullanılarak bilinen ortalama ve varyans ile normal bir dağılımdan nasıl örnek alınır?


36

Daha önce istatistiklerle ilgili bir ders almadım, umarım burada doğru yerde soruyorum.

Normal bir dağılımı tanımlayan sadece iki verim olduğunu varsayalım: ortalama ve variance . Bu dağıtıma rastgele örnekleme yapmak için bir bilgisayar kullanmak istiyorum, öyle ki bu iki istatistiğe saygı duyuyorum.σ 2μσ2

Ortalamayı 0 civarında normalleştirerek halledebileceğim çok açık: örneğin çıktısını almadan önce her örneğe ekleyin . Ancak, göre programlı olarak nasıl örnek üretildiğini göremiyorum .σ 2μσ2

Programım geleneksel bir programlama dilinde olacak; Hiçbir istatistiksel pakete erişimim yok.


Dilinizin rasgele sayı üreteci var mı? Bu jeneratör sadece üniform dağılımdan mı yoksa normal dağılımdan da mı üretilebilir?
ttnphns

@ Ttnphns: Hemen hemen her bilgisayar dili rastgele bir sayı üreteci ile gelir. Sonlu bir alandaki ezici bir şekilde üniforma üreticilerdir.
Fixee

Yanıtlar:


33

Belirli bir dağıtımdan ortalama 0 ve varyans 1 ile örnekleme yapabilirseniz , o dağılımın, ortalama ve varyans olan ölçek konum dönüşümünden kolayca örnek alabilirsiniz . Eğer , ortalama 0 ve varyans 1 dağılımından bir örnek ise, , ortalama ve varyans olan bir örnektir . Bu nedenle, tek yapmanız gereken, değişkeni , ortalama eklemeden önce standart sapma (varyansın karekökü) ile ölçeklendirmektir .σ 2 x σ x + u u σ 2 σ uμσ2x

σx+μ
μσ2σμ

Aslında ortalama 0 ve varyans 1 olan normal bir dağılımdan nasıl bir simülasyon elde edersiniz, farklı bir hikaye. Bu tür şeylerin nasıl uygulanacağını bilmek eğlenceli ve ilginç, ancak istatistiksel bir paket veya programlama dili kullanıyor olsanız da olmasanız da, rastgele sayı üretimi için uygun bir işlev veya kitaplık edinmenizi ve kullanmanızı öneririm. Hangi kütüphaneyi kullanacağınız konusunda tavsiye istiyorsanız, hangi programlama dilini kullandığınıza ilişkin özel bilgiler eklemek isteyebilirsiniz.

Düzenleme: Yorumlar, bazı diğer cevaplar ve Fixee'nin bu cevabı kabul ettiği gerçeği ışığında, normal değişkenler üretmek için tek biçimli değişkenlerin dönüşümlerini nasıl kullanabileceği hakkında biraz daha ayrıntılı bilgi vereceğim.

  • VitalStatistix'in bir yorumunda zaten bahsedilen bir yöntem, iki bağımsız düzgün rastgele değişken alan ve iki bağımsız normal rastgele değişken üreten Box-Muller yöntemidir. İki aşkın fonksiyonun günah ve cos hesaplanmasını önleyen benzer bir yöntem, birkaç simülasyon daha pahasına francogrex tarafından cevaplandı .
  • Tamamen genel bir yöntem, tekdüze bir rastgele değişkenin ters dağılım fonksiyonu tarafından dönüştürülmesidir. Eğer eşit dağıtılır o bir standart normal bir dağılıma sahiptir. için açık bir analitik formül olmamasına rağmen , doğru sayısal yaklaşımlarla hesaplanabilir. R'deki mevcut uygulama (en son kontrol ettiğim) bu fikri kullanıyor. Yöntem kavramsal olarak çok basittir, ancak muhtemelen (diğer) aşkın işlevler günlüğü , günah ve cos gibi yaygın olmayan in doğru bir şekilde uygulanmasını gerektirir .[ 0 , 1 ] Φ - 1 ( U ) Φ - 1 Φ - 1U[0,1]
    Φ1(U)
    Φ1Φ1
  • Birkaç cevap, merkezi dağılım teoremini, normal dağılıma tekdüze rastgele değişkenlerin ortalaması olarak yaklaştırmak için kullanma olasılığından bahseder. Bu genellikle tavsiye edilmez. Ortalama 0 ve varyans 1 ile eşleşme gibi sunulan argümanlar ve dağılımın desteklenmesi ile ilgili düşünceler ikna edici değildir. Christian P. Robert ve George Casella tarafından "R ile Monte Carlo Yöntemlerinin Tanıtılması" ndaki Egzersiz 2.3'te bu üreteçe antika denir ve yaklaşım çok zayıf olarak adlandırılır .
  • Şaşırtıcı sayıda başka fikir var. Bölüm 3 ve özellikle “Bilgisayar Programlama Sanatı” Bölüm 3.4'de Cilt. 2 Donald E. Knuth, rasgele sayı üretimi için klasik bir referanstır. Brian Ripley , Rastgele Değişkenlerin Bilgisayar Üretimi: Yararlı olabilecek bir Öğretici yazdı . Robert ve Casella tarafından veya belki de Bölüm 2'nin "Monte Carlo istatistik yöntemleri" adlı diğer kitaplarında bahsettikleri kitap da önerilir.

Günün sonunda, doğru bir şekilde uygulanan yöntem kullanılan tekdüze sözde rasgele sayı üretecinden daha iyi değildir. Şahsen, güvenilir olduğuna inandığım özel amaçlı kütüphanelere güvenmeyi tercih ederim. Neredeyse her zaman R'de doğrudan R'de veya C / C ++'da API aracılığıyla uygulanan yöntemlere güvenirim. Açıkçası, bu herkes için bir çözüm değil, fakat alternatifler önerebilecek diğer kütüphanelere yeterince aşina değilim.


(+1) OP için iyi cevap ve tavsiyeler.
kardinal

18
Burada gereksiz bir yorumda bulunup bulunmadığımdan emin değilim, ancak yalnızca tek biçimli bir rasgele sayı üretecine erişiminiz varsa, bağımsız N (0,1) rasgele sayılar oluşturmak için Box-Muller Dönüşümünü kullanabilirsiniz. Özetle, eğer U_1 ve U_2 Tekdüze (0,1) dağılımından bağımsız ise, ve bağımsız N (0,1) rasgele değişken olarak dağıtılır. Temel fikir
2log(U1)cos(2πU2)
2log(U1)sin(2πU2)
VitalStatistix

2
@Vital: Gereksiz bir yorum değil; iyiydi. Box-Muller dönüşümü, muhtemelen yanlışlıkla kötü bir şey yapma şansını en aza indirecek şekilde programlanması en kolay olanıdır. En hızlı değil , ama yeterince rekabetçi. Bununla birlikte, yerleşik bir kod kütüphanesini kullanmak, özellikle birinin yanlış adım atması en muhtemel olan yer, tekdüze rastgele değişken değişken girdilerinin nasıl üretildiğinden dolayı, muhtemelen daha güvenlidir .
kardinal

@Vital: Teşekkürler, aradığım şey buydu. Yorumunuzu bir cevaba dönüştürmek istiyorsanız, memnuniyetle reddederim.
Fixee

1
@VitalStatistix, güzel bir yorum ve OP'nin aradığı şey buydu. Neden bir cevaba çevirmiyor ve belki de birörnek rastgele değişkenlerin dönüşümünü kullanma genel fikrine biraz odaklan. Kardinal'in çoğunlukla bahsettiği nedenlerden dolayı tereddüt ettim çünkü herhangi bir dilden gelen varsayılan tekdüze jeneratörün iyi bir jeneratör olup olmadığını bilmiyorum .
NRH

10

Bu gerçekten Michael Lew'in cevabı ve Fixee'nin yorumu üzerine bir yorum, ancak bu sitede yorum yapacak itibarım olmadığı için bir cevap olarak gönderildi.

[0,1]61

E[i=112Xi]=i=112E[Xi]=12×12=6
12 i = 1 Xi-6
var[i=112Xi]=i=112var[Xi]=12×112=1.
i=112Xi6 Σ 12 i = 1 xi-6[-6,6]610/12i=112Xi6[6,6](Çok düşük olasılık) fazla standart sapma ortalamasından farklı değerler asla oluşmayacaktır. Bu genellikle, çok düşük olasılık olaylarının çok fazla ilgi çekeceği bilgisayar ve iletişim sistemlerinin simülasyonunda bir sorundur.6

5

NRH tarafından verilen cevaba ek olarak, eğer bir "standart normal dağılım" N (0,1) den rasgele örnekler üretmek için hiçbir imkanınız yoksa, aşağıdakiler iyi ve basit bir yoldur (çünkü istatistiklere sahip olmadığınızdan paketinde, aşağıdaki işlevlerin çoğu standart programlama dilinde bulunmalıdır).

1. u ve v'yi -1 ile 1 arasında bir dağılım gösteren iki rasgele sayı olarak
u = 2 r1 - 1vev = 2 r2 - 1

2. w = u^2 + v^2eğer hesap > w> 1 ise 1'e geri döner

3.arma * z ve y = v * z ile z= sqrt(-2ln(w)/w) bir örnek kod şöyle görünecektir:

u = 2 * random() - 1;
v = 2 * random() - 1;
w = pow(u, 2) + pow(v, 2);
if (w < 1) {
    z = sqrt((-2 * log(w)) / w);
    x = u * z;
    y = v * z;
    }

daha sonra rastgele sapmaları almak için MHR'nin önerdiği şeyi kullanın N(mu, sigma^2).


Yukarıdaki cevabımı gönderdiğimde @ vitalStatistix'in size Box-Muller Dönüşüm algoritmasını verdiğini fark etmedim. Yukarıda verdiğim şey de sanırım iyi.
francogrex

2
Doğrudan bir Gaussian / Normal dağılımın pdf'sini kullanmak yerine, tek tip dağılımdan (algoritmik bir perspektif dışında) normal değişkenler üretme nedenini açıklayabilir misiniz? Yoksa tamamen yanlış mı?
Arun

4
@Arun Bir sebep: Marsaglia'nın kutupsal metodu, sadece tek tip sapmalar üreten bir RNG'niz olduğunda faydalıdır.
chl

1
@Arun en kolay yoldur. Ayrıca doğrudan "kabul reddetme" yöntemini kullanarak pdf'den de üretebilirsiniz. Sana basit yayınlanmıştır örnek benim üzerinde sitesinde (çünkü burada yorum kutusuna yeterli alan yok).
francogrex

4

Normal dağılım, birbirine çok benzer rasgele değerler (birbirine benzer, yani demek istediğim) eklendiğinde ortaya çıkar. On veya daha fazla eşit dağılıma rastgele değerler eklerseniz, o zaman toplam neredeyse normal dağılır. (Daha da normal olmasını istiyorsanız ondan fazla ekleyin, ancak on neredeyse tüm amaçlar için yeterlidir.)

Tekdüze rasgele değerlerinizin 0 ile 1 arasında eşit olarak dağıldığını söyleyin. Toplam 0 ve 10 arasında olur. Toplamdan 5 çıkarın ve sonuçta elde edilen dağılımın ortalaması 0 olur. Şimdi sonucu (yakın) normal dağılım ve sonucu istenen standart sapma ile çarpın. Maalesef, on tekdüze rastgele sapmanın toplamının standart sapmasının ne olduğundan emin değilim, ama eğer şanslıysak birileri bize bir yorumda bulunacak!

Bu terimlerle normal dağılım hakkında öğrencilerle konuşmayı tercih ederim, çünkü birçok sistemde normal bir dağıtım varsayımının kullanılması, tamamen rastgele etkilerin toplamının normal bir dağılıma yol açtığı özelliğinden kaynaklanmaktadır.


Burada Central Limit Thm kullanıyorsunuz (bir grup iid rastgele değişken normal bir rastgele değişkenin toplamıdır). Bunu düşünmedim, çünkü çok yavaş olacağını düşündüm, ama 10'un yeterli olduğunu mu söylüyorsun ?! Bu bir günlük ve bir günah / cos ve bir sqrt hesaplamaktan daha iyidir!
Düzeltme

Ayrıca, [0,1] üzerindeki tek tip rv'nin ortalaması, 1/12 varyansı ile 0.5'tir. Bunların 10'unu toplarsanız ortalama 5 ve varyansı 10/12 = 5/6 alırsınız.
Fixee

1
Pedagojik bir bakış açısına göre bu yöntem güzel, faydalı bir tartışma ve gösteri sunar. Ancak, bu yaklaşımı pratikte kullanmaktan kimseyi kesinlikle caydırırım.
kardinal

1
logsincos

1
@Michael: Bu "doğru" dağıtım yaklaştırma dağıtım kompakt desteği vardır ve birçok uygulamada, Özellikle bu yana, bir streç biraz verir bildirme yapar değişkenler oluşturulabilir ne kadar etkin umurumda. :) Mesele şu ki, çok daha iyi seçenekler mevcut. Ancak yine de pedagojik olarak yararlı bir şey sağladığını düşünüyorum.
kardinal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.