Главная страница

А. Б. Шипунов, Е. М. Балдин, П. А. Волкова, А. И. Коробейников, С. А. Назарова


Скачать 3.04 Mb.
НазваниеА. Б. Шипунов, Е. М. Балдин, П. А. Волкова, А. И. Коробейников, С. А. Назарова
Анкорrbook
Дата29.09.2022
Размер3.04 Mb.
Формат файлаpdf
Имя файлаrbook.pdf
ТипДокументы
#705644
страница5 из 19
1   2   3   4   5   6   7   8   9   ...   19
В текущую папку будет записан файл trees.csv, созданный из встро- енной в R таблицы данных trees. «Встроенная таблица» означает, что эти данные доступны в R безо всякой загрузки, напрямую. Кстати го- воря, узнать, какие таблицы уже встроены, можно командой data()
(именно так, без аргументов).
А что, если надо записать во внешний файл результаты выполнения команд? В этом случае используется команда sink():

R и работа с данными: вид снаружи
37
> sink("1.txt", split=TRUE)
> 2+2
[1] 4
> sink()
Тогда во внешний файл запишется строчка «[1] 4», то есть резуль- тат выполнения команды. (Мы задали параметр split=TRUE, для того чтобы вывести данные еще и на экран.) Сама команда записана не бу- дет, а если вы хотите, чтобы она была записана, придется писать что-то вроде:
> print("2+2")
[1] "2+2"
> 2+2
[1] 4
Другими словами, придется повторять каждую команду два раза.
Для сохранения истории команд служит, как мы уже писали выше,
команда savehistory(), а для сохранения всех созданных объектов —
save.image()
. Последняя может оказаться полезной для сохранения промежуточных результатов работы, если вы не уверены в стабильно- сти работы компьютера.
2.7.3. R как калькулятор
Самый простой способ использования R — это арифметические вы- числения. Например, выражение log10(((sqrt(sum(c(2,2))))^2)*2.5)
вычисляется так:
1. Из двух двоек создается вектор: c(2,2).
2. Подсчитывается сумма его членов: 2+2=4.
3. Извлекается квадратный корень: sqrt(4)=2.
4. Он возводится в квадрат: 2^2=4.
5. Результат умножается на 2.5: 4*2.5=10.
6. Вычисляется десятичный логарифм: log10(10)=1.
Как видите, круглые скобки можно вкладывать друг в друга. R рас- крывает их, вычисляя значение «изнутри наружу», а если скобки от- сутствуют, то следует правилам «старшинства» арифметических опе- раций, похожим на те, которым нас учили в школе. Например, в выра- жении 2+3*5 сначала будет вычислено произведение (3*5=15), а потом сумма (2+15=17). Проверьте это в R самостоятельно.

38
Как обрабатывать данные
2.7.4. Графики
Одним из основных достоинств статистического пакета служит раз- нообразие типов графиков, которые он может построить. R в этом смыс- ле — один из рекордсменов. В базовом наборе есть несколько десятков типов графиков, еще больше в рекомендуемом пакете lattice, и еще больше — в пакетах с CRAN, из которых не меньше половины строят как минимум один оригинальный график (а половина — это больше полутора тысяч!). Таким образом, по прикидкам получается, что раз- нообразных типов графики в R никак не меньше тысячи. При этом они все еще достаточно хорошо настраиваются, то есть пользователь лег- ко может разнообразить эту исходную тысячу на свой вкус. Здесь мы постараемся, однако, не описывать разнообразие R-графики, а остано- вимся на нескольких фундаментальных принципах, понимание которых должно существенно облегчить новичку построение графиков в R.
Рассмотрим такой пример (рис. 1):
> plot(1:20, main="Заголовок")
> legend("topleft", pch=1, legend="Мои любимые точки")
Тут много такого, о чем речи пока не шло. Самое главное — то,
что первая команда рисует график «с нуля», тогда как вторая — до- бавляет к уже нарисованному графику детали. Это и есть два типа графических команд, используемых в базовом графическом наборе R.
Теперь немного подробнее. plot() — основная графическая команда,
причем команда «умная» (а правильнее сказать — generic, или «об- щая»). Это значит, что она распознает тип объекта, который подлежит рисованию, и строит соответствующий график. Например, в приведен- ном примере 1:20 — это последовательность чисел от 1 до 20, то есть вектор
(подробнее о векторах см. ниже), а для «одиночного» вектора предусмотрен график, где по оси абсцисс — индексы (то есть номера каждого элемента вектора по порядку), а по оси ординат — сами эти элементы. Если в аргументе команды будет что-то другое, будет, скорее всего, построен иной график. Вот пример (рис. 2):
> plot(cars)
> title(main="Автомобили двадцатых годов")
Здесь тоже есть команды обоих типов, но немного иначе оформлен- ные. Как видите, не беда, что мы забыли дать заголовок в команде plot()
, его всегда можно добавить потом, командой title(). cars —
это встроенная в R таблица данных, которая использована здесь по пря- мому назначению, для демонстрации возможностей программы. Прочи- тать, что такое cars, можно, вызвав справку обычным образом (?cars).

