Математик среди биологов

Я немного умею складывать, но от вычитания у меня всегда кружится голова

Семен Зверев, вылов лобстеров, финансовые махинации и закон Бенфорда

Рыбинспектор Семен контролирует вылов лобстеров в Юго-Западной части Тихого океана. Когда-то он закончил кафедру анализа данных МФТИ, но страсть к приключениям и тяга к южным морям привели Семена в эту романтичную область мира.

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

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

Как-то раз к нему обратился мэр Новой Зеландии: он попросил определить, правдивы ли финансовые отчеты его помощников. Семен взял отчеты, закрылся с ними на ночь («для колдовского ритуала», — потом сказали аборигены) и наутро вынес вердикт — финансовые отчеты пяти помощников недостоверны. В общем больше этих помощников никто не видел. Дикие люди, что с них взять.

Каким же образом Семен чувствует ложь в данных?

Продолжение о работе Семена читайте на канале «Математический рок-н-ролл».

Закон Брэдфорда, Леша и библиотечные фонды

Леша — библиотекарь. Точнее, совладелец крупной библиотечной сети, которая за небольшую плату сдает в непродолжительную аренду печатные версии журналов.

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

Как дальше поступил Леша и при чем тут закон Брэдфорда — читайте в телетайпе.

Наблюдение 19. Жизнь без лекарств

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

Симлер К. Хэнсон Р. «Слон в голове. Скрытые мотивы в повсевдневной жизни.»


Классификация разделов математики Американского математического общества

Американское математическое общество (AMS) выработало стандарт для классификации разделов математики. Он регулярно обновляется.

https://mathscinet.ams.org/mathscinet/msc

Текущая версия стандарта MSC 2020 включает 97 разделов, подразделы которых перечислены на более, чем 200 страницах.

Приятного изучения.


Если вам понравилась заметка, то вы можете купить мне пироженку, задонатив в телетайп-канале «Математический рок-н-ролл».

Виктория и нолики

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

«Три нуля — это тысяча, шесть — это миллион, девять — миллиард, а тридцать нолей — это сколько? А две тысячи двести одиннадцать нулей?», — как-то раз подумала Виктория, неожиданно проснувшись ночью.

Действительно, как называются числа с большим количеством нулей?

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

Заходите, будем вместе разбираться.



Математический рок-н-ролл — регулярные заметки о необычной математике доступным языком

Фотограф Лукас Холас. Серия «Портреты животных».

Математический рок-н-ролл

За последние несколько месяцев я опубликовал более 30 классных популярных математических заметок для ВК канала «Ежик в матане». Но ленточное устройство ВК оставляет их активным сутки, иногда чуть больше, после чего они канут в Лету, то есть становятся практически недоступными. Это неудобно.

Чтобы избежать потери заметок, начинаю переносить их в Телетайп, в блог «Матеатический рок-н-ролл».


  1. Теперь посты будут всегда доступными, пока существует Телетайп)
  2. Блог в Телетайпе содержит уникальные заметки, посвященные необычной математике, описанной доступным языком.
  3. За заметки вы можете меня поблагодарить донатом. Это поможет написать новые посты.


Первый пост называется «Оценка средних и карьера Вики». Он содержит краткий обзор различных средних значений.

Это была моя самая первая заметка для «Ежика», благодаря которой стал одни из его пишущих редакторов.


Заходите. Будет интересно.

Математический рок-н-ролл


Недостаток вычисления определителя целоисчисленных матриц на Питоне

Целоисчисленная матрица — это матрица, все элементы которой являются целыми числами.

Определитель целоисчисленной матрицы — тоже целое число. (Очевидно же.)

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

Очевидно, что если множество возможных элементов матриц конечно, то и число возможных богемных матриц заданного размера тоже конечно.

Пусть мы ищем среди всех богемных матриц только те, определитель которых равен нулю. Ищем при помощи кода на Питоне. Определитель матрицы вычисляем так:

dt = np.linalg.det( a )

И вот тут возможна ошибка.

Если мы будем выбирать матрицы по условию dt==0, то получим неверный результат.

Using that test (dt==0) Python got the right number of [...] matrices when mdim=2 or mdim=3, but the test dt==0 failed a few times when mdim=4, and (after a long time computing) reported 15,015,617 singular matrices; the true number is 15,099,201. This is because np.linalg.det is computing the determinant from a numerical factoring (which introduces rational numbers and rounding error) and the roundoff error means that sometimes a zero determinant was not being reported as precisely zero.

