我已经编写了一个代码来对三个参数进行数值优化。我的问题是,代码使用1h30mins进行一次迭代,并且优化直到150-200次迭代才收敛。我尝试了以下方法来优化代码:
我现在正在使用的代码:
library(stats4)
library(gamlss.dist)
library(lmtest)
library(pbapply)
library(compiler)
bid <- runif(10000, 1.1,1.55)
participants <- round(runif(10000,5,9))
r = 0.5
foo_inner <- function(i, theta1, theta2, lambda){
function(N){
density = (
(N) *
(N-1) *
(pWEI2(bid[i], theta1, theta2))^(N-2) *
pWEI2(bid[i], theta1, theta2, lower.tail = FALSE) *
dWEI2(bid[i], theta1, theta2)) /
(1-(pWEI2(r, theta1, theta2))^N)
ngittN =
dbinom(participants[i], size = N,
prob = pWEI2(r, theta1, theta2, lower.tail = FALSE))
sN =
dpois(N, lambda)
return(density * ngittN * sN)
}}
foo_outer <- function(theta1, theta2, lambda){
function(i){
listeObs <- sapply(participants[i]:20000, foo_inner(i, theta1, theta2, lambda))
return(sum(listeObs))
}}
eqThree <- function(theta1, theta2, lambda){
secondPart <- pbsapply(1:length(bid), foo_outer(theta1, theta2, lambda))
LL <- -sum(log(secondPart))
return(LL)
}
foo_inner <- cmpfun(foo_inner)
foo_outer <- cmpfun(foo_outer)
eqThree <- cmpfun(eqThree)
mle <- cmpfun(mle)
result_mle <- mle(minuslogl = eqThree, start=list(theta1 = 1,
theta2 = 2,
lambda = 7),
method="L-BFGS-B", lower=c(0.1,0.1,5),
nobs = length(bid))
由于这是一个一次性项目(时间有限),所以我想避免用新语言(fortran,C ++)编写代码。但是,如果那是我唯一的解决方案,那么我显然别无选择。
我想指出我有使用Python编写的经验,但是基于我的初步分析,Python和R在计算能力方面也存在类似的问题。