Statistical Oracle — 03. Використання мови R






       

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

Тема 2. Використання програми Statistica: файл-приклад PelophylaxExamples

Тема 3. Використання мови R

Тема 4. Робота з даними в R

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

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

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

 

Тема 3. Використання мови R

3.1. Загальні відомості про 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+. Співробітники статистичного факультету Оклендського університету (в Новій Зеландії) Росс Іхака і Роберт Джентлмен з 1992 року розпочали роботу над вирішенням цієї задачи. У 1993 році з'явилася перша експериментальна реалізація цієї вільної статистичної мови програмування. За аналогією з S, ця мова також отримала назву з однієї літери — першої літери імен її «батьків». З часом співтовариство R надзвичайно розрослося. В цілому, ця мова — масштабний результат альтруїстичної діяльності величезної спільноти інтелектуалів усієї земної кулі. Центром, навколо якого організована ця спільнота, є сайт r-project.org

R — безкоштовний відкритий продукт. Це — мова програмування для вирішення задач в області статистики і моделювання, а також середовище з відкритом програмним кодом для обчислювань та графіки. R поширюється як відкритий програмний код, а також як відкомпільована (переведені з мови програмування на мову комп'ютерних кодів) програма. R є доступним під Linux («спорідненою» операційною системою, іншим результатом проєкту GNU), Windows та MacOC. 

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

Щоб почати працювати з R, його слід встановити. Інсталятор R завантажується тут. З R можна працювати безпосередньо, а можна використовувати різні оболонки. Тут ми будемо використовувати оболонку RStudio. Це також вільний продукт, інсталятор якого можна завантажити тут. Встановлювати RStudio слід обов'язково після R, а не до нього. Далі слід запускати саме RStudio і працювати в ньому.

Слід пояснити позначення, що будуть використовуватися в цьому посібнику. У цьому тексті ми будемо наводити імена функцій, використовувати назви об'єктів та досить часто наводити приклади команд. Щоб було зрозуміло, що певну послідовність символів можна застосовувати як команду («згодувати» R, припустимо, через RStudio, та отримати заплановану відповідь), ми будемо брати команди R у прямокутні рамки. Важливою частиною команд R є імена об'єктів, адреси тощо. У нашому викладенні ми будемо ставити на потрібні місця умовні позначення, набрані курсивом та великими літерами. Наприклад, команда is.logical(OBJECT$VARIABLE) перевіряє, чи є числовою змінна Variable в об'єкті Object. Цю команду можна скопіювати і вставити в консоль або редактор скриптів RStudio, але треба замінити назви об'єкту та змінної на ті, що потрібні.

Крім того, іноді ми будемо включати в текст результати, які R виводить у консолі. У такому разі весь такий фрагмент тексту ми будемо поміщувати у загальну рамку, як це зроблено нижче, в R-діалозі 3.1.1. Ми будемо нумеровати R-діалоги як таблиці, і будемо посилатися на них подібним чином.

R-діалог 3.1.1. Приклад виводу інформації у консолі RStudio: результат виконання найпростішої арифметичної операції

> # Приклад R-діалогу (після знаку # — коментарі):
> 2 + 2 # Коментарі можна вставляти навіть у рядки після команд:
[1] 4
> 

 

Відразу слід пояснити, що можна побачити у R-діалогах. Це — RStudio console output, як це показано далі на рис. 3.4.1. Запрошення системи має вигляд знаку >. Те, що стоїть після нього — команди, які виконувалися (в цьому прикладі R шукав значення 2+2). Ця команда могла бути введеною прямо в консоль R, або ж у редактор кодів. У більшості випадків автори писали скріпти, запускали виконання їх фрагментів та переносили у структурні елементи підручника відповіді R з консолі RStudio. 

У багатьох випадках (як показано в R-діалозі 3.1.1) елементи відповіді R нумеруються у квадратних лапках (до речі, в R, на відміну від багатьох мов програмування, перший елемент ряду має № 1, а не № 0). Відповідь на команду 2+2 складалася з одного елементу. Якщо б їх було настільки багато, що їх вивід зайняв би кілька рядків, на початку кожного стояв би номер першого елементу у рядку (наприклад, такий результат показано нижче, в табл. 3.6.1).

Читати R-діалоги слід таким чином. Після знаку > та символу # йдуть коментарі, що пояснюють те, що відбувається (вони необов'язкові). Те, що йде після знаку > та виділено напівжирним шрифтом — це команди R, які виконувалися (у тексті підручника їх маркує прямокутна рамка: 2 + 2). Після команд також можна додавати коментарі. Усе інше — відповіді R.

Інші особливості мови R стануть зрозумілі у подальшому обговоренні. Тут слід звернути увагу лише на такі обставини. 

Багато виразів R мають вигляд  a <- b. Його сенс такий: змінній (об'єкту, що має ім'я та значення) a привласнюється значення b. Звісно, можна було б писати a = b, але таке рішення є не рекомендованим, адже знак = використовується в інших ситуаціях. Щоб швидко вставити у код сполучення <-, можна одночасно натиснути Alt та -.

Ще одна особливість R полягає в тому, що, незалежно від регіональних стандартів, десятковим розділювачем в ньому є точка. 1.5 — це один та п'ять десятих, а 1,5 — текстовий вираз, що не є числом.

3.2. RStudio — оболонка для роботи з R

RStudio — вільне інтегроване середовище розробки, призначене для R. Вікно RStudio складається з декількох панелей, серед яких особливу увагу слід звернути на панель Source, редактор скриптів (script), тобто збережених послідовностей команд, та панель Console, консоль, (рис. 3.2.1).

Рис. 3.2.1. Вікно RStudio під час роботи. Основні елементи: редактор скриптів (згори ліворуч), консоль (унизу ліворуч), оточення та історія (згори праворуч), графіки (унизу праворуч) 

На рис. 3.2.1 можна побачити типову картину роботи з RStudio. В окні редактора скриптів відкрито скріпт Sperm.R (*.R — типове розширення скриптів). Цей скрипт було виконано (його виділили сполученням клавіш Ctrl+A, і після цього натиснули кнопку Run). В консолі можна побачити результати виконання скрипту (у редакторі видно покаток низки команд, а у консолі — результат виконання останніх команд). У виконаному скрипті спочатку задавалося робоча директорія, підгружався та активувався необхідний пакет, а після цього — створювалася таблиця, яка також має назву Sperm. Ці етапи пояснювалися у скрипті. Для цього використовують рядки, що починаються з символу #; усе, що йде після цього символу, програма ігнорує, але демонструє зеленим кольором для користувача.

В об'єкт (фрейм даних, таблицю) Sperm завантажується інформація з файлу, який було створено у електронних таблицях (в Calc). Об'єкт Sperm можна побачити у вікні Environment. Після того, як цей об'єкт було створено, згідно з заданою у скрипті послідовністю дій було побудовано низку графіків. Для цього було використано функцію qplot, що входить у склад пакету ggplot2. У скрипті послідовно створюється низка графічних об'єктів, які будує функція qplot. Аргументи цієї функції задають змінну, об'єкт, тип графіку, підписи осей координат, підпис графіку в цілому. Створені графіки один за одним демонструються у вікні Plots, а потім окремою командою зберігаються у робочій директорії. Їх характеристики можна подивитися у вікні Environment; крім того, можна перейти на вкладку Files, щоб передивитися будь-який з цих файлів.

Під час створення скрипту буває корисним пробувати різні варіанти команд. Їх можна вводити відразу у консоль. Тільки-но ви закінчили писати рядок у консолі та написнули Enter — цей рядок буде виконано. Панель Console дозволяє виконувати окремі команди, в ній відбивається результат виконання команд, поданих як з цього вікна, так і з редактора кодів. Але іноді має сенс виконувати не окремі команди, а їх більш-менш довгі послідовності або скрипти цілком. Саме тут стає у нагоді 

На рис. 3.2.1 видно результати виконання скрипту цілком. Це — не єдиний можливий варіант. Часто корисно виконувати скріпт покроково. Для виконання поточного рядку коду можна скористатися поєднанням клавіш Ctrl+Enter або кнопкою Run Line(s), що розташована у верхній частині вікна редактора. Код буде виконаний, і курсор переміститься на наступний рядок. Для виконання відразу декількох рядків (або частини рядка) треба виділити необхідний фрагмент і натиснути клавіші Ctrl+Enter або Run Line(s). Щоб виконати всі рядки скрипту, слід або виділити його цілком, або натиснути Ctrl+Shift+Enter.

Ctrl+1 — переміщує курсор у вікно редактора скриптів; Ctrl+2 — переміщує курсор в консоль; Ctrl+L — очищає вікно консолі від тексту; Esc — перериває обчислення.

Панель History (історія) дозволяє переглянути історію команд, виділити деякі з них і відправити в консоль (Send to Console) або в редактор скриптів (Send to Source).

 

3.3. Типи об'єктів. Пакети

Як вже сказано, в R є data objects та function objects. Типові data objects в R такі:
— вектор (vector);
— матриця (matrix); 
— масив (array);
— часовий ряд (ts);
— фрейм даних, датафрейм, таблиця (data frame);
— фактор (factor);
— список (list).

Найпростішим об'єктом в R є вектор (іменований одновимірний об'єкт, що містить дані одного певного типу); навіть число розглядається у цій мові як вектор одиничної довжини. Атрибутами вектора є як значення, які він містить, так і тип даних в ньому. Існують такі прості типи векторів та інших об'єктів, що можуть бути побудованими з векторів:
— логiчний (logical) — елементи «iстинно» (TRUE, T) та «хибно» (FALSE, F);
— числовий (numeric) — дiйсні числа;
— цiлий (integer) — цiлі числа;
— комплексний (complex) — комплексні числа;
— символьний (character) — символьнi рядки. 

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

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

