我想手动计算多元正态分布的密度。作为函数的输入,我有x
,它是数据点的n*p
矩阵,向量mu
和n
的均值以及协方差矩阵sigma
p*p
变暗。
我为此编写了以下函数:
`dmnorm <- function(mu, sigma, x){
k <- ncol(sigma)
x <- t(x)
dmn <- exp((-1/2)*t(x-mu)%*%solve(sigma)%*%(x-
mu))/sqrt(((2*pi)^k)*det(sigma))
return(dmn)
}`
我自己的函数给了我n*n
的矩阵。但是,我应该得到一个长度为n
的向量。
最后,我希望获得与使用dmvnorm()
包中的mvtnorm
函数获得的结果相同的结果。我的代码有什么问题?
答案 0 :(得分:0)
表达式t(x-mu)%*%solve(sigma)%*%(x-
mu)
为p x p,因此这就是您的结果是该大小的原因。您想要该矩阵的对角线,可以使用
diag(t(x-mu)%*%solve(sigma)%*%(x-mu))
因此完整功能应该是
dmnorm <- function(mu, sigma, x){
k <- ncol(sigma)
x <- t(x)
dmn <- exp((-1/2)*diag(t(x-mu)%*%solve(sigma)%*%(x-
mu)))/sqrt(((2*pi)^k)*det(sigma))
dmn
}