You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类的*运算符目前存在实现缺陷,无法直接用于计算独立离散变量的乘积分布。

手动实现乘积分布的方法

你可以通过以下步骤手动计算两个独立离散随机变量的乘积分布:

  1. 提取两个变量的支撑集和对应概率
  2. 生成所有可能的取值组合,计算乘积及联合概率
  3. 对相同乘积值的概率求和
  4. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:55:09