Часові ряди подібні до векторів, але відбивають певну часову послідовність, містять частоту спостережень та дату. Списки побудовані як вектори, але складаються з об'єктів, що можуть містити дані різних типів. Фактори — це аналоги векторів, значення яких можуть братися лише з певного переліку. Значення, які може набувати фактор, називають його рівнями (levels). Наприклад, якщо нас цікавить температура тіла певної кількості хворих, ми можемо задати її у числовій формі (36.7, 35.1, 38.7, 36.6, 42.1, 36.5, 37.8,...), а можемо використати фактор (нормальна, знижена, підвищена, нормальна, крітично підвищена, нормальна, підвищена, ...); з цього прикладу зрозуміло, які рівні може приймати обговорюваний фактор.    

Об'єкти можуть бути організовані в пакети, package. Пакети можуть входити до складу бібліотек, library. Використання пакетів є причиною того, що хоча мова R є досить простою, її мінімальний набор можливостей може майже необмежено розширятися. Величезна кількість програмістів та вчених розробляють нові функції, що можуть бути реалізовані в R. До речі, пакети можуть бути написані як на мові R, так і на інших мовах. Ці пакети можна отримувати зі сховища і додавати до складу мінімальної реалізації R, яка отримується під час інсталяції. Кількість доступних пакетів для R на час написання цього тексту ставить близько 16 тисяч; вони перекривають майже усі статистичні процедури, що розроблені людством. Хоча для початку роботи з R треба подолати досить високий поріг входження, в подальшому ці зусилля сторицею виправдовуються завдяки можливості використовувати різноманітні розширення для R. 

