Nic*_*cia 2 functional-programming r
我正在尝试从平均值为 5、标准差为 3 的正态分布模拟 5000 个大小为 5 的样本。然后我想计算每个样本的平均值并制作样本平均值的直方图
我当前的代码没有给我错误,但我认为这是不对的:
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]])
}
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题有什么想法吗?我对 R 非常非常陌生!
实际上,您可以在没有 for 循环的情况下做到这一点。replicate可用于创建 5000 个样本。然后使用sapply返回每个样本的平均值。将调用包装sapply起来hist()以获得平均值的直方图。
dat = replicate(5000, rnorm(5,5,3), simplify=FALSE)
hist(sapply(dat, mean))
Run Code Online (Sandbox Code Playgroud)
或者,如果您想保存方法:
sample.means = sapply(dat,mean)
hist(sample.means)
Run Code Online (Sandbox Code Playgroud)
我认为您的代码给出了有效的结果。 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])
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您不需要列表。过度使用列表是 R 新用户的一个常见错误。
observations <- matrix(rnorm(25000, mean=5, sd=3), 5000, 5)
means <- rowMeans(observations)
Run Code Online (Sandbox Code Playgroud)
Nowmeans是一个包含 5000 个元素的向量。