如何在R中实现矩阵方程?

时间:2018-04-10 14:37:44

标签: r math matrix optimization equation

我正在学习潜在的方面评估分析'和 我试图在r中实现该方法。 但我不知道如何在编程中解决这些问题。

这是等式: the equation

到目前为止,这是代码:

-(t( alpha ) %*% Sd - rd) / delta) * Sd - sigma %*% (alpha - mu) 

我必须找出使该等式为零的alpha。 Delta和rd是常数,alpha,Sd和mu是矩阵(k x 1)。 sigma是一个矩阵(k x k)。在这种情况下,k = 3。

2 个答案:

答案 0 :(得分:0)

定义一个函数f,如下所示,它可以计算你的等式

f <- function(alpha) {
    y <- numeric(length(alpha))

    z <- matrix(alpha,nrow=k)
    # or as.numeric((t(z) %*% sd - rd))
    y <- - ((t(z) %*% sd - rd)[1,1]/delta^2) * matrix(sd,nrow=k) - solve(sigma) %*% (z - mu)
    y
}

注意:您在R中提供的表达式至少有一个错误; delta应该是delta^2

创建一些假数据:

# some fake data
set.seed(401)
k <- 3
sd <- runif(k)
rd <- runif(k)
delta <- 1
rd <- .04
mu <- 1

sigma <- matrix(runif(k*k,1,4),nrow=k,ncol=3)
sigma
alpha <- rep(1,k)

显示此变量星座的f的值

f(alpha)

使用非线性方程求解器求解alpha,如下所示

library(nleqslv)
nleqslv(alpha,f)

如果您要多次评估f,建议您事先计算solve(sigma)sigma的倒数)。

答案 1 :(得分:0)

我们想要

((alpha'*s - r)*s)/(d*d) + inv(Sigma)*(alpha - mu)

注意到

alpha'*s = s'*alpha

我们可以重新排列到

(s*s')*alpha/(d*d) -r*s/(d*d) + inv(Sigma)*alpha - inv(Sigma)*mu

然后到

(inv(Sigma) + (s*s')/(d*d))*alpha = (r/(d*d))*s + inv(Sigma)*mu

所以

alpha = inv( (inv(Sigma) + (s*s')/(d*d)))* ( (r/(d*d))*s + inv(Sigma)*mu)