R:循环中非常大的多个循环花了太长时间,可能还有其他选择吗?如何对此进行矢量化?

0 performance loops r large-data

前面的信息可能有助于您理解问题:我有一个数据/集和/或矩阵有257列,第257列只是一列零,用于编码.

我需要找到四到十个不同列之间的最高相关性,使用每个可能组合的单独线性模型.通过将每个线性模型的R平方值与单个列矩阵进行比较,我一直在对其进行最佳拟合.

我已经为1-3列的每个组合完成了这个任务,但是当使用如下所示的四个参数时,R无法在合理的时间内完成任务,代码运行了大约五天,而不是甚至接近完成.

下面的代码是循环内循环内的循环...等,为每个使用的添加参数添加另一个循环.目前,代码将保存矢量中每个循环的r平方值和循环数,如果它在找到的前十位中.我认为这样做可以节省一些内存,并加快速度,但是,它根本没有帮助,也没有用.

我的问题是:是否有可能在R中加快速度,或者是否有更好的语言可供使用?我将如何使用另一种语言,软件?价钱?我以前只在编码中使用了R,因为我没有做很长时间,并且是一个长镜头的amatuer.

我很感激任何建议!谢谢.

具有四个参数的示例的代码如下所示,这些参数运行时间很长

#Creating objects for loop run. Overunder is already filled.

overundermatrix <- matrix(0,nrow=length(totalsc),ncol=1)
vectfourparamovun <- c(.01,.001,.0001,.00001,.000001,.0000001,.00000001,.000000001,.0000000001,.00000000001)
vectfourindexovun <- vector("list",10)

#Main Body of Loop
options(warn=-1)
for(n in 3:256){
for(i in 1:254){
for(j in 1:254){
for(a in 1:254){
lm1 <- lm(overundermatrix~data[,n]+data[,(ifelse((n+i)>256,257,(n+i)))]+data[,(ifelse((n+i+j)>256,257,(n+i+j)))]+data[,ifelse((n+i+j+a)>256,257,(n+i+j+a))])
lm1sum <-summary(lm1)
if(lm1sum[[9]]>vectfourparamovun[1:10])
{
vectfourindexovun[[which.min(vectfourparamovun[1:10])]] <- list(c(a,j,i,n))
vectfourparamovun[which.min(vectfourparamovun[1:10])] <- lm1sum[[9]]
}
}
}
}
}
options(warn=0)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我只想找到所有可能的组合并为其创建线性模型,但这样做很长.我不知道如何不使用循环.

Dir*_*tel 8

你正在进行暴力模型搜索,几乎任何具有统计意识的人都会提出建议.仅仅因为"你能"并不意味着"你应该".

也就是说,有一些方法可以帮助模型规范搜索大量可能的mnodel.这有时被称为"小n,大p"(用于描述列数占行数)并且是统计基因组学中的核心研究课题.有许多CRAN软件包可以帮助解决这个问题,您可能需要查看机器学习和统计学习CRAN任务视图.

最后,如果您必须继续进行暴力搜索,请考虑

  1. 替换lm()具有更快的替代品,如lm.fit()在碱R,或fastLm()RcppArmadillo

  2. 用编译的解决方案替换你的核心代码; 和Rcpp可能有所帮助.