繁体   English   中英

在for循环内增加? 在r

[英]Increment inside for loop? in r

我正在尝试进行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

最终目标是找到ab之和

我也尝试过:

 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的总数?

在第一个示例中,每次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

在代码的第一个块中,您将每次迭代将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 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM