我想问你的意见,因为我不太清楚怎么做。这是关于我的论文项目的一部分,我的情况是:
我有2个组,每组我需要计算以下步骤:
我已经完成了第一阶段使用for循环。
n1<-3
n2<-3
miu<-0
sd1<-1
sd2<-1
asim<-15
w<-rep(NA,asim)
x<-rep(NA,asim)
for (i in 1:asim) {
print(i)
set.seed(i)
data1<-rnorm(n1,miu,sd1)
data2<-rnorm(n2,miu,sd2)
w[i]<-sum(data1^2)
x[i]<-sum(data2^2)
}
w
x
第二阶段是;
对于每个小组,我需要:
对于整个过程(第一阶段和第二阶段),我需要模拟它们5000次。我如何继续第2步?你认为我需要再进行第二阶段的循环吗?
答案 0 :(得分:2)
这些是你可以在没有显式循环的情况下完成的任务。因此,请注意以下几点:如果您生成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.
现在,如果你想手动完成它,很容易丢掉第一列和最后两列并生成均值。