我应该如何在r中组合两个循环?

时间:2013-01-13 07:25:15

标签: r loops

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

第一阶段

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

  1. 从正态分布生成3个随机数并将它们平方。
  2. 重复步骤1 15次,最后我会得到15个随机数。
  3. 我已经完成了第一阶段使用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. 查找每个组的修剪均值。
    3. 对于整个过程(第一阶段和第二阶段),我需要模拟它们5000次。我如何继续第2步?你认为我需要再进行第二阶段的循环吗?

1 个答案:

答案 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)

我将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.

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