您如何将二元结果与连续预测变量可视化?

机器算法验证 数据可视化
2022-03-19 19:49:37

我有一些需要可视化的数据,但不确定如何最好地做到这一点。我有一组基本项目各自的频率和结果 现在我需要绘制我的方法“找到”(即 1-结果)低频项的效果。我最初只有一个 x 轴的频率和 0-1 的 y 轴和点图,但它看起来很糟糕(特别是在比较来自两种方法的数据时)。也就是说,每个项目都有一个结果(0/1)并按其频率排序。Q={q1,,qn}F={f1,,fn}O{0,1}nqQ

这是一个带有单个方法结果的示例:

在此处输入图像描述

我的下一个想法是将数据划分为区间并计算区间上的局部灵敏度,但这个想法的问题是频率分布不一定是均匀的。那么我应该如何最好地选择间隔?

有谁知道一种更好/更有用的方法来可视化这些数据来描绘寻找稀有(即非常低频率)项目的有效性?

编辑:更具体地说,我展示了某种方法重建特定人群生物序列的能力。为了使用模拟数据进行验证,我需要展示重构变体的能力,而不管其丰度(频率)如何。所以在这种情况下,我正在可视化丢失和找到的项目,按它们的频率排序。该图将不包括不在中的重构变体。Q

4个回答

我过去所做的基本上是您在添加loess时所做的。根据点的密度,我会使用半透明点 (alpha),如下所示,和/或管道符号 ("|") 以尽量减少重叠。

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

在此处输入图像描述

(我不认为这里的误差条应该在边缘变宽,但是我知道没有一种简单的方法可以使用 ggplot 的内部 stat_smooth 函数来做到这一点。如果你在 R 中将此方法用于实数,我们可以做到通过在绘图前估计黄土及其误差条。)

编辑: Andy W. 对如果数据密度有用就尝试垂直抖动的评论以及来自 Mimshot 关于适当置信区间的评论。)

还要考虑哪些比例最适合您的用例。假设您出于逻辑回归建模的目的进行目视检查,并且想要可视化连续预测变量以确定您是否需要向模型添加样条或多项式项。在这种情况下,您可能需要对数赔率而不是概率/比例。

以下要点处的函数使用一些有限的启发式方法将连续预测器拆分为箱,计算平均比例,转换为对数赔率,然后geom_smooth在这些聚合点上绘图。

如果协变量与二进制目标的对数几率具有二次关系(+ 噪声),则此图表的示例:

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'

reprex 包(v0.2.1)于 2019 年 2 月 6 日创建

为了比较,如果您只是绘制 1/0 并添加一个 ,那么二次关系会是什么样子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")'

reprex 包(v0.2.1)于 2019 年 2 月 25 日创建

与 logit 的关系不太清楚,使用geom_smooth有一些问题。

如果您有太多重叠的点并且抖动不足,您可以为二进制变量的两个级别添加直方图(这样一个会颠倒)。这是一个结合逻辑回归的示例。

逻辑回归

想法和R代码(popbio::logi.hist.plot)来自

腐烂,MDLC(2005 年)。使用美国生态学会的 R. Bulletin 改进逻辑回归结果的呈现,86(1), 41-48。

https://esajournals.onlinelibrary.wiley.com/doi/10.1890/0012-9623%282005%2986%5B41%3AITPORO%5D2.0.CO%3B2

我同意只发布几行示例数据会有很长的路要走。如果我理解这个问题,我认为按找到的比例绘制频率是最简单的。

首先,我将在 R 中生成一些示例数据;如果我没有正确理解你,请纠正我。

# 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

现在只需将频率 ( F) 绘制为proportion

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

在此处输入图像描述