我正在学习潜在的方面评估分析'和 我试图在r中实现该方法。 但我不知道如何在编程中解决这些问题。
这是等式:
到目前为止,这是r代码:
-(t( alpha ) %*% Sd - rd) / delta) * Sd - sigma %*% (alpha - mu)
我必须找出使该等式为零的alpha。 Delta和rd是常数,alpha,Sd和mu是矩阵(k x 1)。 sigma是一个矩阵(k x k)。在这种情况下,k = 3。
答案 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)