рисовать сегменты, соединяющие все возможные пары точек данных, раскрашивая их знаком наклона сегмента (черчение Кендалла Тау) - PullRequest
0 голосов
/ 25 февраля 2020

Мой вопрос относится к этой статье Дэвиса и Чена (2006), в которой показан способ визуализации тау-меры Кендалла для непараметрической корреляции между двумя переменными c.

Учитывая количество точек данных на диаграмме рассеяния, каждая точка связана со всеми остальными точками отрезком линии. Сегмент линии может иметь разные цвета в соответствии с этими критериями:

  1. сегмент линии равен черный , если его наклон равен положительный ;
  2. линия сегмент равен красный , если его наклон равен отрицательный ;
  3. сегмент равен синий имеет его наклон 0 ( горизонтально плоская линия );
  4. отрезок черный , как в 1. если его наклон не определен ( вертикальная линия ).

Здесь пример из оригинальной статьи:

enter image description here

Моя проблема заключается в том, что я могу создать диаграмму рассеяния, но не сегменты линий, которые соединяют все возможные пары очки, меняющие цвет в зависимости от критериев выше.

Вот пример набора данных:

dataset <- dplyr::tibble(alpha = c(1, 5, 7, 8, 9, 10, 11, 12), 
              beta =  c(7, 7, 5, 4, 3, 14, 15, 18))

Я могу сгенерировать это:

ggplot2::ggplot(dataset, aes(x = alpha, y = beta)) + geom_point()

enter image description here

но не это:

enter image description here

ПРИМЕЧАНИЕ. Решение должно быть обобщено для набора данных с большим количеством точек данных (~ 1000)

1 Ответ

1 голос
/ 25 февраля 2020

Есть много способов, но вам нужно создать свой собственный data.frame из сегментов. Например,

library(tidyverse)

pd <- dataset %>% 
  mutate(d = map(row_number(), function(x) slice(., -x) %>% rename(x = alpha, y = beta))) %>% 
  unnest(d) %>% 
  mutate(
    slope = (y - beta) / (x - alpha),
    cat = case_when(
      is.infinite(slope) | slope > 0 ~ 'a', 
      slope < 0 ~ 'b',
      slope == 0 ~ 'c'
    )
  )

ggplot() +
  geom_segment(aes(alpha, xend = x, beta, yend = y, color = cat), pd) +
  geom_point(aes(alpha, beta), dataset) +
  scale_color_manual(values = c(a = 'black', b = 'red', c = 'blue'))

enter image description here

...