0

我想问问你的意见,因为我不太确定该怎么做。这是关于我的论文项目的一部分,我的情况是:

阶段I

我有 2 个组,对于每个组,我需要计算以下步骤:

  1. 从正态分布生成 3 个随机数并将它们平方。
  2. 重复步骤 1 15 次,最后我会得到 15 个随机数。

我已经完成了使用 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

第二阶段是;

第二阶段

对于每个组,我需要:

  1. 对组进行排序;
  2. 找到每个组的修剪平均值。

对于整个过程(第一阶段和第二阶段),我需要模拟它们 5000 次。我将如何进行第 2 步?你认为我需要再放一个循环来进行第二阶段吗?

4

1 回答 1

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)

我使用meantrim参数而不是排序、丢弃和计算平均值。如果您明确需要排序的数字,您可以手动完成(这次只针对一组):

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.

现在,如果您想手动完成,很容易丢弃第一列和最后两列并生成平均值。

于 2013-01-13T07:50:01.460 回答