繁体   English   中英

如何在R中加快以下功能?

[英]How can I speed up the following function in R?

我在R中编写了以下函数。我想对其进行迭代,例如50000次。 我在函数中使用了“ sapply”,但它在R中运行缓慢。我的PC现在仍在工作约20小时,我对运行时间一无所知。 任何想法如何加快此操作? 谢谢。

data=matrix(c(0.01132162,1,0.04056053,1,0.11676735,0,0.12029087,1,
           0.16197702,1,0.17190980,1,0.20386841,1,0.21251687,0,
           0.36536492,0,0.40256414,1),ncol=2,byrow=T)

 GIBS=function(data,a,b,beta,R)
    {
       m=length(R)
       n1=sum(data[,2]==1)
       n2=m-n1
       n=m+sum(R)
       N=c(n1,n2)
       R1=c(0,R)
       nstar=c()
       for(i in 1:m) nstar[i]=n-(i-1)-sum(R1[1:i])
       Z=c(data[1,1],data[2:m,1]-data[1:(m-1),1])
       f=function(x)
        {
          A=0
          for(i in 1:m) A=A+x^i*nstar[i]*Z[i]
          FR=1
          for(j in 1:2) FR=FR*(A+b[j])^(N[j]+a[j])
          return(x^(m*(m+1)/2)*exp(-beta*(x-1))/FR)
        }
      INT=integrate(f,1,Inf)$value
      SG=function(it)
       {
        uu=runif(1)
        g0=function(t) integrate(f,1,t)$value/INT-uu
        aa=5
        if(g0(1)>0) {while(g0(aa)>0) aa=aa+1} else {while(g0(aa)<0) aa=aa+1}
        ra=uniroot(g0,c(1,aa))$root
        A1=sum(ra^(1:m)*nstar*Z)
        rl1=rgamma(1,n1+a[1],A1+b[1])
        rl2=rgamma(1,n2+a[2],A1+b[2])
        return(c(ra,rl1,rl2))
      }
     return(colMeans(t(sapply(1:10000,SG,simplify = "array"))))
  }
########
BGI=matrix(NA,ncol=3,nrow=50000)
for(iter in 1:50000)
  {
    BGI[iter,]=GIBS(data,c(2,1.6),c(2,2),5,c(10,rep(0,9)))
    cat(iter, "of 50000\r") 
   flush.console()
 }

关于功能的更新版本,如果您需要进行多次迭代,我建议利用多核/ HPC功能来运行它。

以下是对该函数原始版本的注释:

问题出在函数的这一部分(及其输入, f和数据对象)上:

integrate(f,1,Inf)

f的行开始

FR=prod((A+b)^(N+a))

它给出以下警告,这些警告会导致后续问题并有效地导致无限循环:

 Warning messages: 1: In x^(1:m) : longer object length is not a multiple of shorter object length 2: In x^(1:m) * nstar : longer object length is not a multiple of shorter object length 3: In x^(1:m) * nstar * Z : longer object length is not a multiple of shorter object length 4: In A + b : longer object length is not a multiple of shorter object length 5: In N + a : longer object length is not a multiple of shorter object length 6: In x^(1:m) : longer object length is not a multiple of shorter object length 7: In x^(1:m) * nstar : longer object length is not a multiple of shorter object length 8: In x^(1:m) * nstar * Z : longer object length is not a multiple of shorter object length 9: In A + b : longer object length is not a multiple of shorter object length 10: In N + a : longer object length is not a multiple of shorter object length 11: In x^(1:m) : longer object length is not a multiple of shorter object length 12: In x^(1:m) * nstar : longer object length is not a multiple of shorter object length 13: In x^(1:m) * nstar * Z : longer object length is not a multiple of shorter object length 14: In A + b : longer object length is not a multiple of shorter object length 15: In N + a : longer object length is not a multiple of shorter object length 

我不了解此功能要完成的工作,因此我可能会帮助您修复它,但是如果您使该部分更清楚,我会尝试的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM