使用mvtnorm库无法显示两个暗淡的正态分布轮廓

时间:2018-12-24 02:51:05

标签: r

我无法在以下代码中显示此分布的轮廓。

grid <- seq(-1,1,0.01)
mu_prior <- rep(0, 2)
alpha <- 0.5
sigma_prior <- alpha * diag(2)

library(mvtnorm)
f <- function(x,y){return(dmvnorm(c(x,y), mu_prior, sigma_prior))}

z <- outer(grid, grid, f)
contour(grid, grid, z)

错误显示

  

dmvnorm(z,mu_prior,sigma_prior)中的错误:     均值和西格玛大小不一致

我无法理解它,因为mu_prior的列大小与sigma_prior的列大小相同。 例如,以下代码已成功执行

dmvnorm(c(0,0), mu_prior, sigma_prior)
  

[1] 0.07957747

您能告诉我我应该纠正的地方吗?

1 个答案:

答案 0 :(得分:1)

outer()的R文档中,参数FUN被限制为 vectorized 。简而言之,您在outer()中调用的二进制函数需要满足多对一属性,即FUN(c(-1, 0, 1), 0)应该是可执行的。您的功能:

f <- function(x,y){return(dmvnorm(c(x, y), mu_prior, sigma_prior))}

无法处理f(c(-1, 0, 1), 0)。有两种方法可以使其向量化:

(1)cbind()

f1 <- function(x,y){return(dmvnorm(cbind(x, y), mu_prior, sigma_prior))}
z1 <- outer(grid, grid, f1)
contour(grid, grid, z1)

(2)Vectorize()

f2 <- Vectorize(f)              # It's slower than the former.
z2 <- outer(grid, grid, f2)
contour(grid, grid, z2)

enter image description here