Правильный результат получится если мы используем условие dt<0.5.

https://computational-discovery-on-jupyter.github.io/Computational-Discovery-on-Jupyter/Contents/bohemian-matrices.html#table-of-results

Выбираем в R строки с одинаковыми индексами из data.table

Это техническая заметка-напоминалка о некоторых возможностях пакета data.table.

Задача

Есть несколько таблиц data.table с данными. Назовем их dt_meta, dt_x, dt_y, dt_area.

В каждой таблице есть колонка the_index.

Из таблицы dt_meta выбираю строки, удовлетворяющие критерию. Например, все строки, в которых значение the_length > 120:

dt_meta[the_length > 120]

Задача заключается в том, чтобы из остальных таблиц выбрать строки с теми же номерами.

Решение

Использую специальный символ .I

.I возвращает номера строк. Но у него есть особенности.


Код

dt_meta[the_length > 120, .I]

вернет последовательные номера строк в новой таблице: 1, 2, 3, ....


Код

dt_meta[, .I[the_length > 120]]

вернет номера строк в исходной таблице: 5, 9, 13, 63, ....


Для решения нужен второй вариант кода. Вот решение.

# Номера строк исходной таблицы, в которых the_length > 120
indexes <- dt_meta[, .I[the_length > 120]]
# Выбираю такие же строки из других таблиц
new_x <- dt_x[indexes]
new_y <- dt_y[indexes]
new_area <- dt_area[indexes]

Сцилла и Харибда в 1665 году

Из книги Афанасия Кирхера «Mundus Subterraneus».

Обратите внимание на прекрасный канал, вход в который перекрывает водоворот Харибда.

Вот эта же часть на спутниковой карте

Карта повернута вправо ~60°

Закорючка на месте, а вот суши у Сицилии прибавилось.

Эта часть Сицилии сейчас пронизана тоннелями. А может и на карте Кирхера показан тоннель, а не канал?

Карта Солнечной системы 1849 года

Между Солнцем и Венерой — планета Вулкан.

Между Марсом и Юпитером — четыре планеты: Веста, Юнона, Церера и Паллада.

Указана правильная длительность венерианский суток — 224 земных дня.
(Это в 1849 году, причем сейчас Венера покрыта плотной непроницаемой для оптики атмосферой!)


Подсказал тг «Эпоха недоверия».

Очень кратко о JSON Lines

jsonlines.org

Джисон-лайнс состоит из строк, разделенных символом новой строки \n.

Каждая строка является отдельным объектом джисон.

Джисон-лайнс можно обрабатывать построчно,
это основное достоинство формата.

jsonl — расширение файлов джисон-лайнс.


JSON

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

[
  {"id": 1, "position": [{"x": 17, "y": 256}], "status": "grow"},
  {"id": 2, "position": [{"x": 78, "y": 341}], "status": "sleep"},
  {"id": 3, "position": [{"x": 45, "y": 650}], "status": "moved"},
  ...
]

JSON Lines

Каждая строка — отдельный объект джисон; можем читать файл построчно.

{"id": 1, "position": [{"x": 17, "y": 256}], "status": "grow"},
{"id": 2, "position": [{"x": 78, "y": 341}], "status": "sleep"},
{"id": 3, "position": [{"x": 45, "y": 650}], "status": "moved"},
...

Карта названий Севастопольских бухт

Нашел у себя в запастниках карту с названиями Севастопольских бухт. Рисовал сам. К сожалению карта только в виде растра, вектор потерялся.

Если найду или сделаю вектор, поделюсь.

Справочник по УДК

Нашел неплохой справочник по УДК

https://perviy-vestnik.ru/udc/

Достоинство — динамический поиск: набрал текст — увидел результат.

Недостаток — УРЛ странички статичен, не меняется при переходе к разделу справочника, и не удобно скакать по разделам.



УРЛ все время такой:

  • /perviy-vestnik.ru/udc/

Хочется, чтобы было так:

  • /perviy-vestnik.ru/udc/004.6/ — и ты в разделе о «Данных».
  • /perviy-vestnik.ru/udc/004.94/ — и ты в разделе о «Компьютерном моделировании».
  • /perviy-vestnik.ru/udc/57.02/ — и ты в разделе «Биологические и этологические процессы: механизмы, взаимодействие с окружением».

