Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日本航空公司;R:在三维数组中存储矩阵乘法乘积的结果_R_Arrays_Matrix Multiplication_Jags - Fatal编程技术网

日本航空公司;R:在三维数组中存储矩阵乘法乘积的结果

日本航空公司;R:在三维数组中存储矩阵乘法乘积的结果,r,arrays,matrix-multiplication,jags,R,Arrays,Matrix Multiplication,Jags,我正在用JAGS从R运行一个分层贝叶斯模型,通过定义四个不同的矩阵来编写似然函数,然后使用矩阵乘法来获得每个场景的完全似然。更具体地说(如果有帮助的话),我有一个状态空间多事件标记再捕获模型,每个矩阵都是一个状态转换,但有4个转换需要考虑。我有一个运行良好的模型,但现在我想给我的模型添加时间依赖性,因此我希望我的四个矩阵中的每一个都有第三维(时间)。我的问题是,如何在我的JAGS模型规范中对这些三维数组执行矩阵乘法,并将得到的矩阵集存储在三维数组中 library(abind) phiA &

我正在用JAGS从R运行一个分层贝叶斯模型,通过定义四个不同的矩阵来编写似然函数,然后使用矩阵乘法来获得每个场景的完全似然。更具体地说(如果有帮助的话),我有一个状态空间多事件标记再捕获模型,每个矩阵都是一个状态转换,但有4个转换需要考虑。我有一个运行良好的模型,但现在我想给我的模型添加时间依赖性,因此我希望我的四个矩阵中的每一个都有第三维(时间)。我的问题是,如何在我的JAGS模型规范中对这些三维数组执行矩阵乘法,并将得到的矩阵集存储在三维数组中

library(abind)


phiA <- seq(0,1,.01)
calc <- function(t) {
    px1<-array(dim=c(4,4))
    px2<-array(dim=c(4,4))
    px3<-array(dim=c(4,4))
    px1[1,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px1[2,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px1[3,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px1[4,1:4]<-c(0,0,0,1)
    
    px2[4,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px2[1,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px2[2,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px2[3,1:4]<-c(0,0,0,1)
    
    px3[2,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px3[1,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px3[4,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px3[3,1:4]<-c(0,0,0,1)
    px1 %*%  px2 %*%  px3
}

abind(lapply(1:length(phiA), calc), along=3)
在我的原始模型中,我这样定义每个矩阵(不是我的真实矩阵或维度):

第二次尝试:

    for (t in 1:yrs) {
      #[define 3-D matrices here as above]
    
      px[1:4,1:4,t]<-px1[1:4,1:4,t] %*% px2[1:4,1:5,t] %*% px3[1:5,1:4,t]
    } #t
第1021行是jags文件中的矩阵乘法行


如果您能在这方面提供帮助,我将不胜感激,谢谢

假设
calc
是计算矩阵积的函数,您可以
lappy
计算到它的年份,并使用
abind::abind
函数将结果列表项绑定到三维数组中

library(abind)


phiA <- seq(0,1,.01)
calc <- function(t) {
    px1<-array(dim=c(4,4))
    px2<-array(dim=c(4,4))
    px3<-array(dim=c(4,4))
    px1[1,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px1[2,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px1[3,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px1[4,1:4]<-c(0,0,0,1)
    
    px2[4,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px2[1,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px2[2,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px2[3,1:4]<-c(0,0,0,1)
    
    px3[2,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px3[1,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px3[4,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px3[3,1:4]<-c(0,0,0,1)
    px1 %*%  px2 %*%  px3
}

abind(lapply(1:length(phiA), calc), along=3)
库(abind)

phiA假设
calc
是计算矩阵积的函数,您可以
lappy
计算年份,并使用
abind::abind
函数将结果列表项绑定到三维数组中

library(abind)


phiA <- seq(0,1,.01)
calc <- function(t) {
    px1<-array(dim=c(4,4))
    px2<-array(dim=c(4,4))
    px3<-array(dim=c(4,4))
    px1[1,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px1[2,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px1[3,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px1[4,1:4]<-c(0,0,0,1)
    
    px2[4,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px2[1,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px2[2,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px2[3,1:4]<-c(0,0,0,1)
    
    px3[2,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px3[1,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px3[4,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px3[3,1:4]<-c(0,0,0,1)
    px1 %*%  px2 %*%  px3
}

abind(lapply(1:length(phiA), calc), along=3)
库(abind)

phiA解决方案必须在JAGS中工作(即,在BUGS语言中),因此我认为这对我的问题不起作用。@Gina不是u使用RYes,我使用的是R,但我遇到问题的代码位于我的JAGS模型规范块中,它必须是BUGS语言。这在我最初的问题中不是很清楚。我已经修改了我的问题,使其更加明确。解决方案必须在JAGS中工作(即,在BUGS语言中),因此我认为这对我的问题不起作用。@Gina不是u使用RYes,我使用R,但我遇到问题的代码位于我的JAGS模型规范块中,它必须是BUGS语言。这在我最初的问题中不是很清楚。我修改了我的问题,使之更加明确。
    for (t in 1:yrs) {
      #[define matrix 3-D px1 matrix as above]
      px1.tmp[1:4,1:4]<-px1[,,t]  #store first 2 dimensions in temporary matrix
    
      #[define matrix 2 as above]
      px2.tmp[1:4,1:5]<-px2[,,t]
    
      #[define matrix 3 as above]
      px3.tmp[1:5,1:4]<-px3[,,t]
    
      px.tmp<-px1.tmp %*% px2.tmp %*% px3.tmp
    
      px[,,t]<-px.tmp
    }
    model {
      #JAGS model code here...
    } #end JAGS model code

    px<-array(dim=c(4,4,Years)

>RUNTIME ERROR:
>Compilation error on line 1021.
>Cannot evaluate subset expression for px
library(abind)


phiA <- seq(0,1,.01)
calc <- function(t) {
    px1<-array(dim=c(4,4))
    px2<-array(dim=c(4,4))
    px3<-array(dim=c(4,4))
    px1[1,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px1[2,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px1[3,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px1[4,1:4]<-c(0,0,0,1)
    
    px2[4,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px2[1,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px2[2,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px2[3,1:4]<-c(0,0,0,1)
    
    px3[2,1:4]<-c(phiA[t],0,0,1-phiA[t])
    px3[1,1:4]<-c(0,phiA[t],0,1-phiA[t])
    px3[4,1:4]<-c(0,0,phiA[t],1-phiA[t])
    px3[3,1:4]<-c(0,0,0,1)
    px1 %*%  px2 %*%  px3
}

abind(lapply(1:length(phiA), calc), along=3)