内循环增量?在r

时间:2016-04-11 21:49:13

标签: r statistics

我正在尝试进行1000次模拟,以查看我的 f 值中有多少是在1.48以下.67以上的拒绝区域。

我有这个,但变量不会按原样递增:

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

最终目标是找到 a b 的总和

我也尝试过:

 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&#39> 的总金额?

2 个答案:

答案 0 :(得分:1)

在第一个示例中,每次if语句为true时,您都将ab重置为零。因此,最大值始终为1

要修复,请重新排列这些行:

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}
}

我现在得到a = 13和b = 29

那就是说,不要在R 中增加这样的变量。您可以利用矩阵和矢量化操作。

首先创建模拟矩阵

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)

然后计算每行的f分数:

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

现在你可以简单地使用:

sum(f > 1.48)
[1] 15

sum(f < .67)
[1] 25

答案 1 :(得分:1)

在第一个代码块中,每次迭代都会将a和b重置为0,然后可能会加1(所以它们最多的是1,因为下次迭代它们将再次设置为0)。

在第二个块中,您将a和b设置为TRUE或FALSE,但是您要覆盖该值,因此您只能看到最终迭代中的值(实际上该循环只运行一次,k等于1000,但是如果你有1:1000,那么你只会看到最后一次迭代。)

简单的解决方案是将a=0b=0(或更好的a <- 0b <- 0)移出循环。

更好的方法是在apply函数族中使用某些东西。

我会建议像:

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 )