我有以下问题: 给定 k (=10) 个离散独立随机变量 X_i,每个变量具有 n_i (= 5 到 20) 个值。
问题:计算总和 X = X_1+...+X_k 的分布的分位数。
这里 X 有 n=n_1 x n_2 ... n_k 个不同的值,太大而无法将它们全部列出来 他们的概率。
我尝试了几种方法:
(A) 卷积:
每个 X_j 近似为 Y_j=X_j+Z,其中 Z 是 西格玛较小的正态 N(0,sigma) 变量。那么 Y_j 是正态分布的概率混合 变量 N(x_j,sigma),其中 x_j 遍及 X_j 的所有值,并且具有高度振荡密度。
Y=\sum Y_j 的密度是 Y_j 的密度的卷积。
我需要大量点的密度,但事实证明这太慢了。 问题似乎是卷积积分的收敛因振荡性质而减慢 Y_j 的密度。当密度表现更好时(例如正常的 RV),计算 这样的卷积速度相当快。
(B) 特征函数:
X 将用 Y=X+Z 来近似,其中 Z 是具有小 sigma 的正态 N(0,\sigma)。 Y 具有密度(无法直接计算),但特征函数 (连续傅里叶变换)Y 的 cf_Y 可以很容易地通过分析计算(不知道 Y) 的密度
现在让 s 成为一个数值向量。我想获得沿 s 计算的 Y 的密度 f_Y(s)。 正确的方法是将连续傅里叶逆变换应用于 s 中每个点的函数 cf_Y。
这太慢了。这就是为什么我尝试将逆 离散 傅里叶变换应用于值 cf_Y(s) 的向量,但这不会产生任何合理的结果。
这让我感到困惑,因为我的印象是离散傅里叶变换是连续傅里叶变换的近似,因此如果值网格 s 足够精细,应该会产生后者的值。
这应该有效吗?
请注意,如果我可以计算密度 f_Y 的离散傅立叶变换,那么这种反演肯定会起作用 沿着 s,但遗憾的是这是不可能的,因为
(a) f_Y 的密度太复杂了,并且
(b) 独立的和 Y = Y_1+Y_2+...+Y_k 的离散傅立叶变换 随机变量 Y_j 不是 Y_j 的离散傅立叶变换的乘积。
我该如何解决这个问题?
这是一个小例子,表明卷积很快就会失败 由于所涉及的密度的振荡性质:
library(bayesmeta)
# density of $(1/10)*\sum_{j=1}{10}N(j,0.01$
# (convex sum of normal distributions)
#
f <- Vectorize(function(s) sum(vapply(1:10,
FUN = function(j) dnorm(s,mean=j,sd=0.01)/10, FUN.VALUE=0
)))
g <- function(s) dnorm(s,mean=0,sd=0.01)
cat("\n\n")
for(i in 1:5){
cat("Doing convolution ",i,"\n")
g <- convolve(g,f)$density
}
cat("\nConvolutions finished, plotting density.")
s <- seq(0,100,length.out=1024)
matplot(s,g(s),type="l")
一种可能性是使用包 discreteRV 和 distr。利用discreteRV,可以得到独立随机变量之和的分布:
library(discreteRV)
X1 <- RV(c(0, 1, 2), c(0.5, 0.25, 0.25))
X2 <- RV(c(1, 2), c(0.5, 0.5))
X3 <- RV(c(0, 1, 2, 3), c(0.4, 0.2, 0.2, 0.2))
sumXi <- SofI(X1, X2, X3)
现在您可以使用 distr 来计算分位数:
library(distr)
D <- DiscreteDistribution(
supp = attr(sumXi, "outcomes"),
prob = attr(sumXi, "probs")
)
# quantile 0.5:
q.l(D)(0.5)