Цикл, возвращающий больше значений, чем ожидалось, и NA - PullRequest
3 голосов
/ 19 сентября 2019

Я пытаюсь смоделировать некоторые данные для оценки размера выборки, и мой цикл возвращает неожиданные результаты.

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

library(MCMCglmm)
library(tidyverse)

Est <- function(n, mean, sd, lower, upper, samp_min, samp_max, samp_int, nsim){

        Data <- round(rtnorm(n, mean, sd, lower, upper), digits = 0) # Create a vector to sample from

        Samp_size <- seq(samp_min, samp_max, samp_int) # Create vector of sample sizes

        # Set up enpty results data frames
        Results_samp <- data.frame()
        Results <- data.frame()

        for(i in 1:nsim){ ## Loop through number of simulations

        for (j in seq_along(Samp_size)) { # Loop through sample sizes
                Score <- sample(Data, j, replace = TRUE)
                Nsubj <- Samp_size[j]
                Mean <- mean(Score, na.rm = TRUE)
                SD <- sd(Score, na.rm = TRUE)
                Results_samp <- rbind(Results_samp, 
                                      data.frame(
                                              Nsubj,
                                              Mean,
                                              SD))
        }
        Results <- rbind(Results, Results_samp)   
        }

        Results
}

Test <- Est(n = 1000, mean = 55, sd = 37, lower = 0, upper = 100, 
            samp_min = 5, samp_max = 20, samp_int = 5, nsim = 5)

Это создает фрейм данных с 60 строками, где я ожидаю 20 (5 симуляций с 4 размерами выборки), и мне всегда возвращают NA дляразмер выборки 5.

Кто-нибудь может увидеть, где я иду не так?

Спасибо!

1 Ответ

2 голосов
/ 19 сентября 2019

Как правило, динамическое увеличение data.frame с помощью rbind является очень неэффективным способом выполнения действий в R. Есть почти всегда лучшие / более быстрые способы выполнения того, что вы пытаетесь сделать.

Кроме того, с точки зрения ответа на ваш вопрос, давайте взглянем на упрощенную версию вашего вложенного for цикла

x1 <- data.frame()
x2 <- data.frame()
for (i in 1:5) {
    for (j in 1:4) x1 <- rbind(x1, data.frame(x1 = i, x2 = i^2))
    x2 <- rbind(x2, x1)
}

Посмотрите, как x2 имеет 60 строк?

Причина в том, что вы никогда не сбрасываете x1.Если мы исправим это

x1 <- data.frame()
x2 <- data.frame()
for (i in 1:5) {
    for (j in 1:4) x1 <- rbind(x1, data.frame(x1 = i, x2 = i^2))
    x2 <- rbind(x2, x1)
    x1 <- data.frame()
}

, мы получим nrow(x2) = 20, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...