我正在尝试进行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> 的总金额?
答案 0 :(得分:1)
在第一个示例中,每次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
答案 1 :(得分:1)
在第一个代码块中,每次迭代都会将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 )