如何在平均±3Sigma内生成正态随机样本

时间:2015-05-16 09:18:46

标签: r random normal-distribution

我想在具有特定均值(M)和标准偏差(S)的顺序数组((100 * 8)* 5000)中绘制正常随机数,但我希望它们仅在M±3S范围内,所以我的阵列中没有超出这些限制的异常值。

有什么建议吗?我想在R中编写一个基于该数组的程序进行一些模拟研究。我正在使用以下R代码生成我的数据集:

for(i in 1:5000){
for(j in 1:8){
            Dat[,j,i]=rnorm(100,mean=muu[j],sd=sigma[j])
         }
         }

现在,我们想要摆脱上述数据中高于muu±3sigma的那些值。当然,我们必须用新值替换丢弃的值,以便Dat数组的维度保持不变。

1 个答案:

答案 0 :(得分:2)

第一个解决方案

这是一个开始,但我敢打赌,有一个更优雅的解决方案。 首先生成下一步的样本,将其子集化为所需的值。当然,你必须根据自己的意愿调整价值。

set.seed(123)
rs <- rnorm(10000, mean = 10, sd = 3)
rs1 <- rs[ rs >= -19 & rs <= 19  ]

第二(更好)解决方案

我认为我的第一个解决方案并没有那么顺利。我刚刚编写了一些可能适合您的目的的代码。以下是步骤。

  • 创建具有所需尺寸的NA数组
  • 用随机数填写
  • 创建一个逻辑向量,其中TRUE是针对所需条件的
  • 基于该向量对data进行子集化,并将TRUE为TRUE的值(请原谅我的文字游戏)替换为用于生成样本的均值

    数据&lt; - 数组(NA,dim = c(100,8,5000))

    for(i in 1:5000){
        data[ , , i] <- rnorm(800, 3, 1)
    }
    
    bound <- 3 + c(-1, 1)*3*1
    pr <- data <= bound[1] | data >= bound[2]
    data[pr] <- 3