StatOracle–02 «Заповіді» організації даних, «жаб'ячий» файл-приклад, мова R тощо






       

Д. Шабанов, М. Кравченко. «Статистичний оракул»: аналіз даних в зоології та екології

Основні поняття біостатистики

«Заповіді» організації даних, «жаб'ячий» файл-приклад, мова R тощо

Використання мови R

«Статистичний оракул»-01

«Статистичний оракул»-02

«Статистичний оракул»-03

 

«Заповіді» організації даних, «жаб'ячий» файл-приклад, мова R тощо

 

2.1. Як має бути організована таблиця з первинними даними дослідження?

Природничі науки базуються на емпіричному (від грецьк. ἐμπειρία — досвід) дослідженні природи, тобто такому дослідженні, що базується на спостереженні та експерименті. Є в природничих науках і чисто теоретичні (від грецьк. θεωρία — розгляд, дослідження) роботи, пов'язані з внутрішнім розвитком певної моделі, але такі роботи є вторинними, вони — наслідки аналізу емпіричних, первинних даних. Відкіля беруться ці дані? Їх збирають у ході досліджень. Таким чином, збір емпіричних даних є основою усіх природничих наук, у тому числі — біології. Дуже важливо навчитися збирати ці дані таким чином, щоб не обмежити можливості роботи з ними надалі. 

Найчастіше за все емпіричні дані збираються або у числовій формі, або у формі, що з часом може бути переведена у числову. Існує точка зору, що там, де нема математики, нема й природничої науки. Скоріше за все, можна уявити собі роботу, в основі якої нема математики, але це, звісно, має бути рідкісний випадок. Головна проблема полягає в тому, що дослідник має впевнитися, що його досвід відбиває загальні закономірності. Ви перегорнули листок і побачили на його нижньому боці гусеницю. Це універсальний досвід чи ні? Перегорнули наступний листок, а під ним — жаба. Скоріше за все, щоб встановити, що ховається під такими листками, слід перегорнути певну їх кількість та зареєструвати, чи було під ними щось, а якщо було — що саме.

Важливіша проблема емпіричного дослідження — наскільки отриманий у ньому досвід є універсальним, наскільки на нього можна спиратися в інших випадках. Інакше кажучи — наскільки достовірним (таким, що заслуговує на довіру, є достойним віри) є отриманий в цьому досвіді результат.

Ви отримали певні емпіричні дані. Що з ними робити? Запам'ятати? Це рішення не є надійним. Наша пам'ять є вибірковою, на наші спогади впливає наше ставлення до того, що ми намагалися запам'ятати. Пам'ять втрачає одне та підмінює інше... Записати на папері? Це вже непогане рішення. Але воно має відповідати певним вимогам. Записувати кожен наступний результат слід відразу, як тільки він отриманий. Записи мають робитися однаково, незалежно від того, якими вони є (наприклад, подобається результат досліднику або ні). Папір (чи інший носій), на якому збережено результати емпіричного дослідження, перетворюється на важливий документ. Він має бути збереженим, і він не має редагуватися з часом! Тому зазвичай первинні записи роблять у лабораторному журналі, де побудована певна таблиця для збереження даних.

Дуже корисно зберігати первинні дані й в інших формах. Це можуть бути фотографії, аудіозаписи, роздруки показників приладів тощо. Це має стати не заміною записів у лабораторному журналі, а їх доповненням! До речі, дуже корисним буває після заповнення сторінки лабораторного журналу сфотографувати її та розмістити таку цифрову фотографію, припустимо, десь у хмарному середовищі...

У сучасному світі досить часто первинні записи роблять не у паперовому журналі, а відразу у цифровому вигляді — у файлі (найчастіше — електронних таблиць, таких як Excel, Calc, Google Sheets). У такому разі з таким файлом слід поводитися як з паперовим лабораторним журналом  — зберігати необмежений час, не редагувати наявні записи. Це — носій первинних даних, що зберігає слід важливішого етапу дослідження: дослідник поставив певне питання природі, отримав відповідь та зберіг її! Цей файл і є таблицею для збору емпіричних даних, базою даних, що створюється під час дослідження.

Інший варіант організації роботи — коли первинні дані збираються в лабораторний журнал (або ж на паперові бланки, з якими дослідник працює у польових умовах), а далі переносяться до файлу-таблиці. У такому разі слід зберігати і паперові первинні документи, і первинний файл. Вони мають бути організовані однаково, щоб зменшити ймовірність помилок під час перенесення (і зберігати їх треба для того, щоб такі помилки можна було знайти). 

Досвід роботи зі студентами та дослідниками свідчить, що дуже часто великі проблеми у роботі пов'язані з тим, що таблиця для збору первинних даних емпіричного дослідження побудована неправильно. На те, як правильно організовувати збір та збереження первинних даних, вплинуло багато резонів. Деякі з них мають історічні пояснення, деякі — пов'язані з особливостями самого статистичного аналізу. На початку курсу нема сенсу детально аналізувати усі ці резони; набагато краще повідомити їх у формі певного канону, у вигляді набору «заповідей». Коли це потрібно внаслідок вагомих причин, від канону можна відступати; у більшості випадків слід просто слідувати канону.

Наведемо один приклад. Канон вимагає, щоб у таблиці з первинними даними рядки відповідали окремим об'єктам, спостереженням, вимірам тощо, а стовпці — ознакам. Можна було зробити навпаки? Можна! У деяких видах аналізу навіть доводиться транспонувати (обмінювати місцями рядки та стовпці) таку таблицю. Але збирають дані саме так. Крім іншого — тому, що усі (хто розуміє) роблять саме так. А роблять вони так тому, що це відповідає логіці роботи з лабораторним журналом. У європейській культурі записи роблять по рядках, а не по стовпцях. Окреме спостереження — окремий рядок, а стовпці задають те, що слід занотувати, щоб далі працювати з цим спостереженням. Файл даних має бути організованим так само, як сторінка лабораторного журналу, щоб зменшити ймовірність помилок під час перенесення даних.

Будь ласка, зробіть так, щоб ваші уявлення про організацію первинних даних (і файлів для аналізу) відповідали цим «заповідям» по замовченню, by default!

    «Заповіді» організації таблиці для збору та збереження первинних даних   
1. Первинні, емпіричні дані («відповіді природи» досліднику) — база роботи, вони потребують особливої поваги! 
2. В емпіричних даних є відповіді на ще не поставлені питання, їх слід зберігати без терміну давності!
3. Структура таблиці для первинних даних має відповідати меті дослідження, організовувати дані для аналізу
4. Первинні дані слід дублювати у різних формах (паперовий лабораторний журнал, бланки, файли, фото записів...)!
5. Типово: на папері та в електронних таблицях — збір даних, створення таблиці; аналіз — у спеціальних програмах!
6. Перенесення, перекодування, реорганізація даних — нові помилки; слід зберігати початковий та кінцевий варіанти!
7. Описуються не усі можливі об'єкти? Продумати, обрати, описати та здійснити рандомізацію (випадковий вибір)!
8. Типово: рядки таблиці — окремі об'єкти чи незалежні спостереження, стовпці — ознаки; у комірці — стан ознаки в об'єкта!
9. Весь масив даних дослідження — в одній таблиці! Не використовувані в аналізі рядки можна позначити в певному стовпці!
10. У кожному стовпці — однотипні дані, в однакових одиницях, одного формату, однаково виміряні!
11. Усі однотипні дані, в однакових одиницях, одного формату, однаково виміряні — в одному стовпці!
12. Група, до якої належить об'єкт чи спостереження, задається як окрема ознака (не положенням запису на листі чи в таблиці)!
13. У кожному рядку — усі ознаки (у певних стовпцях), що задають унікальність спостереження (щоб можна було сортувати)!

