2016-08-13 3 views
0

У меня есть набор данных присутствия/отсутствия и вам нужно вычислить матрицу расстояний Ochiai с попарным удалением отсутствующих значений. Каков самый простой способ сделать это?Как вычислить матрицу расстояний Ochiai с попарным удалением в R

Я могу использовать конструктор из пакета vegan для создания матрицы, но не уверен, что он делает с отсутствующими значениями. Если они закодированы как «?» он дает результат, но если кодируется как «NA», то получается матрица всех NA. В vegdist вы можете указать, хотите ли вы попарно удалить, но вы не можете реализовать коэффициент Ochiai. Насколько мне известно, ни одна из других матричных функций расстояния в других пакетах не имеет такой комбинации. Есть идеи?

Приветствия,

Джеймс

ответ

0

Это может быть реализовано в vegan::designdist(), но с текущим дизайном только для terms="minimum". Двоичные данные должны обрабатываться с преобразованием 0/1 ввода либо в прямом R, либо с использованием decostand(..., "pa"). Следующие изменения сделают это в vegan::designdist():

--- a/R/designdist.R 
+++ b/R/designdist.R 
@@ -1,7 +1,7 @@ 
`designdist` <- 
    function (x, method = "(A+B-2*J)/(A+B)", 
       terms = c("binary", "quadratic", "minimum"), 
-    abcd = FALSE, alphagamma = FALSE, name) 
+    abcd = FALSE, alphagamma = FALSE, name, na.rm = FALSE) 
{ 
    terms <- match.arg(terms) 
    if ((abcd || alphagamma) && terms != "binary") 
@@ -9,13 +9,16 @@ 
    x <- as.matrix(x) 
    N <- nrow(x) 
    P <- ncol(x) 
+ ## check NA 
+ if (na.rm && terms != "minimum" && any(is.na(x))) 
+  stop("'na.rm = TRUE' can only be used with 'terms = \"minimum\"\' ") 
    if (terms == "binary") 
     x <- ifelse(x > 0, 1, 0) 
    if (terms == "binary" || terms == "quadratic") 
     x <- tcrossprod(x) 
    if (terms == "minimum") { 
-  r <- rowSums(x) 
-  x <- dist(x, "manhattan") 
+  r <- rowSums(x, na.rm = na.rm) 
+  x <- vegdist(x, "manhattan", na.rm = na.rm) 
     x <- (outer(r, r, "+") - as.matrix(x))/2 
    } 
    d <- diag(x) 
Смежные вопросы