这些是无需显式循环即可完成的任务。因此,请注意以下几点:如果您生成 3 次 15 次 2000 的随机数,或者您一次生成所有这些随机数,都是一样的。它们仍然共享相同的分布。
下一步:在每个循环中设置种子使您的模拟具有确定性。在脚本开始时调用set.seed
一次。
所以,我们要做的是一次生成所有随机数,然后计算它们的平方范数,以三组为一组,然后构建 15 组。
首先是一些变量定义:
set.seed(20131301)
repetitions <- 2000
numperval <- 3
numpergroup <- 15
miu <- 0
sd1 <- 1
sd2 <- 1
由于我们需要两个组,我们将组生成的东西包装到一个自定义函数中。这不是必需的,但确实有助于保持代码清洁可读。
generateGroup <- function(repetitions, numperval, numpergroup, m, s) {
# Generate all data
data <- rnorm(repetitions*numperval*numpergroup, m, s)
# Build groups of 3:
data <- matrix(data, ncol=numperval)
# And generate the squared norm of those
data <- rowSums(data*data)
# Finally build a matrix with 15 columns, each column one dataset of numbers, each row one repetition
matrix(data, ncol=numpergroup)
}
太好了,现在我们可以为我们的组生成随机数:
group1 <- generateGroup(repetitions, numperval, numpergroup, miu, sd1)
group2 <- generateGroup(repetitions, numperval, numpergroup, miu, sd2)
为了计算修剪后的平均值,我们再次使用apply
:
trimmedmeans_group1 <- apply(group1, 1, mean, trim=0.25)
trimmedmeans_group2 <- apply(group2, 1, mean, trim=0.25)
我使用mean
了trim
参数而不是排序、丢弃和计算平均值。如果您明确需要排序的数字,您可以手动完成(这次只针对一组):
sorted <- t(apply(group1, 1, sort))
# We have to transpose as apply by default returns a matrix with each observation in one column. I chose the other way around above, so we stick with this convention and transpose.
现在,如果您想手动完成,很容易丢弃第一列和最后两列并生成平均值。