我无法在以下代码中显示此分布的轮廓。
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
您能告诉我我应该纠正的地方吗?
答案 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)