两个均匀分布差分的 CDF 的 R 函数
R function for CDF for Difference of Two Uniform Distributions
我很难找到满足我要求的 R 函数。假设我有两个均匀分布,A~U[alow,ahigh] 和 B~U(blow,bhigh)。
有一个随机变量 Z=A-B,这两个均匀分布之间的差异。我需要一个用于 Z 分布的 CDF 函数。
我给这个函数一个截止值 x,它会 return Z 低于截止值的概率。
我在 R 中,理想情况下函数调用看起来像这样:
UniformDiffCDC(alow,ahigh,blow,bhigh,cutoff)
不幸的是,我不知道从哪里开始,或者这是否已经在 R 中的某个地方实现了。求助!
是这样的吗?
UniformDiffCDF <- function(alow,ahigh,blow,bhigh,cutoff,n=10000){
a = runif(n,min=alow,max=ahigh)
b = runif(n,min=blow,max=bhigh)
z = (a-b)
p = sum(z < cutoff)/n
return(p)
}
基本思想是概率密度函数会form a trepezoid。我不知道为此有任何内置函数,因为它不是一个很常见的分布,但使用一些几何你可以准确地求解这些值。
UniformDiffCDF <- Vectorize(function(alow,ahigh,blow,bhigh,cutoff) {
breaks <- c(alow-bhigh, ahigh-bhigh, alow-blow, ahigh-blow)
height <- 2/sum(breaks * c(-1, -1, 1, 1))
if (cutoff > breaks[4]) return(1)
prob <- 0
if (cutoff < breaks[1]) return(prob)
if (cutoff < breaks[2]) {
prob <- prob + 1/2 * (cutoff - breaks[1]) * approx(breaks[1:2], c(0, height), cutoff)$y
return(prob)
} else {
prob <- prob + 1/2 * (breaks[2]-breaks[1]) * height
}
if (cutoff < breaks[3]) {
prob <- prob + (cutoff-breaks[2])*height
return(prob)
} else {
prob <- prob + (breaks[3]-breaks[2])*height
}
tri <- 1/2 * (breaks[4]-breaks[3]) * height
prob <- prob + tri - 1/2 * (breaks[4]- cutoff) * approx(breaks[4:3], c(0,height), cutoff)$y
return(prob)
}, vectorize.args="cutoff")
例如
curve(UniformDiffCDF(5,7,2,6, x), from=-2, to=6)
对应的 PDF 为
UniformDiffPDF <- Vectorize(function(alow,ahigh,blow,bhigh,cutoff) {
breaks <- c(alow-bhigh, ahigh-bhigh, alow-blow, ahigh-blow)
height <- 2/sum(breaks * c(-1, -1, 1, 1))
if (cutoff > breaks[4]) return(0)
if (cutoff < breaks[1]) return(0)
if (cutoff < breaks[2]) {
return(approx(breaks[1:2], c(0, height), cutoff)$y)
}
if (cutoff < breaks[3]) {
return(height)
}
return(approx(breaks[4:3], c(0,height), cutoff)$y)
}, vectorize.args="cutoff")
我很难找到满足我要求的 R 函数。假设我有两个均匀分布,A~U[alow,ahigh] 和 B~U(blow,bhigh)。
有一个随机变量 Z=A-B,这两个均匀分布之间的差异。我需要一个用于 Z 分布的 CDF 函数。
我给这个函数一个截止值 x,它会 return Z 低于截止值的概率。
我在 R 中,理想情况下函数调用看起来像这样:
UniformDiffCDC(alow,ahigh,blow,bhigh,cutoff)
不幸的是,我不知道从哪里开始,或者这是否已经在 R 中的某个地方实现了。求助!
是这样的吗?
UniformDiffCDF <- function(alow,ahigh,blow,bhigh,cutoff,n=10000){
a = runif(n,min=alow,max=ahigh)
b = runif(n,min=blow,max=bhigh)
z = (a-b)
p = sum(z < cutoff)/n
return(p)
}
基本思想是概率密度函数会form a trepezoid。我不知道为此有任何内置函数,因为它不是一个很常见的分布,但使用一些几何你可以准确地求解这些值。
UniformDiffCDF <- Vectorize(function(alow,ahigh,blow,bhigh,cutoff) {
breaks <- c(alow-bhigh, ahigh-bhigh, alow-blow, ahigh-blow)
height <- 2/sum(breaks * c(-1, -1, 1, 1))
if (cutoff > breaks[4]) return(1)
prob <- 0
if (cutoff < breaks[1]) return(prob)
if (cutoff < breaks[2]) {
prob <- prob + 1/2 * (cutoff - breaks[1]) * approx(breaks[1:2], c(0, height), cutoff)$y
return(prob)
} else {
prob <- prob + 1/2 * (breaks[2]-breaks[1]) * height
}
if (cutoff < breaks[3]) {
prob <- prob + (cutoff-breaks[2])*height
return(prob)
} else {
prob <- prob + (breaks[3]-breaks[2])*height
}
tri <- 1/2 * (breaks[4]-breaks[3]) * height
prob <- prob + tri - 1/2 * (breaks[4]- cutoff) * approx(breaks[4:3], c(0,height), cutoff)$y
return(prob)
}, vectorize.args="cutoff")
例如
curve(UniformDiffCDF(5,7,2,6, x), from=-2, to=6)
对应的 PDF 为
UniformDiffPDF <- Vectorize(function(alow,ahigh,blow,bhigh,cutoff) {
breaks <- c(alow-bhigh, ahigh-bhigh, alow-blow, ahigh-blow)
height <- 2/sum(breaks * c(-1, -1, 1, 1))
if (cutoff > breaks[4]) return(0)
if (cutoff < breaks[1]) return(0)
if (cutoff < breaks[2]) {
return(approx(breaks[1:2], c(0, height), cutoff)$y)
}
if (cutoff < breaks[3]) {
return(height)
}
return(approx(breaks[4:3], c(0,height), cutoff)$y)
}, vectorize.args="cutoff")