[英]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
最终目标是找到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的总数?
在第一个示例中,每次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}
}
我现在得到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=0
和b=0
(或者更好的a <- 0
和b <- 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.