2016-04-11 30 views
0

f değerlerimin kaç tanesinin 1.48 ve altındaki .67'nin altında olduğunu görmek için 1000 simülasyon yapmayı deniyorum.Döngü için artış mı? r

Bunu alabilir ama gerektiği gibi değişkenler artırmaz: nihai hedef

Ben de denedim bve toplamı bulmak

for (k in 1:1000){ 
    Adata = rnorm(100, mean = 30, sd = 10) 
    Bdata = rnorm(100, mean = 45, sd = 10) 
    f = (sd(Bdata)^2)/(sd(Adata)^2) 
    if (f > 1.48){ 
    a = 0 
    a <- a + 1} 
    if (f < .67){ 
    b = 0 
    b <- b + 1} 
} 

a 
[1] 1 
b 
[1] 1 

:

for (k in 1000){ 
    Adata = rnorm(100, mean = 30, sd = 10) 
    Bdata = rnorm(100, mean = 45, sd = 10) 
    f = (sd(Bdata)^2)/(sd(Adata)^2) 
    a = f > 1.48 
    b = f < .67 
    } 
y = sum(a)+sum(b) 
y 
[1] 0 

f toplam miktarını arttırmak için başka ne gibi bir yol izlerim? reddetme bölgesinde olan?

+0

yerine genel değişkenler oluşturmayı deneyin. Kirli ama sorunu çözüyor. –

cevap

1

İlk örneğinizde, if deyiminin true olduğu her defasında a ve b sıfırlanır. Bu nedenle, maksimum değer her zaman 1 olacaktır.

, tamir bu çizgileri yeniden düzenlemek için:

a = 0 #initialize outside of the loop 
b = 0 #initialize outside of the loop 
set.seed(1) # added for SO as you are using rnorm, remove this when you run your simulations 
for (k in 1:1000){ 
    Adata = rnorm(100, mean = 30, sd = 10) 
    Bdata = rnorm(100, mean = 45, sd = 10) 
    f = (sd(Bdata)^2)/(sd(Adata)^2) 
    if (f > 1.48){ 
    a <- a + 1} 
    if (f < .67){ 
    b <- b + 1} 
} 

Şimdi olsun = 13 ve b = R böyle değişkenleri artırmaz, bahsedilen

29. Matrislerden ve vectorized işlemlerden yararlanabilirsiniz.

İlk oluştur simülasyon matrisleri

set.seed(1) 
Adata = matrix(data = rnorm(100*1000, mean = 30, sd = 10), nrow = 1000, ncol = 100) 
Bdata = matrix(data = rnorm(100*1000, mean = 30, sd = 10), nrow = 1000, ncol = 100) 

Sonra her satırı için f puanı hesaplamak:

f <- apply(Bdata,1,function(x){sd(x)^2})/apply(Adata,1,function(x){sd(x)^2})

şimdi sadece kullanabilirsiniz:

sum(f > 1.48) 
[1] 15 

ve:

sum(f < .67) 
[1] 25 
1

Kodun ilk satırında, her yinelemede a ve b 'yi sıfırlarsınız, sonra da muhtemelen 1 eklediğinizde (böylece en fazla 1 olacaklardır, çünkü sonraki iterasyon tekrar 0 olacak şekilde ayarlanır).

İkinci satırda a ve b'yi TRUE veya FALSE olarak ayarlıyorsunuz, ancak bu değerin üzerine yazıyorsunuz, bu nedenle yalnızca son yinelemeden gelen değeri görüyorsunuz (aslında bu döngü yalnızca 1000'e eşit bir k ile çalışır) ama orada 1: 1000 olsaydı, o zaman sadece son iterasyonu görürdünüz.

Basit çözüm, a=0 ve b=0 (veya daha iyisi a <- 0 ve b <- 0) döngüsünün dışına taşımaktır.

Daha iyi bir yaklaşım, apply işlev ailesindeki bir öğeyi kullanmaktır.

ben gibi bir şey öneririm:

out <- replicate(1000, { 
    Adata = rnorm(100, mean = 30, sd = 10) 
    Bdata = rnorm(100, mean = 45, sd = 10) 
    (sd(Bdata)^2)/(sd(Adata)^2) 
    }) 

sum(out > 1.48) 
sum(out < 0.67) 

sum(out > 1.48 | out < 0.67)