r - 计算大量矩阵的有效方法

标签 r

我正在尝试编写一个执行以下操作的程序:

Given two intervals A and B, for every (a,b) with a in A and b in B
  create a variance matrix ymat, depending on (a,b)
  calculate the (multivariate normal) density of some vector y 
  with mean 0 and variance matrix ymat

我了解到在 R 中使用循环是不好的,所以我想使用outer()。这是我的两个功能:

y_mat <- function(n,lambda,theta,sigma) {
    L <- diag(n);
    L[row(L) == col(L) + 1] <- -1;
    K <- t(1/n * L - theta*diag(n))%*%(1/n * L - theta*diag(n));
    return(sigma^2*diag(n) + 1/lambda*K);
}

make_plot <- function(y,sigma,theta,lambda) { 
    n <- length(y)
    sig_intv <- seq(.1,2*sigma,.01);
    th_intv <- seq(-abs(2*theta),abs(2*theta),.01);

    z <- outer(sig_intv,th_intv,function(s,t){dmvnorm(y,rep(0,n),y_mat(n,lambda,theta=t,sigma=s))})

    contour(sig_intv,th_intv,z);
}   

方差矩阵的形状与此问题无关。 n 和 lambda 只是两个标量,sigma 和 theta 也是如此。

当我尝试时

make_plot(y,.5,-3,10)

我收到以下错误消息:

Error in t(1/n * L - theta * diag(n)) : 
    dims [product 25] do not match the length of object [109291]
In addition: Warning message:
In theta * diag(n) :
longer object length is not a multiple of shorter object length

有人可以告诉我出了什么问题吗?我可能以错误的方式处理这个问题吗?

最佳答案

outer 的第三个参数应该是向量化函数。用 Vectorize 包装它就足够了:

make_plot <- function(y, sigma, theta, lambda) { 
  n <- length(y)
  sig_intv <- seq(.1,2*sigma,.01);
  th_intv <- seq(-abs(2*theta),abs(2*theta),.01);

  z <- outer(
    sig_intv, th_intv,
    Vectorize(function(s,t){dmvnorm(y,rep(0,n),y_mat(n,lambda,theta=t,sigma=s))})
  )

  contour(sig_intv,th_intv,z);
}

关于r - 计算大量矩阵的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007501/

相关文章:

r - 如何生成 SVG 格式的二维码?

r - 在 R 中编码复杂的积分和限制

r - heatmap.2 顶部有颜色键

r - heatmap.2 指定行顺序还是防止重新排序?

r - 在R中每2页将PDF文件拆分为多个文件

r - 将 3d 矩阵转换为数据框

r - 有没有办法在 R 中获得类似 COUNTIF 的摘要,同时也显示比例?

R:聚类文档

负载均衡器后面的 R-Shiny 脚本超时

r - 在 xts 对象上使用 auto.arima