gpt4 book ai didi

r - 使嵌套循环更有效?

转载 作者:行者123 更新时间:2023-12-04 16:29:45 27 4
gpt4 key购买 nike

我正在使用以下脚本分析大量数据:

M <- c_alignment 
c_check <- function(x){
if (x == c_1) {
1
}else{
0
}
}
both_c_check <- function(x){
if (x[res_1] == c_1 && x[res_2] == c_1) {
1
}else{
0
}
}
variance_function <- function(x,y){
sqrt(x*(1-x))*sqrt(y*(1-y))
}
frames_total <- nrow(M)
cols <- ncol(M)
c_vector <- apply(M, 2, max)
freq_vector <- matrix(nrow = sum(c_vector))
co_freq_matrix <- matrix(nrow = sum(c_vector), ncol = sum(c_vector))
insertion <- 0
res_1_insertion <- 0
for (res_1 in 1:cols){
for (c_1 in 1:conf_vector[res_1]){
res_1_insertion <- res_1_insertion + 1
insertion <- insertion + 1
res_1_subset <- sapply(M[,res_1], c_check)
freq_vector[insertion] <- sum(res_1_subset)/frames_total
res_2_insertion <- 0
for (res_2 in 1:cols){
if (is.na(co_freq_matrix[res_1_insertion, res_2_insertion + 1])){
for (c_2 in 1:max(c_vector[res_2])){
res_2_insertion <- res_2_insertion + 1
both_res_subset <- apply(M, 1, both_c_check)
co_freq_matrix[res_1_insertion, res_2_insertion] <- sum(both_res_subset)/frames_total
co_freq_matrix[res_2_insertion, res_1_insertion] <- sum(both_res_subset)/frames_total
}
}
}
}
}
covariance_matrix <- (co_freq_matrix - crossprod(t(freq_vector)))
variance_matrix <- matrix(outer(freq_vector, freq_vector, variance_function), ncol = length(freq_vector))
correlation_coefficient_matrix <- covariance_matrix/variance_matrix

模型输入将是这样的:
1 2 1 4 3
1 3 4 2 1
2 3 3 3 1
1 1 2 1 2
2 3 4 4 2

我正在计算的是 M[,i] 中每个状态的二项式协方差在 M[,j] 中找到每个状态.每一行都是为该试验找到的状态,我想看看列的状态如何共同变化。

澄清:我正在寻找两个多项式分布的协方差,但我是通过二项式比较来完成的。

输入是一个 4200 x 510 的矩阵,每列的 c 值平均约为 15。我知道 for R 中的循环非常慢,但我不确定如何使用 apply功能在这里。如果有人对正确使用 apply 有任何建议在这里,我真的很感激。现在脚本需要几个小时。谢谢!

最佳答案

我想写评论,但我有太多话要说。

首先,如果你觉得apply 比较快,看Is R's apply family more than syntactic sugar? .可能是,但远不能保证。

接下来,请不要在您浏览代码时增加矩阵,这会极大地减慢您的代码速度。预先分配矩阵并填充它,这可以将您的代码速度提高十倍以上。您正在通过您的代码生成不同的向量和矩阵,这太疯狂了(请原谅我的强烈演讲)

然后,查看?subset的帮助页面以及那里给出的警告:

This is a convenience function intended for use interactively. For programming it is better to use the standard subsetting functions like [, and in particular the non-standard evaluation of argument subset can have unanticipated consequences.



总是。用。指数。

此外,您一遍又一遍地重新计算相同的值。 fre_res_2例如,为每个 res_2 和 state_2 计算与 res_1 的组合一样多的次数和 state_1 .那只是浪费资源。将不需要重新计算的内容从循环中移除,并将其保存在您可以再次访问的矩阵中。

哎呀,现在我开始了:请使用矢量化函数。再想一想,看看您可以从循环中拖出什么:这就是我认为的计算核心:
cov <- (freq_both - (freq_res_1)*(freq_res_2)) /
(sqrt(freq_res_1*(1-freq_res_1))*sqrt(freq_res_2*(1-freq_res_2)))

在我看来,您可以构建一个矩阵 freq_both、freq_res_1 和 freq_res_2,并将它们用作该一行的输入。这将是整个协方差矩阵(不要称它为 covcov 是一个函数)。退出循环。输入快速代码。

鉴于我不知道 c_alignment 中有什么,我不会为你重写你的代码,但你绝对应该摆脱 C 的思维方式并开始思考 R。

让这成为一个开始: The R Inferno

关于r - 使嵌套循环更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9319753/

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