library(tidyverse)
library(ape)
library(viridis)# пригодится красоту наводить
Определение авторства романа Тихий Дон
Начнем
Мы рады вас приветствовать, Ольга Валерьевна и София, единственные наши читатели! Спасибо! Сегодня мы будем строить консенснусное дерево, ведь нам необходимо определить (еще разок, для уверенности), действительно ли перу М. Шолохова принадлежит роман “Тихий Дон”. (Великанова and Орехов 2019)
Как это будет выглядеть в коде…
Для начала подгружаем нужные библиотеки:
Прочитаем таблицу из файла:
<- read.delim("table_with_frequencies.txt", sep = "") data
Проведем некоторое преобразование, поменяем местами слова и авторов с текстами:
<- t(data) data
Считаем консенсус. Ищем устойчивые кластеры методом простого большинства:
<- function(df) {
get_tree <- df[ , sample(2500, replace = F, size = 100)]
X <- dist(scale(X))
distmx <- as.phylo(hclust(distmx))
tr
tr
}
<- map(1:10, ~get_tree(data))
trees_result
<- consensus(trees_result, p = 0.5, rooted = FALSE) cons
Выбираем палитру и назначаем авторам цвета:
<- viridis(n = 12)
pal <- tibble(author = str_remove(cons$tip.label, "_.+")) |>
cols mutate(color = case_when(author == "Островский" ~ pal[1],
== "Платонов" ~ 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]))
author 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 книги Тихого Дона действительно находятся очень близко к произведениям М. Шолохова, особенно к Донским рассказам. Это значит, что результат подтверждается с высокой долей вероятности. Автор Тихого Дона - М. Шолохов.