Інформацію про пакет можна отримати так: library(help=PACKAGE). В інсталятор R включені базові (base) і рекомендовані (recommended) пакети. Дізнатися, які пакунки встановлено на комп'ютері, можна командою library(). Щоб додати пакет, його потрібно спочатку завантажити install.packages("PACKAGE"), а потім включити: library(PACKAGE). Зверніть увагу, що у першому випадку назву пакету узято у лапки, а у другому — ні; неврахування такого роду деталей є поширеною причиною помилок у роботі R. Як багато інших функцій, функція install.packages може використовуватися з необов’язковими атрибутами. Наприклад, якщо вказати install.packages("PACKAGE", dependencies = TRUE), у разі, якщо для нормальної роботи пакету PACKAGE необхідні якісь інші пакети, вони встановляться разом. Якщо спробувати звернутися до функції пакета, який ще не включено у системі, R видасть повідомлення про помилку.

Характерною ознакою функцій є круглі дужки, у які вміщуються аргументи, що задають об'єкти, з якими працюють функції, та особливості їх роботи. Звісно, є функції, що використовуються буз дужок, як-от арифметичні операції. Але це виключення. Деякі функції навіть не мають аргументів, але усе рівно застосовуються з дужками. Наприклад, команда: ls() виведе перелік об'єктів, які зараз активні у оточенні, environment, програми. У дужки у даному випадку не треба нічого ставити, вони просто демонструють, що ми маємо справу з функцією. Якщо ми введемо команду ls , ми отримаємо у консолі RStudio код функції ls(). Крім того, щоб отримати допомогу по використанню функції, можна ввести її ім'я зі знаком питання ?ls(); справка з'явиться у правому нижньому вікні RSudio. До того ж самого результату приведе команда help(ls). Щоб отримати список аргументів якоїсь функції (наприклад, lm(), яка забезпечує підгонку лінійних моделей), можна використовувати функцію args(): args(lm).

