Как вы представляете двоичные результаты в сравнении с непрерывным предиктором?


10

У меня есть некоторые данные, которые мне нужно визуализировать, и я не уверен, как лучше это сделать. У меня есть некоторый набор базовых предметов с соответствующими частотами и результатами . Теперь мне нужно показать, насколько хорошо мой метод «находит» (то есть, 1-результат) низкочастотные элементы. Первоначально у меня была только ось x частоты и ось y 0-1 с точечными графиками, но это выглядело ужасно (особенно при сравнении данных из двух методов). То есть каждый элемент имеет результат (0/1) и упорядочен по частоте.F = { f 1 , , f n } O { 0 , 1 } n q QQ={q1,,qn}F={f1,,fn}O{0,1}nqQ

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

введите описание изображения здесь

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

Кто-нибудь знает лучший / более полезный способ визуализации такого рода данных, чтобы изобразить эффективность поиска редких (то есть, очень низкочастотных) предметов?

РЕДАКТИРОВАТЬ: Чтобы быть более конкретным, я демонстрирую способность какого-либо метода для реконструкции биологических последовательностей определенной популяции. Для проверки с использованием смоделированных данных мне нужно показать способность восстанавливать варианты независимо от их обилия (частоты). Поэтому в этом случае я визуализирую пропущенные и найденные предметы, упорядоченные по частоте. Этот участок не будет включать в себя реконструированные варианты, которые не в .Q


1
Я не совсем понимаю. "Результаты" находят что-то? Каковы "редкие предметы"?
Питер Флом

1
IMO, вы должны включить график, который вы сказали, выглядит ужасно - он даст всем лучшее представление о данных, которые вы пытаетесь отобразить.
Энди W

@PeterFlom, я отредактировал, чтобы было понятнее. Результаты 0-1 для каждого элемента указывают «не найден» и «найден». Редкий предмет - это очень низкочастотный предмет.
Николас Манкузо

@AndyW, отредактировано, чтобы включить изображение. Учитывая, что значения на оси у действительно не отражают концепцию найденного и не найденного, но, по крайней мере, для передачи того, что я хочу представить (для целей этого вопроса), вы получите идею ...
Николас Манкузо

1
Хорошо, похоже, вы пробовали график рассеяния на данных, где значение y может быть только 0 или 1. Это правильно? И вы хотите сравнить эти виды графиков по нескольким методам в одних и тех же точках? Но может ли каждый метод быть правильным или неправильным одним или двумя способами? То есть каждая точка либо есть, либо нет (что угодно). Таким образом, метод может сказать, что точка есть (что угодно) или нет (что угодно), и либо выбор может быть правильным или неправильным?
Питер Флом

Ответы:


10

То, что я сделал в прошлом, в основном то, что вы сделали с добавлением лесса . В зависимости от плотности точек, я бы использовал полупрозрачные точки (альфа), как показано ниже, и / или символы трубы ("|"), чтобы минимизировать перекрытие.

library(ggplot2) # plotting package for R

N=100
data=data.frame(Q=seq(N), Freq=runif(N,0,1), Success=sample(seq(0,1), 
size=N, replace=TRUE))

ggplot(data, aes(x=Freq, y=Success))+geom_point(size=2, alpha=0.4)+
  stat_smooth(method="loess", colour="blue", size=1.5)+
  xlab("Frequency")+
  ylab("Probability of Detection")+
  theme_bw()

введите описание изображения здесь

(Я не думаю, что панели ошибок должны расширяться по краям, но я не знаю, как это легко сделать с помощью внутренней функции stat_smooth ggplot. Если вы использовали этот метод для действительных значений в R, мы могли бы это сделать. оценивая лосс и его полосу ошибок перед построением графика.)

( Правка: и плюсы за комментарии от Энди У. о попытке вертикального дрожания, если плотность данных делает это полезным, и из Мимшота о правильных доверительных интервалах.)


3
+1 - я бы также предложил использовать джиттер для точек (в дополнение к прозрачности). В этом примере я бы заменил geom_point(size=2, alpha=0.4)на geom_jitter(size=2, alpha=0.4, position = position_jitter(height = .02)).
Энди W

