Sürekli bir yordayıcıya karşı ikili sonuçları nasıl görselleştiriyorsunuz?


10

Görselleştirmem gereken bazı verilerim var ve bunu en iyi nasıl yapacağımdan emin değilim. Bazı temel öğeleri ile ilgili ve çıktıları var . Şimdi yöntemimin düşük frekanslı öğeleri ne kadar iyi bulduğunu (yani 1 sonuç) çizmem gerekiyor. Başlangıçta sadece bir x-ekseni frekansı ve 0-1 ay ekseni ile nokta çizimleri vardı, ama korkunç görünüyordu (özellikle iki yöntemden verileri karşılaştırırken). Yani, her bir maddenin bir sonucu vardır (0/1) ve sıklığına göre sıralanır.F = { f 1 , , f n } O { 0 , 1 } n q QQ={q1,,qn}F={f1,,fn}O{0,1}nqQ

İşte tek bir yöntemin sonuçları olan bir örnek:

resim açıklamasını buraya girin

Bir sonraki fikrim, verileri aralıklara bölmek ve aralıklar üzerinde yerel bir duyarlılık hesaplamaktı, ancak bu fikirdeki sorun, frekans dağılımının tekdüze olması değil. Peki aralıkları en iyi nasıl seçmeliyim?

Herkes nadir (yani, çok düşük frekanslı) öğeler bulmanın etkinliğini tasvir etmek için bu tür verileri görselleştirmenin daha iyi / daha yararlı bir yolunu biliyor mu?

EDIT: Daha somut olmak için, bazı yöntemlerin belirli bir popülasyonun biyolojik sekanslarını yeniden yapılandırma yeteneğini sergiliyorum. Simüle edilmiş veri kullanarak doğrulama için, bolluğundan (frekans) bağımsız olarak varyantları yeniden oluşturma yeteneğini göstermem gerekiyor. Bu durumda, cevaplarına göre sıralanan ve bulunmayan öğeleri görselleştiriyorum. Bu grafik olmayan yeniden yapılandırılmış varyantları içermeyecektir .Q


1
Tamamen anlamıyorum. "Sonuçlar" bir şey mi buluyor? "Nadir ürünler" nelerdir?
Peter Flom

1
IMO, korkunç göründüğünü düşündüğünüz grafiği eklemelisiniz - herkese görüntülemeye çalıştığınız veriler hakkında daha iyi bir fikir verecektir.
Andy W

@PeterFlom, daha açık hale getirmek için düzenledim. Her madde için 0-1 sonuçları "bulunamadı" ve "bulundu" u gösterir. Nadir bir ürün basit, çok düşük frekanslı bir üründür.
Nicholas Mancuso

@AndyW, resim içerecek şekilde düzenlendi. Y ekseni üzerindeki değerler, bulunan ve bulunmayan kavramını gerçekten yansıtmazsa, en azından sunmak istediğim şeyi (bu soruların amaçları için) iletmek için fikri anlarsınız ...
Nicholas Mancuso

1
Tamam, görünüşe göre y değerinin yalnızca 0 veya 1 olabileceği veriler üzerinde bir dağılım grafiği denediniz. Ve bu tür grafikleri aynı noktalarda birden çok yöntemle karşılaştırmak mı istiyorsunuz? Ancak her yöntem bir veya iki şekilde doğru veya yanlış olabilir mi? Yani, her nokta ya ya da değil (ne olursa olsun). Yani bir yöntem bir noktanın (ne olursa olsun) ya da değil (ne olursa olsun) olduğunu söyleyebilir ve her iki seçim de doğru ya da yanlış olabilir mi?
Peter Flom

Yanıtlar:


10

Geçmişte yaptığım temelde bir lös ilavesi ile yaptığınız şey . Noktaların yoğunluğuna bağlı olarak, aşağıda gösterildiği gibi yarı saydam noktalar (alfa) ve / veya örtüşmeyi en aza indirmek için boru sembolleri ("|") kullanacağım.

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

resim açıklamasını buraya girin

(Hata çubuklarının burada kenarlarda genişlemesi gerektiğini düşünmüyorum, ancak bunu ggplot'un dahili stat_smooth işleviyle yapmanın kolay bir yolu yok. R'deki realler için bu yöntemi kullandıysanız, yapabiliriz çizmeden önce löseyi ve hata çubuğunu tahmin ederek.)

( Düzenleme: Ve verinin yoğunluğu onu faydalı kılıyorsa dikey titremeyi denemeye ilişkin Andy W.'den yorumlar ve artılar Mimshot'tan uygun güven aralıkları hakkında.)


3
+1 - Noktalar için titreme kullanılmasını da öneririm (saydamlığa ek olarak). Bu örnekte ben yerini alacak geom_point(size=2, alpha=0.4)olan geom_jitter(size=2, alpha=0.4, position = position_jitter(height = .02)).
Andy W

3
+1 ama Gauss gürültüsünden ziyade binom dağılımının tersinden güven sınırları kullanmalısınız.
Mimshot

@Mimshot Güven aralıklarının nasıl doğru hesaplanacağını gösterebilir misiniz?
arı adam

1
@Mimshot ggplot2, doğru CI'leri sağlamanın bir yolunu biliyor musunuz ? Dışında [0,1]açıkça yanlış hesaplama geliyor CIs ile bir komplo var
MichaelChirico

Bu iyi bir cevaptır (+1), ancak çizimin (ve CI'ların) aralığı kesinlikle aralık ile sınırlanmalıdır . Bu, arsanın görünümünü iyileştirir ve aynı zamanda izin verilen olasılık değerinin desteğine de saygı gösterir. [0,1]
Ben - Monica adlı

2

Ayrıca hangi ölçeklerin kullanım durumunuz için en uygun olduğunu düşünün. Lojistik regresyonda modelleme amacıyla görsel inceleme yaptığınızı ve modelinize spline veya polinom terimi eklemeniz gerekip gerekmediğini belirlemek için sürekli bir öngörücüyü görselleştirmek istediğinizi varsayalım. Bu durumda, olasılık / orantı yerine günlük oranlarında bir ölçek isteyebilirsiniz.

Kullanımlara bazı sınırlı sezgiseller altında özünden de işlev, sonra ihtimalli giriş yapmasına dönüştürmek ortalama oranı hesaplamak, bidonları içine sürekli öngorücunun bölmek çizmek için geom_smoothbu agrega noktaları üzerinde.

Bir eş değişkenin ikili hedefin log-olasılıkları ile kuadratik bir ilişkisi (+ gürültü) varsa, bu grafiğin nasıl görüneceğine örnek:

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 tarihinde reprex paketi tarafından oluşturuldu (v0.2.1)

Karşılaştırma için, 1 / 0'ları yeni çizdiyseniz ve bir 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 tarihinde reprex paketi tarafından oluşturuldu (v0.2.1)

Logit ile olan ilişki daha az açıktır ve kullanmanın geom_smoothbazı sorunları vardır.


0

Yalnızca birkaç satırlık örnek veri göndermenin uzun bir yol kat edeceğini kabul ediyorum. Soruyu anlarsam, frekansı bulunan orana göre çizmenin en basit yolu olacağını düşünüyorum.

İlk önce R'de bazı örnek veriler üreteceğim; seni doğru anlamadıysam lütfen beni düzeltin.

# 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

Ve şimdi frekansı ( F) şuna göre çizin proportion:

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

resim açıklamasını buraya girin


4
O arsa korkunç! Önceki cevaplarda olduğu gibi bazı düzeltmeler gereklidir.
kjetil b halvorsen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.