所以我有这个 for 循环:
set.seed(11)
k=10000 # replicates
n=100 # sample size of each replication
t.mean = 0 # initialize vector of trimmed means
for(i in 1:k){
dat=rnorm(n)
t.mean[i]=mean(dat,trim=.05)
}
mean(t.mean)
var(t.mean)
我正在尝试用 apply() 函数替换 for 循环中涉及的代码
我认为这会起作用
set.seed = 11
k = 10000
n = 100
t.mean = 0
dat = rnorm(n)
dat = as.data.frame(dat)
t.mean =apply(dat,c(1,2), mean,trim=.05)
mean(t.mean)
var(t.mean)
但是,我没有得到与以前相同的值,并且它们也不像之前使用 for 循环的情况那样保持相同。当我使用 apply 时,我到底做错了什么?
最佳答案
replicate()
函数在这里可能更有用
set.seed(11)
out <- replicate(10, mean(rnorm(100), trim = 0.05))
其中k <- 10
给出
> mean(out)
[1] 0.007134792
> var(out)
[1] 0.009029396
与 for
匹配您为相同的 k
显示的循环.
如果您想使用apply()
,还有另一种选择就是生成整组随机正态值,按 k
将它们排列成 100 行列矩阵,然后 apply()
mean()
在该矩阵的列上。例如
set.seed(11)
rnd <- matrix(rnorm(100*k), ncol = k)
out2 <- apply(rnd, 2L, mean, trim = 0.05)
提供与上面相同的以及您的for()
循环
> mean(out2)
[1] 0.007134792
> var(out2)
[1] 0.009029396
第二条路线的优点是您可以调用 rnorm()
一次而不是k
次。
关于r - 使用 apply() 代替 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47148265/