gpt4 book ai didi

r - 在 R 中使用 apply 系列函数进行矢量化

转载 作者:行者123 更新时间:2023-12-04 10:06:13 24 4
gpt4 key购买 nike

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

以下 R 代码为我提供了所需的结果,但由于我将 for 循环与 LOOCV 一起使用,因此需要很长时间。

有没有办法以快速的方式重写我的代码,例如,在 R 中应用一系列函数?

数据集上传自 here

wdbc <- read_excel("Folds5x2_pp.xlsx") 
wdbc[] <- lapply(wdbc, scale)

dim(wdbc)

9568 5

head(wdbc)

1 -0.629 -0.987 1.82 -0.00952 0.521
2 0.742 0.681 1.14 -0.975 -0.586
3 -1.95 -1.17 -0.185 1.29 2.00
4 0.162 0.237 -0.508 0.228 -0.462
5 -1.19 -1.32 -0.678 1.60 1.14
6 0.888 0.404 -0.173 -0.996 -0.627

fitted_value <- rep(0,nrow(wdbc))

for(i in 1:nrow(wdbc)){
test<-wdbc[i,]
training<-wdbc[-i,]
m=lad(PE ~ ., data=training, method="BR")

co.data = coef(m)
x = cbind(1, as.matrix(test[, !(colnames(test) %in% "PE")]))
fitted_value[i] <- x %*% co.data
}

R2<-(cor(wdbc$PE,fitted_value)^2)
SAD<-sum(abs(wdbc$PE-fitted_value))

c(round(SAD,2) ,round(R2,2))

注 1

问题中使用的数据仅用于解释,因为在我的项目中,我有许多高维数据集。

编辑

基于@Dominic van Essen 的回答,我使用了以下 R 代码 parSapply函数来自 parallel包,但它比 for 循环需要更多时间。
library(parallel)

mycluster=makeCluster(detectCores()-1)
wdbc <- read_excel("Folds5x2_pp.xlsx")
wdbc[] <- lapply(wdbc, scale)
clusterExport(mycluster,c("lad","wdbc"))

fitted_value = parSapply(mycluster,seq_len(nrow(wdbc)),function(i) {
for(i in 1:nrow(wdbc)){
test<-wdbc[i,]
training<-wdbc[-i,]
m=lad(PE ~ ., data=training, method="BR")

co.data = coef(m)
x = cbind(1, as.matrix(test[, !(colnames(test) %in% "PE")]))
}
return (x %*% co.data)
})

注释 2

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

最佳答案

您可以使用 sapply 轻松地重新编写循环。而不是 for... ,尽管正如 bzki 评论的那样,仅此一项不会加速您的代码:

# sapply version:
fitted_value = sapply(seq_len(nrow(wdbc)),function(i) {
# put all the gubbins in here
# ...
return (x %*% co.data)
})

但是,如果您的计算机上有多个内核可用,或者 - 甚至更好 - 访问具有多个处理器的服务器,那么 sapply使用 parSapply 可以轻松地并行化循环来自 'parallel' 包,如本例所示:
# 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)

关于r - 在 R 中使用 apply 系列函数进行矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61578284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com