Wie visualisieren Sie binäre Ergebnisse im Vergleich zu einem kontinuierlichen Prädiktor?

10

Ich habe einige Daten, die ich visualisieren muss, und bin mir nicht sicher, wie ich das am besten machen soll. Ich habe eine Reihe von Basiselementen mit den jeweiligen Frequenzen F = { f 1 , , f n } und den Ergebnissen O { 0 , 1 } nQ={q1,,qn}F={f1,,fn}O{0,1}n. Jetzt muss ich zeichnen, wie gut meine Methode die niederfrequenten Elemente "findet" (dh ein 1-Ergebnis). Ich hatte anfangs nur eine x-Achse der Frequenz und eine a-Achse von 0-1 mit Punktdiagrammen, aber es sah schrecklich aus (besonders beim Vergleich von Daten aus zwei Methoden). Das heißt, jeder Punkt hat ein Ergebnis (0/1) und ist nach seiner Häufigkeit geordnet.qQ

Hier ist ein Beispiel mit den Ergebnissen einer einzelnen Methode:

Geben Sie hier die Bildbeschreibung ein

Meine nächste Idee war, die Daten in Intervalle zu unterteilen und eine lokale Empfindlichkeit über die Intervalle zu berechnen, aber das Problem bei dieser Idee ist, dass die Häufigkeitsverteilung nicht unbedingt einheitlich ist. Wie sollte ich die Intervalle am besten auswählen?

Kennt jemand eine bessere / nützlichere Möglichkeit, diese Art von Daten zu visualisieren, um die Effektivität des Findens seltener (dh sehr niederfrequenter) Elemente darzustellen?

Q

Nicholas Mancuso
quelle
1
Ich verstehe nicht ganz. Finden die "Ergebnisse" etwas? Was sind die "seltenen Gegenstände"?
Peter Flom - Monica wieder einsetzen
1
IMO sollten Sie das Diagramm einfügen, von dem Sie sagten, dass es schrecklich aussieht - es gibt jedem eine bessere Vorstellung von den Daten, die Sie anzeigen möchten.
Andy W
@PeterFlom, ich habe bearbeitet, um es klarer zu machen. Die 0-1-Ergebnisse für jedes Element geben "nicht gefunden" und "gefunden" an. Ein seltener Gegenstand ist einfach ein sehr niederfrequenter Gegenstand.
Nicholas Mancuso
@AndyW, bearbeitet, um Bild einzuschließen. Angesichts der Tatsache, dass die Werte auf der y-Achse nicht wirklich das Konzept von gefunden und nicht gefunden widerspiegeln, aber zumindest um zu vermitteln, was ich präsentieren möchte (für die Zwecke dieser Fragen), kommt Ihnen die Idee ...
Nicholas Mancuso
1
OK, es sieht so aus, als hätten Sie ein Streudiagramm für Daten versucht, bei denen der y-Wert nur 0 oder 1 sein kann. Ist das richtig? Und Sie möchten diese Art von Plots über mehrere Methoden hinweg an denselben Punkten vergleichen? Aber kann jede Methode auf eine oder zwei Arten richtig oder falsch sein? Das heißt, jeder Punkt ist oder ist nicht (was auch immer). Eine Methode könnte also sagen, dass ein Punkt (was auch immer) ist oder nicht (was auch immer) und jede Wahl richtig oder falsch sein könnte?
Peter Flom - Monica wieder einsetzen

Antworten:

10

Was ich in der Vergangenheit getan habe, ist im Grunde das, was Sie mit einem Löss hinzugefügt haben . Abhängig von der Punktdichte würde ich wie unten gezeigt durchscheinende Punkte (Alpha) und / oder Rohrsymbole ("|") verwenden, um die Überlappung zu minimieren.

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

Geben Sie hier die Bildbeschreibung ein

(Ich denke nicht, dass sich die Fehlerbalken an den Rändern hier verbreitern sollten, aber es gibt keine einfache Möglichkeit, dies mit der internen stat_smooth-Funktion von ggplot zu tun. Wenn Sie diese Methode für Real in R verwenden würden, könnten wir dies tun durch Schätzen des Lösses und seines Fehlerbalkens vor dem Plotten.)

( Bearbeiten: Und Pluspunkte für Kommentare von Andy W. zum Ausprobieren von vertikalem Jitter, wenn die Dichte der Daten dies nützlich macht, und von Mimshot zu geeigneten Konfidenzintervallen.)

MattBagg
quelle
3
+1 - Ich würde auch vorschlagen, Jitter für die Punkte zu verwenden (zusätzlich zur Transparenz). In diesem Beispiel würde ich ersetzen geom_point(size=2, alpha=0.4)mit geom_jitter(size=2, alpha=0.4, position = position_jitter(height = .02)).
Andy W
3
+1, aber Sie sollten Konfidenzgrenzen aus der Umkehrung der Binomialverteilung verwenden, anstatt implizites Gaußsches Rauschen zu verwenden.
Mimshot
@Mimshot Können Sie zeigen, wie die Konfidenzintervalle korrekt berechnet werden?
Bienenmann
1
@Mimshot kennen Sie einen Weg ggplot2, um die richtigen CIs bereitzustellen ? Ich habe eine Handlung mit CIs, von [0,1]denen eindeutig die falsche Berechnung stammt
MichaelChirico
[0,1]
2

Überlegen Sie auch, welche Skalen für Ihren Anwendungsfall am besten geeignet sind. Angenommen, Sie führen eine visuelle Inspektion durch, um in logistischer Regression zu modellieren, und möchten einen kontinuierlichen Prädiktor visualisieren, um festzustellen, ob Sie Ihrem Modell einen Spline- oder Polynomterm hinzufügen müssen. In diesem Fall möchten Sie möglicherweise eher eine Skala für die Log-Quoten als für die Wahrscheinlichkeit / das Verhältnis.

Die Funktion im Kern unten verwendet einige begrenzte Heuristiken, um den kontinuierlichen Prädiktor in Bins aufzuteilen, den mittleren Anteil zu berechnen, in logarithmische Quoten umzuwandeln und dann geom_smoothüber diese aggregierten Punkte zu zeichnen .

Beispiel dafür, wie dieses Diagramm aussieht, wenn eine Kovariate eine quadratische Beziehung (+ Rauschen) zu den Log-Quoten eines binären Ziels hat:

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'

Erstellt am 06.02.2019 durch das reprex-Paket (v0.2.1)

Zum Vergleich sehen Sie hier, wie diese quadratische Beziehung aussehen würde, wenn Sie nur die Einsen / Nullen zeichnen und Folgendes hinzufügen würden 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")'

Erstellt am 25.02.2019 durch das reprex-Paket (v0.2.1)

Die Beziehung zu logit ist weniger klar und die Verwendung geom_smoothhat einige Probleme.

Bryan Shalloway
quelle
0

Ich bin damit einverstanden, dass das Posten nur einiger Zeilen mit Beispieldaten einen langen Weg gehen würde. Wenn ich die Frage verstehe, wäre es meiner Meinung nach am einfachsten, die Häufigkeit anhand des gefundenen Anteils darzustellen.

Zuerst werde ich einige Beispieldaten in R generieren; Bitte korrigieren Sie mich, wenn ich Sie nicht richtig verstanden habe.

# 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

Und jetzt zeichnen Sie einfach die Frequenz ( F) durch proportion:

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

Geben Sie hier die Bildbeschreibung ein

Nograpes
quelle
4
Diese Verschwörung ist schrecklich! Wie in früheren Antworten ist eine gewisse Glättung erforderlich.
kjetil b halvorsen