如何用Copula函数与边缘分布表示联合PDF/CDF(R语言实现)
在R中通过Copula函数构造联合PDF与CDF
核心原理
联合概率密度函数(PDF)的计算公式为:
联合PDF = Copula密度函数(在边缘CDF处的取值) × 各边缘PDF的乘积
联合累积分布函数(CDF)则是通过Copula函数将边缘CDF结合得到:
联合CDF = Copula分布函数(输入为各边缘CDF)
实现步骤与代码
1. 加载依赖包
R中处理Copula常用copula包,若未安装先执行安装命令:
install.packages("copula") library(copula)
2. 定义边缘分布参数
沿用你提供的二维正态边缘参数:
mux <- c(3, 4) # 边缘均值 sigmax <- c(1, 1) # 边缘标准差 x <- mux # 待计算联合分布的点
3. 创建Gaussian Copula对象
指定Copula类型为Gaussian,相关系数参数为0.5:
# 构造二维Gaussian Copula,相关系数矩阵为[[1, 0.5], [0.5, 1]] gauss_cop <- normalCopula(param = 0.5, dim = 2)
4. 构造联合分布(Copula + 边缘分布)
将Copula与两个正态边缘分布组合成联合分布对象:
mvd <- mvdc( copula = gauss_cop, margins = c("norm", "norm"), # 两个边缘均为正态分布 paramMargins = list( list(mean = mux[1], sd = sigmax[1]), # 第一个边缘的参数 list(mean = mux[2], sd = sigmax[2]) # 第二个边缘的参数 ) )
5. 计算联合CDF与PDF
直接使用copula包的函数计算:
# 计算联合CDF joint_cdf <- pmvdc(x, mvd) # 计算联合PDF joint_pdf <- dmvdc(x, mvd)
6. 手动验证联合PDF(对应公式原理)
你可以手动拆解计算过程,验证结果一致性:
# 计算边缘CDF与PDF(和你提供的代码一致) cdfx <- c(pnorm(x[1], mux[1], sigmax[1]), pnorm(x[2], mux[2], sigmax[2])) pdfx <- c(dnorm(x[1], mux[1], sigmax[1]), dnorm(x[2], mux[2], sigmax[2])) # 计算Copula在边缘CDF处的密度值 cop_density <- dCopula(cdfx, gauss_cop) # 手动计算联合PDF joint_pdf_manual <- cop_density * prod(pdfx)
7. 与直接多元正态分布结果对比
由于Gaussian Copula+正态边缘等价于多元正态分布,可通过mvtnorm包验证:
install.packages("mvtnorm") library(mvtnorm) # 构造多元正态协方差矩阵 cov_mat <- matrix( c(sigmax[1]^2, 0.5*sigmax[1]*sigmax[2], 0.5*sigmax[1]*sigmax[2], sigmax[2]^2), nrow = 2 ) # 直接计算多元正态PDF joint_pdf_mvtnorm <- dmvnorm(x, mean = mux, sigma = cov_mat)
上述三种方式得到的joint_pdf、joint_pdf_manual、joint_pdf_mvtnorm结果完全一致。
内容的提问来源于stack exchange,提问作者HIteWIng
相关产品推荐
相关产品推荐

