【问题标题】:How to Generate Normal Random Samples within Mean±3Sigma如何在 Mean±3Sigma 范围内生成正态随机样本
【发布时间】:2015-05-16 09:18:45
【问题描述】:

我想以特定的均值 (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 数组的维度保持不变。

【问题讨论】:

  • 只需写下您的分布的逆 cdf。有了它,您可以从统一的 (0,1) 绘图进行映射。

标签: r random normal-distribution


【解决方案1】:

第一个解决方案

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

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

第二个(更好的)解决方案

我认为我的第一个解决方案效果不佳。我刚刚编写了一些可能非常适合您的代码。步骤如下。

  • 创建具有所需尺寸的 NA 数组
  • 用随机数填充它
  • 创建一个逻辑向量,其中TRUEs 用于所需条件
  • 根据该向量对data 进行子集化,并将 TRUE 为 TRUE 的值替换为用于生成样本的平均值

    数据

    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
    

【讨论】:

  • 我认为这几乎是正确的。我认为您真正想要的是参数化您的均值和 sd,然后过滤为均值正负 3*sd。
  • 这个解决方案是完美的,如果我们只有一个复制,但就我而言,我使用两个 for 循环(如下所示)来生成数据集:for(i in 1:5000){ for(j in 1:8){ Dat[,j,i]=rnorm(100,mean=muu[j],sd=sigma[j]) } } 对于这种情况,我该如何得到我想要的数据集?
  • 我很抱歉@KashifAli,但我认为我没有得到你应该做的事情。首先,您想要一个 3 维数组,比如 100 行 * 8 列 * 5000 个级别?如果是这样,但即使不是这样,您想要一个简单的模拟还是有限数量的模拟?这些模拟是按行还是按列?
  • 我很抱歉@KashifAli,但我还是不明白。您的代码似乎说您想要生成 8 个样本,每个样本的平均值从 1 到 8,并且对于每组随机样本(平均值从 1 到 8),您需要 5000 个数组级别。所以,让我回顾一下:一个有 8 列、100 行和 5000 层的数组。每列都是 rnorm 的结果,其中第 1 列的平均值为 1 和 sd 1,第 2 列的平均值为 2 和 sd 2,依此类推。
  • 实际上我忘了提到均值是相同的,用 muu[j] 表示,标准差也是如此。
猜你喜欢
  • 2021-09-01
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 2010-12-24
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
相关资源
最近更新 更多