Я пытаюсь смоделировать 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!

1
Nick Garcia 11 Май 2016 в 02:27

3 ответа

Лучший ответ

Ваш код в порядке (см. Ниже), но я предлагаю вам попробовать следующее:

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

Здесь для каждого элемента последовательности 1, 2, 3, ... nrSamples, который я указываю в качестве первого аргумента, lapply выполняет функцию с заданным элементом последовательности в качестве аргумента (т. Е. { {X2}}). Однако функция, которую я предоставил, не зависит от 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

Здесь я установил начальное число в генератор случайных чисел, чтобы убедиться, что случайные числа совпадают. Как видите, ваш код работает нормально, хотя, как отмечали другие, циклов можно легко избежать.

1
coffeinjunky 10 Май 2016 в 23:58

В этом случае вам не нужен список. Чрезмерное использование списков является распространенной ошибкой новых пользователей R.

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

Теперь means - это вектор из 5000 элементов.

4
user31264 10 Май 2016 в 23:55

Вы действительно можете сделать это без циклов 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])
}
4
eipi10 10 Май 2016 в 23:58