Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Mastitsky_and_Shitikov_2014.pdf
Скачиваний:
206
Добавлен:
25.12.2019
Размер:
10.99 Mб
Скачать

3.6.Категоризованные графики

Функция coplot(), входящая в базовую комплектацию R, предназначена для построения так называемых"conditioning plots", название которых можно перевести на русский язык как "категоризованные графики". Суть здесь сводится к тому, что анализируемые данные разбиваются на отдельные категории(например, в соответствии с уровнями какого-то фактора) и для каждой из них строится свой график(так называемая панель) определенного типа. Все эти графики затем объединяются на одном рисунке, что существенно облегчает выявление статистических закономерностей и структур в данных – подробности можно найти в книге (Cleveland, 1993).

Функция coplot() обладает большим количеством управляющих аргументов (см.

?coplot), основными из которых являются следующие:

°formula – формула, описывающая взаимодействие между анализируемыми переменными;

°data – таблица данных, содержащая значения переменных, указанных в formula;

°panel – функция, позволяющая задать тип и настроить внешний вид отдельных панелей категоризованного графика; по умолчанию эти панели представляют собой

диаграммы рассеяния (см. примеры ниже);

°rows и columns – панели категоризованного графика размещаются в виде матрицы

с количеством строк и столбцов, соответствующим значениям аргументовrows и columns; изменяя значения этих аргументов, можно упорядочить панели на графике необходимым образом;

°show.given – логическое значение (или вектор из двух логических значений в случае двух категориальных переменных, по которым разбиваются данные), позволяющее включать (TRUE) или отключать (FALSE) изображение "вывески" графика (см. ниже);

°number – количество интервалов, на которые разбиваются переменныеа и b в случаях, если эти переменные не являются факторами;

°overlap – число (< 1), определяющее область перекрытия между данными, которые группируются в соответствии с уровнями количественных переменныхa и b; если overlap < 0, соответствующая доля наблюдений на"стыках" групп не будет изображаться.

Формула вида y

~ x |

a показывает, что графики зависимости у от x должны

быть построены для

каждого

уровня переменнойа. В свою очередь, формула вида

y ~ x| a * b показывает, что графики зависимости у от x должны быть одновременно построены для каждого уровня как переменной а, так и переменной b. Все три или четыре переменные могут быть как количественными, так и качественными (факторами). Если x или y являются факторами, то их уровни будут автоматически преобразованы в численные значения (при помощи функции as.numeric()).

Кроме перечисленных аргументов, функция coplot() принимает также такие стандартные графические параметры, как col, pch, xlim, ylim, и др. (см. раздел 3.1).

