функция emd2d от падений emdist


Я пытаюсь применить функцию к списку с помощью apply, но у меня возникли проблемы с этим. Я пытаюсь вычислить расстояние между землеройными двигателями с помощью пакета emdist. Каждый индекс в списке имеет два подиндекса. Я хочу вычислить расстояние землеройных машин для этих подиндексов итеративно (реальный список имеет тысячи индексов). Проблема в том, что Rstudio аварийно завершает работу каждый раз, когда я пытаюсь запустить код на тестовом наборе данных. Пример тестового набора данных:

set.seed(42) 
output1 <- list(list(matrix(0,8,11),matrix(0,8,11)), list(matrix(rnorm(80),8,10),matrix(rnorm(80),8,10))) 

[[1]] 
[[1]][[1]] 
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] 
[1,]    0    0    0    0    0    0    0    0    0     0     0 
[2,]    0    0    0    0    0    0    0    0    0     0     0 
[3,]    0    0    0    0    0    0    0    0    0     0     0 
[4,]    0    0    0    0    0    0    0    0    0     0     0 
[5,]    0    0    0    0    0    0    0    0    0     0     0 
[6,]    0    0    0    0    0    0    0    0    0     0     0 
[7,]    0    0    0    0    0    0    0    0    0     0     0 
[8,]    0    0    0    0    0    0    0    0    0     0     0 

[[1]][[2]] 
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] 
[1,]    0    0    0    0    0    0    0    0    0     0     0 
[2,]    0    0    0    0    0    0    0    0    0     0     0 
[3,]    0    0    0    0    0    0    0    0    0     0     0 
[4,]    0    0    0    0    0    0    0    0    0     0     0 
[5,]    0    0    0    0    0    0    0    0    0     0     0 
[6,]    0    0    0    0    0    0    0    0    0     0     0 
[7,]    0    0    0    0    0    0    0    0    0     0     0 
[8,]    0    0    0    0    0    0    0    0    0     0     0 

Теперь, когда я делаю это:

library(emdist)
sapply(output1,function(x) {emd2d(x[[seq_along(x)[1]]],x[[seq_along(x)[2]]]) }) 

Rstudio просто вылетает. Я также попытался:

mapply(emd2d,sapply(output1,`[`,1),sapply(output1,`[`,2)) 
Но безрезультатно. Есть идеи? Я запускаю это на macbook air 2013 года с 2 ГБ оперативной памяти.
1 2

1 ответ:

Это прекрасно работает:

> emd2d(output1[[2]][[1]],output1[[2]][[2]])
[1] -6.089909

Это не означает:

emd2d(output1[[1]][[1]],output1[[1]][[2]])

Кажется, что emd2d() может ненавидеть, когда вы сравниваете две все нулевые матрицы...

По крайней мере, для меня на OSX, как это удается для меня:

set.seed(666)
output2 <- list(list(matrix(5,8,11),matrix(5,8,11)),  
           list(matrix(rnorm(80),8,10),matrix(rnorm(80),8,10)))
sapply(output2,function(x) {emd2d(x[[1]],x[[2]]) })
#[1]  0.000000 -7.995288
# not i removed your seq_along because I don't think you really want this..

Как и это:

> set.seed(666)
> output2 <- list(list(matrix(0,8,11),matrix(5,8,11)), list(matrix(rnorm(80),8,10),matrix(rnorm(80),8,10)))
> sapply(output2,function(x) {emd2d(x[[1]],x[[2]]) })
[1]       NaN -7.995288

Может быть, вам нужно связаться с создателем пакета по этому поводу, а тем временем вы могли бы создать функцию, которая проверяет, все ли матрицы равны нулю, например

foo <- function(z){ if( sum(length(z[[1]][ z[[1]] != 0]),
                            length(z[[2]][ z[[2]] != 0]) ) > 0){
                        emd2d(z[[1]],z[[2]]) 
                    }else{ 
                      0 
                    }   
                  }

# i use length and subsetting, not just sum(), in case somehow 
# the two matrices sum to zero because you have minus values in them

> sapply(output1, foo)
[1]  0.000000 -6.089909