R-截断中的快速处理方法

R-截断中的快速处理方法,r,performance,R,Performance,我问你以下问题。 假设我有以下数据库,并试图计算每个db分布(em函数给出双峰分布的每个平均值)。 问题是处理速度非常慢。 仅6个ID需要2.3分钟(想象一下,如果我必须为数千个ID这么做)。 你能想出另一种更快的方法来处理这些数据吗(例如,并行处理,使用另一个函数,使用多个核心) 谢谢 N <- 100000 components <- sample(1:3,prob=c(0.3,0.5,0.2),size=N,replace=TRUE) mus <- c(0,10,3)

我问你以下问题。 假设我有以下数据库,并试图计算每个db分布(em函数给出双峰分布的每个平均值)。 问题是处理速度非常慢。 仅6个ID需要2.3分钟(想象一下,如果我必须为数千个ID这么做)。 你能想出另一种更快的方法来处理这些数据吗(例如,并行处理,使用另一个函数,使用多个核心)

谢谢

N <- 100000

components <- sample(1:3,prob=c(0.3,0.5,0.2),size=N,replace=TRUE)
mus <- c(0,10,3)
sds <- sqrt(c(1,1,0.1))

samples <- rnorm(n=N,mean=mus[components],sd=sds[components])

db<-data.frame(id=c('a','b','c','d','e','f'),dist=c(samples,samples*0.9,samples*1.1,samples*1.2,samples*0.98,samples*0.88))
db$id<-as.character(db$id)

# install.packages("bbmle")
# devtools::install_github("choisy/cutoff")
library(cutoff)

IDS<-unique(db$id)

system.time(
bimod <- lapply(1:length(unique(db$id)), function(x){
                                        x<-db[db$id==IDS[x],]$dist

                                        tryCatch({ em(x,"normal","normal") }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")}) 
  })
)

126.675  11.697 140.838

N尝试在ID中使用矩阵而不是数据帧,使用数字而不是字符。如果你依赖于角色,可能因素是更好的选择。这会提高你的速度吗?如果没有,请查看
cutoff::em
,并查看是否可以增强慢速部件。进行分析。您可以看到,
bbmle::mle2
函数占用了所有的处理时间。您是如何进行分析的?带着我?您可以复制您的分析吗?在RSTUDIO中,Ctrl+Alt+Shift+P您可以尝试以某种方式将
bbmle::mle2
部分替换为
stats4::mle
。可能会改进,因为它小得多(未测试)。