У ході роботи з R вам доведеться створювати об'єкти та надавати їм імена. Імена об'єктів мають починатися з букви, не можуть мати пробіли, але можуть мати крапки. Деякі імена, які зайняті під назви функцій R, використовувати, по зрозумілим причинам, неможливо.

Скріпт R складається з рядків, кожен з яких є певною командою. У разі, якщо у один рядок треба записати дві послідовні команди, їх розділюють точкою з комою(;). Записані у різні рядки команди ніяк особливо розділяти не треба. Якщо команда не вмістилася у один рядок, її можна продовжувати у наступному — R зрозуміє, що це не нова команда, а продовження старої, адже інтерпретатор цієї мови аналізує синтаксис команди. Як ви можете зрозуміти, незакриті дужки (чи інші порушення синтаксису) призведуть до помилок. 

Під час написання скрипту його можна супроводжувати поясненнями. Як вже вказано, пояснення розміщуються праворуч від символу #. Цей символ можна помістити після певної команди скріпту або на початку рядка. Програма буде ігнорувати усе, що написано після символу # до самого кінця рядка.

 

3.4. Початок роботи

Ви зайшли в RStudio. Ще нема ані завантаженого скрипту, ані файлу з даними. Якщо є бажання або потреба, на цьому етапі RStudio можна використовувати як калькулятор (рис. 3.4.1).

Рис. 3.4.1. RStudio вирахував вираз, який було уведено до консолі. В вікні History лишився запис про цей крок. Саме цей приклад консольного виводу показано в таблиці 3.1.1 

Підтвердженням того, що система готова до роботи, є символ >. Команди, що вводяться у консоль, підсвічуються синім. Після того, як команду уведено, система видає результати. Результати, які виводить R, нумеруються, починаючи з [1]. 

Скоріше за все, RStudio має працювати з якимось файлами. Їх можна створити прямо в програмі, а можна загрузити; більш поширеним є другий варіант. Спочатку слід зазначити робочу директорію для R, як це було зроблено на прикладі, показаному на рис. 3.2.1. Зручно, коли кожен окремий аналіз, окремий файл даних, з яким працюють у R, знаходиться у своій директорії. Створимо директорію для аналізу, з яким будемо працювати, Робочий файл слід або помістити в робочу директорію RStudio, або розмістити там, де треба, змінивши в RStudio робочу директорію. Щоб вказати робочу директорію засобами RStudio, слід пройти наступним шляхом: Session / Set Working Directory / Choose Directory. Крім того, можна просто увести команду setwd("PATH"). Шлях до директорії треба вказувати повністю, з фізичного або логічного диску у Windows  або материнської директорії у Linux.

Розглянемо для початку приклад створення файлу даних прямо під час R-сесії. Уведемо дані про довжину тіла (L) та ширину голови (Ltc) представників Pelophylax lessonae з файлу PelophylaxExample. Для цього ми створимо два вектори, один — для змінної L, другий — для Ltc. Перша жаба буде першою в обох цих векторах, друга — другою тощо. Щоб створити вектори, використаємо операцію привласнення: задамо ім'я, використаємо символ <- і функцію c(), яка перетворює свої аргументи на вектор або список (combine).

Якщо редактор скриптів закрито, відкроємо його сполученням Ctrl+1. Введемо в нього наступний текст:

L <- c(603, 562, 592, 595, 602)
Ltc <- c(194, 187, 195, 199, 218)
plot(L, Ltc)

В двох перших командах ми використали характерний для R символ присвоєння: <-. Його значення просте: певним ім'ям (у першому випадку — L) слід назвати певну змінну (у першому випадку — вектор, що утворено з п'яти чисел). Тут використано також функцію c, що поєднує об'єкти у вектор.

Виділимо усі три рядки у редакторі скриптів та натиснемо кнопку Run (або послідовно будемо ставити курсор після кожного з рядків команд та натискати Ctrl+Enter). Ось що ми отримаємо (рис. 3.4.2):

Рис. 3.4.2. Безпосередньо у RStudio було створено найпростіші об'єкти з даними та побудовано графік

У редакторі скриптів — текст команд, які були виконані. У консолі — виконані команди. У вікні Environment — два створені вектори. У вікні Plots — побудований відповідно до поданої команди графік. Звісно, можливості R не обмежені графіками.

