如何修复R绘制混合分布等高线图时x and mean have non-conforming size错误
问题修复方案
错误原因
- 你要绘制二维等高线,传入
mvtnorm::dmvnorm的data.grid是2列的二维数据,要求对应正态分布的均值为长度2的向量,但你当前设置的mu1为2行3列的矩阵,维度不匹配触发报错。 - 如果你要实现3组分二元混合高斯分布的等高线,不能直接将多组分均值矩阵传入
dmvnorm的mean参数,需要单独计算每个组分的密度后按权重求和。
修复代码
场景1:绘制单组分二元正态等高线
如果你只需要绘制单个二元正态分布的等高线,调整mu1为长度2的均值向量即可:
# 调整为长度为2的均值向量,对应二维数据维度 mu1 <- c(0.2765799, 2.30699) sigma1 <- matrix(c(0.9796896, -0.5666977, -0.5666977, 1.0509883), ncol = 2) data.grid <- expand.grid(seq1 = seq(1,10, length.out = 200), seq2 = seq(0, 5, length.out = 200)) # 计算单组分密度 samp <- cbind(data.grid, prob = mvtnorm::dmvnorm(data.grid, mean = mu1, sigma = sigma1)) # 绘图 library(ggplot2) ggplot(samp, aes(x=seq1, y=seq2, z=prob)) + geom_contour() + labs(x = "Sepal Length", y = "Sepal Width")
场景2:绘制3组分二元混合高斯等高线
如果你需要绘制混合分布,首先调整mu1为3行2列的矩阵(每行对应一个组分的二维均值),再分别计算各组分密度后加权求和:
# 调整为3行2列的均值矩阵,每行对应一个组分的二维均值 mu1 <- matrix(c(0.2765799, 2.30699, 0.4268534, 2.6254749, -1.30049, -0.9883130), nrow = 3, ncol = 2, byrow = TRUE) # 共用协方差矩阵,你也可以为每个组分单独设置对应协方差 sigma1 <- matrix(c(0.9796896, -0.5666977, -0.5666977, 1.0509883), ncol = 2) # 混合权重,可根据你的实际拟合结果调整,这里默认三个组分权重相等 weights <- c(1/3, 1/3, 1/3) # 调整坐标范围覆盖所有组分的取值区间 data.grid <- expand.grid(seq1 = seq(-3,10, length.out = 200), seq2 = seq(-2, 5, length.out = 200)) # 分别计算每个组分的密度,加权求和得到混合密度 prob <- rep(0, nrow(data.grid)) for(i in 1:nrow(mu1)){ prob <- prob + weights[i] * mvtnorm::dmvnorm(data.grid, mean = mu1[i,], sigma = sigma1) } samp <- cbind(data.grid, prob = prob) # 绘图 library(ggplot2) ggplot(samp, aes(x=seq1, y=seq2, z=prob)) + geom_contour() + labs(x = "Sepal Length", y = "Sepal Width")
内容的提问来源于stack exchange,提问作者Maxwell
相关产品推荐
相关产品推荐

