在R中创建并可视化联合概率分布以估算太阳能板家庭安装比例
合并非匹配双样本生成联合分布的R实现方案
方法1:全量笛卡尔积组合法(无抽样误差)
原理:两个独立样本的所有配对组合天然对应经验联合分布的所有可能取值,每对的权重相等,直接统计符合条件的配对占比即可,不需要模拟抽样。
# 示例数据准备 v1 <- data.frame(rnorm(100, 0, 3)) colnames(v1) <- "return" v2 <- data.frame(rnorm(30, 10, 20)) colnames(v2) <- "threshold" # 全量交叉合并生成所有配对 library(tidyverse) joint_full <- crossing(v1, v2) # 直接计算安装占比 adoption_full <- joint_full %>% summarise(adoption = mean(return > threshold))
该方法完全消除蒙特卡洛随机抽样误差,计算结果是经验分布下的精确值,适合两个样本总长度乘积不超过1e7的场景(否则内存占用过高)。
方法2:核密度估计生成连续联合分布(适合可视化)
原理:基于两个独立样本拟合二维核密度函数,得到连续的联合概率分布,既可以计算积分得到阈值占比,也可以直接生成二维分布可视化图。
library(ks) library(ggplot2) # 提取向量 x <- v1$return y <- v2$threshold # 拟合二维核密度 kde_fit <- kde(x = cbind(x, y)) # 计算收益>阈值的占比:积分所有return > threshold区域的密度 adoption_kde <- sum(kde_fit$estimate[kde_fit$eval.points[,1] > kde_fit$eval.points[,2]]) * kde_fit$h[1] * kde_fit$h[2] # 二维联合分布可视化 kde_df <- expand.grid(return = kde_fit$eval.points[,1], threshold = kde_fit$eval.points[,2]) %>% mutate(density = as.vector(kde_fit$estimate)) ggplot(kde_df, aes(x = return, y = threshold)) + geom_tile(aes(fill = density)) + geom_density2d(color = "white") + # 收益=阈值分界线,线下区域为符合安装条件的范围 geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed", linewidth = 1) + labs(fill = "联合密度", x = "安装收益", y = "收益阈值") + scale_fill_viridis_c()
图中密度颜色越深代表该收益-阈值组合出现的概率越高,可以直观看到符合安装条件的区域分布特征。
三类方案特性对比
- 全量交叉法:计算快、结果精确,适合小样本量场景,仅能输出离散点的联合分布
- 蒙特卡洛模拟法:灵活可控样本量,适合大样本场景,结果存在微小抽样误差
- 核密度估计法:输出连续联合分布,支持可视化,适合需要展示分布形态的场景
内容的提问来源于stack exchange,提问作者SolarSon
相关产品推荐
相关产品推荐

