簡體   English   中英

如何使函數內部的矩陣乘法獲得最佳效果以在R中最大化

[英]How to get optim working with matrix multiplication inside the function to be maximized in R

我正在嘗試使尺寸為2x2的Matrix參數的可能性最大化。 似然函數需要傳入兩個固定矩陣參數,似然也是函數。 表示為Y的數據和協方差矩陣Sigma.star(我作為下三角矩陣傳遞)是計算所必需的,但我想保持其不變並在此基礎上運行優化函數嘗試優化A的代碼

我的問題是,它似乎正在優化我正在用於矩陣代數的對象內部的某些東西,這似乎是一種錯誤。 有什么方法可以使它工作而無需編寫每一個小的計算?

具體錯誤是:

Error in diag(1, nrow = (m^2)) - A %x% A : non-conformable arrays

但是A kronecker A應該是一個m ^ 2 xm ^ 2矩陣,就像恆等式一樣。

碼:

library(MCMCpack)
library(mvtnorm)
set.seed(1000)


Likelihood.orig<-function(A, Y, Sigma.star){
Sigma<-xpnd(Sigma.star)
n<-nrow(Y)
if(is.vector(A)==TRUE){
  A<-as.matrix(A, nrow=nrow(Sigma), ncol=ncol(Sigma))
}
m<-nrow(A)
V<-matrix(solve(diag(1, nrow=(m^2))-A%x%A)%*%as.vector(Sigma), nrow=m, ncol=m)
temp1<- (-.5)*log(abs(det(V)))
temp2<- (-(n-1)/2)*log(abs(det(Sigma)))
temp3<- t(Y[,1, drop=FALSE]) %*% (solve(V)) %*% Y[,1, drop=FALSE]
terms<- numeric(n-1)
for(i in 2:n){
    terms[i-1]<- t(Y[,i, drop=FALSE] - A %*%Y[,i-1, drop=FALSE]) %*% (solve(Sigma)) %*% (Y[,i] - A %*%Y[,i-1])
}
return(temp1+temp2-.5*(temp3+sum(terms)))   
}




Generate.Y<-function(n, A, Sigma){
m<-nrow(A)
Y<-matrix(0, nrow=m, ncol=n)
V<-matrix(solve(diag(1, nrow=m^2)-A%x%A)%*%as.vector(Sigma), nrow=m, ncol=m)
Y[,1]<-rmvnorm(1, numeric(nrow(A)), V)
for(i in 2:n){
    Y[,i]<-A%*%Y[,i-1, drop=FALSE]+t(rmvnorm(1, mean = numeric(m), sigma = Sigma))
    }
return(Y)
}


n<-500
A.true<-matrix(c(.8, .3, 0, .5), nrow=2, ncol=2)
Sigma<-matrix(c(1, 0, 0, .5), nrow=2, ncol=2)
Y<-matrix(0, nrow=2, ncol=n)
Y<-Generate.Y(n, A.true, Sigma)
m=nrow(Y)
lower.Sigma<-vech(Sigma)



optim(par=c(1, 0, 0, 1), fn=Likelihood.orig, method="Nelder-Mead", 
  control=list(maxit=500, fnscale=-1), Sigma.star=lower.Sigma, Y=Y)

您的方法是正確的,即,使優化對向量進行optim ,並且僅將該向量轉換為要最大化的函數內的矩陣。

但是,您需要使用matrix而不是as.matrix來創建該矩陣。 看到之間的區別:

as.matrix(1:4, nrow=2, ncol=2)  # wrong tool
#      [,1]
# [1,]    1
# [2,]    2
# [3,]    3
# [4,]    4

matrix(1:4, nrow=2, ncol=2)
#      [,1] [,2]
# [1,]    1    3
# [2,]    2    4

對於此類問題,我強烈建議您學習R調試工具( browserdebugdebugonce等)。 有關示例,請參見有關R中調試的一般建議

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM