<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Математик среди биологов: заметки с тегом кластерный анализ</title>
<link>https://antonlyakh.ru/blog/tags/klasterny-analiz/</link>
<description>Я немного умею складывать, но от вычитания у меня всегда кружится голова</description>
<author>Антон Лях</author>
<language>ru</language>
<generator>E2 (v3559; Aegea)</generator>

<itunes:owner>
<itunes:name>Антон Лях</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Я немного умею складывать, но от вычитания у меня всегда кружится голова</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Добавляем рисунки к листьям дендрограммы в R: используем ggtree</title>
<guid isPermaLink="false">482</guid>
<link>https://antonlyakh.ru/blog/all/dobavlyaem-risunki-k-listyam-dendrogrammy-ggtree/</link>
<pubDate>Sun, 26 Nov 2023 11:31:42 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/dobavlyaem-risunki-k-listyam-dendrogrammy-ggtree/</comments>
<description>
&lt;p class="loud"&gt;Дендрограмма — это результат объединения данных при помощи иерархического кластерного анализа. Обычно на листьях дендрограммы написаны имена переменных — названия объектов. Рассказываю, как вместо названий показать изображения.&lt;/p&gt;
&lt;p class="foot"&gt;В конце заметки — &lt;a href="https://antonlyakh.ru/blog/all/dobavlyaem-risunki-k-listyam-dendrogrammy-ggtree/#dend-ggtree--final-code"&gt;финальный код на R&lt;/a&gt; &amp;darr;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/hc_compl__da_s0__x600.png" width="500" height="560" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Эта красочная дендрограмма содержит 38 листьев и разделена на 19 классов. На листьях дендрограммы написаны названия видов плоских паразитических червей из класса моногеней. Собираюсь показать вместо них изображения прикрепительных органов этих паразитов&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h4&gt;Для работы понадобятся&lt;/h4&gt;
&lt;p&gt;Знание языка Эр.&lt;/p&gt;
&lt;p&gt;Установленный &lt;a href="https://bioconductor.org/packages/release/bioc/html/ggtree.html"&gt;пакет &lt;kbd&gt;ggtree&lt;/kbd&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;!-- [[https://cran.r-project.org/web/packages/dendextend/vignettes/dendextend.html Пакет &lt;kbd&gt;dendextend&lt;/kbd&gt;]] для построения финальных дендрограмм. --&gt;&lt;h3&gt;Создаю изображения объектов&lt;/h3&gt;
&lt;p&gt;Каждому листу дендрограммы сопоставлю маленький рисунок объекта. Для этого буду использовать два набора изображений: один — для тестирования, другой — для финальной отрисовки.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Тестовые изображения&lt;/b&gt;&lt;br /&gt;
Тестовые изображения содержат номера, идущие по порядку. Они нужны для того, чтобы было понятно, куда именно разработанный код помещает картинки.&lt;/p&gt;
&lt;p&gt;Вот код для генерации 99-ти пнг-файлов размером 20×20 пикселей. Имя файла с изображением совпадает с нарисованым номером.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;imgs_path = &amp;quot;img_indexed/&amp;quot;

for (i in 1:99) {
  # Создаю новый пнг-файл img_{i}.png с нулевыми отступами
  png(file = paste0(imgs_path, &amp;quot;img_&amp;quot;, i, &amp;quot;.png&amp;quot;), width = 20, height = 20)
  par(mar = c(0, 0, 0, 0))
  
  # Созданию рисунок числа
  plot(0, 0, type = &amp;quot;n&amp;quot;, xlim = c(0, 1), ylim = c(0, 1), xlab = &amp;quot;&amp;quot;, ylab = &amp;quot;&amp;quot;, axes = FALSE)
  text(0.5, 0.5, i, cex = 1)
  
  # Сохраняю пнг-файл
  dev.off()
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вот сами изображения.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/numbered-images-1-99.png" width="520" height="130" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Вод код для их загрузки.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;imgs_indexed = c()
imgs_path = &amp;quot;imgs_indexed/&amp;quot;

for(i in 1:75) {
  imgs_indexed = c(imgs_indexed, paste0(imgs_path, &amp;quot;img_&amp;quot;, i, &amp;quot;.png&amp;quot;))
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Изображения объектов&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Изображение объекта — это уменьшенный рисунок прикрепительного крючка паразитического червя (моногенеи).  Вот они все:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/all-thumbs--ligophorus--da.png" width="480" height="48" alt="" /&gt;
&lt;/div&gt;
&lt;p class="foot"&gt;&lt;i&gt;Общая картинка создана с помощью Имедж-меджик:&lt;/i&gt; &lt;kbd&gt;montage -tile 20x2 -geometry +0+0 *.png all-anchors.png&lt;/kbd&gt;&lt;/p&gt;
&lt;p&gt;Название файла с крючком совпадает с наванием вида. Эти названия храню списком в текстовом файле &lt;kbd&gt;labels.txt&lt;/kbd&gt;. Для загрузки изображений объектов использую следующий код.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;imgs_path = &amp;quot;img_objects/&amp;quot;
# Загружаем имена меток
img_objects &amp;lt;- readLines(&amp;quot;labels.txt&amp;quot;)
# и добавляем расширение '.png'
img_objects &amp;lt;- paste0(imgs_path, img_objects, &amp;quot;.png&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Изображения готовы, перейдем к дереву.&lt;/p&gt;
&lt;h3&gt;Строю дерево с картинками, используя &lt;kbd&gt;ggtree&lt;/kbd&gt;&lt;/h3&gt;
&lt;p&gt;В книге «Data integration, manipulation and visualization of phylogenetic trees» описано, &lt;a href="https://yulab-smu.top/treedata-book/chapter8.html"&gt;как прикрутить картинки к дендрограмме с помощью &lt;kbd&gt;ggtree&lt;/kbd&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://yulab-smu.top/treedata-book/9781032233574_cover_review.png" style="width: 200px" /&gt;&lt;/p&gt;
&lt;p&gt;К сожалению, приведнный в книге код у меня не заработал. Он подразумевает, что мы загружаем филодерево из файла. А я строю дерево при помощи иерархической кластеризации и преобразую ее в объект дендрограммы.&lt;/p&gt;
&lt;p&gt;&lt;kbd&gt;data&lt;/kbd&gt; — это матрица данных: &lt;a href="https://antonlyakh.ru/blog/all/obekt-i-priznaki-obekta-v-biologicheskoy-statistike/#data-matrix"&gt;в ее строках — объекты, в столбцах — признаки&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Выполняю иерархический кластерный анализ
dist &amp;lt;- dist(data)
hc   &amp;lt;- hclust(dist, method = &amp;quot;complete&amp;quot;) 

library(dendextend)

# Преобразую результат в дендрограмму
dend &amp;lt;- as.dendrogram(hc)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Из дендрограммы делаю филодерево.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;library(ggtree)

phylo &amp;lt;- as.phylo(dend)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Рисую дерево.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ggtree(phylo)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;И получаю пустой каркас.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/ggtree.png" width="500" height="560" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;R: ggtree(∙)&lt;/div&gt;
&lt;/div&gt;
&lt;h4&gt;Строю дендрограмму с текстовыми листьями&lt;/h4&gt;
&lt;p&gt;Добавлю к листьям каркаса текстовые подписи при помощи функции &lt;kbd&gt;&lt;a href="https://rdrr.io/github/GuangchuangYu/ggtree/man/geom_tiplab.html"&gt;geom_tiplab(∙)&lt;/a&gt;&lt;/kbd&gt;. Чтобы подписи поместились на канве, оставлю пустое место справа при помощи &lt;kbd&gt;xlim(∙)&lt;/kbd&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ggtree(phylo) + xlim(0, 0.7) + geom_tiplab(geom=&amp;quot;label&amp;quot;, size=2.2)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/ggtree-+-tiplabels.png" width="500" height="800" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;R: ggtree(∙) + xlim(∙) + geom_tiplab(label)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Получилось так себе: текст мелкий и бесит рамка вокруг него, но как от нее избавиться — не понял.&lt;/p&gt;
&lt;p style="text-decoration: line-through"&gt;Метки мелкие и иногда перекрывают друг на друга. &lt;a href="https://ggrepel.slowkow.com/articles/examples.html"&gt;От перекрытия меток избавит пакет &lt;kbd&gt;ggrepel&lt;/kbd&gt;&lt;/a&gt;. Но в результате получается каша.&lt;/p&gt;
&lt;h4&gt;Рисую картинки на дендрограмме&lt;/h4&gt;
&lt;p&gt;У функции &lt;kbd&gt;geom_tiplab(∙)&lt;/kbd&gt; есть параметр &lt;kbd&gt;geom&lt;/kbd&gt;, задающий тип метки:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;one of ’text’, ’label’, ’shadowtext’, ’image’ and ’phylopic’.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;При помощи опции ’image’, можно на месте листьев нарисовать картинки.&lt;/p&gt;
&lt;p&gt;На нашей дендрограмме 38 листьев. Значит передадим ей массив из 38 тестовых изображений: &lt;kbd&gt;imgs_indexed[1:38]&lt;/kbd&gt;.&lt;/p&gt;
&lt;p class="foot"&gt;Параметр &lt;kbd&gt;size&lt;/kbd&gt; управляет размером картинок. Пришлось с ним повозиться, пока не подобрал подходящее значение.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ggtree(phylo) + geom_tiplab(geom=&amp;quot;image&amp;quot;, aes(image=imgs_indexed[1:38]), size=.03)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В результате выполнения кода получил ошибку:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Error in `label_geom()`:&lt;br /&gt;
! Problem while computing aesthetics.&lt;br /&gt;
i Error occurred in the 3rd layer.&lt;br /&gt;
Caused by error in `check_aesthetics()`:&lt;br /&gt;
! Aesthetics must be either length 1 or the same as the data (75)&lt;br /&gt;
x Fix the following mappings: `image`&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;После длительного анализа определил, что массив изображений должен состоять из 75 элементов, что написано в сообщении об ошибке. (&lt;nobr&gt;75 = 38 листьев * 2 &amp;minus; 1&lt;/nobr&gt;.) Но код все равно использует только 38 первых изображений. (Это хорошо.)&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ggtree(phylo) + geom_tiplab(geom=&amp;quot;image&amp;quot;, aes(image=imgs_indexed[1:75]), size=.03)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вуаля.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/ggtree-+-tip-test-images.png" width="500" height="560" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;R: ggtree(∙) + xlim(∙) + geom_tiplab(image)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Подставлю сюда изображения объектов.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ggtree(phylo) + geom_tiplab(geom=&amp;quot;image&amp;quot;, aes(image=img_objects[1:75]), size=.03)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Цель достигнута.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/ggtree-+-tip-ligo-images-da-24x24.png" width="400" height="560" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a id="dend-ggtree--final-code"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Финальный код&lt;/h4&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;library(ggplot2)
library(ggtree)

# Формируем массив с названиями файлов с рисунками объектов.
imgs_path = &amp;quot;img_objects/&amp;quot;
img_objects &amp;lt;- readLines(&amp;quot;labels.txt&amp;quot;)
img_objects &amp;lt;- paste0(imgs_path, img_objects, &amp;quot;.png&amp;quot;)

# Выполняю иерархический кластерный анализ
dist &amp;lt;- dist(data)
hc   &amp;lt;- hclust(dist, method = &amp;quot;complete&amp;quot;) 

# Преобразую результат в филодерево
phylo &amp;lt;- as.phylo(dend)

# Рисую дерево с картинками
ggtree(phylo) + geom_tiplab(geom=&amp;quot;image&amp;quot;, aes(image=img_objects[1:75]), size=.03)&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Итог&lt;/h3&gt;
&lt;p&gt;Результат не нравится.&lt;/p&gt;
&lt;p&gt;Дендрограмма вверху заметки — красивая, а эта — средненькая. Поэтому в следующий раз покажу, как сделать красивую дендрограмму с картинками при помощи пакета &lt;kbd&gt;dendextend&lt;/kbd&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Если после прочтения этой прекрасной заметки вам вдруг непреодолимо захотелось меня поблагодарить, переведите мне 200 руб. на круасан с чаем. А я пока напишу что-то новенькое.&lt;/p&gt;
&lt;iframe src="https://yoomoney.ru/quickpay/fundraise/button?billNumber=wfB4EAHx4LE.231103&amp;" width="330" height="50" frameborder="0" allowtransparency="true" scrolling="no"&gt;&lt;/iframe&gt;
&lt;p&gt;​&lt;/p&gt;
</description>
</item>

<item>
<title>Вырезаем из большой дендрограммы маленькую веточку с помощью R</title>
<guid isPermaLink="false">479</guid>
<link>https://antonlyakh.ru/blog/all/vyrezaem-iz-bolshoy-dendrogrammy-malenku-vetochku-s-pomoschyu-r/</link>
<pubDate>Fri, 03 Nov 2023 12:05:56 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/vyrezaem-iz-bolshoy-dendrogrammy-malenku-vetochku-s-pomoschyu-r/</comments>
<description>
&lt;p&gt;Во время анализа больших дендрограмм у меня возникает необходимость выделить отдельную ветвь для подробного изучения. Например у нижеследующей дендрограммы намерен оставить ветку, отмеченную красным, а также по одному листу из соседних ветвей, отмеченных синим.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/dend_s0__vert_colored.png" width="800" height="555" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Нужно оставить только отмеченные ветви&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="width: 100%; border-bottom: 1px solid gray; display: inline-block;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;i&gt;Примечание&lt;/i&gt;. Размер шрифта на денрограмме уменьшил &lt;a href="https://stackoverflow.com/a/28250129/1615266"&gt;при помощи R-кода&lt;/a&gt; &amp;darr;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Размер подписей на оси
par(cex.axis=0.8)
# Размер подписей листьев
dend &amp;lt;- set(dend, &amp;quot;labels_cex&amp;quot;, 0.9)
# Рисует дендрограмму
plot(dend)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style="width: 100%; border-top: 1px solid gray; display: inline-block; margin-bottom:2em"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;В &lt;abbr&gt;R&lt;/abbr&gt; (вроде бы пока еще) нет специальной процедуры для вырезания ветвей. Зато в пакете &lt;kbd&gt;dendextend&lt;/kbd&gt; есть функция &lt;a href="https://search.r-project.org/CRAN/refmans/dendextend/html/prune.html"&gt; &lt;kbd&gt;prune&lt;/kbd&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;kbd&gt;Prune&lt;/kbd&gt; обрезает дерево, то есть удаляет из него указанные листья. Так, если в качестве параметра передать названия листьев, отмеченных на рис. красным, &lt;kbd&gt;prune&lt;/kbd&gt; именно их и вырежет.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;dend_pruned &amp;lt;- prune(dend, c(&amp;quot;L_grandis__da&amp;quot;, &amp;quot;L_kedahensis__TG__da&amp;quot;, &amp;quot;L_chabaudi__da&amp;quot;, &amp;quot;L_fenestrum__KM221913__da&amp;quot;))
plot(dend_pruned)&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/dend_s0__vert_incorrectly_pruned.png" width="728" height="555" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Отмеченные ветви удалены&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Получается, чтобы оставить только отмеченные листья, мне нужно перечислить все остальные. Когда дендрограмма большая, перечислять листья вручную я буду довольно долго.&lt;/p&gt;
&lt;p&gt;«&lt;a href="https://www.artlebedev.ru/best/ui/humaneness/"&gt;Пусть потеет машина&lt;/a&gt;», гласит дизайнерская мудрость. Поручим компьютеру сделать необходимые перестроения.&lt;/p&gt;
&lt;p&gt;Для этого предлагаю функцию &lt;kbd&gt;invert_prune&lt;/kbd&gt;. Она получает на вход список листьев, которые нужно оставить в дендрограмме, и возвращает список листьев, которые должна обрезать функция &lt;kbd&gt;prune&lt;/kbd&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;invert_prune &amp;lt;- function(dend, remained_leaves) {
  setdiff( labels(dend), remained_leaves )
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Пользуемся ею так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;dend_pruned &amp;lt;- prune(dend, 
invert_prune(dend, c(&amp;quot;L_grandis__da&amp;quot;, &amp;quot;L_kedahensis__TG__da&amp;quot;, &amp;quot;L_chabaudi__da&amp;quot;, &amp;quot;L_fenestrum__KM221913__da&amp;quot;))
)

plot(dend_pruned)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вуаля, и все нужные ветки остались.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/dend_s0__vert_correctly_pruned2.png" width="515" height="555" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://antonlyakh.ru/blog/all/horoshie-knigi-dlya-izuchayuschih-r/"&gt;&lt;b&gt;Учите R&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;—-&lt;/p&gt;
&lt;p&gt;Если вам вдруг непреодолимо захотелось меня поблагодарить, переведите мне 200 руб. на чашеку кофе.&lt;/p&gt;
&lt;iframe src="https://yoomoney.ru/quickpay/fundraise/button?billNumber=wfB4EAHx4LE.231103&amp;" width="330" height="50" frameborder="0" allowtransparency="true" scrolling="no"&gt;&lt;/iframe&gt;
&lt;p&gt;​&lt;/p&gt;
</description>
</item>

<item>
<title>Стандартизация числовых данных</title>
<guid isPermaLink="false">470</guid>
<link>https://antonlyakh.ru/blog/all/standartizaciya-chislovyh-dannyh/</link>
<pubDate>Thu, 01 Jun 2023 11:27:27 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/standartizaciya-chislovyh-dannyh/</comments>
<description>
&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"&gt;&lt;/script&gt;
&lt;script id="MathJax-script" async src="http://antonlyakh.ru/mathjax/es5/tex-mml-chtml.js"&gt;&lt;/script&gt;
&lt;p&gt;Это продолжение серии заметок об &lt;a href="https://antonlyakh.ru/blog/tags/analiz-dannyh/"&gt;анализе биологических данных&lt;/a&gt;. В прошлый раз мы разобрали &lt;a href="https://antonlyakh.ru/blog/all/obekt-i-priznaki-obekta-v-biologicheskoy-statistike/"&gt;понятие объекта и его признаков&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Сегодня рассмотрим процедуру предварительной обработки первичных данных — &lt;i&gt;стандартизацию.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Допустим нам нужно статистически сравнить или сгруппировать несколько наблюдений по схожести признаков (например, выполнив кластерный анализ). Каждое наблюдение — это ряд числовых значений, к примеру, биомасс разных видов организмов. Ряды наблюдений упорядочены: первой всегда идет биомасса вида А, затем вида Б и так далее.&lt;/p&gt;
&lt;p&gt;У значений есть особенность: в пределах ряда они могут отличаются в несколько раз, потому что мы изучаем как крупные, так и мелкие организмы. В результате биомасса одного или нескольких видов часто в несколько раз превышает остальные. Как на графике.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/sample_000.abs__vals.png" width="800" height="420" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Первичные нестандартизованные данные, строки соответствуют наблюдениям, столбцы — видам. Биомассса первого вида практически во всех случаях подавляет биомассу остальных, поэтому кластерный анализ таких данных приведет к неверным выводам&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Такие наблюдения сравнивать некорректно. Виды, доминирующие по биомассе, будут сильнее всего влиять на результаты сравнения. Поэтому получится, что мы будем сравнивать не биомассы всех видов, а только нескольких доминирующих (в частном случае — одного).&lt;/p&gt;
&lt;p&gt;Теперь выполним стандартизацию по видам (по столбцам).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/sample_000.abs__vals_scaled_rows.png" width="800" height="420" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Данные стандартизованные по признакам (столбцам)&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;После стандартизации значения выровнялись и исчезло резкое доминирование отдельных видов. Теперь на результаты кластерного анализа будут влиять все значения. А его результаты будут более корректными.&lt;/p&gt;
&lt;h3&gt;Формула стандартизации&lt;/h3&gt;
&lt;p&gt;Для стандартизации ряда значений (строки или столбца) необходимо вычислить среднее \( \mu \) и стандартное отклонение \( \sigma \) значений ряда, затем отнять среднее от каждого элемента ряда и поделить разницу на стандартное отклонение:&lt;/p&gt;
&lt;p&gt;\( y_i = (x_i — \mu) / \sigma \).&lt;/p&gt;
&lt;p&gt;После таких манипуляций среднее ряда станет равным нулю, а стандартное отклонение — единице.&lt;/p&gt;
&lt;p&gt;Полученные величины \( y_i \) будут &lt;a href="https://stats.stackexchange.com/a/398190/37265"&gt;выражать значения в пропорции к стандартному отклонению&lt;/a&gt;: то есть 1 будет означать одно стандартное отклонение, 2 — два и т. д.&lt;/p&gt;
&lt;h3&gt;Код на R&lt;/h3&gt;
&lt;p&gt;Если вы работаете в R, для стандартизации используйте функцию &lt;var&gt;scale()&lt;/var&gt;. Она стандартизирует столбцы переданной матрицы.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;standardized_columns &amp;lt;- scale(matrix)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если необходимо стандартизировать строки, транспонируйте &lt;var&gt;t&lt;/var&gt; матрицу, а затем транспонируйте результат.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;standardized_rows &amp;lt;- t( scale( t(matrix) ) )&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Когда применять стандартизацию&lt;/h3&gt;
&lt;p&gt;Обычно стандартизацию применяют, когда диапазоны изменения значения признаков существенно отличаются, как в примере выше. Вот еще несколько рекомендация на английском &lt;a href="https://stats.stackexchange.com/questions/19216/variables-are-often-adjusted-e-g-standardised-before-making-a-model-when-is"&gt;о применимости стандартизации&lt;/a&gt;.&lt;/p&gt;
</description>
</item>


</channel>
</rss>