簡體   English   中英

從均值5和標准差3的正態分布模擬5000個大小為5的樣本

[英]Simulate 5000 samples of size 5 from a normal distribution with mean 5 and standard deviation 3

我正在嘗試從均值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]])
}

關於如何解決這個問題的任何想法? 我對R非常陌生!

您實際上可以在沒有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])
}

在這種情況下,您不需要列表。 新R用戶過度使用列表是一個常見錯誤。

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

現在的means是5000個元素的向量。

您的代碼很好(請參見下文),但是我建議您嘗試以下操作:

 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

在這里,我將種子設置為隨機數生成器,以確保隨機數相同。 如您所見,您的代碼運行良好,盡管正如其他人指出的那樣,可以輕松避免循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM