R语言distr包:离散独立随机变量乘积分布计算问题
如何用distr包计算离散独立随机变量的乘积分布?
你在使用distr包时发现,+运算符可以正常实现离散独立随机变量的求和卷积:
X <- DiscreteDistribution(supp=c(-1,0,1), prob=c(0.25,0.5,0.25)) Y <- X + X attr(Y, "support") # [1] -2 -1 0 1 2 d(Y)(attr(Y, "support")) # [1] 0.0625 0.2500 0.3750 0.2500 0.0625
但调用*运算符时却报错:
Y <- X * X # Error in apply(mixDistr.dfs, 1, all) : dim(X) must have a positive length
问题原因
distr包中针对DiscreteDistribution类的*运算符目前存在实现缺陷,无法直接用于计算独立离散变量的乘积分布。
手动实现乘积分布的方法
你可以通过以下步骤手动计算两个独立离散随机变量的乘积分布:
- 提取两个变量的支撑集和对应概率
- 生成所有可能的取值组合,计算乘积及联合概率
- 对相同乘积值的概率求和
- 用
DiscreteDistribution构造最终的乘积分布
针对你的示例,代码实现如下:
# 定义原分布 X <- DiscreteDistribution(supp=c(-1,0,1), prob=c(0.25,0.5,0.25)) # 获取X的支撑集和概率 supp_x <- attr(X, "support") prob_x <- d(X)(supp_x) # 生成所有取值组合,计算乘积和联合概率 product_combinations <- expand.grid(a = supp_x, b = supp_x) product_combinations$product <- product_combinations$a * product_combinations$b product_combinations$joint_prob <- prob_x[match(product_combinations$a, supp_x)] * prob_x[match(product_combinations$b, supp_x)] # 聚合相同乘积值的概率 aggregated_probs <- aggregate(joint_prob ~ product, data = product_combinations, sum) # 构造乘积分布 Y <- DiscreteDistribution(supp = aggregated_probs$product, prob = aggregated_probs$joint_prob) # 验证结果 attr(Y, "support") # [1] -1 0 1 d(Y)(attr(Y, "support")) # [1] 0.125 0.750 0.125
总结
目前distr包的*运算符并未正确支持离散独立变量的乘积分布计算,手动实现是当前最可靠的解决方案。
内容的提问来源于stack exchange,提问作者cdalitz
相关产品推荐
相关产品推荐

