R Error : non-conformable arguments when doing double integration

R Error : non-conformable arguments when doing double integration

我有以下数据。数据有 2 个组 (G),每个组有 2 个个体 (n_i)。

library(cubature)
set.seed(1)
G=2 ; # Suppose 2 groups
n_i<-2 # There are two individuals per group
nTot<-4 # In total we have 4 individuals 
z_j<-rbinom(nTot, 1, 0.5)
T_j<- runif(nTot, 5, 10)
Data<-round(data.frame(id=rep(1:nTot), group=rep(1:G, rep(2,G) ),z_j, T_j),0)
Data
  id group z_j T_j
1  1     1    0    6
2  2     1    0    9
3  3     2    1   10
4  4     2    1    8

对于每个人(行),我有以下函数f(x,y)= (x*exp(2y))^Zj[id] * exp(-x*exp(2y)*Tj[id])

我正在尝试按如下方式计算 R 中的以下二重积分。

第 1 组

第 2 组

我想使用 pracma 包中的 quad2d 函数进行二重积分。 双积分的尝试代码产生 Error in wx %*% Z : non-conformable arguments :,如下所示。

fInt<- function(df) {
    function(x,y) {
    prod(
      sapply(
        1:nrow(df),
        function(i)  (x*exp(2*y) )^df$z_j[i]*exp( - x *exp(2*y)* df$T_j[i])
      )
    )
  }
}

GroupInt <- sapply(1:G, function(grp) quad2d(  fInt(subset(Data, group == grp, select = c("z_j", "T_j"))), 0, 20, -20, 20))
Error in wx %*% Z : non-conformable arguments

当您手动简化积分时,存在一个解。例如 group 1 我们有

quad2d(  function(x,y) exp(-15*x *exp(2*y)),  0, 20, -20, 20)
[1] 348.5557

我相信那是因为被积函数没有向量化。你能试试吗:

fInt <- function(df) {
    Vectorize(function(x,y) {
    prod(
      sapply(
        1:nrow(df),
        function(i)  (x*exp(2*y) )^df$z_j[i]*exp( - x *exp(2*y)* df$T_j[i])
      )
    )
  })
}

编辑

我查看了 quad2d 的代码,发现被积函数应用于两个具有相同形状的矩阵。所以这应该有效:

fInt<- function(df) {
  function(x,y) {
    arr <- abind::abind(x, y, along = 3)
    apply(arr, c(1, 2), function(xy){
      x <- xy[1]; y <- xy[2]
      prod(
          sapply(
            1:nrow(df),
            function(i)  (x*exp(2*y) )^df$z_j[i]*exp( - x *exp(2*y)* df$T_j[i])
          )
      )
    })
  }
}