R中应用函数族的矢量化

R中应用函数族的矢量化,r,machine-learning,regression,vectorization,apply,R,Machine Learning,Regression,Vectorization,Apply,我正在使用线性回归模型,我想手动计算一些性能度量。我使用留一交叉验证(LOOCV)分割数据 下面的R代码给出了我想要的结果,但由于我在LOOCV中使用for循环,所以需要很长时间 有没有一种方法可以快速重写我的代码,比如使用R中的apply函数族 数据集是从中上载的 注2 我有8个核,“PE”是我的数据集中的因变量。您可以使用sapply而不是为…轻松地重新编写循环,尽管正如bzki所评论的,这本身并不能加快代码的速度: # sapply version: fitted_value = sapp

我正在使用线性回归模型,我想手动计算一些性能度量。我使用留一交叉验证(LOOCV)分割数据

下面的R代码给出了我想要的结果,但由于我在LOOCV中使用for循环,所以需要很长时间

有没有一种方法可以快速重写我的代码,比如使用R中的apply函数族

数据集是从中上载的

注2


我有8个核,“PE”是我的数据集中的因变量。

您可以使用
sapply
而不是
为…
轻松地重新编写循环,尽管正如bzki所评论的,这本身并不能加快代码的速度:

# sapply version:
fitted_value = sapply(seq_len(nrow(wdbc)),function(i) {
    # put all the gubbins in here
    # ...
    return (x %*% co.data)
})
但是,如果您的计算机上有多个可用内核,或者(甚至更好)访问具有多个处理器的服务器,则可以使用“并行”软件包中的
parSapply
轻松并行化
sapply
循环,如本例所示:

# slow sapply loop (takes 12s):
data=123
answer = sapply(1:12,function(i) {
    Sys.sleep(1)
    return(data+i)
})
# faster parallel version (takes 4s on my laptop with 4 cores):
library(parallel)
mycluster=makeCluster(detectCores()-1) # leave 1 core available for system 
data=123
clusterExport(mycluster,"data") # specify variable(s) that should be available to parallel function
answer = parSapply(mycluster,1:12,function(i) {
    Sys.sleep(1)
    return(data+i)
})
stopCluster(mycluster)

简单评论一下:apply函数族在R中不矢量化操作。它们是完成任务的方便包装函数,但通常不会有很大的速度改进。@bzki,我明白了。那么,你认为有办法加快我的代码吗?因为我有很多不同维度的数据集,这需要花费太多的时间。不幸的是,我不知道你的问题的答案(比我更有知识的人可以回答)。对于使用最小二乘拟合的线性回归,有一种简单的方法可以通过只拟合一次模型来获得LOO CV误差:。我不知道最小绝对偏差拟合是否也有类似的功能。其他软件包(例如tidyverse)也有类似的功能吗?您可以使用Furr软件包,它允许您使用purrr软件包中的并行功能,如map、map2、pmap等。@jeza-这很烦人,不幸的是,我不熟悉特定的
lad()
coef()
函数,如果这些函数是问题的一部分,您可以使用它们来提供帮助。但我有几个问题:1。您是否检查过您的计算机是否有多个可并行处理的内核(detectCores()的输出是什么?);2.您的函数中的
PE
是什么?这是另一个你应该为并行函数提供的变量吗?@Dominic van Essen,我有8个核,“PE”是我数据集中的因变量。@jeza-好的-我没有注意到这一点。对于…循环,您不需要
parSapply
应自行完成此操作。尝试简单地删除…
行的
,以及底部相应的
}
# sapply version:
fitted_value = sapply(seq_len(nrow(wdbc)),function(i) {
    # put all the gubbins in here
    # ...
    return (x %*% co.data)
})
# slow sapply loop (takes 12s):
data=123
answer = sapply(1:12,function(i) {
    Sys.sleep(1)
    return(data+i)
})
# faster parallel version (takes 4s on my laptop with 4 cores):
library(parallel)
mycluster=makeCluster(detectCores()-1) # leave 1 core available for system 
data=123
clusterExport(mycluster,"data") # specify variable(s) that should be available to parallel function
answer = parSapply(mycluster,1:12,function(i) {
    Sys.sleep(1)
    return(data+i)
})
stopCluster(mycluster)