Работу функции coplot() мы проиллюстрируем на примере собственных данных о плотности популяции (экз./м2) моллюска Dreissena polymorpha в озере Нарочь, Беларусь (подробнее см. в оригинальной статье(Mastitsky, Veres, 2010). Учеты плотности популяции дрейссены были выполнены в мае и октябре2005 г. на пяти глубинах озера

вдоль восьми трансект. В приведенном ниже примере для простоты использована лишь часть данных (для трех из восьми трансект). Загрузить текстовый файл с данными можно из онлайн-сервиса Dropbox при помощи простой команды:

92

density <- read.delim(file = "http://dl.dropbox.com/u/7521662/Dreissena_in_Naroch_Lake.txt",

header = TRUE) str(density)

'data.frame': 79

obs. of

4 variables:

 

1 1 1 1 1 1 1 1 1 ...

$

Transect: Factor w/ 3

levels "A","B","C": 1

$

Month : Factor w/ 2 levels "May","October":

1 1 1 1 1 1 1 1 1 1 ...

$

Depth

: num

0.8 0.8

0.8 0.8

0.8 0.8

0.8 0.8 2 2 ...

$

Density

: int

36 340

40 40 24

56 28 0

1560

40 ...

Созданная указанным образом таблица density содержит такие переменные, как

Transect

(Трансекта), Month (Месяц),

Depth (Глубина) и собственно Density

(Плотность

популяции). Для начала

изобразим зависимость плотности популяции

дрейсены от глубины для каждого месяца:

coplot(Density ~ Depth | Month, data = density, xlab = c("Depth", "Month"), ylab = "Density")

Воспользовавшись аргументами pch и col, мы можем изменить внешний вид и цвет точек в каждой панели графика:

coplot(Density ~ Depth | Month, data = density, pch = 19, col = "blue",

xlab = c("Depth", "Month"), ylab = "Density")

Прямоугольную область графика с названиями уровней фактора, по которым разбиваются данные, по-английски иногда называют"shingle" ("вывеска"). При необходимости можно изменить заливку прямоугольников, в которые вписаны названия уровней фактора (см. аргумент bar.bg):

coplot(Density ~ Depth | Month, data = density,

bar.bg = c(fac = "coral"), # fac - сокращение от "factor" pch = 19, col = "blue",

xlab = c("Depth", "Month"), ylab = "Density")

Как это часто бывает с данными, характеризующими численность того или иного организма, данные по плотности популяции дрейссены в озере Нарочь распределены резко асимметрично – большинство наблюдений сосредоточено в области малых значений плотности, и лишь некоторые наблюдения имеют очень высокие значения. Как результат, плотное расположение точек в области низких значений затрудняет вывод о характере анализируемой связи. Для лучшей визуализации этой зависимости мы можем добавить сглаживающие кривые в каждую панель графика. Для этого воспользуемся аргументом panel, который, как отмечалось выше, позволяет выполнять тонкую настройку внешнего вида панелей путем прописывания соответствующей графической функции, например, panel.smooth():

coplot(Density ~ Depth | Month, data = density, panel = function(x, y, ...) {

panel.smooth(x, y, lty = 2, pch = 19, col = "blue",

span = 0.6)}, # span регулирует кривизну сглаживающей кривой bar.bg = c(fac = "coral"), # fac - сокращение от "factor"

pch = 19, col = "blue",

xlab = c("Depth", "Month"), ylab = "Density")

93

 

 

 

 

 

 

Month

 

 

 

 

 

 

 

 

 

 

 

 

 

October

 

 

 

 

 

 

 

May

 

 

 

 

 

 

 

 

1

2

3

4

5

6

 

 

 

 

 

 

10000

 

 

 

 

 

 

 

 

 

 

Density

6000

 

 

 

 

 

 

 

 

 

 

 

2000

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

2

3

4

5

6

 

 

 

 

 

 

Depth

 

 

 

 

 

Пока закономерность вырисовывается нечетко– и все из-за уже упомянутой асимметричности распределения значений плотности популяции дрейссены. Мы можем несколько снизить эту асимметричность, преобразовав данные путем логарифмирования. Поскольку некоторые значения плотности равны ,нулюперед логарифмированием добавим по единице к каждому наблюдению:

coplot(log(Density + 1) ~ Depth | Month, data = density, panel = function(x, y, ...) {

panel.smooth(x, y, lty = 2, pch = 19, col = "blue",

span = 0.6)}, # span регулирует кривизну сглаживающей кривой bar.bg = c(fac = "coral"), # fac - сокращение от "factor"

pch = 19, col = "blue",

xlab = c("Depth", "Month"), ylab = "Density")

На полученном графике гораздо лучше прослеживается тенденция к возрастанию плотности популяции дрейссены от глубины0.8 к 2 м и к последующей стабилизации на более глубоких участках озера. При этом данная тенденция имела место как в мае, так и в октябре.

Вспомним, что учёты плотности популяции дрейссены проводились вдоль нескольких трансект. При помощи функцииcoplot() мы можем легко изобразить полученные данные в отношении не только времени отбора проб, но и трансект, вдоль которых эти пробы отбирались (обратите внимание на формулу log(Density + 1) ~

Depth | Month * Transect):

coplot(log(Density + 1) ~ Depth | Month * Transect, panel = function(x, y, ...) {

panel.smooth(x, y, lty = 2, pch = 19, col = "blue", span = 0.6)},

bar.bg = c(fac = "coral"), xlab = c("Depth", "Month"), ylab = c("Density", "Transect"), data = density)

94

Полученный категоризованный график дает достаточно полную пространственновременную характеристику изучаемой зависимости.

 

 

 

 

 

Month

 

 

 

 

 

October

 

 

 

May

 

 

1

2

3

4

5

6

8

 

 

 

 

 

6

 

 

 

 

 

4

 

 

 

 

C

2

 

 

 

 

 

0

 

 

 

 

 

Density

 

 

 

 

8

 

Transect

 

 

 

 

2 4 6

B

 

 

 

 

 

0

 

 

8

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

4

 

 

 

 

 

A

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

1

2

3

4

5

6

 

 

Depth

 

 

 

 

 

 

 

Как отмечалось выше, в формуле вида y ~ x | a * b любая из переменных может быть количественной, в том числе и переменные, стоящие по правую сторону от “|”. Например, можно разбить наши данные не по месяцам, а по интервалам глубин:

coplot(log(Density+1) ~ Month | Depth,

bar.bg = c(num = "coral"), # num - сокращение от numeric pch = 19, col = "blue", xlab = c("Month", "Depth"),

ylab = c("Density", "Transect"), data = density)

Важно понимать, как на полученном графике располагаются отдельные панели: они выстроены в порядке возрастания значений плотности популяции дрейссены. Первой является левая нижняя панель, за которой следуют средняя нижняя и правая нижняя панели. В верхнем ряду порядок аналогичный (т.е. "читать" график нужно слева направо). "Вывеска" в верхней части графика является своего рода легендой, подсказывающей,

какие именно данные изображены в каждой

панели. Так, в

левом нижнем углу

представлены данные для диапазона глубин от0 до

примерно 1.5

м; средняя нижняя

панель содержит данные для диапазона глубин от 0 до примерно 2.5 м, и т.д. Практически все автоматически выделенные программой диапазоны глубин перекрываются.

95

Depth

 

1

2

3

4

5

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

May

Octb

 

 

 

 

 

 

8

 

 

 

 

6

 

 

 

 

4

Density

 

 

 

2

8

 

May

0

 

 

 

 

 

6

 

 

 

 

4

 

 

 

 

2

 

 

 

 

0

 

 

 

 

 

May

Octb

 

Month

Octb

Количество диапазонов и уровень их перекрытия регулируются при помощи аргументов number и overlap соответственно:

coplot(log(Density+1) ~ Month | Depth, number = 2, overlap = 0.1,

bar.bg = c(num = "coral"), pch = 19, col = "blue", xlab = c("Month", "Depth"),

ylab = c("Density", "Transect"), data = density)

Depth

1 2 3 4 5 6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

May

 

Octb

 

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Density

4 6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

May

Octb

Month

96