Идентичные значения, полученные из случайных выборок из равномерного распределения в dplyr

Это продолжение предыдущего вопроса. Мой вопрос не был полностью сформулирован и поэтому не получил полного ответа в моем последнем посте. Простите меня, я новичок в использовании переполнения стека.

Мой профессор назначил набор задач, и мы должны использовать dplyr и другие пакеты tidyverse. Я прекрасно понимаю, что большинство (если не все) задач, которые я пытаюсь выполнить, возможны в базе r, но это не согласуется с моими инструкциями.

Сначала нас просят сгенерировать таблицу из 1000 случайных выборок из равномерного распределения:

2a.  Create a new tibble called uniformDf containing a variable called unifSamples that contains 10000 random samples from a uniform distribution.  You should use the runif() function to create the uniform samples. {r 2a}

uniformDf <- tibble(unifSamples = runif(1000))

Это хорошо.

Затем нас просят выполнить цикл по этой таблице 1000 раз, каждый раз выбирая 20 случайных выборок, вычисляя среднее значение и сохраняя его в таблице:

2c.  Now let's loop through 1000 times, sampling 20 values from a uniform distribution and computing the mean of the sample, saving this mean to a variable called sampMean within a tibble called uniformSampleMeans. {r 2c}

unif_sample_size = 20 # sample size
n_samples = 1000 # number of samples

# set up q data frame to contain the results
uniformSampleMeans <- tibble(sampMean=rep(NA,n_samples))

# loop through all samples.  for each one, take a new random sample, 
# compute the mean, and store it in the data frame

for (i in 1:n_samples){
  uniformSampleMeans$sampMean[i] <- uniformDf %>%
  sample_n(unif_sample_size) %>%
  summarize(sampMean = mean(sampMean))
}

Все это работает, ну, я думаю, пока не посмотрю на свой uniformSampleMeans тибет. Это выглядит так:

1   0.471271611726843
2   0.471271611726843
3   0.471271611726843
4   0.471271611726843
5   0.471271611726843
6   0.471271611726843
7   0.471271611726843
...
1000    0.471271611726843

Все значения идентичны! Кто-нибудь знает, почему мой результат такой? Я был бы менее обеспокоен, если бы они варьировались на значения +/- 0,000x, поскольку это происходит от распределения, которое находится в диапазоне от 0 до 1, но все значения идентичны даже до 15-го десятичного знака! Любая помощь высоко ценится!


person Salma Abdel-Raheem    schedule 20.02.2020    source источник
comment
У вас есть sampMean = mean(sampMean). Вы не показали, где вы создаете объект sampMean, но он выглядит как фиксированное значение, созданное вне цикла for. Вероятно, это должно быть sampMean = mean(unifSamples).   -  person Marius    schedule 20.02.2020
comment
Да спасибо! Теперь я понимаю, насколько это было глупой ошибкой.   -  person Salma Abdel-Raheem    schedule 20.02.2020


Ответы (1)


Следующее выбирает случайные unif_sample_size строки и дает mean

library(dplyr)
uniformDf %>% sample_n(unif_sample_size) %>% pull(unifSamples) %>% mean
#[1] 0.5563638

Если вы хотите сделать это n раз, используйте replicate и повторите это n раз.

n <- 10
replicate(n, uniformDf %>%
               sample_n(unif_sample_size) %>%
               pull(unifSamples) %>% mean)
#[1] 0.5070833 0.5259541 0.5617969 0.4695862 0.5030998 0.5745950 0.4688153 0.4914363 0.4449804 0.5202964
person Ronak Shah    schedule 20.02.2020