Как вычислить матрицу расстояний Очиаи с попарным удалением в R
У меня есть набор данных присутствия / отсутствия и мне нужно рассчитать матрицу расстояний Ochiai с попарным удалением пропущенных значений. Какой самый простой способ сделать это?
Я могу использовать designdist из пакета vegan для генерации матрицы, но не уверен, что он делает с отсутствующими значениями. Если они закодированы как "?" это дает результат, но если закодировано как "NA", то это производит матрицу всех NA. В vegdist вы можете указать, хотите ли вы парное удаление, но не можете реализовать коэффициент Ochiai. Насколько я могу судить, ни одна из других функций матрицы расстояний в других пакетах не имеет этой комбинации. Есть идеи?
Ура,
Джеймс
1 ответ
Это может быть реализовано в 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)