Додамо у редактор скриптів (звісно, якщо є бажання, можна ввести їх прямо у консоль) наступні команди:

cor(L, Ltc)
cor.test(L, Ltc)
cor.test(L, Ltc, method = "spearman")

Результат буде таким (R-діалог 3.4.1).

R-діалог 3.4.1. RStudio console output. Приклад розрахунку коефіцієнтів кореляції

> cor(L, Ltc) # Обчислення коеффіцієнту кореляції Пірсона
[1] 0.6296008
> cor.test(L, Ltc) # Більш детальна інформація щодо коеффіцієнту кореляції Пірсона

    Pearson's product-moment correlation

data:  L and Ltc
t = 1.4036, df = 3, p-value = 0.255
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.5683954  0.9719646
sample estimates:
      cor 
0.6296008 

> cor.test(L, Ltc, method = "spearman") # Обчислення коеффіцієнту кореляції Спірмана

    Spearman's rank correlation rho

data:  L and Ltc
S = 12, p-value = 0.5167
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.4
> 

 

Після знаку > R виводить відповіді на подані команди. Функція cor(FIRST, SECOND) є самою простою. У відповідь R просто розраховує коефіцієнт кореляції за Пірсоном; можна впевнитися, що він складає приблизно 0,63. Якщо нас цікавить значущість отриманого коефіцієнту, нам потрібна функція cor.test(FIRST, SECOND). У відповідь R виведе більш детальний звіт. Можна побачити, що p=0,24, тобто коефіцієнт кореляції не є значущим: такі відносини між значеннями двох векторів могли з'явитися просто внаслідок випадковості і не обов'язково свідчать про наявність зв'язку між ними. Цікаво, що у 95% довірчий інтервал значень коефіціенту кореляції Пірсона входить навіть негативна кореляція між розглянутими векторами. Причину неважко зрозуміти: 5 особин є зовсім невеликою вибірку і, дійсно, співвідношення між зареєстрованими значеннями можуть бути результатом випадковості.

Як ми будемо обговорювати пізніше, коефіцієнт кореляції Пірсона є параметричним методом; він засновується на припущенні, що вибірки отримані з генеральної сукупності, що має нормальний розподіл. Якщо ми не знаємо, яким є розподіл досліджуваних ознак, слід використовувати коефіцієнт кореляції Спірмана. Щоб отримати розрахунок цієї величини, у команду слід додати відповідний атрибут cor.test(FIRST, SECOND, method = "spearman"). Можна побачити, що потужність цього методу є меншою за попередній (це типово для випадку переходу від параметричних до непараметричних методів). 

 

3.5. Читання файлів *.csv

Робота в R найчастіше йде з фреймам даних, DataFrame. Для початківців в R типовою може бути ситуація, коли вже наявний файл з даними слід перенести в це середовище. Серед інших форматів R приймає файли з розширенням *.csv, Comma-Separated Values. Це поширений формат, який можна використовувати у якості шлюзу між різними програмами. Фактично, це текстовий файл, де дані таблиці представлені у вигляді рядків. Окремі комірки таблиці при цьому відділяються певним знаком пунктуації (в стандартному випадку це — коми). Прикладом такого файлу може бути PelophylaxExample.csv, посилання на який вже наводилося раніше.

Якщо б у файлі PelophylaxExamples.csv комірки були б розділені комами, а десятковим знаком була б точка, щоб відкрити його у RStudio або напряму у R, було б достатньо увести команду PE <- read.csv('PelophylaxExamples.csv'). Ця команда читає файл PelophylaxExamples.csv, який має бути розташованим у робочій директорії R, та зберігає результат читання як фрейм, що має ім'я PE. На жаль, у даному випадку ця команда спрацює. Річ у тім, що під час створення цього файлу були використані інші роздільники (рис. 3.5.1), адже файли *.csv можуть бути різними.

Рис. 3.5.1. Створення файлу PelophylaxExamples.csv в LibreOffice Calc. Десятковий роздільник — кома, між полями — крапка з комою

Зберегти таблицю в форматі *.csv можна в Exсel, Calc та багатьох інших програмах через пункт меню «Зберегти як...». Втім, з тими настройками, з якими найчастіше доводиться мати справу користувачам в Україні, Exсel використовує коми як десяткові роздільники. Для відокремлення комірок таблиці в такому випадку Exсel буде використовувати крапку з комою. Щоб прочитати файл *.csv, що зроблено так, як на рис. 3.5.1, слід використати таку команду PE <- read.csv('PelophylaxExamples.csv', sep = ";", dec = ",").

