循环返回的值比预期的多,并且NA

时间:2019-09-19 02:12:58

标签: r simulation

我正在尝试模拟一些数据以进行样本量估计,并且我的循环返回了意外的结果。

我正在尝试从生成的值的向量中采样一个具有不同样本数量的样本,然后将平均值和标准偏差串联起来进行多次模拟。

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个),并且对于样本5,我总是会得到NA。

谁能看到我要去哪里错了?

谢谢!

1 个答案:

答案 0 :(得分:2)

通常,用1动态增长data.frame是在R中做事的效率非常低的方法。几乎总是有更好/更快的做事方法。重新尝试做。

此外,就回答问题而言,让我们看一下嵌套rbind循环的简化版本

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) } 有60行吗?

这样做的原因是您永远不会重置x2。如果我们解决这个问题

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() } ,符合预期。