Korelasyonlu rasgele sayılar nasıl üretilir (verilen araçlar, varyanslar ve korelasyon derecesi)?


53

Bu çok basit görünüyorsa özür dilerim, ama sanırım burada anlayışı onaylamak istiyorum. Bunu iki adımda yapmak zorunda kalacağımı anladım ve korelasyon matrislerini kırmaya çalışmaya başladım, ancak gerçekten işe karışmış gibi görünmeye başladı. İlişkili rasgele sayılar oluşturmak için iyi ve ideal hızlı bir yolun (ideal olarak sahte kod çözümüne yönelik ipuçlarıyla) kısa bir açıklama arıyorum.

Bilinen ortalamalar ve varyanslarla boy ve kilo olarak iki sözderandom değişkeni ve verilen bir korelasyon göz önüne alındığında, temelde bu ikinci adımın nasıl görünmesi gerektiğini anlamaya çalışıyorum:

   height = gaussianPdf(height.mean, height.variance)
   weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient), 
                        correlated_variance(height.variance, 
                        correlation_coefficient))
  • İlişkili ortalama ve varyansı nasıl hesaplarım? Ancak bunun gerçekten ilgili sorun olduğunu onaylamak istiyorum.
  • Matris manipülasyonuna başvurmam gerekir mi? Yoksa bu soruna temel yaklaşımımda çok yanlış bir şey mi var?

1
Seni doğru anladığımdan emin değilim, ama "ilişkili ortalama ve varyans" hesaplamak zorunda değilsin. Değişkenlerin iki değişkenli normal olduğunu varsayıyorsanız, bireysel araçları ve varyansları ve korelasyonu belirtmeniz yeterli olacaktır. Bunun için kullanmak istediğiniz herhangi bir özel yazılım var mı?
mark999


Yanıtlar:


44

"Bağlantılı rasgele sayılar üretmenin iyi ve ideal hızlı bir yolu" sorunuzu yanıtlamak için: Tanım olarak pozitif olan istenen bir varyans-kovaryans matrisi göz önüne alındığında , bunun Cholesky ayrışması şöyledir: C = L L T ; L alt üçgen matris olmak.CCLLTL

Şimdi bu matris yi ilişkisiz bir rastgele değişken vektörü X yansıtmak için kullanırsanız, sonuçtaki Y = L X çıkıntısı korelasyonlu rastgele değişkenlerin olacaktır.LXY=LX

Bunun neden burada olduğuna dair kısa bir açıklama bulabilirsiniz .


Teşekkürler! Bu çok yardımcı oldu. Sanırım en azından sonra bakmam gerekenler hakkında daha iyi bir fikrim var.
Joseph Weissman

7
Bu yöntem yalnızca Gauss dağılımları için geçerli mi (soruda belirtildiği gibi) veya diğer dağılımları takip eden ilişkili değişkenleri üretmek için kullanılabilir mi? Olmazsa, bu durumda kullanılabilecek bir yöntemin farkında mısın?
user000001

1
@Michael: Evet. Verilen geçerli bir kovaryans matrisi olduğunu söyleyen Cholesky ayrışması en hızlı yoldur. Ayrıca, kare kökü (simetrik) alabilir X matrisini C SVD kullanılarak (çok Cı- = X X = X X T , burada X = U S 0.5 V T den = U S V T ), fakat daha pahalı olacaktır çok. CXCC=XX=XXTX=US0.5VTC=USVT
usεr11852, Reinstate Monic’in 18: 29’da

1
@Michael: Elbette. Kovaryansları (yaklaşık olarak) aynı olacak, sayıların kendisi değil.
usεr11852 diyor Reinstate Monic,

1
@Sid: Tüm gerçek hat üzerinde desteklenmeyen herhangi bir sürekli dağıtım derhal başarısız olur. Bir uniform kullanın, örneğin biz "ilişkili sayılar" olacağını garanti edemez [ 0 , 1 ] ; Benzer şekilde Poisson için ayrık olmayan sayılarla sonuçlanacaktır. Buna ek olarak, dağılımları toplamı yine aynı dağıtım olmayan herhangi bir dağılımı (ör. Toplanmasıyla t sonuçlanmaz -Dağıtım t dağıtımı:) de başarısız olur. Belirtilen tüm durumlarda, üretilen sayılar ilişkili olacaktır göre CU[0,1][0,1]ttCfakat başlattığımız dağıtıma karşılık gelmeyeceklerdir.
usεr11852 diyor Reinstate Monic

36

