R: оптимизация для больших данных в R

У меня есть панельные данные, состоящие из 5908 отдельных наблюдений за 5 лет. Я хочу оценить оценку максимального правдоподобия с помощью пакета optim(). Вот мой код

library(pglm)
library(plm)
data("HealthIns")
dat<- pdata.frame(HealthIns,index = c("id","year"))
summary(dat)

dat$claims<-ifelse(dat$size>=4,1,0)
y<-data.matrix(dat$claims)
y[is.na(y)]=0
Y<-matrix(data=y,nrow=5908,ncol=5)

dat$ageclass<-ifelse(dat$age >=30,1,0)
x1<-data.matrix(dat$ageclass)
x1[is.na(x1)]=0
X1<-matrix(data=x1,nrow=5908,ncol=5)

dat$gender <-ifelse(dat$sex=="male",1,0)
x2<-data.matrix(dat$gender)
x2[is.na(x2)]=0
X2<-matrix(data=x2,nrow=5908,ncol=5)

dat$child<-ifelse(dat$child=="yes",1,0)
x3<-data.matrix(dat$child)
x3[is.na(x3)]=0
X3<-matrix(data=x3,nrow=5908,ncol=5)

Вероятность -log, которую я хочу использовать, равна

po.gam=function(para){
  #Lambda(i,t)
  {for (i in (1:5908)){
    for(t in (1:5)){
    lambda<-as.matrix(exp(para[1] + para[2]*X1 + para[3]*X2 + para[4]*X3),nrow=5908,ncol=5)}}
  }
  
 
  num.claims.of.t <-numeric(nrow(Y))
  {for (i in seq(nrow(Y))){
    num.claims.of.t[i] <-sum(Y[i,])}
  }
  
  num.lambda.of.t<-numeric(nrow(Y))
  {for (i in seq(nrow(Y))){
    num.lambda.of.t[i]<-sum(lambda[i,])}
  }
  
  prod.exp<-numeric(nrow(Y))
  {for (i in seq(nrow(Y))){
    prod.exp[i]<-prod(lambda[i,]^Y[i,]/factorial(Y[i,]))}
  }
  
  
  joint.pdf.mvnb<-(prod.exp)*(gamma(num.claims.of.t + (1/para[5]))/gamma(1/para[5]))*(((1/para[5])/(num.lambda.of.t + (1/para[5])))^(1/para[5]))*((num.lambda.of.t + (1/para[5]))^(-num.claims.of.t))
  
  #PRODUC NUMBER OF CLAIMS SEMUA INDIVIDU
  prod.mvnb=1
  for (i in (length(joint.pdf.mvnb))){
    prod.mvnb<-prod(joint.pdf.mvnb[i])
  }
  return(-log(prod.mvnb))
}

Затем с помощью optim()

start.value <- c(beta0=0.01,beta1=0.01,beta2=0.01,beta3=0.01,alfa=0.01)
MLE_pogam<-optim(start.value,fn=po.gam,hessian=FALSE)
MLE_pogam

И программа будет работать более 2 часов без каких-либо выходных данных. Есть ли у вас какие-либо предложения по оптимизации функции логарифмического правдоподобия для больших данных? Спасибо!!


person Jasmine Helen    schedule 09.04.2021    source источник
comment
Я не вдавался в подробности, но, возможно, вам нужно поискать более оптимизированную функцию для выполнения этого. Из документации optim The default method is an implementation of that of Nelder and Mead (1965), that uses only function values and is robust but relatively slow. .   -  person user2974951    schedule 09.04.2021
comment
Первые четыре строки функции вычисляют лямбду 5908*5 раз, но они не зависят от i и t, поэтому результат каждый раз будет точно таким же, поэтому циклы for можно убрать.   -  person Miff    schedule 14.04.2021


Ответы (1)


Попробуйте использовать пакет pso. Он реализует алгоритм оптимизации роя частиц с pso::psoptim() в качестве прямой замены функции optim(). Это стохастический алгоритм, поэтому он должен быть относительно быстрее.

person eduardokapp    schedule 09.04.2021
comment
Привет! Я пробовал ваше решение, но получается Ошибка в if (f.x[i] ‹ f.p[i]) { : отсутствует значение, где нужно TRUE/FALSE. У вас есть какие-либо предложения по устранению этой проблемы? Благодарю вас! - person Jasmine Helen; 09.04.2021
comment
Я еще не мог попробовать ваш пример, но эта ошибка, похоже, является внутренней ошибкой в ​​​​функции psoptim! Возможно, вы не передаете аргументы должным образом. Например, функция стоимости должна возвращать скаляр. Ознакомьтесь с документацией rdocumentation.org/packages/pso. /версии/1.0.3/темы/psoptim. Надеюсь, это поможет! - person eduardokapp; 09.04.2021