【问题标题】:Expected value of the difference between a sum of variables and a threshold变量总和与阈值之差的期望值
【发布时间】:2016-05-08 22:13:19
【问题描述】:

我有一个自定义套牌,由 2^n、n=0、..、6 序列的八张牌组成。我抽牌(不更换),直到总和等于或大于阈值。如何在 R 中实现一个计算总和与阈值之差平均值的函数?

我尝试使用这个How to store values in a vector with nested functions 但这需要很长时间......我认为有一种方法可以通过概率/模拟来做到这一点,但我可以弄清楚。

阈值可以大于单张卡的值,即阈值=500,也可以小于单卡的值,即阈值=50

到目前为止,我所做的是找到所有满足总和大于或等于阈值条件的子集。然后我只会减去阈值并计算平均值。

我在 R 中使用以下代码。对于一小部分,我很快就能得到答案。但是,我已经使用包含 56 个数字的集合运行了我们的几个函数,并且仍在工作。

 set<-c(rep(1,8),rep(2,8), rep(4,8),rep(8,8),rep(16,8),rep(32,8),rep(64,8))
recursive.subset <-function(x, index, current, threshold, result){
  for (i in index:length(x)){
    if (current + x[i] >= threshold){
      store <<- append(store, sum(c(result,x[i])))
    } else {
      recursive.subset(x, i + 1, current+x[i], threshold, c(result,x[i]))
    }
  }
}

store <- vector()
inivector <- vector(mode="numeric", length=0) #initializing empty vector    
recursive.subset (set, 1, 0, threshold, inivector)

【问题讨论】:

  • 嗨。欢迎来到堆栈溢出。在发布 [r] 问题时,提供minimal reproducible example 通常很有用。提出此类问题时,请分享您的尝试,即使它不起作用,这样我们就可以开始。
  • 嗨,对不起,我是 stackoverflow 的新手。我编辑了这个问题以显示我到目前为止所做的事情。可能我的方法是“蛮力”,但我不知道如何改进它。
  • 你解决的问题和this一样吗?
  • 是的,这是我在stackoverflow.com/questions/35107568/… 指向的问题中发布的链接,我在此处发布的代码是您向 Pierre 指出的代码,并进行了一些修改,但是,对于一个大集合(在我的案例 56)它已经运行了几个小时。对于一个小的集合,代码可以完美运行,但不适用于大集合。我认为是因为排列在 56 左右! / 23!
  • @ph33 做 100 万次随机抽奖是否足够,还是必须是所有可能的组合?因为我编写了一个每秒可以进行 100k 次绘制的脚本,但我不完全确定这是否是您正在寻找的。它确实允许您估计平均差。

标签: r sum subset mean


【解决方案1】:

我不知道是否有可能得到一个精确的解决方案,仅仅是因为有很多可能的组合。进行模拟可能会更好,即为 1 次完整绘制编写脚本,然后多次重新运行该脚本。由于解决方案非常相似,因此模拟应该给出一个很好的近似值。

好的,开始吧:

set <- rep(2^(0:6), each = 8)
thr <- 500

fun <- function(set,thr){
    x <- cumsum(sample(set))
    value <- x[min(which(x >= thr))]
    value
}

system.time(a <- replicate(100000, fun(set,thr)))
# user  system elapsed 
# 1.10    0.00    1.09

mean(a - thr)
# [1] 21.22992

解释:我不是一次抽一张牌,而是同时抽出所有牌(sample),然后计算累积和(cumsum)。然后我找到卡片达到阈值或更大的点,并在x 中找到这些卡片的总和。我们使用复制多次运行此函数,以获得值的向量。我们使用mean(a-thr) 来计算平均差。

编辑:在代码中犯了一个非常愚蠢的错字,现在修复它。 Edit2:稍微缩短了功能。

【讨论】:

    猜你喜欢
    • 2021-06-28
    • 2018-05-10
    • 2018-07-31
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    相关资源
    最近更新 更多