循环的内部增量?在r

循环的内部增量?在r,r,statistics,R,Statistics,我正在尝试进行1000次模拟,以查看有多少f值处于高于1.48和低于0.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 <-

我正在尝试进行1000次模拟,以查看有多少f值处于高于1.48和低于0.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
for(1:1000中的k){
Adata=rnorm(100,平均值=30,标准差=10)
b数据=r形式(100,平均值=45,标准差=10)
f=(标准差(数据)^2)/(标准差(数据)^2)
如果(f>1.48){
a=0

a在第一个示例中,每次if语句为true时,您都将
a
b
重置为零。因此,最大值始终为
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}
}
然后计算每行的
f
分数:


f在第一个示例中,每次if语句为true时,都将
a
b
重置为零。因此,最大值始终为
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}
}
然后计算每行的
f
分数:


f在第一个代码块中,您每次迭代都将a和b重置为0,然后可能添加1(因此它们最多为1,因为下一次迭代它们将再次设置为0)

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


简单的解决方案是移动
a=0
b=0
(或者更好的方法是在第一个代码块中,每次迭代都将a和b重置为0,然后可能添加1(因此它们最多是1,因为下一次迭代它们将再次设置为0)

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


简单的解决方案是移动
a=0
b=0
(或者更好的
a尝试创建全局变量。它脏了,但解决了问题。尝试创建全局变量。它脏了,但解决了问题。
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)
sum(f > 1.48)
[1] 15
sum(f < .67)
[1] 25
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 )