R и работа с данными: вид снаружи
39 5
10 15 20 5
10 15 20
Заголовок
Мои любимые точки
Рис. 1. Пример графика с заголовком и легендой
Для нас сейчас важно, что это — не вектор, а таблица из двух коло- нок — speed и distance (скорость и тормозная дистанция). Функция plot()
автоматически нарисовала коррелограмму (scatterplot), где по оси x откладывается значение одной переменной (колонки), а по оси y —
другой, и еще присвоила осям имена этих колонок. Любопытным сове- туем проверить, что нарисует plot(), если ему «подложить» таблицу с тремя колонками, скажем встроенную таблицу trees.
Как мы уже писали, очень многие пакеты расширяют графические функции R. Вот, например, что будет, если мы применим к тем же дан- ным (1:20) функцию qplot() из пакета ggplot2 (рис. 3):
> library(ggplot2)
> qplot(1:20, 1:20, main="Заголовок")
(Мы уже писали выше, что команда library() загружает нужный пакет. Но пакета ggplot2 в вашей системе могло не быть! Если R не смог загрузить пакет, то нужно его скачать из Интернета и установить. Дела- ется это через меню или командой install.packages("ggplot2"). Дан-

40
Как обрабатывать данные
5 10 15 20 25 0
20 40 60 80 10 0
12 0
Автомобили двадцатых годов
Рис. 2. Пример графика, отражающего встроенные данные cars ные 1:20 мы повторили дважды потому, что qplot() работает немного иначе, чем plot()).
Получилось почти то же самое, но оформление выглядит сложнее.
Пакет ggplot2 и создавался для того, чтобы разнообразить слишком аскетичное, по мнению автора (это Hadley Wickham), оформление гра- фиков в R по умолчанию.
2.7.5. Графические устройства
Это второй очень важный момент для понимания устройства графи- ки в R. Когда вы вводите команду plot(), R открывает так называемое экранное графическое устройство и начинает вывод на него. Если сле- дующая команда того же типа (то есть не добавляющая), то R «сотрет»
старое изображение и начнет выводить новое. Если вы дадите команду dev.off()
, то R закроет графическое окно (что, впрочем, можно сде- лать, просто щелкнув по кнопке закрытия окна). Экранных устройств в R предусмотрено несколько, в каждой операционной системе — свое

R и работа с данными: вид снаружи
41 5
10 15 20 5
10 15 20 1:20 1:
20
Заголовок
Рис. 3. Пример графика с заголовком, полученного при помощи коман- ды qplot() из пакета ggplot2
(а в Mac OS X даже два). Но все это не так важно, пока вы не захотите строить графики и сохранять их в файлы автоматически. Тогда вам надо будет познакомиться с другими графическими устройствами. Их несколько (количество опять-таки зависит от операционной системы),
а пакеты предоставляют еще около десятка. Работают они так:
> png(file="1-20.png", bg="transparent")
> plot(1:20)
> dev.off()
Команда png() открывает одноименное графическое устройство, при- чем задается параметр, включающий прозрачность базового фона (удоб- но, например, для веб-дизайна). Такого параметра у экранных устройств нет. Как только вводится команда dev.off(), устройство закрывается,
и на диске появляется файл 1-20.png (на самом деле файл появляет- ся еще при открытии устройства, но сначала в нем ничего не записа- но). png() — одно из самых распространенных устройств при записи