До речі, певні труднощі можуть виникати при читанні файлів, де є кирилиця (найпростіше рішення — не використовувати її в статистичних файлах загалом!). Коли кирилиця читається неправильно, слід встановити, з якою кодировкою було збережено файл *.csv та вказати необхідну кодировку окремим атрибутом, наприклад  OBJECT <- read.csv('FILENAME.csv', sep = "SIMBOL", dec = "SIMBOL", encoding = "UTF-8") або  OBJECT <- read.csv('FILENAME.csv', encoding = "Windows-1251").

Зверніть увагу! Як це зроблено у попередній команді, ім'я файлу слід вводити з одинарними прямими лапками, а символи, які треба використовувати як розділювачі, — брати у подвійні прямі лапки. Загалом, важливим джерелом помилок, які можуть перешкоджати роботі в R, є плутанина з різновидами знаків пунктуації. Наприклад, якщо ви напишете так: sep = “;”, R його просто нічого не зрозуміє. Подвійні (як і одинарні) лапки повинні бути прямими, тобто такими, які в найбільш поширеною розкладці ставляться при натисканні клавіші, що відповідає за українську літеру «Є» або російську — «Э» (до речі, ось приклад третього типу лапок). Щоб R виконав команду, треба писати виключно sep = ";"). На щастя, ви можете побачити, чи «розуміє» вас RStudio. Якщо RStudio приймає синтаксис введеного тексту, він підсвічує назви файлів, роздільники і інші елементи набраного користувачем тексту (рис. 3.5.2).

Рис. 3.5.2. «Підсвічування» елементів тексту в RStudio: у другому рядку ім'я файлу і знак десяткового розділювача (dec) підсвічені зеленим, а знак розділювача комірок (sep) — ні (там використано неправільні лапки)

Загалом, RStudio достатньо зручні засоби допомоги під час створення команд. Припустимо, ми плануємо роздивитися структуру створеного фрейму з використанням команди str(NAME). Під час набору назви функції RStudio у віконці, що спливає (хінті), запропонує варіанти, що починаються подібним чином, та виведе нагадування про властивості цих функцій (рис. 3.5.3). RStudio запропонує можливі варіанти продовження початого тексту під час зупинки у наборі або при натисканні клавіши Tab.

Рис. 3.5.3. Спливаючі віконця в RStudio можуть бути дуже корисними; викликати підказку можна клавішею Tab

До речі, наслідком виконання обговорюваної команди буде наступний вивід (R-діалог 3.5.1).

R-діалог 3.5.1. Структура фрейму PE

> str(PE) # Виклик структури фрейму PE
'data.frame':    57 obs. of  15 variables:
 $ X      : Factor w/ 57 levels "LL_f_562","LL_f_592",..: 4 1 2 5 3 9 16 10 13 7 ...
 $ Place  : Factor w/ 25 levels "Balakliya","Chernetchina",..: 12 2 2 2 2 11 5 5 13 13 ...
 $ East   : num  35.2 35.1 35.1 35.1 35.1 ...
 $ North  : num  50.1 50 50 50 50 ...
 $ Basin  : Factor w/ 2 levels "Dnipro","Don": 1 1 1 1 1 2 2 2 2 2 ...
 $ Sex    : Factor w/ 2 levels "female","male": 1 1 1 2 1 1 2 1 2 1 ...
 $ DNA    : num  14 13.9 14 13.9 14 ...
 $ Genotyp: Factor w/ 5 levels "LL","LLR","LR",..: 1 1 1 1 1 2 2 2 2 2 ...
 $ L      : int  603 562 592 595 603 625 589 658 528 557 ...
 $ Ltc    : int  194 187 195 199 218 221 216 241 196 200 ...
 $ Fm     : int  264 266 281 285 287 303 290 306 257 251 ...
 $ T      : int  255 249 261 286 281 292 277 304 246 257 ...
 $ Dp     : int  76 62 79 75 80 83 77 96 66 67 ...
 $ Ci     : int  42 41 37 38 45 37 37 34 31 33 ...
 $ Cs     : int  119 152 132 114 158 145 152 170 127 143 ...
> 

 

 

3.6. Перегляд даних на прикладі фрейму PelophylaxExample

