Jak wizualizujesz wyniki binarne w porównaniu z ciągłym predyktorem?


10

Mam pewne dane, które muszę wizualizować i nie jestem pewien, jak najlepiej to zrobić. Mam pewien zestaw elementów podstawowych o odpowiednich częstotliwościach i wyniki O \ w \ {0,1 \} ^ n . Teraz muszę wykreślić, jak dobrze moja metoda „znajduje” (tj. Wynik 1) elementy niskiej częstotliwości. Początkowo miałem po prostu oś x częstotliwości i oś y 0-1 z wykresami punktowymi, ale wyglądało to okropnie (szczególnie przy porównywaniu danych z dwóch metod). Oznacza to, że każdy element q \ w Q ma wynik (0/1) i jest uporządkowany według częstotliwości.F = { f 1 , , f n }Q={q1,,qn}F={f1,,fn} q QO{0,1}nqQ

Oto przykład z wynikami jednej metody:

wprowadź opis zdjęcia tutaj

Moim następnym pomysłem było podzielenie danych na przedziały i obliczenie lokalnej czułości w przedziałach, ale problem z tym pomysłem polega na tym, że rozkład częstotliwości niekoniecznie jest jednolity. Jak więc najlepiej wybrać interwały?

Czy ktoś wie o lepszym / bardziej użytecznym sposobie wizualizacji tego rodzaju danych w celu przedstawienia skuteczności znajdowania rzadkich (tj. Bardzo niskiej częstotliwości) przedmiotów?

EDYCJA: Aby być bardziej konkretnym, pokazuję zdolność jakiejś metody do rekonstrukcji sekwencji biologicznych pewnej populacji. W celu walidacji z wykorzystaniem danych symulowanych muszę wykazać zdolność do rekonstrukcji wariantów niezależnie od ich liczebności (częstotliwości). W tym przypadku wizualizuję pominięte i znalezione przedmioty, uporządkowane według częstotliwości. Ten wykres nie będzie zawierała zrekonstruowane warianty, które nie są w .Q


1
Nie do końca rozumiem. Czy „wyniki” znajdują coś? Jakie są „rzadkie przedmioty”?
Peter Flom

1
IMO powinien dołączyć wykres, który według ciebie wygląda okropnie - da to wszystkim lepszy obraz danych, które próbujesz wyświetlić.
Andy W

@PeterFlom, edytowałem, aby było jaśniej. Wyniki 0-1 dla każdej pozycji wskazują „nie znaleziono” i „znaleziono”. Rzadki przedmiot to prosty przedmiot o bardzo niskiej częstotliwości.
Nicholas Mancuso

@AndyW, edytowane w celu dołączenia obrazu. Biorąc pod uwagę, że wartości na osi y tak naprawdę nie odzwierciedlają pojęcia znalezionego i nieodnalezionego, ale przynajmniej do przekazania tego, co chcę przedstawić (dla celów tego pytania), wpadłeś na pomysł ...
Nicholas Mancuso

1
OK, wygląda na to, że próbowałeś wykresu rozrzutu dla danych, gdzie wartość y może wynosić tylko 0 lub 1. Czy to prawda? I chcesz porównać tego rodzaju wykresy na wiele sposobów w tych samych punktach? Ale czy każda metoda może być dobra lub zła na jeden lub dwa sposoby? Oznacza to, że każdy punkt jest albo nie jest (cokolwiek). Tak więc metoda może powiedzieć, że punkt jest (cokolwiek) lub nie jest (cokolwiek) i każdy wybór może być dobry, czy zły?
Peter Flom

Odpowiedzi:


10

To, co zrobiłem w przeszłości, jest w zasadzie tym, co zrobiłeś z dodatkiem lessu . W zależności od gęstości punktów użyłbym przezroczystych punktów (alfa), jak pokazano poniżej i / lub symboli rur („|”), aby zminimalizować nakładanie się.

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()

wprowadź opis zdjęcia tutaj

(Nie sądzę, że paski błędów powinny się tutaj rozszerzać, ale nie jest to łatwy sposób, aby to zrobić za pomocą wewnętrznej funkcji stat_smooth ggplota. Jeśli użyłbyś tej metody dla liczb rzeczywistych w R, moglibyśmy to zrobić przez oszacowanie lessu i jego paska błędów przed wydrukowaniem).

( Edycja: I plusy za komentarze Andy'ego W. na temat próbowania pionowego jittera, jeśli gęstość danych sprawia, że ​​jest to użyteczne, i od Mimshota o odpowiednich przedziałach ufności.)


3
+1 - Sugerowałbym również użycie fluktuacji kropek (oprócz przezroczystości). W tym przykładzie chciałbym zamienić geom_point(size=2, alpha=0.4)z geom_jitter(size=2, alpha=0.4, position = position_jitter(height = .02)).
Andy W

3
+1, ale powinieneś używać granic ufności z odwrotności rozkładu dwumianowego, a nie sugerować szum Gaussa.
Mimshot,

@Mimshot Czy możesz pokazać, jak poprawnie obliczyć przedziały ufności?
koleś pszczół

1
@Mimshot, czy znasz sposób ggplot2na dostarczenie prawidłowych elementów CI? Mam spisek z CI, poza [0,1]którym wyraźnie pochodzą z niewłaściwych obliczeń
MichaelChirico

To dobra odpowiedź (+1), ale zasięg wykresu (i CI) należy zdecydowanie ograniczyć do przedziału . Poprawiłoby to wygląd wykresu, a także respektowałoby poparcie dopuszczalnej wartości prawdopodobieństwa. [0,1]
Ben - Przywróć Monikę

2

Zastanów się także, które skale są najbardziej odpowiednie dla twojego przypadku użycia. Załóżmy, że przeprowadzasz kontrolę wizualną w celu modelowania w regresji logistycznej i chcesz wizualizować ciągły predyktor, aby ustalić, czy chcesz dodać do modelu model spline lub wielomianowy. W takim przypadku może być potrzebna skala logarytmicznych szans, a nie prawdopodobieństwa / proporcji.

Funkcja znajdująca się na poniższej liście używa pewnych ograniczonych heurystyk do dzielenia ciągłego predyktora na przedziały, obliczania średniej proporcji, przeliczania na logarytmiczne szanse, a następnie kreślenia geom_smoothtych punktów sumarycznych.

Przykład tego wykresu, jeśli zmienna towarzysząca ma kwadratowy związek (+ szum) z logarytmicznym prawdopodobieństwem celu binarnego:

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'

Utworzono 2019-02-06 przez pakiet reprezentx (v0.2.1)

Dla porównania, oto jak wyglądałaby ta kwadratowa relacja, gdybyś po prostu wykreślił cyfry 1/0 i dodał 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")'

Utworzono 25.02.2019 przez pakiet reprezentx (v0.2.1)

Związek z logowaniem jest mniej wyraźny, a używanie geom_smoothma pewne problemy.


0

Zgadzam się, że opublikowanie zaledwie kilku wierszy przykładowych danych przeszedłoby długą drogę. Jeśli rozumiem pytanie, myślę, że najłatwiej byłoby wykreślić częstotliwość według znalezionego odsetka.

Najpierw wygeneruję kilka przykładowych danych w języku R; popraw mnie, jeśli nie zrozumiałem cię poprawnie.

# 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

A teraz po prostu wykreśl częstotliwość ( F) proportion:

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

wprowadź opis zdjęcia tutaj


4
Ta fabuła jest okropna! Konieczne jest pewne wygładzenie, jak we wcześniejszych odpowiedziach.
kjetil b halvorsen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.