42
Как обрабатывать данные файлов. Недостатком его является, разумеется, растровость. R поддер- живает и векторные форматы, например PDF. Здесь, однако, могут возникнуть специфические для русскоязычного пользователя трудно- сти со шрифтами. Остановимся на этом чуть подробнее. Вот как надо
«правильно» создавать PDF-файл, содержащий русский текст:
> pdf("1-20.pdf", family="NimbusSan", encoding="CP1251.enc")
> plot(1:20, main="Заголовок")
> dev.off()
> embedFonts("1-20.pdf")
Как видим, требуется указать, какой шрифт мы будем использовать,
а также кодировку. Затем нужно закрыть графическое устройство и встроить в полученный файл шрифты. В противном случае кирилли- ца может не отобразиться! Важно отметить, что шрифт «NimbusSan»
и возможность встраивания шрифтов командой embedFonts() обеспе- чивается взаимодействием R с «посторонней» программой Ghostscript,
в поставку которой входят шрифты, содержащие русские буквы. Кро- ме того, если вы работаете под Windows, то R должен «знать» путь к программе gswin32c.exe (другими словами, нужно, чтобы путь к этой программе был записан в системную переменную PATH), иначе встраива- ние шрифтов не сработает
1
. К счастью, если Ghostscript был установлен нормально, то проблем возникнуть не должно
2
Кроме PDF, R «знает» и другие векторные форматы, например,
PostScript, xfig и picTeX. Есть отдельный пакет svglite, который под- держивает популярный векторный формат SVG. График в этом форма- те можно, например, открыть и видоизменить в свободном векторном редакторе Inkscape.
2.7.6. Графические опции
Как уже говорилось, графика в R настраивается в очень широких пределах. Один из способов настройки — это видоизменение встроен- ных графических опций. Вот, к примеру, распространенная задача —
нарисовать два графика один над другим на одном рисунке. Чтобы это сделать, надо изменить исходные опции — разделить пространство ри- сунка на две части, примерно так (рис. 4):
> old.par <- par(mfrow=c(2,1))
1
На сообщения типа ... Invalid BaseEncoding name ... можно не обращать внимания.
2
Чтобы избежать всех этих сложностей, можно поставить пакет showtext, кото- рый позволяет встраивать в графики любые системные шрифты.

R и работа с данными: вид снаружи
43
> hist(cars$speed, main="")
> hist(cars$dist, main="")
> par(old.par)
0 5
10 15 20 25 0
5 10 15 0
20 40 60 80 100 120 0
5 10 15
Рис. 4. Две гистограммы на одном графике
Ключевая команда здесь — par(). В первой строчке изменяется один из ее параметров, mfrow, который регулирует, сколько изображе- ний и как будет размещено на «листе». Значение mfrow по умолчанию —
c(1,1)
, то есть один график по вертикали и один по горизонтали. Что- бы не печатать каждый раз команду par() со всеми ее аргументами, мы
«запомнили» старое значение в объекте old.par, а в конце вернули со- стояние к запомненному. Команда hist() строит график-гистограмму
(подробнее о ней рассказано в главе про одномерные данные).
2.7.7. Интерактивная графика
Интерактивная графика позволяет выяснить, где именно на графи- ке расположены нужные вам точки, поместить объект (скажем, подпись)

44
Как обрабатывать данные в нужное место, а также проследить «судьбу» одних и тех же точек на разных графиках. Кроме того, если данные многомерные, то можно вращать облако точек в плоскости разных переменных, с тем чтобы вы- яснить структуру данных. Еще несколько лет назад мы бы написали,
что здесь вам вместо R следует воспользоваться другими аналитиче- скими инструментами, но R развивается так быстро, что все эти мето- ды теперь доступны, и даже в нескольких вариантах. Приведем лишь один пример. Вот так можно добавлять подписи в указанную мыш- кой область графика (пока вы еще не начали проверять — после того как введена вторая команда, надо щелкнуть левой кнопкой мыши на какой-нибудь точке в середине, а затем щелкнуть в любом месте гра- фика правой кнопкой мыши и в получившемся меню выбрать Stop):
> plot(1:20)
> text(locator(), "Моя любимая точка", pos=4)
Интерактивная графика других типов реализована командой iden- tify()
, а также дополнительными пакетами, в том числе iplot, manipu- late
, playwith, rggobi, rpanel, и TeachingDemos.
* * *
Ответ на вопрос про то, как найти функцию R, зная толь- ко то, что она должна делать
. Чтобы, не выходя из R, узнать, как сделать, скажем, дисперсионный анализ, есть несколько способов. Пер- вый — это команда «??» (два вопросительных знака):
> ??anova
Help files with alias or concept or title matching ‘anova’
using fuzzy matching:
stats::anova
Anova Tables stats::anova.glm
Analysis of Deviance for Generalized
Linear Model Fits stats::anova.lm
ANOVA for Linear Model Fits stats::stat.anova
GLM Anova Statistics
Type ’?PKG::FOO’ to inspect entries ’PKG::FOO’, or
’TYPE?PKG::FOO’ for entries like ’PKG::FOO-TYPE’.

R и работа с данными: вид снаружи
45
Надо только знать, что дисперсионный анализ по-английски на- зывается «Analysis of Variance», или «ANOVA». Похожего результа- та можно добиться, если сначала запустить интерактивную помощь
(help.start()), а там перейти на поиск и задать в поле поиска то же самое слово anova.
Ну а если это не помогло, надо искать в Интернете. Сделать это можно прямо изнутри R:
> RSiteSearch("anova")
A search query has been submitted to http://search.r-project.org
The results page should open in your browser shortly
В браузере должно открыться окно с результатами запроса.

