Bagaimana Anda memvisualisasikan hasil biner versus prediktor berkelanjutan?

10

Saya punya beberapa data yang perlu saya visualisasikan dan tidak yakin cara terbaik untuk melakukannya. Saya memiliki beberapa set item dasar dengan frekuensi masing-masing F = { f 1 , , f n } dan hasil O { 0 , 1 } nQ={q1,,qn}F={f1,,fn}O{0,1}n. Sekarang saya perlu merencanakan seberapa baik metode saya "menemukan" (yaitu, 1-hasil) item frekuensi rendah. Saya awalnya hanya memiliki sumbu x frekuensi dan ay sumbu 0-1 dengan titik-plot, tetapi tampak mengerikan (terutama ketika membandingkan data dari dua metode). Artinya, setiap item memiliki hasil (0/1) dan diurutkan berdasarkan frekuensinya.qQ

Berikut ini adalah contoh dengan hasil metode tunggal:

masukkan deskripsi gambar di sini

Ide saya berikutnya adalah membagi data ke dalam interval dan menghitung sensitivitas lokal selama interval, tetapi masalah dengan ide itu adalah distribusi frekuensi belum tentu seragam. Jadi bagaimana sebaiknya saya memilih interval?

Adakah yang tahu cara yang lebih baik / lebih berguna untuk memvisualisasikan data semacam ini untuk menggambarkan efektivitas menemukan barang langka (yaitu, frekuensi sangat rendah)?

Q

Nicholas Mancuso
sumber
1
Saya tidak sepenuhnya mengerti. Apakah "hasil" menemukan sesuatu? Apa itu "barang langka"?
Peter Flom - Kembalikan Monica
1
IMO Anda harus memasukkan grafik yang Anda katakan tampak mengerikan - itu akan memberi semua orang ide yang lebih baik dari data yang Anda coba tampilkan.
Andy W
@PeterFlom, saya telah mengedit untuk membuatnya lebih jelas. Hasil 0-1 untuk setiap item menunjukkan "tidak ditemukan" dan "ditemukan". Item langka adalah item frekuensi sangat rendah.
Nicholas Mancuso
@AndyW, diedit untuk menyertakan gambar. Mengingat nilai pada sumbu y tidak benar-benar mencerminkan konsep ditemukan dan tidak ditemukan, tetapi setidaknya untuk menyampaikan apa yang ingin saya sampaikan (untuk tujuan pertanyaan ini), Anda mendapatkan ide ...
Nicholas Mancuso
1
OK, sepertinya Anda mencoba sebar pada data di mana nilai y hanya bisa 0 atau 1. Apakah itu benar? Dan Anda ingin membandingkan plot semacam ini di berbagai metode pada titik yang sama? Tetapi dapatkah masing-masing metode itu benar atau salah dalam satu atau dua cara? Yaitu, setiap poin bisa atau tidak (apa pun). Jadi suatu metode dapat mengatakan bahwa suatu titik adalah (apa pun) atau tidak (apa pun) dan pilihan mana pun bisa benar atau salah?
Peter Flom - Kembalikan Monica

Jawaban:

10

Apa yang telah saya lakukan di masa lalu pada dasarnya adalah apa yang telah Anda lakukan dengan penambahan loess . Tergantung pada kepadatan titik, saya akan menggunakan titik tembus (alpha), seperti yang ditunjukkan di bawah ini, dan / atau simbol pipa ("|") untuk meminimalkan tumpang tindih.

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

masukkan deskripsi gambar di sini

(Saya tidak berpikir bar kesalahan harus melebar di tepi sini, tapi tidak ada cara mudah yang saya tahu untuk melakukan itu dengan fungsi stat_smooth internal ggplot. Jika Anda menggunakan metode ini untuk real dalam R, kita bisa melakukannya dengan memperkirakan loess dan bilah galatnya sebelum merencanakan.)

( Sunting: Dan tambah untuk komentar dari Andy W. tentang mencoba jitter vertikal jika kepadatan data membuatnya berguna dan dari Mimshot tentang interval kepercayaan yang tepat.)

MattBagg
sumber
3
+1 - Saya juga menyarankan menggunakan jitter untuk titik-titik (selain transparansi). Dalam contoh ini saya akan mengganti geom_point(size=2, alpha=0.4)dengan geom_jitter(size=2, alpha=0.4, position = position_jitter(height = .02)).
Andy W
3
+1 tetapi Anda harus menggunakan batas kepercayaan dari kebalikan dari distribusi binomial daripada Anda tersirat Gaussian noise.
Mimshot
@Mimshot Bisakah Anda menunjukkan cara menghitung interval kepercayaan dengan benar?
Lebah pria
1
@Mimshot, apakah Anda tahu cara ggplot2untuk memasok CI yang benar? Saya punya plot dengan CI di luar [0,1]yang jelas berasal dari perhitungan yang salah
MichaelChirico
[0,1]
2

Pertimbangkan juga skala mana yang paling sesuai untuk kasus penggunaan Anda. Katakanlah Anda sedang melakukan inspeksi visual untuk keperluan pemodelan dalam regresi logistik dan ingin memvisualisasikan prediktor berkelanjutan untuk menentukan apakah Anda perlu menambahkan spline atau istilah polinomial ke model Anda. Dalam hal ini, Anda mungkin menginginkan skala dalam log-odds daripada probabilitas / proporsi.

Fungsi pada intisari di bawah ini menggunakan beberapa heuristik terbatas untuk membagi prediktor kontinu menjadi nampan, menghitung proporsi rata-rata, mengkonversi ke peluang-log, kemudian plot geom_smoothatas titik agregat ini.

Contoh bagan ini terlihat jika kovariat memiliki hubungan kuadratik (+ noise) dengan peluang log dari target biner:

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'

Dibuat pada 2019-02-06 oleh paket reprex (v0.2.1)

Sebagai perbandingan, di sini akan terlihat seperti apa hubungan kuadratik jika Anda baru saja merencanakan angka 1's / 0 dan menambahkan 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")'

Dibuat pada 2019-02-25 oleh paket reprex (v0.2.1)

Hubungan dengan logit kurang jelas dan penggunaan geom_smoothmemiliki beberapa masalah.

Bryan Shalloway
sumber
0

Saya setuju bahwa mem-posting hanya beberapa baris data sampel akan jauh. Jika saya mengerti pertanyaannya, saya pikir akan lebih mudah untuk merencanakan frekuensi berdasarkan proporsi yang ditemukan.

Pertama saya akan menghasilkan beberapa data sampel dalam R; tolong perbaiki saya jika saya belum mengerti Anda dengan benar.

# 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

Dan sekarang cukup plot frekuensi ( F) dengan proportion:

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

masukkan deskripsi gambar di sini

memotret
sumber
4
Plot itu mengerikan! Beberapa perataan, seperti pada jawaban sebelumnya, diperlukan.
kjetil b halvorsen