6 заметок с тегом

R

Добавляем рисунки к листьям дендрограммы. 1 часть: используем ggtree

Дендрограмма — это результат объединения данных при помощи иерархического кластерного анализа. Обычно на листьях дендрограммы написаны имена переменных — названия объектов. Рассказываю, как вместо названий показать изображения.

В конце заметки — финальный код на R


Эта красочная дендрограмма содержит 38 листьев и разделена на 19 классов. На листьях дендрограммы написаны названия видов плоских паразитических червей из класса моногеней. Собираюсь показать вместо них изображения прикрепительных органов этих паразитов


Для работы понадобятся

Знание языка Эр.

Установленный пакет ggtree.

Создаю изображения объектов

Каждому листу дендрограммы сопоставлю маленький рисунок объекта. Для этого буду использовать два набора изображений: один — для тестирования, другой — для финальной отрисовки.

Тестовые изображения
Тестовые изображения содержат номера, идущие по порядку. Они нужны для того, чтобы было понятно, куда именно разработанный код помещает картинки.

Вот код для генерации 99-ти пнг-файлов размером 20×20 пикселей. Имя файла с изображением совпадает с нарисованым номером.

imgs_path = "img_indexed/"

for (i in 1:99) {
  # Создаю новый пнг-файл img_{i}.png с нулевыми отступами
  png(file = paste0(imgs_path, "img_", i, ".png"), width = 20, height = 20)
  par(mar = c(0, 0, 0, 0))
  
  # Созданию рисунок числа
  plot(0, 0, type = "n", xlim = c(0, 1), ylim = c(0, 1), xlab = "", ylab = "", axes = FALSE)
  text(0.5, 0.5, i, cex = 1)
  
  # Сохраняю пнг-файл
  dev.off()
}

Вот сами изображения.

Вод код для их загрузки.

imgs_indexed = c()
imgs_path = "imgs_indexed/"

for(i in 1:75) {
  imgs_indexed = c(imgs_indexed, paste0(imgs_path, "img_", i, ".png"))
}

Изображения объектов

Изображение объекта — это уменьшенный рисунок прикрепительного крючка паразитического червя (моногенеи). Вот они все:

Общая картинка создана с помощью Имедж-меджик: montage -tile 20x2 -geometry +0+0 *.png all-anchors.png

Название файла с крючком совпадает с наванием вида. Эти названия храню списком в текстовом файле labels.txt. Для загрузки изображений объектов использую следующий код.

imgs_path = "img_objects/"
# Загружаем имена меток
img_objects <- readLines("labels.txt")
# и добавляем расширение '.png'
img_objects <- paste0(imgs_path, img_objects, ".png")

Изображения готовы, перейдем к дереву.

Строю дерево с картинками, используя ggtree

В книге «Data integration, manipulation and visualization of phylogenetic trees» описано, как прикрутить картинки к дендрограмме с помощью ggtree.

К сожалению, приведнный в книге код у меня не заработал. Он подразумевает, что мы загружаем филодерево из файла. А я строю дерево при помощи иерархической кластеризации и преобразую ее в объект дендрограммы.

data — это матрица данных: в ее строках — объекты, в столбцах — признаки.

# Выполняю иерархический кластерный анализ
dist <- dist(data)
hc   <- hclust(dist, method = "complete") 

library(dendextend)

# Преобразую результат в дендрограмму
dend <- as.dendrogram(hc)

Из дендрограммы делаю филодерево.

library(ggtree)

phylo <- as.phylo(dend)

Рисую дерево.

ggtree(phylo)

И получаю пустой каркас.

R: ggtree(∙)

Строю дендрограмму с текстовыми листьями

Добавлю к листьям каркаса текстовые подписи при помощи функции geom_tiplab(∙). Чтобы подписи поместились на канве, оставлю пустое место справа при помощи xlim(∙).

ggtree(phylo) + xlim(0, 0.7) + geom_tiplab(geom="label", size=2.2)
R: ggtree(∙) + xlim(∙) + geom_tiplab(label)

Получилось так себе: текст мелкий и бесит рамка вокруг него, но как от нее избавиться — не понял.

Метки мелкие и иногда перекрывают друг на друга. От перекрытия меток избавит пакет ggrepel. Но в результате получается каша.

Рисую картинки на дендрограмме

У функции geom_tiplab(∙) есть параметр geom, задающий тип метки:

one of ’text’, ’label’, ’shadowtext’, ’image’ and ’phylopic’.

При помощи опции ’image’, можно на месте листьев нарисовать картинки.

На нашей дендрограмме 38 листьев. Значит передадим ей массив из 38 тестовых изображений: imgs_indexed[1:38].