Глава 3
Типы данных
Чтобы обрабатывать данные, надо не просто их получить. Надо еще перевести их на язык цифр, ведь математика, на которой основан ана- лиз данных, оперирует по большей части именно с числами. Сделать это можно самыми разными способами, иногда — удачно, иногда — с натяжками.
Со времен Галилея, который говорил, что «следует измерять то,
что измеримо, и делать измеримым то, что таковым не является», ев- ропейская наука накопила громадный опыт в переводе окружающих явлений в измерения. Возникла и специальная наука об измерении —
метрология. Ко многим достижениям метрологии мы уже настолько привыкли, что совершенно их не замечаем. Если, например, ставится опыт с расширением металлического бруска при нагревании, само собой подразумевается, что для этого нам нужны термометр и линейка. Эти два прибора (да, именно прибора!) как раз и являются устройствами,
переводящими температуру и расстояние на язык цифр.
3.1. Градусы, часы и километры: интервальные данные
Очень важно, что температура и расстояние изменяются плавно и непрерывно. Это значит, что если у нас есть две разные температу- ры, то всегда можно представить температуру, промежуточную между ними. Любые два показателя температуры или расстояния представля- ют собой интервал, куда «умещается» бесконечное множество других показателей. Поэтому такие данные и называются интервальными. Ин- тервальные данные чаще всего сравнивают с хорошо известной нам из курса математики числовой прямой, на которой расположены так на- зываемые действительные (или, как их еще называют, вещественные)
числа. Можно еще вспомнить о рациональных числах — то есть таких числах, которые можно представить в виде дроби. И те, и другие очень близки по своей сути к интервальным данным.

Градусы, часы и километры: интервальные данные
47
Не всегда, однако, интервальные данные изменяются плавно и непре- рывно, от (как говорят математики) плюс бесконечности к минус беско- нечности. Пример перед глазами: температура соответствует не прямой,
а лучу, потому что со стороны отрицательной (слева) она ограничена абсолютным нулем, ниже которого температуры просто не бывает. Но на остальном протяжении этого луча показатели температуры мож- но уподобить действительным числам. Еще интереснее измерять углы.
Угол изменяется непрерывно, но вот после 359

следует 0

— вместо прямой имеем отрезок без отрицательных значений. Есть даже особый раздел статистики, так называемая круговая статистика (directional,
or circular statistics), которая работает с углами.
А вот другая ситуация. Допустим, мы считаем посетителей магази- на. Понятно, что если в один день в магазин зашло 947 человек, а в другой — 832, то очень легко представить промежуточные значения. К
тому же очевидно, что в первый день в магазине было больше народа.
Однако если взять два «соседних» числа, например 832 и 831, то про- межуточное значение представить нельзя, потому что люди на части не делятся. Получается, что такие данные соответствуют не действитель- ным, а скорее натуральным числам. У этих чисел тоже есть отношение порядка, но вот промежуточное значение есть не всегда. И отрицатель- ных значений у них нет. Перед нами — другой тип интервальных дан- ных, не непрерывный, а дискретный.
С интервальностью и непрерывностью данных неразрывно связан важный водораздел в методах статистики. Эти методы часто делят на две большие группы: параметрические и непараметрические. Парамет- рические тесты предназначены для обработки так называемых пара- метрических данных. Для того чтобы данные считались параметриче- скими, должны одновременно выполняться три условия:
1) распределение данных близко к нормальному (незнакомые терми- ны можно посмотреть в словаре);
2) выборка — большая (обычно не менее 30 наблюдений);
3) данные — интервальные непрерывные.
Если хотя бы одно из этих условий не выполняется, данные счи- таются непараметрическими и обрабатываются непараметрическими методами
. Несомненным достоинством непараметрических методов яв- ляется, как ни банально это звучит, их способность работать с непара- метрическими (то есть «неидеальными») данными. Зато параметриче- ские методы имеют б
0
ольшую мощность (то есть при прочих равных вероятность не заметить существующую закономерность ниже). Этому есть простое объяснение: непараметрические данные (если они, как это

48
Типы данных очень часто бывает, дискретны) имеют свойство «скрывать» имеющие- ся различия, объединяя отдельные значения в группы.
Так как параметрические методы доступнее непараметрических (на- пример, в курсах статистики изучают в основном параметрические ме- тоды), то часто хочется как-нибудь «параметризировать» данные. На распределение данных мы, естественно, никак повлиять не можем (хотя иногда преобразования данных могут «улучшить» распределение и да- же сделать его нормальным — об этом написано ниже). Что мы можем сделать, так это постараться иметь достаточно большой объем выборки
1   2   3   4   5   6   7   8   9   ...   19


написать администратору сайта