与连续预测器相比,您如何形象地显示二进制结果?


10

我需要可视化一些数据,不确定如何做到最好。我有一些基础项目,频率分别为和结果 。现在,我需要绘制我的方法“发现”(即1结果)低频项的效果如何。最初,我的频率x轴和ay轴为0-1,具有点状图,但它看起来太可怕了(特别是在比较两种方法的数据时)。也就是说,每个项都有一个结果(0/1),并按其频率排序。F = { f 1f n }={q1个qñ}F={F1个Fñ}Ø{01个}ñq

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

在此处输入图片说明

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

有谁知道一种更好/更有用的方式来可视化此类数据,以描绘发现稀有(即,非常低频率)的物品的有效性?

编辑:更具体地讲,我正在展示某种方法来重建特定种群的生物序列的能力。为了使用模拟数据进行验证,我需要展示重建变异体的能力,而无论其丰度(频率)如何。因此,在这种情况下,我将可视化丢失和找到的物品,并按其频率排序。此图将不包括不在重构变体。


1
我不太了解 “结果”是否找到了东西?什么是“稀有物品”?
彼得·弗洛姆

1
海事组织(IMO),您应该包括您认为令人恐惧的图表-它可以使所有人更好地了解您要显示的数据。
Andy W

@PeterFlom,我已对其进行编辑以使其更加清晰。每个项目的0-1结果表示“未找到”和“找到”。稀有物品是非常低频率的物品。
Nicholas Mancuso 2012年

@AndyW,已编辑以包含图像。鉴于y轴上的值并不能真正反映“发现”和“未找到”的概念,但至少是为了传达我想要呈现的内容(出于此问题的目的),您会明白...
Nicholas Mancuso

1
好的,您好像在数据的散点图上尝试过,其中y值只能为0或1。您想比较同一点上多种方法的这类图吗?但是,每种方法都能以一种或两种方式是对还是错?也就是说,每个点(无论是不是)。因此,一种方法可以说一个点是(无论)还是不是(什么),并且选择是对还是错?
彼得·弗洛姆

Answers:


10

我过去所做的基本上是您加上黄土所做的。根据点的密度,我将使用如下所示的半透明点(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则提供适当的置信区间。)


3
+1-我还建议对点使用抖动(除了透明度之外)。在此示例中,我将替换geom_point(size=2, alpha=0.4)geom_jitter(size=2, alpha=0.4, position = position_jitter(height = .02))
Andy W

3
+1,但您应使用二项式分布反函数的置信界,而不要隐含高斯噪声。
Mimshot 2012年

@Mimshot您可以显示如何正确计算置信区间吗?
蜜蜂家伙

1
@Mimshot您知道ggplot2提供正确CI 的一种方法吗?我有一个带有配置项的图,[0,1]这些图显然来自错误的计算
MichaelChirico

[01个]

2

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

下面的要点中的函数使用一些有限的启发式方法将连续预测变量拆分为bin,计算平均比例,转换为对数奇数,然后绘制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-02-06

为了进行比较,如果仅绘制1/0并添加a,则二次关系将是这样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-02-25

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


0

我同意,仅发布几行示例数据将大有帮助。如果我理解这个问题,我认为以找到的比例绘制频率将是最简单的。

首先,我将在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

现在只需按以下方式绘制频率(Fproportion

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

在此处输入图片说明


4
那情节太可怕了!如先前的答案中所述,需要进行一些平滑处理。
kjetil b halvorsen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.