Параметр size управляет размером картинок. Пришлось с ним повозиться, пока не подобрал подходящее значение.

ggtree(phylo) + geom_tiplab(geom="image", aes(image=imgs_indexed[1:38]), size=.03)

В результате выполнения кода получил ошибку:

Error in `label_geom()`:
! Problem while computing aesthetics.
i Error occurred in the 3rd layer.
Caused by error in `check_aesthetics()`:
! Aesthetics must be either length 1 or the same as the data (75)
x Fix the following mappings: `image`

После длительного анализа определил, что массив изображений должен состоять из 75 элементов, что написано в сообщении об ошибке. (75 = 38 листьев * 2 − 1.) Но код все равно использует только 38 первых изображений. (Это хорошо.)

ggtree(phylo) + geom_tiplab(geom="image", aes(image=imgs_indexed[1:75]), size=.03)

Вуаля.

R: ggtree(∙) + xlim(∙) + geom_tiplab(image)

Подставлю сюда изображения объектов.

ggtree(phylo) + geom_tiplab(geom="image", aes(image=img_objects[1:75]), size=.03)

Цель достигнута.

Финальный код

library(ggplot2)
library(ggtree)

# Формируем массив с названиями файлов с рисунками объектов.
imgs_path = "img_objects/"
img_objects <- readLines("labels.txt")
img_objects <- paste0(imgs_path, img_objects, ".png")

# Выполняю иерархический кластерный анализ
dist <- dist(data)
hc   <- hclust(dist, method = "complete") 

# Преобразую результат в филодерево
phylo <- as.phylo(dend)

# Рисую дерево с картинками
ggtree(phylo) + geom_tiplab(geom="image", aes(image=img_objects[1:75]), size=.03)

Итог

Результат не нравится.

Дендрограмма вверху заметки — красивая, а эта — средненькая. Поэтому в следующий раз покажу, как сделать красивую дендрограмму с картинками при помощи пакета dendextend.



Если после прочтения этой прекрасной заметки вам вдруг непреодолимо захотелось меня поблагодарить, переведите мне 200 руб. на круасан с чаем. А я пока напишу что-то новенькое.

Переносим пакеты R из одного каталога в другой (под Виндоус)

Рассказываю, что делать, если ваш каталог с пакетами Эр закрыт для записи

Установка пакетов Эр в каталог по-умолчанию равносильно ношению корсета: внешне красиво, а внутри — тяжелые последствия. Источник.

Эр работает со множеством вспомогательных пакетов. Для этого Эр скачивает пакеты в специальный каталог на компьютере.

Пакеты Эр установленные на моей машине

По-умолчанию Эр помещает пакеты в системный каталог Виндоус. Обычно — это каталог текущего пользователя. Например, у меня на Виндоус 10 — это:

C:\User\Anton\AppData\Local\R\win-library\4.3\

По какой-то причине данный каталог иногда закрыт для записи, поэтому я не могу установить туда новые пакеты.

Чтобы исправить это досадное недоразумение, создадим новый каталог и укажем Эр, что теперь пакеты нужно устанавливать в него.

  1. Создадим новый каталог для пакетов Эр. Например:
    C:\User\R\packages
  1. Откроем переменные среды текущего пользователя.
  1. Найдем переменную R_LIB_PATH или создадим ее.
  1. Запишем в эту переменную название каталога с пакетами Эр.
  2. Перезапустите Эр. Теперь новые пакеты будут установлены в указанный каталог.




Первоисточник.
How do I change the default library path for R packages.

Доп. чтение:
Migrating R libraries

R Installation and Administration. 6 Add-on packages
Painless way to install a new version of R?




—-

Если вам вдруг непреодолимо захотелось меня поблагодарить, переведите мне 200 руб. на чашеку кофе.

Вырезаем из большой дендрограммы маленькую веточку с помощью R

Во время анализа больших дендрограмм у меня возникает необходимость выделить отдельную ветвь для подробного изучения. Например у нижеследующей дендрограммы намерен оставить ветку, отмеченную красным, а также по одному листу из соседних ветвей, отмеченных синим.

Нужно оставить только отмеченные ветви


Примечание. Размер шрифта на денрограмме уменьшил при помощи R-кода ↓.

# Размер подписей на оси
par(cex.axis=0.8)
# Размер подписей листьев
dend <- set(dend, "labels_cex", 0.9)
# Рисует дендрограмму
plot(dend)

В R (вроде бы пока еще) нет специальной процедуры для вырезания ветвей. Зато в пакете dendextend есть функция prune.

Prune обрезает дерево, то есть удаляет из него указанные листья. Так, если в качестве параметра передать названия листьев, отмеченных на рис. красным, prune именно их и вырежет.

