我试图用正态分布模拟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来说非常新!
答案 0 :(得分:4)
你可以在没有for循环的情况下实际执行此操作。 replicate
可用于创建5000个样本。然后使用sapply
返回每个样本的平均值。将sapply
来电换于hist()
以获取均值的直方图。
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])
}
答案 1 :(得分:4)
在这种情况下,您不需要列表。新R用户常常错误地使用列表。
observations <- matrix(rnorm(25000, mean=5, sd=3), 5000, 5)
means <- rowMeans(observations)
现在means
是5000个元素的向量。
答案 2 :(得分: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)
。
要显示您的代码正常,请考虑以下事项:
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
在这里,我将种子设置为随机数生成器,以确保随机数相同。如您所见,您的代码工作正常,但正如其他人所指出的那样,可以很容易地避免循环。