R кластер с Танимото / Жакард - PullRequest
1 голос
/ 22 апреля 2011

Входной файл

Mydata <- read.table(con <- textConnection('
gene treatment1 treatment2 treatment3
aaa 1 0 1
bbb 1 1 1
ccc 0 0 0
eee 0 1 0
'), header=TRUE)
close(con)

Мидата

  gene treatment1 treatment2 treatment3
1  aaa          1          0          1
2  bbb          1          1          1
3  ccc          0          0          0
4  eee          0          1          0

Чтобы построить кластер, я сделал

d <- dist(mydata, method = "euclidean")
fit <- hclust(d, method="ward") 
plot(fit)

Я получил кластер на основе "евклидова" расстояния.

В моем предыдущем сообщении в stackoverflow Как использовать R для вычисления балла Танимото / Жаккарда в качестве матрицы расстояний

Я обнаружил, что могу также рассчитать матрицу расстояния танимото-жаккарда с помощью R. Не могли бы вы научить меня, как интегрировать танимото-жаккард с предыдущими шагами, чтобы получить кластер на основе матрицы расстояния, рассчитанной по расстоянию танимото-жаккард, вместо евклидова ? Большое спасибо.

1 Ответ

5 голосов
/ 22 апреля 2011

Что ты не понимаешь? ?vegdist сообщает нам, что возвращает объект класса "dist", поэтому вы можете просто удалить строку dist(....) и заменить ее одним вызовом vegdist(....). Например:

require(vegan)
d <- vegdist(Mydata[, -1], method = "jaccard")
fit <- hclust(d, method="ward") 
plot(fit)

Вам нужно отбросить первый столбец (и это должно было быть сделано в евклидовой версии, которую вы указали в Q), поскольку это не те данные, которые следует использовать для формирования матрицы различий.

Это выдаст предупреждение:

Warning message:
In vegdist(Mydata[, -1], method = "jaccard") :
  you have empty rows: their dissimilarities may be meaningless in method jaccard

потому что строка 3 не содержит информации для формирования расстояния jaccard между ним и другими образцами. Возможно, вы захотите подумать, подходит ли jaccard в таких случаях.

ОП теперь хочет, чтобы генные метки были именами строк. Самый простой вариант - сообщить R об этом при чтении данных, используя аргумент row.names для read.table():

mydata2 <- read.table(con <- textConnection("gene treatment1 treatment2 treatment3
aaa 1 0 1
bbb 1 1 1
ccc 0 0 0
eee 0 1 0
"), header = TRUE, row.names = 1)
close(con)

дает:

> mydata2
    treatment1 treatment2 treatment3
aaa          1          0          1
bbb          1          1          1
ccc          0          0          0
eee          0          1          0

Или, если данные уже находятся в R, и перезагрузка и повтор предыдущих вычислений затруднены, просто присвойте столбцу gene имена строк и удалите столбец gene (используя исходный mydata):

rownames(mydata) <- mydata$gene
mydata <- mydata[, -1]

дает:

> mydata
    treatment1 treatment2 treatment3
aaa          1          0          1
bbb          1          1          1
ccc          0          0          0
eee          0          1          0
...