dend_pruned <- prune(dend, c("L_grandis__da", "L_kedahensis__TG__da", "L_chabaudi__da", "L_fenestrum__KM221913__da"))
plot(dend_pruned)
Отмеченные ветви удалены

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

«Пусть потеет машина», гласит дизайнерская мудрость. Поручим компьютеру сделать необходимые перестроения.

Для этого предлагаю функцию invert_prune. Она получает на вход список листьев, которые нужно оставить в дендрограмме, и возвращает список листьев, которые должна обрезать функция prune.

invert_prune <- function(dend, remained_leaves) {
  setdiff( labels(dend), remained_leaves )
}

Пользуемся ею так:

dend_pruned <- prune(dend, 
invert_prune(dend, c("L_grandis__da", "L_kedahensis__TG__da", "L_chabaudi__da", "L_fenestrum__KM221913__da"))
)

plot(dend_pruned)

Вуаля, и все нужные ветки остались.


Учите R.


—-

Если вам вдруг непреодолимо захотелось меня поблагодарить, переведите мне 200 руб. на чашеку кофе.

Шпаргалки по пакетам R

R — это мощный язык программирования и среда анализа данных, широко используемая в области статистики и науки о данных. Благодаря своей гибкости и расширяемости, в R разработаны тысячи пакетов, предоставляющих разнообразные функции и инструменты для работы с данными, статистического анализа, графического представления и др.

Пакеты R позволяют пользователям расширять функциональность языка R, добавлять новые методы анализа данных, реализовывать свои алгоритмы и многое другое. Они часто распространяются через специальный репозиторий CRAN (Comprehensive R Archive Network), что делает установку и использование пакетов простым и удобным процессом.

Чат-джи-пи-ти.


Шпаргалки по пакетам R на гитхабе.


Пример шпаргалки для пакета stringr, который сильно упрощает работу со строками.

Оригинал stingr шпаргалки.

Хорошие книги для изучающих R

Обновлено 24 ноя 2023.


Собрал ссылки на хорошие книги по R. Все на английском языке. Все бесплатно доступны в онлайне, но также можно купить бумажные издания.

Для доступа к некоторым книгам понадобится Ви-Пи-Эн.

Использование R

Advanced R. Второе издание.
The book is designed primarily for R users who want to improve their programming skills and understanding of the language. It should also be useful for programmers coming to R from other languages, as help you to understand why R works the way it does.

R for Data Science. Второе издание.
This book will teach you how to do data science with R: You’ll learn how to get your data into R, get it into the most useful structure, transform it and visualize.

Дендрограммы

Data Integration, Manipulation and Visualization of Phylogenetic Trees.
Рассказывает как строить дендрограммы и филогенетические деревья с помощью пакета ggtree. Есть глава, где говорится как прикрутить картинки к дендрограмме.

Статистическое моделирование

Tidy Modeling with R.
This book is a guide to using a collection of software in the R programming language for model building called tidymodels, and it has two main goals:

  • First and foremost, this book provides a practical introduction to how to use these specific R packages to create models. We focus on a dialect of R called the tidyverse that is designed with a consistent, human-centered philosophy, and demonstrate how the tidyverse and the tidymodels packages can be used to produce high quality statistical and machine learning models.
  • Second, this book will show you how to develop good methodology and statistical practices. Whenever possible, our software, documentation, and other materials attempt to prevent common pitfalls.

Визуализация

R Graphics Cookbook. Второе издание.
A practical guide that provides more than 150 recipes to help you generate high-quality graphs quickly, without having to comb through all the details of R’s graphing systems. Each recipe tackles a specific problem with a solution you can apply to your own project, and includes a discussion of how and why the recipe works.

ggplot2: Elegant Graphics for Data Analysis. Третье издание.
While this book gives some details on the basics of ggplot2, its primary focus is explaining the Grammar of Graphics that ggplot2 uses, and describing the full details. It is not a cookbook, and won’t necessarily help you create any specific graphic that you need. But it will help you understand the details of the underlying theory, giving you the power to tailor any plot specifically to your needs.

Статьи

«Кто за всех решил, что Python удобен для „гражданской“ аналитики?», — объясняет, почему R лучше Питона.

Выполнение R скриптов на ПХП

Надо выполнить сложные статистические вычисления с помощью ПХП. Писать свои модули сложно, долго и бессмысленно. Придумал интегрироваться с Эр.

Библиотека php-r Александра Качкаева позволяет выполнять скрипты Эр на ПХП. Примеры убедительны, но сам еще не пробовал.

У кого есть опыт работы с php-r?

С какими другими модулями для выполнения многомерных статистических расчетов на ПХП вы знакомы (дискриминантный анализ, кластерный анализ, ординационный анализ)?

 65   2016   R   ПХП   статистика