Estoy análisis de grandes conjuntos de datos utilizando el siguiente script:¿Hacer que los bucles anidados sean más eficientes?
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
Un modelo de entrada sería algo como esto:
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
Lo que estoy cálculo de la covarianza es binomial para cada estado encontrado en M[,i]
con cada estado encontrado en M[,j]
. Cada fila es el estado que se encuentra para esa prueba, y quiero ver cómo varía el estado de las columnas.
Aclaración: Estoy buscando la covarianza de dos distribuciones multinomiales, pero lo hago a través de comparaciones binomiales.
La entrada es una matriz de 4200 x 510, y el valor de c para cada columna es aproximadamente 15 en promedio. Sé que los bucles for
son terriblemente lentos en R, pero no estoy seguro de cómo puedo usar la función apply
aquí. Si alguien tiene una sugerencia sobre cómo usar correctamente apply
aquí, realmente lo agradecería. En este momento, el script tarda varias horas. ¡Gracias!
¿Podría agregar un pequeño conjunto de datos y lo que está tratando de obtener? – aatrujillob
@AndresT Se agregó algo más de información. –
¿Has probado encender el optimizador 'loop que se desenrolla' en el compilador? –