library(tidyverse)
library(ape)
library(viridis)# пригодится красоту наводитьОпределение авторства романа Тихий Дон
Начнем
Мы рады вас приветствовать, Ольга Валерьевна и София, единственные наши читатели! Спасибо! Сегодня мы будем строить консенснусное дерево, ведь нам необходимо определить (еще разок, для уверенности), действительно ли перу М. Шолохова принадлежит роман “Тихий Дон”. (Великанова and Орехов 2019)
Как это будет выглядеть в коде…
Для начала подгружаем нужные библиотеки:
Прочитаем таблицу из файла:
data <- read.delim("table_with_frequencies.txt", sep = "")Проведем некоторое преобразование, поменяем местами слова и авторов с текстами:
data <- t(data)Считаем консенсус. Ищем устойчивые кластеры методом простого большинства:
get_tree <- function(df) {
X <- df[ , sample(2500, replace = F, size = 100)]
distmx <- dist(scale(X))
tr <- as.phylo(hclust(distmx))
tr
}
trees_result <- map(1:10, ~get_tree(data))
cons <- consensus(trees_result, p = 0.5, rooted = FALSE)Выбираем палитру и назначаем авторам цвета:
pal <- viridis(n = 12)
cols <- tibble(author = str_remove(cons$tip.label, "_.+")) |>
mutate(color = case_when(author == "Островский" ~ pal[1],
author == "Платонов" ~ pal[2],
author == "Севский" ~ pal[3],
author == "Серафимович" ~ pal[4],
author == "Фадеев" ~ pal[5],
author == "Фурманов" ~ pal[6],
author == "Шолохов" ~ pal[7],
author == "Dubia" ~ pal[8],
author == "Булгаков" ~ pal[9],
author == "Леонов" ~ pal[10],
author == "Крюков" ~ pal[11],
author == "Иванов" ~ pal[12]))
cols# A tibble: 30 × 2
author color
<chr> <chr>
1 Булгаков #51C56AFF
2 Булгаков #51C56AFF
3 Иванов #FDE725FF
4 Иванов #FDE725FF
5 Крюков #C2DF23FF
6 Крюков #C2DF23FF
7 Крюков #C2DF23FF
8 Крюков #C2DF23FF
9 Крюков #C2DF23FF
10 Леонов #85D54AFF
# ℹ 20 more rows
Визуализируем наше, как кажется, красивое консенснусное дерево:
par(mar = c(0,0,0,0))
plot.phylo(cons,
type = "unrooted",
use.edge.length = FALSE,
edge.width = 1.5,
node.color = "grey",
font = 3,
no.margin = TRUE,
direction = "rightwards",
plot = TRUE,
lab4ut = "a",
node.depth = 1,
tip.color = cols$color)
nodelabels(text=sprintf("%.2f", cons$node.label),
node=1:cons$Nnode+Ntip(cons),
frame="circle",
bg = "skyblue",
cex = 0.5,
)Небольшой вывод
4 книги Тихого Дона действительно находятся очень близко к произведениям М. Шолохова, особенно к Донским рассказам. Это значит, что результат подтверждается с высокой долей вероятности. Автор Тихого Дона - М. Шолохов.