14. Для кожної ознаки обрати її тип, спосіб визначення або вимірювання, кодування, формат, точність запису тощо!
15. Кількісні ознаки: або мірні (=безперервні, метричні), або рахункові (=дискретні), або порядкові (=ранги)!
16. Якісні ознаки: або альтернативні («є — нема»), або множинні («так, або сяк, або едак»)!
17. Якщо первинні дані не символьні (фотографії тощо), окремий стовпчик — посилання на них у "хмарному" сховищі!
18. У кожній комірці — одна певна ознака (а не, припустимо, дві різні, як-от місяць та рік для природних спостережень)!
19. «0» — це певне число; відсутність даних — пуста комірка (у програмах може позначатися як NA, «not applicable»)!
20. Порядок стовпців має відбивати порядок їх визначення; після емпіричних даних можна розмістити розрахункові!
21. В електронних таблицях і статистичних програмах розрахунки — формулами (можна повторити або виправити)!
22. Назви ознак та їхні стани — бажано латиницею (менше проблем) + якнайдетальніші пояснення для себе та інших!
23. Назви файлів з первинними даними — наочні, відразу зрозумілі; місця їх збереження — передбачувані, зрозуміло підписані!
24. Життя дослідника спростить журнал або файл, де буде розписана методика, усі етапи роботи та усе незвичне у її ході!
25. Перевірка якості даних — візуалізація їх розподілу; діаграма розсіювання покаже викиди та помилки при наборі!
26. Після отримання першого фрагменту бази даних — провести пробний аналіз і виправити недоліки організації роботи!

 

Після первинного формулювання цих "заповідей" їх автор запросив допомоги від колективного розуму. Завдяки порадам від кваліфікованих Facebook-друзів ці тези вдалося покращити. Особливу вдячність автори висловлюють професору Олександру Жукову.  

Таблиця, що відповідає переліченим вимогам, може виглядати, наприклад, так, як показано нижче. Рядки — окремі спостереження, стовпці — ознаки. У кожній комірці — стан ознаки, що відповідає стовпцю, для певного спостереження.

Рис. 2.1.1. Фрагмент умовної таблиці з первинними даними

 

Одна зі складнощей — що є об'єктом, окремим спостереженням ("заповідь" № 8). Припустимо, ми порівнюємо довжину певної кількості листків з одного дерева... Що є спостереженням: окреме дерево чи довжина окремого листка? Звісно, довжина листка ("заповідь" № 16). А те, з якого дерева цей листок — це вже групова ознака ("заповідь" № 11). А вид дерева, його висота чи його розташування — ще ознаки. Для усіх лістків з одного дерева стан цих ознак буде однаковим (в електронних таблицях такі комірки заповнити неважко, хоча слід уважно спостерігати за тим, щоб не помилитися під час їх заповнення). А, припустимо, висота, на якій був розташований листок — ознака, стан якої може відрізнятися для різних листків з одного дерева. А якщо ми для аналізу використаємо не усі дерева, а лише деякі, ми створимо ще один стопбчик, де укажемо, використовується це дерево у даному аналізі, або ж ні ("заповідь" № 10).

 

2.2. Файл-приклад PelophylaxExamples

У подальшому викладі особливості роботи програм будуть пояснюватися переважно з використанням файлів, що відбивають результати справжніх досліджень. Одним з таких файлів є таблиця даних PelophylaxExamples (табл. 2.4.1). Багато матеріалів у даному підручнику стосуються роботи саме з цим файлом. Його можна отримати одним із трьох способів. По-перше, його можна завантажити (PelophylaxExamples.csv) або отримати у автора даного тексту. Доступний для завантаження файл має формат .csv (Comma-Separated Values); це один з поширених форматів для переносу даних між різними програмами. Фактично це текстовий формат, де наведено табличні дані. Кожне наступне значення відділяється від попереднього розділювачем (у типовому випадку — комами, у пропонованому файлі — крапками з комами). Якщо поля таблиці розділені комами, їх неможливо використовувати у якості десяткових розділювачів (нагадуємо, що у більшості розвинених країн у якості десяткового розділювача використовують коми). При використанні електронної версії конспекту наведені нижче дані можна перенести з вікна браузера, файлу Word чи .pdf в необхідну програму. Нарешті, при використанні друкованого конспекту наведену далі таблицю можна розпізнати, ввести в необхідні програми і потім використовувати її в подальшій роботі.

У файлі використаний фрагмент даних, отриманих О. В. Коршуновим при підготовці дисертації на здобуття наукового ступеня кандидата біологічних наук (автори щиро вдячні О. В. Коршунову за дозвіл використовувати результати його роботи). В оригінальному файлі містився опис кількохсот жаб за 16 морфометричними ознаками; в обраному фрагменті залишено 57 жаб і наведені дані про мінливість у них 7 морфометричних ознак. 

Ознаки перелічених особин, використані у файлі, є такими:

Place — Місце походження
East — Східна довгота
North — Північна широта
Basin — Водозбірний басейн (Dnipro, Don)
Sex — Стать (female, male)
DNA — Маса геному (пг)
Genotyp — Генотип (LL, LLR, LR, LRR, RR)
Lс — (L.) — Longitudo corporis — Довжина тіла
Ltc — (Lt.c.) — Latitudo capitis — Ширина голови
Fm — (F.) — Longitudo femoris — Довжина стегна
Tі — (T.) — Longitudo tibiae — Довжина гомілки
Dp — (D.p.) — Digitus primus — Довжина 1-го (внутрішнього) пальця задньої кінцівки
Ci — (C.i.) — Callus internus — Довжина внутрішнього п'яткового горбку
Cs — (C.s.) — Longitudo crus secondarius — Довжина додаткової гомілки 

Всі описані у файлі-прикладі особини належать до гібридогенного комплексу зелених жаб, Pelophylax esculentus complex. Це два батьківських види, ставкова жаба Pelophylax lessonae (Camerano, 1882) і озерна жаба, P. ridibundus (Pallas, 1771), а також їх диплоїдні і триплоїдні гібриди, звані їстівними жабами, P. esculentus (Linnaeus, 1758). Триплоїдні гібриди P. esculentus представлені двома формами, що відрізняються за складом геномів в генотипі. Відтворення гібридів пов'язано з феноменом геміклональной спадковості. Перелічені форми жаб у різному складі можуть утворювати геміклональні популяційні системи (ГПС), де рід час спільного відтворення передаються як клональні, так і рекомбінантні геноми.