Наприкінці попереднього пункту наведено відповідь R на команду  str(PE). Перелічено кількість рядків (observations) і стовпців (variables). Побудова фрейму даних відповідає найпоширенішому статистичному стандарту. Рядкам відповідають окремі спостереження, окремі порівнювані об'єкти; стовпцям — змінні, ознаки цих об'єктів. Спочатку вказано тип об'єкту, а також загальну кількість спостережень та змінних, а після цього наведено перелік змінних та значення перших 10 спостережень. Назви змінних йдуть після символу $. так, PE$Place — це змінна з назвами місць збору досліджуваних особин. Перший стовбчик з кодами жаб не мав назви; R позначив його як PE$X.

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

Змінні, де знаходилися числа з десятковими знаками (географічні координати та кількість ДНК), трактуються як числові (numeric) вектори. Там, де булі лише цілі значення, вектори є цілочисловими (integer).

Що б було, якщо б ми позначали стать жаб числами (1 та 2)? R вирішив би, що це цілочислений вектор. Якщо б ми захотіли порівнювати самиць та самців, нам би довелося спеціальною командою повідомити R, що це — фактор. Саме такою була ситуація у прикладі, що був показаний на рис. 3.2.1. У стовпці Sperm$Male там знаходилися номери різних самців, а у стовпці Sperm$Sample — номери проб. Щоб порівнювати різних особин або ж різні проби, треба було зробити ці змінні факторами. Саме тому там подавалися команди Sperm$Male <- factor(Sperm$Male) та Sperm$Sample <- factor(Sperm$Sample).

А що буде, якщо ввести ці команди у тому скрипті R, де було створено фрейм PE? R повідомить про помилку: в його оточенні в цьому сеансі відсутній фрейм Sperm. А як перевірити, чи є певна змінна фактором? За допомогою команди  is.factor(DATAFRAME$VARIABLE). За допомогою іншої команди можна перевести стовпчик у потрібний тип: as.integer(DATAFRAME$VARIABLE).  Відповідь системи буде приблизно такою (R-діалог. 3.6.1). Зверніть увагу, як пронумеровані елементи вектора. У перший рядок вмістилося 36 значень, перше значення у другому рядку має № 37.

R-діалог 3.6.1. RStudio перетворив фактор у цілі числа та вивів його у консолі

> is.factor(PE$Sex) # Перевірка, чи є змінна Sex фактором
[1] TRUE
> as.integer(PE$Sex) # Перетворення змінної на фактор
 [1] 1 1 1 2 1 1 2 1 2 1 2 2 1 1 1 1 2 1 2 1 1 2 2 1 2 1 2 2 1 1 2 2 2 1 2 1
[37] 1 1 2 2 1 1 2 2 2 1 1 1 1 2 1 1 1 2 2 2 2
> 

 

У останньому прикладі R просто навів усі значення переведеного у цілочисловий режим вектора. У перший рядок вмістилося 36 значень, і R показав, що починає наступний рядок з тридцять сьомого елемента. 

До речі, ви зрозуміли, що результат команд  Sperm$Male <- factor(Sperm$Male) та as.factor(Sperm$Male) буде відрізнятися лише тим, якій звіт виведе R у консолі? Вибір між такими альтернативами і характеризує стиль програмування, що є характерним для кожного користувача.

Крім функції str() для того, щоб познайомитися з фреймом дуже корисною може бути функція summary().

R-діалог 3.6.2. Результат виконання функції summary()

