加速矩阵计算

时间:2014-03-19 17:57:32

标签: r

我的代码中有这个矩阵计算需要很长时间才能运行。到目前为止,我能想到速度的唯一方法是使用foreach而不是for循环,但我觉得还有更多可以做的事情。有没有某种方法可以对事物进行矢量化或使用for循环的替代方法,而我却错过了?

谢谢!

require(foreach)
require(mvtnorm)

# some dummy input values
omega.input.jP <- matrix(rnorm(3000*5, 0.1, 0.1), 3000, 5)
nsteps.obs <- ncol(omega.input.jP)
sigma.j <- rnorm(3000, 0.02, 0.05)
rho1.j <- rnorm(3000, 0.8, 0.1)
rho2.j <- rnorm(3000, 0.05, 0.1)
y.lastobs <- 0.3

mu.input.jP <- matrix(NA, nrow(omega.input.jP), ncol(omega.input.jP))
# note: j is an index denoting sample number (here there are 3000 samples in total, and P denotes the time step (5 time steps here)
mu.input.jP <- foreach (j = 1:nrow(mu.input.jP), .combine = "rbind") %do% {
  omega <- omega.input.jP[j, ]
  Sigma.mu <- GetSigmaMu(nsteps = nsteps.obs, sigma_ar = sigma.j[j], rho1 = rho1.j[j], rho2 = rho2.j[j])
  mu.input.P <- GetConditionalMu(omega = omega, Sigma.mu = Sigma.mu, y = y.lastobs)
  return(mu.input.P)
}

GetSigmaMu <- function( # Get Sigma.mu, a \code{nsteps} x \code{nsteps} matrix, for AR(2) process
  nsteps,
  sigma_ar,
  rho1,
  rho2
) {
  rho <- c(rho1, rho2)
  cor <- ARMAacf(ar = rho, pacf = FALSE, lag.max = nsteps) # phi's, first element is phi0 = 1
  var <- sigma_ar^2/(1 - sum(rho*cor[2:3])) # stationary variance # cor[2:3] gives first two phi's; cor[1] gives phi0 = 1 # change JR, 20140304
  cov <- cor*var
  Sigma.mu <- matrix(NA, nsteps, nsteps)
  for (i in 1:nsteps) {
    for (k in 1:nsteps) {
      Sigma.mu[i,k] <- cov[abs(i-k)+1]
    }
  }
  return(Sigma.mu)
}

GetConditionalMu <- function( # Get values of mu given y
  omega,
  Sigma.mu,
  y,
  method = "svd" # Method to get eigenvalues in matrix. Default method does not work, "svd" used instead.
) {
  nsteps <- length(omega)
  one <- rep(1, nsteps)
  mean.mu.cond <- c(omega + (1/(sum(Sigma.mu)))*(Sigma.mu %*% one)*c(nsteps*y - t(one) %*% omega))
  Sigma.mu.cond <- Sigma.mu - (1/(sum(Sigma.mu)))*(Sigma.mu %*% one %*% t(one) %*% Sigma.mu)
  mu.cond <- rmvnorm(1, mean.mu.cond, Sigma.mu.cond, method = method)
  return(mu.cond)
}

0 个答案:

没有答案