Батьківські види і гібриди мають певні зовнішні особливості, які, однак, не дозволяють чітко відрізняти їх один від одного. Один з методів доказової ідентифікації різних форм зелених жаб полягає у використанні проточної ДНК-цитометрії. Клітини жаб з струмом рідини проходять через ультрафіолетовий детектор. Вони опромінюються ультрафіолетовим випромінюванням на тій довжині хвилі, на який ДНК поглинає випромінення, а потім на тій довжині, на якій збуджена ДНК випромінює енергію, реєструється інтенсивність флуоресценції клітини. Порівнюючи клітини досліджуваних особин з реперними клітинами (наприклад, трав'яної жаби, Rana temporaria), що мають точно відому масу ДНК у кожній клітині, можна визначити масу ДНК в досліджуваних клітинах. Ця маса вимірюється в пікограмах, пг. Оскільки відомо, що геном P. lessonae має масу близько 7 пг, а геном P. ridibundus — 8 пг, за масою клітинної ДНК можна визначити, які геноми входять в генотип даної особини.

У файлі PelophylaxExamples містяться дані про жаб з 5 різними генотипами. Геном P. lessonae позначено як L, геном P. ridibundus — як R, і ці 5 форм — це LL, LLR, LR, LRR і RR. Всі ці форми зустрічаються в Харківській області.

У файлі PelophylaxExamples рядкам (Cases, rows, спостереженням) відповідають окремі особини, а стовпцям (Variables, columns, змінним) — їхні ознаки. Характеристика кожної особини включає в себе місце збору, його координати, а також інформації про належність точки здору або до водозбірного басейну Дніпра (захід і північний захід Харківської області) або Дона (тобто Сіверського Дінця; більша частина території області). Крім того, для кожної жаби вказується її стать. У файлі наведено дані про статевозрілих жаб. 

Вимірювання морфометричних ознак проводилося на фіксованих жабах за допомогою штангенциркуля; дані вимірювалися з точністю до 0,1 мм; результати вимірів вказані у мм. Найістотнішою з цих ознак є довжина тіла. Всі інші ознаки можуть використовуватися як у вигляді абсолютних значень, так і у вигляді пропорцій (відношення даної ознаки до довжини тіла). Крім того, для тих чи інших цілей можуть обчислюватися індекси — комплексні ознаки, які обчислюються як певні комбінації вихідних морфометрических ознак. Строго кажучи, пропорції (відносини промірів до довжини тіла) теж є індексами, але в цілях зручності ці поняття простіше звузити так, як це запропоновано в даному абзаці.

Таблица 2.4.1. Дані, включені в файл PelophylaxExamples: статевозрілі зелені жаби з Харківської області (невипадкова вибірка)

  Place East North Basin Sex DNA Genotyp Lc Ltc Fm Ti Dp Ci Cs
LL_f_603 Krasnocuts`k 35,16 50,07 Dnipro female 14,03 LL 60,3 19,4 26,4 25,5 7,6 4,2 11,9
LL_f_562 Chernetchina 35,13 50,05 Dnipro female 13,95 LL 56,2 18,7 26,6 24,9 6,2 4,1 15,2
LL_f_592 Chernetchina 35,13 50,05 Dnipro female 13,99 LL 59,2 19,5 28,1 26,1 7,9 3,7 13,2
LL_m_595 Chernetchina 35,13 50,05 Dnipro male 13,95 LL 59,5 19,9 28,5 28,6 7,5 3,8 11,4
LL_f_602 Chernetchina 35,13 50,05 Dnipro female 14,02 LL 60,2 21,8 28,7 28,1 8,0 4,5 15,8
LLR_f_625 Izbickoe 36,73 50,20 Don female 21,83 LLR 62,5 22,1 30,3 29,2 8,3 3,7 14,5
LLR_m_589 DobritzkiyYar 36,31 49,56 Don male 21,43 LLR 58,9 21,6 29,0 27,7 7,7 3,7 15,2
LLR_f_658 DobritzkiyYar 36,31 49,56 Don female 21,67 LLR 65,8 24,1 30,6 30,4 9,6 3,4 17,0
LLR_m_528 KreydyanaDacha 36,80 49,43 Don male 21,62 LLR 52,8 19,6 25,7 24,6 6,6 3,1 12,7
LLR_f_557 KreydyanaDacha 36,80 49,43 Don female 21,61 LLR 55,7 20,0 25,1 25,7 6,7 3,3 14,3
LLR_m_529 Verbunivs`kaDacha 36,89 49,42 Don male 21,61 LLR 52,9 19,2 25,8 26,2 7,7 3,5 12,8
LLR_m_574 Verbunivs`kaDacha 36,89 49,42 Don male 21,64 LLR 57,4 199 26,3 26,7 7,8 3,8 14,6
LLR_f_616 Verbunivs`kaDacha 36,89 49,42 Don female 21,50 LLR 61,6 23,0 31,6 29,8 9,1 3,9 15,5
LLR_f_767 Zamulivka 36,46 50,08 Don female 21,43 LLR 76,7 24,0 34,9 34,6 9,5 4,4 16,0
LLR_f_800 Zamulivka 36,46 50,08 Don female 21,60 LLR 80,0 26,2 38,9 37,6 11,6 4,9 19,6
LLR_f_479 ChervoniyShahtar 37,03 49,18 Don female 22,03 LLR 47,9 18,9 23,8 24,6 6,5 2,7 11,8
LR_m_659 Sharivka 35,47 50,04 Dnipro male 14,94 LR 65,9 20,8 30,2 30,0 8,4 4,8 16,6
LR_f_691 Sharivka 35,47 50,04 Dnipro female 14,91 LR 69,1 22,7 35,9 34,9 9,8 4,8 17,6
LR_m_668 Lipci 36,38 50,21 Don male 14,86 LR 66,8 22,6 33,5 32,8 8,6 4,4 17,5
LR_f_791 Gaydary 36,33 49,62 Don female 14,88 LR 79,1 29,9 38,1 39,4 11,6 4,7 23,3
LR_f_707 DobritzkiyYar 36,31 49,56 Don female 14,95 LR 70,7 22,9 33,4 33,2 9,7 4,3 15,0
LR_m_714 DobritzkiyYar 36,31 49,56 Don male 14,91 LR 71,4 24,4 35,6 34,1 9,3 5,3 18,1
LR_m_553 VelykaGomol`sha 36,27 49,57 Don male 14,80 LR 55,3 21,0 26,2 28,0 8,5 2,8 14,4
LR_f_877 SuhaGomol`sha 36,34 49,54 Don female 15,09 LR 87,7 33,8 37,6 42,3 13,9 4,7 22,7
LR_m_650 KreydyanaDacha 36,80 49,43 Don male 14,79 LR 65,0 22,5 32,0 31,9 9,0 3,8 16,4
LR_f_543 Verbunivs`kaDacha 36,89 49,42 Don female 14,91 LR 54,3 19,0 26,6 27,3 7,9 3,3 12,7
LR_m_662 Pechenizhsk`iyRibhoz 36,59 49,52 Don male 14,72 LR 66,2 25,2 32,1 32,5 9,2 4,3 18,6
LR_m_561 Eschar 36,35 49,47 Don male 14,91 LR 56,1 20,9 27,3 28,5 7,7 3,7 16,1
LR_f_641 Balakliya 36,48 49,27 Don female 14,85 LR 64,1 26,8 31,7 32,3 9,3 4,1 17,3
LR_f_569 Gatishe 36,52 50,18 Don female 14,91 LR 56,9 20,1 26,0 28,1 9,0 3,6 15,6
LRR_m_588 Gaydary 36,33 49,62 Don male 22,97 LRR 58,8 20,6 28,8 28,9 9,1 3,5 13,7
LRR_m_653 Gaydary 36,33 49,62 Don male 22,64 LRR 65,3 21,5 31,5 31,9 8,2 3,8 15,1
LRR_m_655 Gaydary 36,33 49,62 Don male 22,98 LRR 65,5 22,1 32,8 34,5 9,2 4,5 15,9
LRR_f_677 Gaydary 36,33 49,62 Don female 22,80 LRR 67,7 29,4 33,8 36,4 10,8 4,3 18,1
LRR_m_691 Gaydary 36,33 49,62 Don male 22,81 LRR 69,1 22,6 33,0 33,4 9,2 4,0 16,7
LRR_f_742 Gaydary 36,33 49,62 Don female 22,79 LRR 74,2 25,5 35,2 35,6 10,7 4,0 17,4
LRR_f_715 DobritzkiyYar 36,31 49,56 Don female 22,60 LRR 71,5 22,0 35,3 34,4 10,3 4,1 15,5
LRR_f_504 SuhaGomol`sha 36,34 49,54 Don female 22,79 LRR 50,4 20,3 23,1 24,8 6,3 3,1 11,7
LRR_m_564 KreydyanaDacha 36,80 49,43 Don male 22,74 LRR 56,4 19,2 28,3 29,3 7,7 3,0 13,9
LRR_m_755 KreydyanaDacha 36,80 49,43 Don male 22,73 LRR 75,5 26,8 41,1 37,2 10,6 4,2 18,9
LRR_f_618 Verbunivs`kaDacha 36,89 49,42 Don female 22,81 LRR 61,8 21,2 28,8 30,2 9,4 3,2 14,5
LRR_f_689 Verbunivs`kaDacha 36,89 49,42 Don female 22,85 LRR 68,9 24,8 31,6 34,1 10,4 3,7 17,9
LRR_m_721 Balakliya 36,48 49,27 Don male 22,85 LRR 72,1 27,8 35,9 35,9 10,4 4,7 19,6
RR_m_706 Gorodnee 35,14 50,05 Dnipro male 16,13 RR 70,6 26,6 32,6 36,2 9,7 3,7 18,7
RR_m_508 Gubarivka 35,35 50,16 Dnipro male 16,27 RR 50,8 19,1 25,9 27,7 6,6 2,7 12,9
RR_f_701 Lipci 36,38 50,21 Don female 16,00 RR 70,1 27,0 36,0 37,6 10,6 3,0 17,8
RR_f_825 Martova 36,96 49,93 Don female 16,18 RR 82,5 31,5 42,3 44,3 12,4 4,9 24,0
RR_f_537 Pechenigy 36,99 49,89 Don female 16,22 RR 53,7 18,9 25,9 27,3 7,2 2,8 11,9
RR_f_535 SuhaGomol`sha 36,34 49,54 Don female 15,99 RR 53,5 20,0 26,5 28,1 7,8 3,2 14,5
RR_m_521 ChervonaGusarivka 36,86 49,41 Don male 16,01 RR 52,1 18,6 24,3 26,7 6,5 2,8 12,4
RR_f_542 ChervonaGusarivka 36,86 49,41 Don female 16,07 RR 54,2 19,3 26,2 28,2 7,1 2,7 12,9
RR_f_693 Vesele 37,19 49,40 Don female 16,11 RR 69,3 24,7 34,1 36,2 10,4 3,2 17,4
RR_f_710 Petropillya 37,13 49,09 Don female 16,01 RR 71,0 25,6 33,9 37,1 9,9 3,4 17,7
RR_m_686 Eschar 36,35 49,47 Don male 16,03 RR 68,6 26,8 33,6 36,1 10,3 3,8 19,7
RR_m_792 Balakliya 36,48 49,27 Don male 15,92 RR 79,2 26,2 34,0 35,7 9,3 3,2 17,2
RR_m_930 Zamulivka 36,46 50,08 Don male 16,08 RR 93,0 26,5 46,2 46,1 13,8 3,1 20,2
RR_m_656 Liman 36,32 49,35 Don male 16,20 RR 65,6 21,9 35,2 33,7 9,0 3,6 15,4

 

2.3. Різноманіття програм для статистичного аналізу

Ми приступили до вивчення біологічної статистики. Воно може бути організовано двома різними способами. При першому з них (його можна позначити «ab ovo») студентам пояснюють математичні основи досліджуваних методів, виводять необхідні формули і доводять пояснюють їх теореми. Якщо студент освоїв такий курс, рішення конкретних проблем, пов'язаних з тим чи іншим набором даних в його області досліджень виявляється не такою вже складною задачею. Другий спосіб («роби, як я») полягає в тому, що студентам показують, як вирішувати типові завдання за допомогою того чи іншого інструментарію.

Перший спосіб складніший. Люди, що успішно впоралися з навчанням за першим способом, мають більш високу підготовку і більш універсальні. Однак, значною мірою, перший спосіб працює за принципом «все або нічого». Ти або освоїв основні підходи і можеш їх застосовувати, або не знаєш, що робити і губишся при необхідності вирішити найпростіші завдання. Другий спосіб «демократичніший» і дозволяє легко вирішувати типові завдання. На жаль, без розуміння основ методів люди, яких навчили повторювати якісь послідовності дій, але не пояснили їх зміст, часто роблять помилки. Ще одним недоліком другого підходу є звикання до певних програм (інструментам для вирішення типових задач). Природно, що для різних категорій студентів потрібен або перший, або другий спосіб, або їх поєднання. Досвід викладання статистики студентам-біологам свідчить, що для них, найчастіше, більш корисним є підхід «роби, як я».

Реалізація підходу «роби, як я» вимагає вибору програм, за допомогою яких буде проводитися навчання. Тут доводиться вибирати між шістьма категоріями програм.
— Безкоштовні аматорські і напівпрофесійні програми; їх чимало, але серед них немає універсальних, і, до того ж, мало не кожна з них вимагає свого підходу (хоча деякі рішення слід визнати вдалими, як, наприклад, цей набір онлайн-калькуляторів);
— Спеціалізовані безкоштовні програми для вирішення певного кола задач. Ймовірно, лідером в цій категорії є програма PAST, що працює виключно у середовищі Windows. PAST створено фахівцями-палеонтологами як «Statistica для бідних» — спрощений і безкоштовний аналог вартісного пакету Statistica. Завантажити останню версію PAST і керівництва користувача до неї можна тут;
— Платне або вільне ПЗ, не призначене для вирішення статистичних завдань спеціально, але здатне надавати широкі можливості для роботи з даними і, в тому числі, і їх статистичного аналізу. До цієї категорії відносяться Excel і Access, компоненти Microsoft Office. У разі необхідності роботи з електронними таблицями радимо вам користуватися LibreOffice Calc, безкоштовним аналогом Excel, що за багатьма ознаками є кращим за нього. Як вказано вище, електронні таблиці яасто використовуються для збору даних, але...

«Тут слід зазначити ще одну річ: ні в якому разі не рекомендовано проводити будь-який статистичний аналіз в програмах електронних таблиць. Не кажучи вже про те, що інтернет просто забитий статтями про помилки в цих програмах і/або в їх статистичних модулях, це ще й вкрай невірно ідеологічно. Інакше кажучи: Використовуйте R!». А. Б. Шипунов, Е. М. Балдин «Анализ данных с R».

— Спеціалізовані платні програми, що призначені для вирішення певного набору задач. Лідерів ринку на цьому полі два. SPSS (Statistical Package for the Social Sciences) програма, що широко використовується в гуманітарних науках. У 2009 році компанію SPSS Inc придбала славнозвісна IBM. Тепер їх продукт має назву PASW Statistics (Predictive Analytics SoftWare). Серед вчених-природничників, особливо на пострадянському просторі, особливу популярність здобув пакет Statistica, який розробляє компанія StatSoft.
— Платні мови програмування, що допускають різноманітне застосування. В цій галузі лідером є SAS (Statistical Analysis System) — мова програмування та відповідна програма від SAS Institute. Цей програмний продукт призначено, перш за все, для серйозного бізнесу, медичного у тому числі. 
— Вільне спеціалізовані мови, що надають надширокі можливості для вирішення як типових, так і нетрадиційних задач. Лідер в цій області — середовище R: потужна мова для статистичного аналізу; в базовому випадку вимагає роботи з командним рядком, хоча частіше використовується з оболонками на зразок RStudio. Останніми роками для подібних задач широко використованою стала й мова Python.

Використання програм п'ятої категорії дозволяє найбільшою мірою зосередитися на суті розв'язуваних проблем. На жаль, воно пов'язане з необхідністю вибору між купівлею дорогої (дуже дорогої!) ліцензії або використання зламаних, піратських версій. Втім, зараз компанія StatSoft надає можливість отримати ліцензію на використання її програмного продукту у освітніх цілях. 

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

Один з авторів цього підручника почав працювати з програмою Statistica фірми StatSoft (в її попередній реінкарнації) близько 1992 року (тоді вона називалася CSS, і вона була призначена для роботи в MS DOS). У той час саме цю програму використовували кваліфіковані зоологи пострадянських країн. Зроблений тоді вибір і визначив ту програму, на яку спочатку було орієнтовано виклад в цьому підручнику. Треба зізнатися, що людині, яка звикла працювати в програмі з віконним інтерфейсом, вибираючи опції з запропонованого списку, надзвичайно важко перейти до роботи в режимі командного рядка, який вимагає пам'ятати імена і синтаксис необхідних програм. Втім, час подібних програм вже минув. Треба засвоювати середовище R... Звісно, останніми роками R зазнає усе більш інтенсивної конкуренції з бокубільш універсальної мови програмування Python, втім, поки що, обійтися без R біолог-фахівець не зможе.

 

2.4. Мова (середовище) R

Історія R почалася з мови S, яку розробила Лабораторія Белла, Bell Labs — американська компанія, яка зіграла ключову роль у розвитку програмного забезпечення. Це була мова, призначена для статистичних розрахунків (це пояснення літери S), яку назвали за аналогією з мовою програмування C. З часом з'явилася й версія S+. І S, і S+ були платними і достатньо дорогими продуктами. З часом на цю мову звернули увагу активісти проєкту GNU. Проєкт GNU (GNU’s Not UNIX) було почато 1983 року Річардом Столменом. Цей американський програміст звільнився з університету для того, щоб операційна система, подібна на систему Unix (модульну операційну систему, засновану на ідеях, що були розроблені в Bell Labs), не належала жодній організації. Ініціатива Столмена привела до появи руху розробників вільного програмного забезпечення. У 1991 році Лінус Торвальдс почав роботу над ядром версії операційної системи, що була названа Linux. І Linux, і інші продукти, що створюються під ліцензією GNU — це вільне програмне забезпечення, один з найяскравіших здобутків людської кооперації.

Природно, що з часом два активісти GNU вирішили зробити у межах цього проєкту вільний аналог мови S+. Співробітники статистичного факультету Оклендського університету (в Новій Зеландії) Росс Іхака (Ross Ihaka) і Роберт Джентлмен (Robert Gentleman) з 1992 року розпочали роботу над вирішенням цієї задачі. У 1993 році з'явилася перша експериментальна реалізація цієї вільної статистичної мови програмування. За аналогією з S, ця мова також отримала назву з однієї літери — першої літери імен її «батьків». З часом співтовариство R надзвичайно розрослося.

R — безкоштовний відкритий продукт. Це — мова програмування для вирішення задач в області статистики і моделювання, а також середовище з відкритим програмним кодом для обчислювань та графіки. R поширюється як програмний код, а також як відкомпільована (переведена з мови програмування на мову комп'ютерних кодів) програма. R є доступним під Linux («спорідненою» операційною системою, іншим результатом розвитку підходів Bell Labs у проєкті GNU), Windows та MacOC. В цілому, ця мова — масштабний результат альтруїстичної діяльності величезної спільноти інтелектуалів усієї земної кулі (з особливою роллю представників новозеландської статистичної школи). Центром, навколо якого організована ця спільнота, є сайт r-project.org. З часом у R-співтоваристві поширюються популярні новації. Так, можна працювати з «голим» R, а можна використовувати ті або інші оболонки. Найпоширеніша оболонка для R — RStudio. Науковий керівник RStudio, професор статистики в Оклендському університеті (і біолог за першою освітою) Хедлі Уікем (Hadley Wickham) суттєво вплинув на розвиток мови R. Так, він є автором концепції tidy data (насправді це нова назва для давно відомої організації статистичних даних: спостереження у рядках, характеристики у стовпцях) та низки популярних пакетів, що входять у склад комплексу tidyverse. Найпопулярнішим з цих пакетів є ggplot2, що, фактично, став одним з стандартів наукової графіки.

Для нашого курсу «батьками-засновниками» можна вважати усіх трьох перелічених персон (рис. 2.4.1), адже ми будемо використовувати R через оболонку RStudio та застосуватимемо частини комплексу tidyverse.

Рис. 2.4.1. «Гуру» R: Росс Іхака та Роберт Джентлмен (джерело), Хедлі Уікем (джерело)

R — це високорівнева об'єктна інтерпретована мова програмування. Високорівневість цієї мови пов'язана з тим, що її конструкції орієнтовані на людський мозок, а не на комп'ютерний процесор (втім, цей мозок має працювати логічно, послідовно та однозначно). Мова R є об'єктною, тому що вона містить описи окремих об'єктів, що мають певні атрибути. Об'єкти можуть належати до двох категорій: data objects, що призначені для зберігання даних, та function objects, що виконують певні перетворення інших об'єктів. Об'єкт, з яким працювала функція, сам по собі не змінюється; щоб зберігти результати роботи функції, слід перетворити ці результати на новий об'єкт або окремою командою замінити старий об'єкт на новий. Щоб зрозуміти перевагу інтерпретованості R, слід зазначити, що мови програмування можуть бути компільованими та інтерпретованими. Програми компільованих мов «перекладаються» на мову кодів, що керують процесором, як єдине ціле. Програми інтерпретованих мов перетворюються у коди крок за кроком, команда за командою. Завдяки тому, що R є інтерпретованою мовою, написану в R програму — скрипт (ланцюг команд) — можна виконувати покроково або частково. Це дуже зручно для налагодження такої програми у випадку, коли щось не заладилося з першої спроби (тобто — у типовому випадку). Скрипт R може бути змінений в будь-якому місці. Щоб повторити раніше виконану послідовність операцій в R, досить змінити скрипт і запустити його заново. Слід зазначити, що типова робота з R може складатися з покрокового подолання труднощів: щось треба зробити; шукаєш інформацію, робиш спроби, зазнаєш невдач, шукаєш їх причини, долаєш їх крок за кроком, оптимізуєш скрипт, виправляєш помилки, потрапляєш у тупік, знаходиш з нього вихід... і, кінець-кінцем, отримуєш задоволення від вирішення задачі.

Подобається це або ні, щоб використовувати R, слід подолати певний поріг входження. Типовою є ситуація, коли людина, яка не мала до цього R-досвіду (і, ще гірше, яка мала досвід роботи з принципово інакше організованими комп'ютерними програмами) намагається вирішити якусь задачу в R. На перших кроках нічого не буде зрозуміло! Ігровий підхід, що потребує інтуїтивно зрозумілої логіки роботи, не спрацьовує у програмному середовищі, яке вимагає однозначності. Досить часто це призводить до розчарування у R та повернення до менш досконалих інструментів. З іншого боку, маючи справу з фахівцем, що користується цією мовою, можна зробити висновок, що він вміє долати перешкоди і за необхідності може впоратися з власною фрустрацією.

...один з авторів цього посібника проходив стажування в одному з найкращих світових університетів у фахівця, що дуже просунувся у застосуванні R. Стажування стосувалося використання R у імітаційному моделюванні, а не в статистиці, але отримані у ході цього навчання уроки цілком стосуються й нашої теми. Стажеру хотілося використовувати час майстра з максимальною ефективністю. За кілька днів до предметної зустрічі стажер спробував вирішити задачу самостійно і відразу стикнувся з проблемами. Очевидно, що потрібні перетворення можна зробити, але як? Інтуїтивно зрозумілі шляхи призводять до зупинок програми та появи дивних повідомлень... Стажеру не хотілося витрачати час спільної роботи на те, що можна знайти у мережі. Він шукав рішення аналогічних проблем у Google, знаходив аналогії, пробував їх застосувати та раз за разом зазнавав поразки. У такий ситуації важко не виялатися вголос; зрозуміло, що ані R, ані автори порад, які не вдалося застосувати, ані в чому не винні, але ж лайка якось полегшує відчуття невдачі... Втім, витративши кілька годин на пошук та безплідні спроби, кінець-кінцем вдавалося просунутися на один крок. До першої спільної сесії з метром вдалося зробити кілька таких кроків. І ось настав час, коли стажер пояснив, у чому йому потрібна допомога. «Гадки не маю, як це треба робити», сказав гуру: «Треба шукати». Фахівець поліз у Google; слід зазначити, що він формулював запити так, що швидше отримував результат. Перші спроби застосувати знайдене були невдалими; метр отримував повідомлення про помилки від R та лаявся у відповідь. Оскільки і метр, і стажер належали до однієї культури, лайка, яку вони використовували у разі невдачи, була більш-менш подібною... Втім достатньо швидко гуру зміг зробити потрібний крок, потім — ще один. Кваліфікація фахівця проявилася не в тому, що він знав відповідь на нетривіальні питання заздалегідь (і навіть не в тому, що він лаявся більш ефективно), а в тому, що шляхом проб та помилок із використанням колективної мудрості мережі він просувався набагато швидше, ніж новачок. Кінець-кінцем, модель, яка створювалася у тому стажуванні, була готова. Відразу стало зрозумілим, що вона не є оптимальною; скрипт довелося відкоригувати. Під час експериментів з моделлю виявилося, що одне з припущень, прийнятих під час її побудови, було невдалим; модель довелося переписати... Шановні студенти! Якщо під час роботи з R ви відчуєте себе дурнями, а R у певний момент буде здаватися способом знущання над вами, не переймайтеся: це типові переживання. Важливо, щоб вони вас не зупинили. Якщо ваші зусилля триватимуть, ви переможете, і завдяки витраченим зусиллям відчуття вашої перемоги стане особливо гострим.

 

2.5. Короткий огляд команд R

Матеріал цього розділу засновано на «шпаргалці», яка розташована на офіціальній сторінці проєкту R, а також на її русіфікованій версії

 

2.5.1. Допомога

help(topic), ?topic — довідка щодо topic

help.search("pattern"), ??pattern — глобальний пошук pattern

help(package = ) — довідка щодо вказаного пакету

help.start() — запустити допомогу в браузері

apropos(what) — імена об'єктів, що відповідають what

args(name) — аргументи команди name

example(topic) — приклади використання topic

 

2.5.2. Оточення

ls() — список усіх об'єктів

rm(x) — видалити об'єкт

dir() — показати усі файли в поточній директорії

getwd() — вказати поточну директорію

setwd(dir) — змінити поточну директорію на dir

 

2.5.3. Огляд об'єктів

str(object) — внутрішня структура об'єкта object

summary(object) — загальна інформація щодо об'єкта object

dput(x) — отримати представлення об'єкту в R-синтаксисе

head(x) — подивитися початкові рядки об'єкта

tail(x) — подивитися останні рядки об'єкта

 

2.5.4. Ввід та вивід

library(package) — підключити пакет package

save(file, ...) — зберігає вказані об'єкти у двойковому XDR-форматі, що не залежить від платформи

load() — завантажує дані, що були збережені раніше командою save()

read.table — зчитує таблицю даних і створює по ним data.frame

write.table — виводить на друк об'єкт, конвертуючи його в data.frame

read.csv — зчитує csv-файл

re1ad.delim — зчитування даних, що розділені знаками табуляції

save.image — зберігає усі об'єкты у файл

cat(..., file= , sep= ) — зберігає аргументи, конкатенуючи їх через sep

sink(file) — виводить результати виконання інших команд в файл у режимі реального часу до моменту виклику цієї ж команди без аргументів

 

2.5.5. Створення об'єктів

from:to — генерує послідовність чисел від from до to з кроком 1, наприклад 1:3

с(...) — поєднує аргументи у вектор, наприклад c(1, 2, 3)

seq(from, to, by = ) — генерує послідовність чисел від from до to з кроком by

seq(from, to, len = ) — генерує послідовність числел від from до to довжини len

rep(x, times) — повторює x times разів

list(...) — створює перелік об'єктів

data.frame(...) — створює фрейм даних

array(data, dims) — створює з data багатовимірний масив з розмірністю dim

matrix(data, nrow = , ncol = , byrow = ) — створює з data матрицю nrow на ncol, порядок заповнення визначає byrow

factor(x, levels = ) — створює з x фактор з рівнями levels

gl(n, k, length = n*k, labels = 1:n) — створює фактор из n рівнів, кожен з яких повторюється k раз довжини length з іменами labels

rbind(...) — поєднує аргументи по рядках

cbind(...) — поєднує аргументи по стовпцях

 

2.5.6. Індексування

Вектори

x[n] — n-тий елемент

x[-n] — усі елементи, крім n-того

x[1:n] — перші n елементів

x[-(1:n)] — усі елементи, крім перших n

x[c(1,4,2)] — елементи з індексами, що перелічені

x["name"] — елемент з ім'ям, яке вказано

x[x > 3] — усі елементи, більші за 3

x[x > 3 & x < 5] — усі елементи між 3 и 5

x[x %in% c("a","and","the")] — усі елементи з множини, яка задана

Переліки

x[n] — перелік, зо складається з елемента n

— n-тий елемент переліку

 — елемент переліку з ім'ям name

x$name — елемент переліку з ім'ям name

Матриці

x[i, j] — елемент на перехрещенні i-ого рядка та j-ого стовпця

x[i,] — i-ий рядок

x[,j] — j-ий стовпець

x[,c(1,3)] — задана підмножина стовпців

x["name", ] — рядок з ім'ям name

Фрейми

— стовпець з ім'ям name

x$name — стовпець з ім'ям name

 

2.5.7. Робота зі змінними

as.array(x), as.data.frame(x), as.numeric(x), as.logical(x), as.complex(x), as.character(x) — перетворення об'єкту до певного типу 

is.na(x), is.null(x), is.array(x), is.data.frame(x), is.numeric(x), is.complex(x), is.character(x) — перевірка того, що об'єкт належить до певного типу

length(x) — кількість елементів в x

dim(x) — розмірності об'єкта x

dimnames(x) — імена розмірностей об'єкта x

names(x) — імена об'єкта x

nrow(x) — кількість рядків x

ncol(x) — кількість стовпців x

class(x) — клас об'єкта x

unclass(x) — виділяє атрибут класа у об'єкта x

attr(x,which) — атрибут which об'єкта x

attributes(obj) — перелік атрибутів об'єкта obj

 

2.5.8. Керування даними

which.max(x) — індекс елемента з максимальним значенням

which.min(x) — індекс елемента з мінімальним значенням

rev(x) — реверсує порядок елементів

sort(x) — сортує елементи об'єкта у порядку збільшення

cut(x,breaks) — розділює вектор на рівні інтервали

match(x, y) — шукає елементи x, які є в y

which(x == a) — вертає порядкові елементи x, які дорівнюють a

na.omit(x) — виключає відсутні значення (NA) об'єкта (у матриці або фреймі виключає відповідний рядок)

na.fail(x) — повертає повідомлення про помилку, якщо об'єкт містить NA

unique(x) — виключає з об'єкта повторювані елементи

table(x) — створює таблицю з кількістю повторювань кожного унікального елемента

subset(x, ...) — вертає підмножину елементів об'єкта, яка відповідає заданій умові

sample(x, size) — вертає випадковий набір розміру size з елементів x

replace(x, list, values) — замінює значення x з індексами з list значеннями values

append(x, values) — додає елементи values до вектору x

 

2.5.9. Математика

sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), atan2(y, x), log(x), log(x, base), log10(x), exp(x) — елементарні математичні функції

min(x), max(x) — мінімальний та максимальний елементи об'єкта

range(x) — вектор з мінімального та максимального елементів об'єкта

pmin(x, y), pmax(x, y) — вертає вектор з мінімальними (максимальними) значеннями для кожної пари x[i], y[i]

sum(x) — сума елементів об'єкта

prod(x) — добуток (результат множення) елементів об'єкта

diff(x) — вертає вектор з різниць між сусідніми елементами

mean(x) — середнє арифметичне елементів об'єкта

median(x) — медіана об'єкта

weighted.mean(x, w) — середньозважене об'єкта x (w задає ваги)

round(x, n) — округляє x до n десяткових знаків

cumsum(x), cumprod(x), cummin(x), cummax(x) — кумулятивні суми, добутки, мінімуми та максимуми вектора x (i-тий елемент містить статистику по елементам x[1:i])

union(x, y), intersect(x, y), setdiff(x,y), setequal(x,y), is.element(el,set) — операції над множинами: поєднання, перетин, різниця, належність

Re(x), Im(x), Mod(x), Arg(x), Conj(x) — операції над комплексними числами: ціла частина, мнима частина, модуль, аргумент, спряжене число

fft(x), mvfft(x) — швидке перетворення Фур'є

choose(n, k) — кількість комбінацій

rank(x) — ранжує елементи об'єкта

 

2.5.10. Матриці

%*% — матричне множення

t(x) — транспонована матриця

diag(x) — діагональ матриці

solve(a, b) — вирішує систему рівнянь a %*% x = b

solve(a) — зворотня матриця

colSums, rowSums, colMeans, rowMeans — суми і середні по стовпцям та рядкам

 

2.5.11. Перебудова даних

apply(X,INDEX,FUN =) — повертає вектор, масив або список значень, отриманих шляхом застосування функції FUN до певних елементів масиву або матриці x; елементи, що мають оброблюватися, вказуються за допомогою аргументу MARGIN;

lapply(X,FUN) — повертає список тієї ж довжини, що і х; при цьому значення в новому списку будуть результатом застосування функції FUN до елементів вихідного об'єкта х

tapply(X,INDEX,FUN =) — застосовує функцію FUN до кожної сукупності значень х, створеної відповідно до рівнів певного фактора; перелік факторів вказується за допомогою аргументу INDEX

by(data,INDEX,FUN) — аналог tapply (), застосовуваний до таблиць даних

merge(a,b) — об'єднує дві таблиці даних (а і b) за загальними стовпцями або рядками

aggregate(x,by,FUN) — розбиває таблицю даних х на окремі набори даних, застосовує до цих наборів певну функцію FUN і повертає результат в зручному для читання форматі

stack(x, ...) — перетворює дані, представлені в об'єкті х у вигляді окремих стовпців, в таблицю даних

unstack(x, ...) — виконує операцію, зворотну дії функції stack()

reshape(x, ...) — перетворює таблицю даних з «широкого формату» (повторні вимірювання будь-якої величини записані в окремих стовпцях таблиці) в таблицю «вузького формату» (повторні вимірювання йдуть одне під одним в межах одного стовпчика)

 

Дата і час

as.Date(s) — конвертує вектор s в об'єкт класу Date

as.POSIXct(s) — конвертує вектор s в об'єкт класу POSIXct

 

2.5.12. Рядки

print(x) — виводить на екран x

sprintf(fmt, ...) — форматування тексту в C-style (можна використовувати %s, %.5f тощо)

format(x) — форматує об'єкт x таким чином, щоб він виглядав красиво під час виводу на екран

paste(...) — конвертує вектори в текстові змінні і об'єднує їх в один текстовий вираз

substr(x,start,stop) — отримання підрядка

strsplit(x,split) — розбиває рядок х на підрядки у відповідності до split

grep(pattern,x) (а також grepl, regexpr, gregexpr, regexec) — пошук по регулярному виразу

gsub(pattern,replacement,x) (а також sub) — заміна по регулярному виразу

tolower(x) — привести рядок до нижнього регістру

toupper(x) — привести рядок до верхнього регістру

match(x,table), x %in% table — шукає елементи у векторі table, які співпадають зі значеннями з вектора х

pmatch(x,table) — шукає елементи у векторі table, які частково співпадають зі значеннями з вектора х

nchar(x) — вертає кількість знаків в рядку х

 

2.5.13. Графіки

plot(x) — графік x

plot(x, y) — графік залежності y от x

hist(x) — гістограма

barplot(x) — стовпчаста діаграма

dotchart(x) — діаграма Кливленда

pie(x) — кругова діаграма

boxplot(x) — графік типу «коробочки с вусами»

sunflowerplot(x, y) — те ж саме, що й plot(), але точки з однаковими координатами зображуються у вигляді «соняшників», кількість пелюсток у яких пропорційна кількості таких точок

coplot(x˜y | z) — графік залежності y от x для кожного інтервалу значень z

interaction.plot(f1, f2, y) — якщо f1 і f2 — фактори, ця фукнкція створить графік з середніми значеннями відповідно до значень f1 (по вісі х) та f2 (по вісі у, різні криві)

matplot(x, y) — графік залежності стовпців y від стовпців x

fourfoldplot(x) — зображує (у вигляді частин окружності) зв'язок між двома бінарними змінними в різних сукупностях

assocplot(x) — графік Кохена-Френдлі

mosaicplot(x) — мозаїчний графік залишків лог-лінійної регресії

pairs(x) — якщо х — матриця або таблиця даних, ця функція зобразить діаграми розсіювання для всіх можливих пар змінних з х

plot.ts(x), ts.plot(x) — зображує часовий ряд

qqnorm(x) — квантилі

qqplot(x, y) — графік залежності квантилів y від квантилів х

contour(x, y, z) — виконує інтерполяцію даних і створює контурний графік

filled.contour(x, y, z) — те ж, що і contour(), але заповнює області між контурами певними кольорами

image(x, y, z) — зображує дані у вигляду квадратів, колір яких визначається значеннями х і у

persp(x, y, z) — те ж, що і image(), але у вигляді трьохвимірного графіка

stars(x) — якщо x — матриця або фрейм, зображує графік у вигляді  «зірок» так, що кожен рядок представлений «зіркою», а стовпці визначають довжину променів цих «зірок»

symbols(x, y, ...) — зображує різні символи у відповідності до координат

termplot(mod.obj) — зображує часткові ефекти змінних з регресійної моделі

 

2.5.14. Окремі елементи графіків

points(x, y) — малювання точок

lines(x, y) — малювання лінії

text(x, y, labels, ...) — додавання текстового надпису

mtext(text, side=3, line=0, ...) — додавання текстового надпису

segments(x0, y0, x1, y1) — додавання відрізка

arrows(x0, y0, x1, y1, angle= 30, code=2) — малювання стрілки

abline(a,b) — малювання нахиленої прямої

abline(h=y) — малювання вертикальної прямої

abline(v=x) — малювання горизонтальної прямої

abline(lm.obj) — малювання регресійної прямої

rect(x1, y1, x2, y2) — малювання прямокутника

polygon(x, y) — малювання багатокутника

legend(x, y, legend) — додавання легенди

title() — додавання назви

axis(side, vect) — додавання осей

rug(x) — малювання засічок на вісі X

locator(n, type = "n", ...) — вертає координати на графіку у відповідь на клік користувача

 

2.5.15. Гратчасті графіки (Lattice-графіки)

xyplot(y˜x) — графік залежності у від х

barchart(y˜x) — стовпчаста діаграма

dotplot(y˜x) — діаграма Клівленда

densityplot(˜x) — графік щільності розподілу значень х

histogram(˜x) — гістограма значень х

bwplot(y˜x) — графік типу «коробочки с вусами»

qqmath(˜x) — аналог функції qqnorm()

stripplot(y˜x) — аналог функції stripplot(x)

qq(y~x) — зображує квантилі розподілів х і у для візуального порівняння цих розподілів; змінна х має бути числовою, змінна у — числовою, текстовою, або фактором з двома рівнями

splom(~x) — матриця діаграм розсіювання (аналог функції pairs() )

levelplot(z~xy|g1g2) — кольоровий графік значень z, координати яких задані змінними х і у (очевидно, що x, y і z повинні мати однакову довжину); g1, g2 ... (якщо присутні) — фактори або числові змінні, чиї значення автоматично розбиваються на рівномірні відрізки

wireframe(z~xy|g1g2) — функція для побудови тривимірних діаграм розсіювання і площин; z, x і у — числові вектори; g1, g2 ... (якщо присутні) — фактори або числові змінні, чиї значення автоматично розбиваються на рівномірні відрізки

cloud(z˜xy|g1g2) — тривимірна діаграма розсіяння

 

2.5.16. Оптимізація та підгонка параметрів

optim(par, fn, method = ) — оптимізація загального призначення

nlm(f,p) — мінімізація функції f алгоритмом Ньютона

lm(formula) — підгонка лінійної моделі

glm(formula,family=) — підгонка узагальненої лінійної моделі

nls(formula) — нелінійний метод найменших квадратів

approx(x,y=) — лінійна інтерполяція

spline(x,y=) — інтерполяція кубічними сплайнами

loess(formula) — підгонка поліноміальної поверхні

predict(fit,...) — побудова прогнозів

coef(fit) — розрахункові коефіцієнти

 

2.5.17. Статистика

sd(x) — стандартне відхилення

var(x) — дисперсія

cor(x) — кореляційна матриця

var(x, y) — коваріація між x та y

cor(x, y) — лінійна кореляція між x та y

aov(formula) — дисперсійний аналіз

anova(fit,...) — дисперсійний аналіз для підігнаних моделей fit

density(x) — ядерні щільності ймовірностей

binom.test() — точний тест простої гіпотези о ймовірності успіху у випробуваннях Бернуллі

pairwise.t.test() — попарні порівняння кількох незалежних або залежних вибірок

prop.test() — перевірка гіпотези про рівність частот певної ознаки в усіх групах, що аналізуються

t.test() — тест Стьюдента

 

2.5.18. Розподіли

rnorm(n, mean=0, sd=1) — нормальний розподіл

rexp(n, rate=1) — експоненційний розподіл

rgamma(n, shape, scale=1) — гамма-розподіл

rpois(n, lambda) — розподіл Пуассона

rweibull(n, shape, scale=1) — розподіл Вейбулла

rcauchy(n, location=0, scale=1) — розподіл Коші

rbeta(n, shape1, shape2) — бета-розподіл

rt(n, df) — розподіл Стьюдента

rf(n, df1, df2) — розподіл Фішера

rchisq(n, df) — розподіл Пірсона

rbinom(n, size, prob) — біноміальний розподіл

rgeom(n, prob) — геометричний розподіл

rhyper(nn, m, n, k) — гипергеометричний розподіл

rlogis(n, location=0, scale=1) — логістичний розподіл

rlnorm(n, meanlog=0, sdlog=1) — логнормальний розподіл

rnbinom(n, size, prob) — від'ємний біноміальний розподіл

runif(n, min=0, max=1) — рівномірний розподіл

 

2.5.19. Програмування

Робота з функціями

function(arglist) { expr } — створює функцію користувача

return(value) — возвертає значення

do.call(funname, args) — викликає функцію по імені

Условні оператори

if(cond) expr

if(cond) cons.expr else alt.expr

ifelse(test, yes, no)

Цикли

for(var in seq) expr

while(cond) expr

repeat expr

break — зупинка цикла

 

2.6. R: корисні посилання

Для знайомства з R можна рекомендувати досить численні джерела. Серед них — присвячені R блоги, в тому числі r-analytics і statinr, дуже зрозуміло написані огляди тут. Дуже корисно пройти російськомовний курс по роботі в R. Є зрозумілі лекції російською мовою, що викладені на Youtube; якщо ви вважаєте можливим слухати Санкт-Петербурзських фахівців по R, можемо вам порадити цей курс та ці лекції. Курс московської Вищої школи економіки з економетрики є тут. Цікаві навчальні матеріали (зручно побудовані у лаконічній формі) є тут. Деякі нетривіальні речі є в цьому навчальному курсі. Загалом, пошук на YouTube і просто в Google може принести багато цікавого. 

Для опанування R можна використати кілька книг. Українською мовою можна рекомендувати наступне видання:

Мaйбoрoдa Р. Є. Кoмп'ютeрнa стaтистикa. К.: ВПЦ «Київський університет», 2019. – 589 с.

Кількість англійських книг, присвячених R, величезна. Серед них, за порадою авторитетів, можна запропонувати дві наступні.

Field A., Miles J. and Field Z. Discovering Statistics using R. SAGE Publications, 2012. – 957 p.

Wickham H., Grolemund G. R for Data Science_Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media, Inc. 2017. – 292 p. Ця книга доступна також у вигляді гіпертексту у Мережі.

Остання книга є доступною і в російському перекладі: 

Уикeм Х., Грoулмунд Г. Язык R в зaдачах нaуки о дaнных. Импoрт, пoдготовка, oбработка, визуaлизация и мoделирование дaнных. СПб.: ООО "Диaлектика", 2018. – 592 с.

Крім того, перелічені далі перші п'ять російськомовних книг є перекладами з англійської, їх первинні версії також доступні у Мережі. 

Кaбaкoв Р.И. R в дeйcтвии. Анaлиз и визуaлизация дaнных на языке R. М.: ДMK Прecc, 2014. – 588 с.

Лoнг Дж.Д., Титoр П. R. Книгa рeцептoв. Прoвeренныe рeцепты для стaтистики, aнализa и визуaлизации. М.: ДМК Пресс, 2020. – 510 с.

Мэтлoфф Н. Искусствo прoграммирoвaния нa R. Пoгружение в бoльшие дaнные. СПб.: Питер, 2019. – 416 с.

Джeймс Г., Уиттoн Д., Хaсти Т., Тибширaни Р. Ввeдениe в стaтистичeскoе oбучение c примeрами на языкe R. М.: ДМК Пресс, 2017. – 456 с.

Брюc П., Брюc Э. Прaктическая cтатиcтика для cпециалистoв Dаta Sciеnce. СПб: БХВ-Петербург, 2018. — 304 с.

Мaстицкий С.Э., Шитикoв В.К. Стaтистичeский анaлиз и визуaлизaция дaнных c помoщью R. М.: ДМК Пресс, 2015. – 496 с.

Мaстицкий С.Э. Визуaлизация дaнных c пoмощью ggplot2. М.: ДМК Пресс, 2017. – 222 с.

Шипунoв А.Б., Бaлдин Е.М., Вoлкова П.А. и др. Нaгляднaя cтатиcтика. Испoльзуем R! М.: ДМК Пресс, 2014. – 298 с.

Крім перелічених книг корисними можуть бути наступні матеріали:

R Programming Tutorial

Самсонов Т. Визуализация и анализ географических данных на языке R. Онлайн-курс.

Эрвe М. Путевoдитель пo примeнению cтатиcтических метoдов c испoльзовaнием R

Введениe в R - cистему cтатиcтического анализa дaнных (Обзор R-средств для решения избранных проблем)

Схема: Data Visualization with ggplot2

Мaстицкий C. Рабoта с RStudio

Слід нагадати, що автори навели тут посилання на електронні версії кількох книг не задля отримання прибутку, а для підтримки навчання студентів (та власних зусиль по засвоєнню R). Деякі з цих книг запропоновані для розповсюдження їх авторами (як-от, наприклад, підручник Р. Є. Майбороди); деякі використані тут без дозволу їх авторів та видавництв. Автори цього підручника просять розглядати дані посилання як рекламні.