¿Cómo visualizas los resultados binarios versus un predictor continuo?

10

Tengo algunos datos que necesito visualizar y no estoy seguro de cuál es la mejor manera de hacerlo. Tengo un conjunto de elementos básicos con las frecuencias respectivas y los resultados . Ahora necesito trazar qué tan bien mi método "encuentra" (es decir, un resultado 1) los elementos de baja frecuencia. Inicialmente solo tenía un eje x de frecuencia y un eje ay de 0-1 con gráficos de puntos, pero se veía horrible (especialmente cuando se comparan datos de dos métodos). Es decir, cada elemento tiene un resultado (0/1) y está ordenado por su frecuencia.F = { f 1 , , f n } O { 0 , 1 } n q QQ={q1,,qn}F={f1,,fn}O{0,1}nqQ

Aquí hay un ejemplo con los resultados de un solo método:

ingrese la descripción de la imagen aquí

Mi siguiente idea fue dividir los datos en intervalos y calcular una sensibilidad local sobre los intervalos, pero el problema con esa idea es que la distribución de frecuencia no es necesariamente uniforme. Entonces, ¿cómo debo elegir mejor los intervalos?

¿Alguien sabe de una manera mejor / más útil de visualizar este tipo de datos para representar la efectividad de encontrar elementos raros (es decir, de muy baja frecuencia)?

EDITAR: Para ser más concreto, estoy mostrando la capacidad de algún método para reconstruir secuencias biológicas de una determinada población. Para la validación utilizando datos simulados, necesito mostrar la capacidad de reconstruir variantes independientemente de su abundancia (frecuencia). Entonces, en este caso, visualizo los elementos perdidos y encontrados, ordenados por su frecuencia. Esta parcela no incluirá variantes reconstruidas que no están en .Q

Nicholas Mancuso
fuente
1
No lo entiendo completamente. ¿Los "resultados" están encontrando algo? ¿Qué son los "artículos raros"?
Peter Flom - Restablece a Monica
1
En mi opinión, debe incluir el gráfico que dijo que se ve horrible: les dará a todos una mejor idea de los datos que está tratando de mostrar.
Andy W
@PeterFlom, he editado para que quede más claro. Los resultados 0-1 para cada ítem indican "no encontrado" y "encontrado". Un elemento raro es simple, un elemento de muy baja frecuencia.
Nicholas Mancuso
@AndyW, editado para incluir la imagen. Dado que los valores en el eje y no reflejan realmente el concepto de encontrado y no encontrado, pero al menos para transmitir lo que quiero presentar (para los propósitos de esta pregunta), se entiende la idea ...
Nicholas Mancuso
1
OK, parece que intentaste un diagrama de dispersión en datos donde el valor y solo puede ser 0 o 1. ¿Es correcto? ¿Y desea comparar este tipo de tramas en varios métodos en los mismos puntos? Pero, ¿puede cada método ser correcto o incorrecto de una o dos maneras? Es decir, cada punto es o no es (lo que sea). Entonces, ¿un método podría decir que un punto es (lo que sea) o no (lo que sea) y que cualquiera de las opciones podría ser correcta o incorrecta?
Peter Flom - Restablece a Monica

Respuestas:

10

Lo que he hecho en el pasado es básicamente lo que has hecho con la adición de un loess . Dependiendo de la densidad de los puntos, usaría puntos translúcidos (alfa), como se muestra a continuación, y / o símbolos de tubería ("|") para minimizar la superposición.

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

ingrese la descripción de la imagen aquí

(No creo que las barras de error deberían ensancharse en los bordes aquí, pero no hay una manera fácil de hacerlo con la función stat_smooth interna de ggplot. Si usas este método para reales en R, podríamos hacerlo estimando el loess y su barra de error antes de trazar).

( Editar: Y más para comentarios de Andy W. sobre probar el jitter vertical si la densidad de los datos lo hace útil y de Mimshot sobre los intervalos de confianza adecuados).

MattBagg
fuente
3
+1: también sugeriría utilizar jitter para los puntos (además de la transparencia). En este ejemplo, lo reemplazaría geom_point(size=2, alpha=0.4)con geom_jitter(size=2, alpha=0.4, position = position_jitter(height = .02)).
Andy W
3
+1, pero debe usar límites de confianza desde el inverso de la distribución binomial en lugar del ruido gaussiano implícito.
Mimshot
@Mimshot ¿Puede mostrar cómo calcular correctamente los intervalos de confianza?
abeja
1
@Mimshot, ¿conoce alguna forma ggplot2de suministrar los CI correctos? Tengo una trama con CI fuera de los [0,1]cuales claramente provienen del cálculo incorrecto
MichaelChirico
[0,1]
2

También considere qué escalas son las más apropiadas para su caso de uso. Digamos que está haciendo una inspección visual con el propósito de modelar en regresión logística y desea visualizar un predictor continuo para determinar si necesita agregar una spline o un término polinómico a su modelo. En este caso, es posible que desee una escala en log-odds en lugar de probabilidad / proporción.

La función en la siguiente tabla utiliza algunas heurísticas limitadas para dividir el predictor continuo en bins, calcular la proporción media, convertir a log-odds y luego trazar geom_smoothsobre estos puntos agregados.

Ejemplo de cómo se ve este gráfico si una covariable tiene una relación cuadrática (+ ruido) con las probabilidades de registro de un objetivo binario:

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'

Creado el 06/02/2019 por el paquete reprex (v0.2.1)

A modo de comparación, así es como se vería esa relación cuadrática si solo trazara los 1's / 0's y agregara un 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")'

Creado el 25/02/2019 por el paquete reprex (v0.2.1)

La relación con logit es menos clara y su uso geom_smoothtiene algunos problemas.

Bryan Shalloway
fuente
0

Estoy de acuerdo en que publicar solo unas pocas líneas de datos de muestra sería muy útil. Si entiendo la pregunta, creo que sería más sencillo trazar la frecuencia según la proporción encontrada.

Primero generaré algunos datos de muestra en R; corrígeme si no te he entendido bien.

# 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

Y ahora simplemente grafica la frecuencia ( F) por proportion:

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

ingrese la descripción de la imagen aquí

nograpes
fuente
44
¡Esa trama es horrible! Es necesario suavizar, como en las respuestas anteriores.
kjetil b halvorsen