Вложенный цикл for в R для моделирования

#r #loops #nested #simulation

#r #циклы #вложенный #Симуляция

Вопрос:

Уважаемое сообщество,

Я хочу создать вложенный цикл for. Внутренний цикл должен повторно (x 10.000) вычислять p-значение подставки. норма. distn. с помощью j рисует и сохраняет его в p_val. Внешний цикл должен повторить этот внутренний цикл для моего i числа розыгрышей, где i = c(10,50,100,1000), а затем сохранить среднее значение этого в p_val_mean, которое должно быть вектором только с четырьмя записями. Приведенный ниже код не работает для меня, и мой p_val_mean содержит 1000 записей, только 4 из которых содержат вычисляемые значения:

 # outer loop

p_val_mean <- rep(NA, 4)
for (i in c(10, 50, 100, 1000)){

# inner loop
n <- 10000
p_val <- rep(NA, 10000)
for(j in 1:n){
  current_data <- rnorm(i,0,1)
  current_t_stat <- t.test(current_data)
  current_p_val <- current_t_stat$p.value
  p_val[j] <- current_p_val
}
p_val_mean[i] <- mean(p_val)
}
p_val_mean
  

Заранее благодарю вас за ваши ответы!

Ответ №1:

Вы не можете использовать свой i в качестве индекса, используйте это вместо:

 p_val_mean <- rep(NA, 4)
N <- c(10, 50, 100, 1000)

for (i in 1:length(N)){

  # inner loop
  n <- 10000
  p_val <- rep(NA, n)
  for(j in 1:n){
    current_data <- rnorm(N[i], 0, 1)
    current_t_stat <- t.test(current_data)
    current_p_val <- current_t_stat$p.value
    p_val[j] <- current_p_val
  }
  p_val_mean[i] <- mean(p_val)
}
p_val_mean
  

Ответ №2:

Вам не нужны вложенные циклы. Следующая единственная строка кода делает то, что вам нужно:

 sapply(c(10, 50, 100, 1000), function(x) mean(replicate(x, t.test(rnorm(1000))$p.val)))
#> [1] 0.4272396 0.5089299 0.4686196 0.4930584
  

Ответ №3:

Мы можем использовать map

 library(purrr)
map_dbl(c(10, 50, 100, 1000), ~ mean(replicate(.x, t.test(rnorm(1000))$p.val)))
#[1] 0.4030399 0.4840713 0.4791711 0.4960831