乘法概率分布函数

时间:2015-05-11 21:28:04

标签: r statistics 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)

如何计算完成时间的概率密度函数&#34; A&#34;和&#34; B&#34;?

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

这是有效率的,因为它比单独计算每个值的输入更少,并且因为它以有效的方式实现(使用快速傅立叶变换或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

答案 1 :(得分:4)

请参阅包裹:distr。选择术语&#34;乘以&#34;很不幸,因为所描述的情况不是概率的贡献是独立的(概率的乘法将是自然的使用术语)。它恰恰是某种顺序添加,而这恰恰是distr包提供的解释&#34; +&#34;应该用作两个离散分布的符号操作。

 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)

enter image description here

经过一段时间的嗅觉后,我发现可以在这里找到实际的数值:

 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

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

答案 2 :(得分:2)

我不熟悉专门的软件包,它完全符合您的示例所描述的内容。但是,让我为这个问题调整一个更强大的解决方案。 您正在寻找一种方法来估计可能由n步骤过程组合的过程的分布,在您的案例2中可能不像您的示例那样容易计算。 我将使用的方法是模拟,从基础分布中淹没10k观测值,然后计算模拟结果的密度函数。 使用您的示例,我们可以执行以下操作:

x <- runif(10000)
y <- runif(10000)

library(data.table)
z <- as.data.table(cbind(x,y))
z[x>=0 & x<0.1, a_days:=0]
z[x>=0.1 & x<0.5, a_days:=1]
z[x>=0.5 & x<=1, a_days:=2]
z[y>=0 & y <0.1, b_days:=0]
z[x>=0.1 & x<0.3, b_days:=1]
z[x>=0.3 & x<0.5, b_days:=2]
z[x>=0.5 & x<0.8, b_days:=3]
z[x>=0.8 & x<=1, b_days:=4]
z[,total_days:=a_days+b_days]
hist(z[,total_days])

如果你的第二个过程从指数分布中淹没,密度和aproach也会起作用,这将产生一个非常好的代理。在这种情况下,您可以使用rexp函数直接计算b_days。