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])
)
)
})
}
}
我有以下数据。数据有 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])
)
)
})
}
}