Вот как бы я это сделал (для одной версии беты и X). Обратите внимание, что двойной интеграл - это просто два отдельных интеграла, вложенных друг в друга. Параметр n
определяет количество случайных выборок, которые я использую для оценки ожидания в интеграле.
beta <- function(t){
return(t*t*t-1.6*t*t+0.76*t+1)
}
myX <- function(a,t){
pt <- c(1,t,t*t,t*t*t)
return(sum(a*pt))
}
## computes the expectation by averaging over n samples
myE <- function(n,s,t){
samp <- sapply(seq(n),function(x){
a <- rnorm(4)
myX(a,s)*myX(a,t)})
return(mean(samp,na.rm=T))
}
## funtion inside the first integral
myIntegrand1 <- function(s,t,n){
return(beta(s)*myE(n,s,t))
}
## function inside the second integral
myIntegrand2 <- function(t,n){
v <- integrate(myIntegrand1,0,1,t=t,n=n)
return(beta(t)*v$value)
}
## computes sigma
mySig <- function(n){
v <- integrate(myIntegrand2,0,1,n=n)
return( 0.25*v$value)
}
## tests various values of n (number of samples drawn to compute the expectation)
sapply(seq(3),function(x)
c("100"=mySig(100),"1000"=mySig(1000),"10000"=mySig(10000)))
## output shows you the level of precision you may expect:
## [,1] [,2] [,3]
## 100 48.61876 47.85445 58.2094
## 1000 52.95681 50.61860 50.61702
## 10000 54.88292 53.02073 54.48635