乘以概率分布函数

Jon*_*han 4 statistics r probability-density

我很难构建一个有效的程序,该程序可以添加和乘以概率密度函数来预测完成两个流程步骤所需的时间分布。

让“a”代表完成过程“A”所需时间的概率分布函数。零天 = 10%,一天 = 40%,两天 = 50%。让“b”代表完成过程“B”需要多长时间的概率分布函数。零天 = 10%,一天 = 20%,以此类推。

进程“B”在进程“A”完成之前无法启动,因此“B”依赖于“A”。

a <- c(.1, .4, .5)
b <- c(.1,.2,.3,.3,.1)
Run Code Online (Sandbox Code Playgroud)

如何计算完成“A”和“B”的时间的概率密度函数?

这是我所期望的或以下示例的输出:

totallength <- 0 # initialize
totallength[1:(length(a) + length(b))] <- 0 # initialize
totallength[1] <- a[1]*b[1]
totallength[2] <- a[1]*b[2] + a[2]*b[1]
totallength[3] <- a[1]*b[3] + a[2]*b[2] + a[3]*b[1]
totallength[4] <- a[1]*b[4] + a[2]*b[3] + a[3]*b[2]
totallength[5] <- a[1]*b[5] + a[2]*b[4] + a[3]*b[3]
totallength[6] <- a[2]*b[5] + a[3]*b[4]
totallength[7] <- a[3]*b[5]

print(totallength)
[1] [1] 0.01 0.06 0.16 0.25 0.28 0.19 0.05
sum(totallength)
[1] 1
Run Code Online (Sandbox Code Playgroud)

我在 Visual Basic 中有一种方法,它使用了三个 for 循环(每个步骤一个,输出一个),但我希望我不必在 R 中循环。

由于这似乎是一个非常标准的流程问题,我的问题的第二部分是是否存在任何库来模拟操作流程,因此我不会从头开始创建它。

jos*_*ber 5

进行此类操作的有效方法是使用卷积:

convolve(a, rev(b), type="open")
# [1] 0.01 0.06 0.16 0.25 0.28 0.19 0.05
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它比单独计算每个值更少输入,还因为它以有效的方式实现(使用快速傅立叶变换或 FFT)。

您可以使用您发布的公式确认这些值中的每一个都是正确的:

(expected <- c(a[1]*b[1], a[1]*b[2] + a[2]*b[1], a[1]*b[3] + a[2]*b[2] + a[3]*b[1], a[1]*b[4] + a[2]*b[3] + a[3]*b[2], a[1]*b[5] + a[2]*b[4] + a[3]*b[3], a[2]*b[5] + a[3]*b[4], a[3]*b[5]))
# [1] 0.01 0.06 0.16 0.25 0.28 0.19 0.05
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 5

见包装:distr。选择术语“乘法”是不幸的,因为所描述的情况并不是对概率的贡献是独立的(概率乘法将是使用的自然术语)。它是某种顺序加法,这正是distr包提供的解释“+”在用作两个离散分布的符号操作时应该表示的含义。

 A <- DiscreteDistribution ( setNames(0:2, c('Zero', 'one', 'two') ), a)
 B <- DiscreteDistribution(setNames(0:2, c(  "Zero2" ,"one2", "two2", 
                                               "three2", "four2") ),  b )
?'operators-methods'  # where operations on 2 DiscreteDistribution are convolution
plot(A+B)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

经过一番摸索,我看到实际的数值可以在这里找到:

 A.then.B <- A + B
> environment(A.the.nB@d)$dx
[1] 0.01 0.06 0.16 0.25 0.28 0.19 0.05
Run Code Online (Sandbox Code Playgroud)

似乎应该有一种显示概率的方法,而且我不是这个迷人包的常规用户,所以很可能有一个。请阅读小插图和代码演示......我还没有完成。进一步的闲逛让我相信,合适的地方是在配套包中:distrDoc小插图有 100 多页长。而且它不应该需要任何努力才能找到它,因为该建议在加载包时打印的消息中......除了在我的辩护中有几页消息,所以它更诱人跳转到编码和使用帮助页面。