+1 ila @ user11852 ve @ jem77bfp, bunlar iyi cevaplardır. Buna farklı bir bakış açısıyla yaklaşmama izin verin , pratikte mutlaka daha iyi olduğunu düşündüğüm için değil, öğretici olduğunu düşündüğüm için. İşte zaten bildiğimiz birkaç ilgili gerçek:

  1. Her iki regresyon çizgisinin eğimi olan X ve Y, olanstandartyani, N ( 0 , 1 ) , rXYN(0,1)
  2. varyans oranı olan Y varyansın atfedilebilir X , r2YX



    (ayrıca, varyans kurallarından ):

  3. Bir sabit ile çarpılan rastgele bir değişkenin varyansı, orijinal varyansın sabit kare çarpımıdır :
    Var[aX]=a2Var[X]
  4. varyanslar eklemek iki varyans toplamıdır yani iki rastgele değişkenlerin toplamı varyans (bunlar bağımsız varsayılarak):
    Var[X+ε]=Var[X]+Var[ε]

Şimdi, bu dört gerçeği, popülasyonları belirli bir korelasyona sahip olacak iki normal normal değişken oluşturmak için birleştirebiliriz , (daha doğru, ρ ), ancak ürettiğiniz örnekler değişken örnek korelasyonlara sahip olsa da. Fikri yalancı rasgele bir değişken oluşturmak için olan X standart normal, N ( 0 , 1 ) , ve daha sonra bir katsayı bulmak bir ve bir hata varyans, v e , bu şekilde Y, ~ N ( 0 , bir 2 + v , e ) , burada birrρXN-(0,1)birveYN(0,a2+ve) . (Bunun çalışması için | a | 'nın1 olması gerektiğinive dahası, a = r olması gerektiğini unutmayın .) Böylece, istediğiniz r ile başlarsınız; bu senin katsayın, a . O zaman ihtiyacınız olacak hata varyansı anlamaya, bu kadar 1 - r 2 . (Yazılım standart sapması kullanmanızı gerektiriyorsa, bu değerin karekökünü alır.) Son olarak, her yalancı rasgele değişkenin, için x i , oluşturulan oldukları bir yalancı rasgele hata değişken oluşturmak e ia2+ve=1|a| 1a=rra1r2xieiUygun hata varyans ile , korelasyon yalancı rasgele değişken, hesaplamak ve y ı , çoğalarak ekleyerek. veyi

Bunu R'de yapmak istiyorsanız, aşağıdaki kod sizin için işe yarayabilir:

correlatedValue = function(x, r){
  r2 = r**2
  ve = 1-r2
  SD = sqrt(ve)
  e  = rnorm(length(x), mean=0, sd=SD)
  y  = r*x + e
  return(y)
}

set.seed(5)
x = rnorm(10000)
y = correlatedValue(x=x, r=.5)

cor(x,y)
[1] 0.4945964

(Düzenleme: Söylemeyi unuttum :) Açıkladığım gibi, bu prosedür size iki standart normal korelasyonlu değişken verir. Standart normaller istemiyorsanız , ancak değişkenlerin bazı özel araçlara (0 değil) ve SD'lere (1 değil) sahip olmasını istiyorsanız, korelasyonu etkilemeden bunları dönüştürebilirsiniz. Böylece, ortalamanın tam olarak olmasını sağlamak için gözlemlenen ortalamayı çıkarır, değişkeni istediğiniz SD ile çarpın ve ardından istediğiniz ortalamayı ekleyin. Gözlemlenen ortalamanın istenen ortalamanın etrafında normal olarak dalgalanmasını istiyorsanız, ilk farkı geri ekleyeceksiniz. Temel olarak, bu tersine bir z-puanı dönüşümüdür. Bu doğrusal bir dönüşüm olduğundan, dönüştürülen değişken önceki değişkenle aynı korelasyona sahip olacaktır. 0

Yine, bu, en basit haliyle, sadece bir çift korelasyonlu değişken oluşturmanıza izin verir (bu ölçeklendirilebilir, ancak çirkin hızlı olur) ve kesinlikle işi yapmanın en uygun yolu değildir. Ar, kullanmak isteyeyim ? Mvrnorm içinde KİTLE daha kolay hem çünkü paketin ve belirli bir nüfus korelasyon matris ile birçok değişken oluşturabilir çünkü. Bununla birlikte, bazı temel prensiplerin basit bir şekilde nasıl yürüdüğünü görmek için bu süreçten geçmenin faydası olduğunu düşünüyorum.


Bu esasen regresyonel yaklaşım, herhangi bir mevcut X "öngörücüsüyle" ilişkili bir rasgele Y üretmesine izin vermek özellikle güzeldir . Böyle bir anlayışta haklı mıyım?
ttnphns

İstediğiniz değişkenler arasında tam olarak hangi korelasyon modeline bağlı olduğuna, @ttnphns. Bunu birbiri ardına yineleyebilirsiniz, ancak sıkıcı olur. Belirli bir düzende çok sayıda ilişkili değişken oluşturmak için, Cholesky ayrıştırmasını kullanmak daha iyidir.
gung - Reinstate Monica

Cholesky'yi, birkaç mevcut (simüle edilmemiş) Xs ile bir korelasyon vektörüne göre korelasyonlu bir Y üretmek için (yaklaşık olarak metodunuzda olduğu gibi) nasıl kullanacağınızı biliyor musunuz ?
ttnphns

@ ttnphns, önceden belirlenmiş bir popülasyon korelasyonu olan bir dizi p değişkeni değil, bir X kümesiyle birlikte verilen bir popülasyon korelasyonu oluşturmak ister misiniz? Basit bir yol, X'inizden tek bir Y-şapka üretmek için bir regresyon denklemi yazmak, ardından Y-şapkanızın bir korelasyonu olarak Y üretmek için yukarıdaki yöntemi kullanmak olacaktır. İsterseniz, bunun hakkında yeni bir soru sorabilirsiniz.
gung - Reinstate Monica

1
İlk yorumumda kastettiğim şuydu: bu yöntem, cevabınızda konuştuğunuz şeyin doğrudan bir uzantısıdır: esasen regressional (Hat) yöntemi.
ttnphns

16

Genel olarak bu değil basit bir şey yapmak ama için paketler olduğuna inanıyorum değişkenli normal değişken nesil (en azından R, bakınız mvrnormde MASSpakete), burada sadece girdi bir kovaryans matrisi ve ortalama vektörü.

Ayrıca bir tane daha "yapıcı" yaklaşım var. Diyelim ki rastgele bir vektörü modellemek istiyoruz ve dağılım fonksiyonunu F ( x 1 , x 2 ) alıyoruz . İlk adım, marjinal dağılım fonksiyonunu elde etmektir; yani, F'yi tüm x 2'ye entegre edin : F X 1 ( x 1 ) = - F ( x 1 , x 2 ) d x 2(X1,X2)F(x1,x2)Fx2 Sonra F - 1 X 1 - F X 1'in ters fonksiyonunubuluruz- ve [ 0 , 1 ] aralığında eşit bir şekilde dağıtılmış olanrastgele bir değişkende ξ 1 fişe takın. Bu adımda, ilk koordinat oluşturmak x 1 = F - 1 x 1 ( Karsılık ) .

FX1(x1)=-F(x1,x2)dx2.
FX1-1FX1ξ1[0,1]x^1=FX1-1(ξ)

Şimdi, bir koordinatımız olduğuna göre, ilk dağıtım fonksiyonumuza ve ardından koşulu ile bir koşullu dağılım fonksiyonu olsun x 1 = x 1 : F ( x 2 | X 1 = x 1 ) = F ( x 1 , x 2 )F(x1,x2)x1=x^1 buradafx1marjinal bir olasılık yoğunluk fonksiyonu olanX-1dağılımı; yani,FX 1 (x1)=fX1(x1).

F(x2|X1=x^1)=F(x^1,x2)fX1(x^1),
fX1X1FX1'(x1)=fX1(x1)

Daha sonra tekrar aynı oranda dağılmış değişken oluşturmak ile [ 0 , 1 ] (bağımsız bir ξ 1 ) ve tersine olarak takın F ( x 2 |ξ2[0,1]ξ1F(x2|X1=x^1)x^2=(F(x2|X1=x^1))-1(ξ)x^2F(x^2|X1=x^1)=ξ

Düzgün bir değişkeni ters olasılık dağılım fonksiyonuna sokmanın anlamını anlamıyorsanız, tek değişkenli durumun bir taslağını çizmeye çalışın ve sonra ters fonksiyonun geometrik yorumunun ne olduğunu hatırlayın.


Akıllıca fikir! Basit sezgisel çekiciliği vardır. Fakat evet, hesaplama açısından pahalı görünüyor.
MichaelChirico

fX,Y(x,y)=fX(x)fY|X(y)

1

Verimliliğinden vazgeçmeye hazırsanız, bir çöpe atılan alogoritmi kullanabilirsiniz. Avantajı, her türlü dağıtıma izin vermesidir (yalnızca Gauss dili değil).

İlişkisiz iki rasgele sayı dizisi oluşturarak başlayın {xben}ben=1N-{yben}ben=1N-C

cÖld=cÖrr({xben},{yben})

n1n2:1n1,2N-

xn1xn2

cnew=cÖrr({xben},{yben})

|C-cnew|<|C-cÖld|

|C-c|<ε

xben

İyi şanslar!


xbencÖrr(xben,yben)

xben{xben}ycÖrr(xben,yben)cÖrr({xben},{yben})=(1/N-)Σben=1N-(xben-x¯)(yy-y¯)

Görüyorum, çok mantıklı. I "yok " içinde c o r r ({}cÖrr({xben},{yben})
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.