Последовательность шагов для определения видов диатомовых микроводорослей по морфологическим признакам

Продолжаю рассуждать об алгоритме идентификации огромного числа видов диатомовых

Я медленно распаковываю присланный архив и передо мною открывается пятьсот фотографий диатомовых водорослей. Боже, они все такие разные, и я не знаю, какие виды на них изображены. А через два месяца мне нужно написать отчет и упомянуть большую часть из этих видов. Но как к ним подступиться, с чего начать? Ведь диатомовых очень много, а я знаю так мало. Караул!


В аннотации к статье Tyree et al. (2020) Reduction of taxonomic bias in diatom species data приведена следующая рекомендация:

«postcount identification and documentation of taxa (as opposed to an approach in which analysts assign names while they enumerate)».

Полностью она звучит так:
Precount voucher floras. [...] Each analyst was instructed to provide the project leader with a digital image of a representative specimen for all taxa that made up 5% or more of an individual count. [...] Multiple images were collected to document the size and morphological range of each taxon, which were then assigned aunique mOTU code. The images were assembled into image catalogs, or precount voucher floras, and made available to analysts. Analysts then had the opportunity to comment and reformulate mOTUs and their member images before the formal analysis began. Once analysis of microslides started, newly encountered taxa were photographed, assigned a code, added to the flora, and made available to project analysts for use throughout the analysis period.


Это натолкнуло меня на мысль о порядке определения видов диатомовых. Он подходит только для определения видов по фотографиям.

(1) Сначала объединяем фотографии особей в группы по схожести видимых признаков, невзирая на таксономическую принадленость изображенных организмов.

Фактически, на первом этапе мы выделяем морфотаксоны.

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

На втором шаге присваиваем имена морфотаксонам.

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


Такой же алгоритм упомянут на сайте diatoms.org:

Steps to Eliminate Taxonomic Bias

  1. A priori, images are collected and organized into morphological OTUs.
  2. Each OTU is assigned a provisional name (GOM01, GOM02, etc.)
  3. Taxonomists add images to the voucher flora, when new taxa are encountered during analysis.
  4. Identification of species is delayed, until the final step of analysis.
  5. The voucher publicly available and serves as a permanent record of the study.
  6. Permanent slides are deposited in a public herbarium to support the voucher.



Tyree et al. (2020) дает рекомендации по именованию морфотаксонов:

Formal scientific names. [...] analysts [...] enumerated taxa based on the mOTU codes from the shared voucher floras. When analyses were completed, mOTU codes were reconciled, and formal scientific names were assigned during collaborative workshops. During the workshops, project analysts [...] assigned scientific names to mOTUs. For each scientific name assigned, analysts recorded their initials and the taxonomic concept reference used when identifying the taxon. Any mOTU that did not correspond with a validly published species was referenced by its project-specific code (e. g. “Achnanthidium sp. 1 SESQA”). Such names were entered into [...] Taxonomic Database [...] as a bench name, with the voucher flora serving as the image representation of the name.

Изображения диатомовых сгруппированные по морфотаксонам. Bishop et al., 2017



Последовательность шагов для определения диатомовых выглядит так:

  • Делим изображения на морфотаксоны
  • Корректируем состав морфотаксонов
  • Идентифицируем виды, относящиеся к морфотаксонам
  • Соотносим с морфотаксоном валидное видовое название или оставляем рабочее название морфотаксона
  • Заносим результаты в таксономическую базу данных


Эта последовательность подходит для идентификации других групп организмов.



В предыдущих сериях:


Викиданные и Викибаза

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

Работает так: мы активно пишем статьи, семантически размечаем приведенные в тексте понятия, а викиботы их вытягивают и заносят в базу. Затем эти данные специальные алгоритмы используют для обучения нейросетей, с которыми мы потом и взаимодействуем.

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

Викибаза — это набор программ, позволяющие извлекать и работать с данными из Викиданных.


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

Символизм: пчела — лилия

Лилия — это замаскированная пчела.

Пчела — это символ одного из ответвлений суфизма, из которого вышли массоны — вольные каменщики.

* * *

Информация из интервью уважаемой АсСалам.

Добавляем рисунки к листьям дендрограммы. 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 руб. на чашеку кофе.

Ранее Ctrl + ↓