3
+1, но вы должны использовать доверительные границы из обратного биномиального распределения, а не подразумеваемый гауссовский шум.
Mimshot

@Mimshot Можете ли вы показать, как правильно рассчитать доверительные интервалы?
Пчеловод

1
@ Снимок, знаете ли вы о том, как ggplot2предоставить правильные КИ? У меня есть заговор с КИ за пределами [0,1]которого явно исходит из неправильного расчета
MichaelChirico

[0,1]

2

Также подумайте, какие весы наиболее подходят для вашего случая использования. Допустим, вы проводите визуальный осмотр для целей моделирования в логистической регрессии и хотите визуализировать непрерывный предиктор, чтобы определить, нужно ли добавить сплайн или полиномиальный термин в вашу модель. В этом случае вам может потребоваться шкала лог-шансов, а не вероятность / пропорция.

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

Пример того, как выглядит эта диаграмма, если ковариата имеет квадратичное отношение (+ шум) с лог-коэффициентами двоичной цели:

devtools::source_gist("https://gist.github.com/brshallo/3ccb8e12a3519b05ec41ca93500aa4b3")

# simulated dataset with quadratic relationship between x and y
set.seed(12)
samp_size <- 1000
simulated_df <- tibble(x = rlogis(samp_size), 
                       y_odds = 0.2*x^2,
                       y_probs = exp(y_odds)/(1 + exp(y_odds))) %>% 
  mutate(y = rbinom(samp_size, 1, prob = y_probs)) 

# looking at on balanced dataset
simulated_df_balanced <- simulated_df %>% 
  group_by(y) %>% 
  sample_n(table(simulated_df$y) %>% min())


ggplot_continuous_binary(df = simulated_df,
                         covariate = x, 
                         response = y,
                         snip_scales = TRUE)
#> [1] "bin size: 18"
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Создано 2019-02-06 пакетом представлением (v0.2.1)

Для сравнения, вот как будет выглядеть это квадратичное отношение, если вы просто построите 1/0 и добавите geom_smooth:

simulated_df %>% 
  ggplot(aes(x, y))+
  geom_smooth()+
  geom_jitter(height = 0.01, width = 0)+
  coord_cartesian(ylim = c(0, 1), xlim = c(-3.76, 3.59))
# set xlim to be generally consistent with prior chart
#> `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Создано в 2019-02-25 пакетом представлением (v0.2.1)

Отношение к логиту менее ясно, и у использования geom_smoothесть некоторые проблемы.


0

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

Сначала я сгенерирую некоторые примеры данных в R; Пожалуйста, поправьте меня, если я вас не правильно понял.

# Create some sample data
data=data.frame(Q=1:20,F=seq(5,100,by=5))
set.seed(1)
data$found<-round(sapply(data$F,function(x) runif(1,1,x)))
data$prop<-data$found/data$F
# Looks like:
Q   F found      prop
1   1   5     2 0.4000000
2   2  10     4 0.4000000
3   3  15     9 0.6000000
4   4  20    18 0.9000000
5   5  25     6 0.2400000
6   6  30    27 0.9000000
7   7  35    33 0.9428571
8   8  40    27 0.6750000
9   9  45    29 0.6444444
10 10  50     4 0.0800000
11 11  55    12 0.2181818
12 12  60    11 0.1833333
13 13  65    45 0.6923077
14 14  70    28 0.4000000
15 15  75    58 0.7733333
16 16  80    40 0.5000000
17 17  85    61 0.7176471
18 18  90    89 0.9888889
19 19  95    37 0.3894737
20 20 100    78 0.7800000

А теперь просто построим частоту ( F) proportion:

# Plot frequency by proportion found.
plot(data$F,data$prop,xlab='Frequency',ylab='Proportion Found',type='l',col='red',lwd=2)

введите описание изображения здесь


4
Этот сюжет ужасен! Некоторое сглаживание, как и в предыдущих ответах, необходимо.
kjetil b halvorsen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.