R中优化的积分与误收敛

时间:2018-05-22 16:57:14

标签: r math optimization statistics integral

我正在尝试找到三个参数amutheta的MLE,然后是函数的值,说{{1 }}

f1

第1步假设我们有以下(负)对数似然函数。

loglikelihood

其中

integral

x_ij和t_ij已知

f1<-function(para)
{
 a<-para[1]
 mu<-para[2]
 the<-para[3]
 return(a*mu/the)
}

第2步让我们修复真值并生成数据。

loglik<-function(para, data)
{
 n.quad<-64
 a<-para[1]
 mu<-para[2]
 the<-para[3]
 k<-length(table(data$group))
 rule<-glaguerre.quadrature.rules(n.quad, alpha = 0)[[n.quad]]
 int.ing.gl<-function(y, x, t)
 {
  (y^(a-mu-1)/(y+t)^(x+a))*exp(-the/y)
 }
 int.f<-function(x, t) glaguerre.quadrature(int.ing.gl, lower = 0, upper = 
 Inf, x=x, t=t, rule = rule, weighted = F)
 v.int.f<-Vectorize(int.f)
 int<-v.int.f(data$count, data$time)
 loglik.value<-lgamma(a+data$count)-lgamma(a)+mu*log(the)-lgamma(mu)+log(int)
 log.sum<-sum(loglik.value)
 return(-log.sum)
}

第3步优化

### Set ###
library(tolerance)
library(lbfgs3)

a<-2
mu<-0.01
theta<-480
k<-10

f1(c(a, mu, theta))
[1] 5e-04

##### Data Generation #####

set.seed(k+100+floor(a*100)+floor(theta*1000)+floor(mu*1024))

n<-sample(50:150, k) # sample size for each group

X<-rep(0,sum(n))

# Initiate time vector 
t<-rep(0, sum(n))

# Initiate the data set
group<-sample(rep(1:k,n)) # Randomly assign the group index
data.pre<-data.frame(X,t,group) 
colnames(data.pre)<-c('count','time','group')
data<-data.pre[order(data.pre$group),] # Arrange by group index

# Generate time variable

mut<-runif(k, 50, 350)

for (i in 1:k)
{
 data$time[which(data$group==i)]<-ceiling(r2exp(n[i], rate = mut[i], shift = 1)) 
}

### Generate count variable: Poisson
## First, Generate beta for each group: beta_i
beta<-rgamma(k, shape = mu, rate = theta)

# Generate lambda for each observation
lambda<-0
for (i in 1:k)
{
 l<-rgamma(n[i], shape = a, rate = 1/beta[i])
 lambda<-c(lambda,l)
}
lambda<-lambda[-1]

data<-data.frame(data,lambda)

data$count<-rpois(length(data$time), data$lambda*data$time) # Generate count variable

导致错误收敛的一个可能原因是步骤1中的积分。在head(data) count time group 0 400 1 0 39 1 0 407 1 0 291 1 0 210 1 0 241 1 start.value<-c(2, 0.01, 100) fit<-nlminb(start = start.value, loglik, data=data, lower = c(0, 0, 0), control = list(trace = T)) fit $par [1] 1.674672e-02 1.745698e+02 3.848568e+03 $objective [1] 359.5767 $convergence [1] 1 $iterations [1] 40 $evaluations function gradient 79 128 $message [1] "false convergence (8)" 函数中,我使用了loglik。然而,由于积分缓慢收敛,因此未能给出正确的结果。 我举了一个例子,在下面的问题中寻找一些建议

Use the Gauss-Laguerre quadrature to approximate an integral in R

在这里,我只是提供一个完整的例子。有什么方法可以用来处理这个积分吗?

0 个答案:

没有答案