Как выполнить кластеризацию, не удаляя строки, где NA присутствует в R

У меня есть данные, которые содержат некоторые значения NA в своих элементах. То, что я хочу сделать, это выполнить кластеризацию без удаления строк, где присутствует NA.

Я это понимаю gower мера расстояния в daisy разрешить такую ​​ситуацию. Но почему мой код ниже не работает? Я приветствую другие альтернативы, кроме "ромашки".

# plot heat map with dendogram together.

library("gplots")
library("cluster")


# Arbitrarily assigning NA to some elements
mtcars[2,2] <- "NA"
mtcars[6,7]  <- "NA"

 mydata <- mtcars

hclustfunc <- function(x) hclust(x, method="complete")

# Initially I wanted to use this but it didn't take NA
#distfunc <- function(x) dist(x,method="euclidean")

# Try using daisy GOWER function 
# which suppose to work with NA value
distfunc <- function(x) daisy(x,metric="gower")

d <- distfunc(mydata)
fit <- hclustfunc(d)

# Perform clustering heatmap
heatmap.2(as.matrix(mydata),dendrogram="row",trace="none", margin=c(8,9), hclust=hclustfunc,distfun=distfunc);

Я получил следующее сообщение об ошибке:

    Error in which(is.na) : argument to 'which' is not logical
Calls: distfunc.g -> daisy
In addition: Warning messages:
1: In data.matrix(x) : NAs introduced by coercion
2: In data.matrix(x) : NAs introduced by coercion
3: In daisy(x, metric = "gower") :
  binary variable(s) 8, 9 treated as interval scaled
Execution halted

В конце дня я хотел бы выполнить иерархическую кластеризацию с данными, разрешенными NA.

Обновить

Преобразование с as.numeric работать с примером выше. Но почему этот код потерпел неудачу при чтении из текстового файла?

library("gplots")
library("cluster")

# This time read from file
mtcars <- read.table("http://dpaste.com/1496666/plain/",na.strings="NA",sep="\t")

# Following suggestion convert to numeric
mydata <- apply( mtcars, 2, as.numeric )

hclustfunc <- function(x) hclust(x, method="complete")
#distfunc <- function(x) dist(x,method="euclidean")
# Try using daisy GOWER function 
distfunc <- function(x) daisy(x,metric="gower")

d <- distfunc(mydata)
fit <- hclustfunc(d)

heatmap.2(as.matrix(mydata),dendrogram="row",trace="none", margin=c(8,9), hclust=hclustfunc,distfun=distfunc);

Ошибка, которую я получаю, такова:

  Warning messages:
1: In min(x) : no non-missing arguments to min; returning Inf
2: In max(x) : no non-missing arguments to max; returning -Inf
3: In min(x) : no non-missing arguments to min; returning Inf
4: In max(x) : no non-missing arguments to max; returning -Inf
Error in hclust(x, method = "complete") : 
  NA/NaN/Inf in foreign function call (arg 11)
Calls: hclustfunc -> hclust
Execution halted

~

2 ответа

Решение

Ошибка связана с наличием в данных нечисловых переменных (чисел, закодированных в виде строк). Вы можете конвертировать их в числа:

mydata <- apply( mtcars, 2, as.numeric )
d <- distfunc(mydata)

Использование as.numeric может помочь в этом случае, но я думаю, что оригинальный вопрос указывает на ошибку в daisy функция. В частности, он имеет следующий код:

    if (any(ina <- is.na(type3))) 
    stop(gettextf("invalid type %s for column numbers %s", 
        type2[ina], pColl(which(is.na))))

Предполагаемое сообщение об ошибке не печатается, потому что which(is.na) неправильно. Так должно быть which(ina),

Я думаю, я должен выяснить, где / как отправить эту ошибку сейчас.

Другие вопросы по тегам