R矩阵乘法报non-conformable arguments错误:多维正态密度函数实现问题
R多维正态分布密度函数报错修复方案
核心错误点
- 变量名引用错误:函数入参定义为
x_one、x_two、x_three、x_four,但计算离均差时误用了未定义的x1、x2、x3、x4,属于基础变量名不匹配问题。 - 均值取值不准确:给定的均值向量为
c(5.0060022, 3.4280049, 1.4620007, 0.2459998),代码中使用近似值会引入不必要的计算误差。 - 分母计算逻辑错误:多维正态分布密度公式的分母为$\sqrt{(2\pi)^4 \times det(\Sigma)}$,你误用了协方差矩阵逆的行列式,相当于分母多做了一次倒数运算,结果会完全偏离真实值。
- 指数部分矩阵维度不匹配:指数项的标准形式为$-0.5 \times (x-\mu)^T \Sigma^{-1} (x-\mu)$,你额外生成了重复的离均差矩阵、错误添加转置和系数位置,导致矩阵乘法维度不兼容。
修复后可运行代码
# 若使用ginv需要先加载MASS包,协方差矩阵正定的情况下也可以直接用base的solve函数 library(MASS) my_function <- function(x_one, x_two, x_three, x_four) { # 构造协方差矩阵 sigma1.pre <- c(0.15065114 , 0.13080115 , 0.02084463 , 0.01309107 , 0.13080115 , 0.17604529 , 0.01603245 , 0.01221458 , 0.02084463 , 0.01603245 , 0.02808260 , 0.00601568 , 0.01309107 , 0.01221458 , 0.00601568 , 0.01042365) sigma1 <- matrix(sigma1.pre, nrow=4, ncol= 4, byrow = TRUE) sigma1_inv <- ginv(sigma1) # 分母使用协方差矩阵的行列式,而非逆矩阵的行列式 det_sigma1 <- det(sigma1) denom = sqrt( (2*pi)^4 * det_sigma1) # 修正变量名和均值取值 x_diff = c(x_one - 5.0060022, x_two - 3.4280049, x_three - 1.4620007, x_four - 0.2459998) # 指数项按标准公式计算,无需重复构造矩阵 exp_term = -0.5 * t(x_diff) %*% sigma1_inv %*% x_diff num = exp(exp_term) answer = as.numeric(num/denom) return(answer) } # 测试运行 my_function(1,2,3,4)
可选优化方案
如果不需要手动实现底层逻辑,可以直接调用mvtnorm包的dmvnorm函数,避免手动实现的维度、公式错误:
library(mvtnorm) mu <- c(5.0060022, 3.4280049, 1.4620007, 0.2459998) sigma <- matrix(c(0.15065114 , 0.13080115 , 0.02084463 , 0.01309107 , 0.13080115 , 0.17604529 , 0.01603245 , 0.01221458 , 0.02084463 , 0.01603245 , 0.02808260 , 0.00601568 , 0.01309107 , 0.01221458 , 0.00601568 , 0.01042365), nrow=4, byrow = T) # 计算密度值 dmvnorm(c(1,2,3,4), mean = mu, sigma = sigma)
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