> summary(PE) # Функція summary() надає багато корисної інформації
         X                    Place         East           North      
 LL_f_562 : 1   Gaydary          : 7   Min.   :35.13   Min.   :49.09  
 LL_f_592 : 1   Verbunivs`kaDacha: 6   1st Qu.:36.31   1st Qu.:49.42  
 LL_f_602 : 1   DobritzkiyYar    : 5   Median :36.38   Median :49.56  
 LL_f_603 : 1   KreydyanaDacha   : 5   Mean   :36.37   Mean   :49.66  
 LL_m_595 : 1   Chernetchina     : 4   3rd Qu.:36.80   3rd Qu.:50.04  
 LLR_f_479: 1   Balakliya        : 3   Max.   :37.19   Max.   :50.21  
 (Other)  :51   (Other)          :27                                  
    Basin        Sex          DNA        Genotyp        L        
 Dnipro: 9   female:31   Min.   :13.95   LL : 5   Min.   :479.0  
 Don   :48   male  :26   1st Qu.:14.91   LLR:11   1st Qu.:564.0  
                         Median :16.13   LR :14   Median :653.0  
                         Mean   :18.21   LRR:13   Mean   :646.9  
                         3rd Qu.:21.83   RR :14   3rd Qu.:706.0  
                         Max.   :22.98            Max.   :930.0  
                                                                 
      Ltc              Fm              T               Dp        
 Min.   :186.0   Min.   :231.0   Min.   :246.0   Min.   : 62.00  
 1st Qu.:200.0   1st Qu.:266.0   1st Qu.:280.0   1st Qu.: 77.00  
 Median :221.0   Median :316.0   Median :319.0   Median : 91.00  
 Mean   :229.3   Mean   :312.7   Mean   :318.1   Mean   : 90.02  
 3rd Qu.:255.0   3rd Qu.:341.0   3rd Qu.:356.0   3rd Qu.: 99.00  
 Max.   :338.0   Max.   :462.0   Max.   :461.0   Max.   :139.00  
                                                                 
       Ci              Cs       
 Min.   :27.00   Min.   :114.0  
 1st Qu.:32.00   1st Qu.:143.0  
 Median :37.00   Median :158.0  
 Mean   :37.81   Mean   :160.5  
 3rd Qu.:43.00   3rd Qu.:177.0  
 Max.   :53.00   Max.   :240.0 
> 

 

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

Наостанок зазначимо, що роздивиться фрейм можна й самим простим способом — подивитися на нього цілком. Перш за все, можна просто ввести в редакторі скриптів або в консолі його назву:  PE. R виведе у консолі усі дані цього об'єкту (якщо він буде дуже великим — лише частину). Втім, у такому вигляді працювати з фреймом буде не дуже зручно. Краще просто клацнути мишею у вікні Environment по опису об'єкта, що нас цікавить (у нашому випадку — по надпису «57 obs. of 15 variables»; встановіть самі, що буде, якщо обрати назву об'єкта: «PE»!), або, що теж саме, ввести команду  View(PE) (рис. 3.6.1).

Рис. 3.6.1. У лівому верхньому куті RStudio відкрито не редактор скриптів, а об'єкт PE

А якщо дані слід не лише роздивлятися, а змінювати? Використайте команду  edit(PE) (рис. 3.6.2)!

Рис. 3.6.2. За допомогою функції edit() викликано редактор даних; фрейм даних має в ньому більш-менш звичний вигляд і нагадує лист електронних таблиць

Наведемо ще кілька корисних команд. Команда length(OBJECT) повідомить кількість елементів (компонентів) у об'єкті;  ncol(OBJECT) — кількість стовпцов, змінних;  nrow(OBJECT) — кількість рядків, випадків;  dim(OBJECT) — кількість вимірів, dimensions, тобто і стовпців, і рядків; class(OBJECT) — тип об'єкту, mode(OBJECT) — тип даних (list — у разі даних різних типів), names(OBJECT) — назви частин (наприклад, змінних). Ми вже використовували функцію c, яка поєднує об'єкти у вектор: c(OBJECT1, OBJECT2, ...); cbind(OBJECT1, OBJECT2, ...) поєднує об'єкти у вигляді стовпців, а rbind(OBJECT1, OBJECT2, ...) — рядків. Команда OBJECT виводить у консоль весь об'єкт (або його частину, якщо він дуже великий), head(OBJECT) — виводить першу частину (початок) об'єкту (а, наприклад,  head(OBJECT, 3) — перші три рядки), а tail(OBJECT) — його останню частину, кінець. Якщо ви бажаєте проглядати першу частину об'єкту не в консолі, а у більш зручному вікні, можна подати команду  View(head(OBJECT)) (зверніть увагу: команда View() починається з великої літери!). Команда ls() виводить у консолі перелік об'єктів, що наявні у робочому оточенні.

 

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

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

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

Майборода Р. Є. Комп'ютерна статистика. К.: ВПЦ «Київський університет», 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. Ця книга доступна також у вигляді гіпертексту у Мережі.

Остання книга переведена на російську, але, на жаль, її електронної версії у авторів цього підручника нема.  Крім її електронної версії, є й інші довідкові матеріали по R у мережі. Серед них:

R Programming Tutorial

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

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

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

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

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

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

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

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

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

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

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

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

Схема: Data Visualization with ggplot2

Мастицкий С. Работа с RStudio

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