首页 文章

从正态分布模拟5000个大小为5的样本,平均值为5,标准差为3

提问于
浏览
1

我试图用正态分布模拟5000个5号样本,平均值为5,标准差为3.我想计算每个样本的平均值,并制作样本均值的直方图

我目前的代码没有给我一个错误,但我不认为这是正确的:

nrSamples = 5000
e <- list(mode="vector",length=nrSamples)
for (i in 1:nrSamples) {
e[[i]] <- rnorm(n = 5, mean = 5, sd = 3)
}

sample_means <- matrix(NA, 5000,1)
for (i in 1:5000){
sample_means[i] <- mean(e[[i]])
}

有关如何解决这个问题的任何想法?我对R非常新!

3 回答

  • 1

    你的代码很好(见下文),但我建议你尝试以下方法:

    yourlist <- lapply(1:nrSamples, function(x) rnorm(n=5, mean = 5, sd = 3 ))
     yourmeans <- sapply(yourlist, mean)
    

    这里,对于作为第一个参数提供的序列1,2,3,... nrSamples 的每个元素, lapply 执行一个函数,该序列的给定元素作为参数(即 x ) . 我提供的函数不依赖于 x ,因此它只复制了5000次,输出存储在列表中(这就是 lapply 所做的) . 在这种情况下,这是一种避免循环的简单方法 . 不用说,你也可以跑

    yourmeans <- sapply(1:nrSamples, function(x) mean(rnorm(n=5, mean = 5, sd = 3)))
    

    除了手段,后者不会存储您的结果,这可能不是您想要的 . 另请注意,我调用 sapply 来返回一个矢量,然后您可以使用该矢量绘制直方图 . hist(yourmeans) .

    To show that your code is fine, consider the following:

    set.seed(42)
    nrSamples = 5000
    e <- list(mode="vector",length=nrSamples)
    for (i in 1:nrSamples) {
      e[[i]] <- rnorm(n = 5, mean = 5, sd = 3)
    }
    
    sample_means <- matrix(NA, 5000,1)
    for (i in 1:5000){
      sample_means[i] <- mean(e[[i]])
    }
    
    set.seed(42)
    yourlist <- lapply(1:nrSamples, function(x) rnorm(n=5, mean = 5, sd = 3 ))
    yourmeans <- sapply(yourlist, mean)
    
    all.equal(as.vector(sample_means), yourmeans)
    [1] TRUE
    

    在这里,我将种子设置为随机数生成器,以确保随机数相同 . 如您所见,您的代码工作正常,但正如其他人所指出的那样,可以轻松避免循环 .

  • 4

    在这种情况下,您不需要列表 . 新R用户常常错误地使用列表 .

    observations <- matrix(rnorm(25000, mean=5, sd=3), 5000, 5)
    means <- rowMeans(observations)
    

    现在 means 是5000个元素的向量 .

  • 3

    你可以在没有for循环的情况下实现这一点 replicate 可用于创建5000个样本 . 然后使用 sapply 返回每个样本的平均值 . 在 hist() 中包含 sapply 调用以获取平均值的直方图 .

    dat = replicate(5000, rnorm(5,5,3), simplify=FALSE)
    
    hist(sapply(dat, mean))
    

    或者,如果你想保存手段:

    sample.means = sapply(dat,mean)
    hist(sample.means)
    

    我认为您的代码提供了有效的结果 . list(mode="vector",length=nrSamples) 没有做我认为你想要的事情(在控制台中运行它,看看会发生什么),但它确实有效,因为前两个列表元素在循环中被覆盖 .

    虽然这里不需要使用循环,但这里只是为了说明使用循环的代码的两个修改版本:

    # 1. Store random samples in a list
    e <- vector("list", nrSamples) 
    for (i in 1:nrSamples) {
      e[[i]] <- rnorm(n = 5, mean = 5, sd = 3)
    }
    
    sample_means = rep(NA, nrSamples)
    for (i in 1:nrSamples){
      sample_means[i] <- mean(e[[i]])
    }
    
    # 2. Store random samples in a matrix
    e <- matrix(rep(NA, 5000*5), nrow=5)
    for (i in 1:nrSamples) {
      e[,i] <- rnorm(n = 5, mean = 5, sd = 3)
    }
    
    sample_means = rep(NA, nrSamples)
    for (i in 1:nrSamples){
      sample_means[i] <- mean(e[, i])
    }
    

相关问题