在R中相乘概率分布遇阻:pdqr与bayesmeta包使用求助
问题分析与解决
核心误区
你遇到的问题主要来自两个层面:
- 统计逻辑混淆:你尝试的相加、混合、卷积操作对应完全不同的统计场景,和你需要的「a、b均为真时的分布」(本质是独立事件的联合概率密度)无关;直接相乘PDF得到的是未归一化的联合密度,自然会出现“整体概率过低”的问题。
- 分布类型选择错误:用
type="continuous"处理离散观测数据时,pdqr会自动做核密度平滑,导致b的分布在x<5的区域也保留了微小概率,最终相乘后低x值出现非零概率,不符合预期。
修正方案
1. 用离散分布贴合原始数据
原始数据是离散整数观测,使用type="discrete"创建分布,能让b的分布在x<5时PDF直接为0,相乘后低x值概率会被正确置为0。
2. 对相乘后的未归一化密度做归一化
两个PDF相乘的结果不再是合法PDF(求和/积分不为1),必须重新归一化才能得到符合要求的分布。
修正后的代码
library(tidyverse) library(pdqr) # 原始观测数据 a <- c(1, 2, 2, 4, 5, 5, 6, 6, 7, 7, 7, 8, 7, 8, 2, 6, 9, 10) b <- c(5, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 7) # 创建离散分布,贴合原始数据特性 distr_a_disc <- new_d(a, type = "discrete") distr_b_disc <- new_d(b, type = "discrete") # 获取所有可能的x取值(取两者的并集) all_x <- sort(unique(c(distr_a_disc$x, distr_b_disc$x))) # 计算每个x的未归一化联合密度(PDF乘积) un_norm_density <- map_dbl(all_x, function(x) { d(distr_a_disc, x) * d(distr_b_disc, x) }) # 归一化得到合法的离散分布 joint_distr <- new_d(data.frame(x = all_x, y = un_norm_density), type = "discrete") # 验证:查看x=1-10的概率 tibble(x = 1:10, prob = d(joint_distr, 1:10))
各尝试操作的实际含义(为什么不符合需求)
distr_a + distr_b/convolve():计算两个独立变量和的分布,和“均为真”的联合场景无关;form_mix():创建混合分布,即随机选择a或b的分布,不是同时满足两者的情况;- 直接相乘
distr_a * distr_b:pdqr中对分布做乘法是逐点相乘PDF,但不会自动归一化,且连续分布的平滑特性导致低x值有非零概率。
关于更新的问题
你期望的「当a和b两种情况均为真时的分布」完全可行,本质是计算两个独立事件的联合概率分布,上面的代码已经实现了这个需求,得到的分布形状会和你手动计算的一致,且概率和为1。
内容的提问来源于stack exchange,提问作者Johan Vos
相关产品推荐
相关产品推荐

