Як ви візуалізуєте бінарні результати порівняно з безперервним прогноктором?


10

У мене є деякі дані, які мені потрібні для візуалізації, і я не впевнений, як краще це зробити. У мене є деякий набір базових елементів з відповідними частотами F = { f 1 , , f n } і результатами O { 0 , 1 } nQ={q1,,qn}F={f1,,fn}O{0,1}n. Тепер мені потрібно побудувати схему того, наскільки добре мій метод "знаходить" (тобто 1-результат) низькочастотних елементів. Спочатку я мав вісь x частоти та осі 0-1 з точковими графіками, але це виглядало жахливо (особливо при порівнянні даних двох методів). Тобто кожен елемент має результат (0/1) і впорядковується за його частотою.qQ

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

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

Наступною моєю ідеєю було поділити дані на інтервали та обчислити локальну чутливість через інтервали, але проблема з цією ідеєю полягає в тому, що розподіл частоти не обов'язково є рівномірним. То як мені найкраще підбирати інтервали?

Хтось знає про кращий / корисніший спосіб візуалізації подібних даних для відображення ефективності пошуку рідкісних (тобто дуже низьких частот) предметів?

Q


1
Я не повністю розумію. Чи "результати" щось знаходять? Що таке "рідкісні предмети"?
Пітер Флом

1
ІМО, вам слід включити графік, про який ви казали, виглядає жахливо - це дасть всім краще уявлення про дані, які ви намагаєтеся відобразити.
Енді Ш

@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)).
Енді Ш

3
+1, але вам слід використовувати межі довіри від зворотного біноміального розподілу, а не на те, що мається на увазі шум Гаусса.
Мімшот

@Mimshot Чи можете ви показати, як правильно обчислити довірчі інтервали?
хлопець бджоли

1
@Mimshot Ви знаєте про спосіб 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 пакетом reprex (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 пакетом reprex (v0.2.1)

Відносини до logit менш зрозумілі, а використання 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.