08 июля 2012

Протокол разведочного анализа данных: выявление характера связи между переменными



Один из важных этапов разведочного анализа данных заключается в выявлении характера связи между анализируемыми переменными (Zuur et al. 2010). Обнаруженные на этом этапе закономерности будут определять, например, выбор статистической модели для описания данных, необходимость преобразования нелинейно связанных переменных, и т.д.

Характер связи между переменными проще всего выявить, используя соответствующие ситуации графические средства. Так, при анализе нескольких количественных переменных очень удобным инструментом являются матричные диаграммы рассеяния (англ. scatterplot matrices), или парные диаграммы рассеяния (англ. pair plots). В качестве примера рассмотрим данные из таблицы mtcars (эти данные уже были использованы в одном из предыдущих сообщений). Для простоты будем работать только с первыми семью количественными параметрами, описывающими разные модели автомобилей.


cars <- mtcars[, 1:7]
 
str(cars)
 
'data.frame': 32 obs. of  7 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...

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

pairs(cars)

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



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

# Функция для расчета коэффициентов корреляции
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    r <- abs(cor(x, y, method = "spearman"))
    txt <- format(c(r, 0.123456789), digits=digits)[1]
    txt <- paste(prefix, txt, sep = "")
    # эта команда позволяет изменять размер шрифта в соответствии
    # со значением коэффициента корреляции:
    if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
    text(0.5, 0.5, txt, cex = cex.cor * r)
}
 
# Строим сам график:
pairs(cars, lower.panel = panel.cor)


Функция splom() из графического пакета lattice также позволяет строить матричные диаграммы рассеяния:

library(lattice)
 
splom(cars)



Наконец, стоит отметить функцию ggpairs() из пакета GGally, служащего дополнением к одному из лучших графических пакетов для R - ggplot2. Функция ggpairs() позволяет строить как простые матричные диаграммы рассеяния

ggpairs(cars)


так и гораздо более сложные графики, вроде

ggpairs(cars, upper = list(continuous = "density", combo = "box"),
       lower = list(continuous = "points", combo = "dot"))



1 комментарий :

Анонимный комментирует...

"А" зависит от "B" и "C", простая линейная зависимость. Матричная диаграмма рассеяния (функция pairs) показывает относительно четкие верхнюю и нижнюю границы на пересечении "D" и "А", но полную размазню на пересечениях с "D" и "B", а так же "D" и "C". Цель была как раз поиск границ отклонения. Долго тупил пока не придумал новую переменную "А".
Вопрос: как быть с такими ситуациями? Или это наверно не совсем разведка, а скорее уже само исследование?

Отправить комментарий