А. Б. Шипунов, Е. М. Балдин, П. А. Волкова, А. И. Коробейников, С. А. Назарова
Скачать 3.04 Mb.
|
В текущую папку будет записан файл 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 Типы данных очень часто бывает, дискретны) имеют свойство «скрывать» имеющие- ся различия, объединяя отдельные значения в группы. Так как параметрические методы доступнее непараметрических (на- пример, в курсах статистики изучают в основном параметрические ме- тоды), то часто хочется как-нибудь «параметризировать» данные. На распределение данных мы, естественно, никак повлиять не можем (хотя иногда преобразования данных могут «улучшить» распределение и да- же сделать его нормальным — об этом написано ниже). Что мы можем сделать, так это постараться иметь достаточно большой объем выборки |