【问题标题】:Calculating the mean of every replication计算每个复制的平均值
【发布时间】:2017-02-09 20:11:21
【问题描述】:

我有以下代码

set.seed(30)
nsim <- 50    ## NUMBER OF REPLICATIONS
demand <- c(12,13,24,12,13,12,14,10,11,10)

res <- replicate(nsim, {
    load <- runif(10,11,14)
    diff <- load - demand    ## DIFFERENCE BETWEEN DEMAND AND LOAD 
    return(sum(diff < 0))
})
res
[1] 6 5 7 4 4 5 4 3 6 4 5 5 5 4 2 5 3 3 3 5 3 2 4 6 5 4 4 3 5 6 4 4 3 6 5 3 5 5 4 3 3
[42] 6 4 4 4 6 6 5 4 5

我有一个庞大的数据集,问题是计算每个复制的平均值的最快方法是什么。例如,第一次复制中的 res 为 6,因此第二次复制的结果应为 6/1=6,第三次复制 6+5/2=5.5,最后一次复制为 sum(res )/nsim=4.38

【问题讨论】:

  • 除非您面临内存限制,否则一次生成所有数据并将其粘贴到矩阵或 data.frame 中,例如sapply(seq(nsim), function(x){runif(10,11,14)})matrix(runif(10 * nsim, 11, 14), nrow = nsim)。然后以矢量化方式应用您的其他步骤。
  • 对我来说,我不清楚如何将这些过程应用于我的数据框并绘制 LOLE 除以迭代次数
  • 也许cumsum(res)/(1:length(res))

标签: r simulation replicate


【解决方案1】:

在问题的编辑版本中(2 月 11 日 5:53 编辑),OP 已指定预期结果。这些表明 OP 可能正在寻找结果向量 res累积平均值

cumsum(res)/seq_along(res)
# [1] 6.000000 5.500000 6.000000 5.500000 5.200000 5.166667 5.000000 4.750000 4.888889
#[10] 4.800000 4.818182 4.833333 4.846154 4.785714 4.600000 4.625000 4.529412 4.444444
#[19] 4.368421 4.400000 4.333333 4.227273 4.217391 4.291667 4.320000 4.307692 4.296296
#[28] 4.250000 4.275862 4.333333 4.322581 4.312500 4.272727 4.323529 4.342857 4.305556
#[37] 4.324324 4.342105 4.333333 4.300000 4.268293 4.309524 4.302326 4.295455 4.288889
#[46] 4.326087 4.361702 4.375000 4.367347 4.380000

或者,可以使用dplyr::cummean(res)

【讨论】:

    【解决方案2】:

    为了说明我的评论,您可以生成一个矩阵,其中列(或行,如果您愿意)表示复制,之后您可以使用 R 的矩阵运算功能:

    set.seed(47)    # make reproducible
    
    nsim <- 50    ## NUMBER OF REPLICATIONS
    demand <- c(12,13,24,12,13,12,14,10,11,10)
    
    loads <- matrix(runif(10 * nsim, 11, 14), ncol = nsim)
    
    diffs <- loads - demand    # with vector recycling
    # or: diffs <- apply(loads, 2, `-`, demand)    
    # or: diffs <- apply(loads, 2, function(x){x - demand})
    
    res <- colSums(diffs > 0)
    LOLE <- sum(res) / nsim
    
    LOLE
    #> [1] 5.7
    

    【讨论】:

    • 好的很清楚,但是如何保存每次迭代的结果呢?对于 50 个模拟,我想要 50 个 LOLE 结果。随着我增加迭代次数,LOLE 应该收敛
    • sum 在定义 LOLE 时将所有模拟折叠成一个数字。这段代码只是复制了上面的内容,保存了中间产品。如果这不是您想要的,请定义您想要的并相应地修改您的代码。
    • 对不明确的说明深表歉意。我想获得每次迭代的结果,50 个模拟 50 个 lole 结果。不仅仅是 50 次模拟的结果。只是不知道如何使用复制或任何更好的方法来实现这一目标。
    • 那么每个 50 个模拟的 50 个复制(即 2500 个模拟元素)?你应该编辑你的代码;否则我只是从你的描述中猜测,因为我不知道你的任何变量代表什么。
    • 这不是您的代码所做的。编辑它以澄清。不过,您可以使用Reduceaccumulate = TRUE 来完成它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    相关资源
    最近更新 更多