如何使用箱线图找到值更可能来自不同条件的点?

机器算法验证 r 物流 分类 数据可视化 箱形图
2022-04-01 20:42:35

我已经使用箱线图绘制了一些数据。我正在比较条件 1(左)和条件 2(右)的值。我的目标是找到一个点,在该点我们做出决定,值从点条件 1 变为条件 2。

这个结论是否有意义,如果我说如果我再次进行实验并得到任何值而不是条件 1 的中值,那么该值很可能是条件 2?

或者有没有其他方法可以表示这些数据来得出结论,如果我得到随机值,我可以说它是来自条件 1 还是条件 2?

数据显示为 R 输入的代码:

Cond.1 <- c(2.9, 3.0, 3.1, 3.1, 3.1, 3.3, 3.3, 3.4, 3.4, 3.4, 3.5, 3.5, 3.6, 3.7, 3.7,
            3.8, 3.8, 3.8, 3.8, 3.9, 4.0, 4.0, 4.1, 4.1, 4.2, 4.4, 4.5, 4.5, 4.5, 4.6,
            4.6, 4.6, 4.7, 4.8, 4.9, 4.9, 5.5, 5.5, 5.7)
Cond.2 <- c(2.3, 2.4, 2.6, 3.1, 3.7, 3.7, 3.8, 4.0, 4.2, 4.8, 4.9, 5.5, 5.5, 5.5, 5.7,
            5.8, 5.9, 5.9, 6.0, 6.0, 6.1, 6.1, 6.3, 6.5, 6.7, 6.8, 6.9, 7.1, 7.1, 7.1,
            7.2, 7.2, 7.4, 7.5, 7.6, 7.6, 10, 10.1, 12.5)

每个条件有 39 个值。

数据箱线图

2个回答

@NickCox 提供了一种可视化数据的好方法。我认为您想找到一条规则来决定何时将值分类为条件 1 和条件 2。

在您的问题的早期版本中,您想知道是否应该将任何大于条件 1 的中值的值称为条件 2 的成员。这不是一个很好的使用规则。请注意,根据定义,的分布高于中位数。因此,您必然会错误分类的 true condition1 成员。根据您的数据,我认为您还会的真实条件 2 成员进行错误分类。 50%50%18%

思考像你这样的规则的价值的一种方法是形成一个混淆矩阵在 R 中,您可以caret 包中使用?confusionMatrix这是使用您的数据和建议规则的示例:

library(caret)

dat  = stack(list(cond1=Cond.1, cond2=Cond.2))
pred = ifelse(dat$values>median(Cond.1), "cond2", "cond1")
confusionMatrix(pred, dat$ind) 
# Confusion Matrix and Statistics
# 
#           Reference
# Prediction cond1 cond2
#      cond1    20     7
#      cond2    19    32
# 
#                Accuracy : 0.6667          
# ...       
#                                           
#             Sensitivity : 0.5128          
#             Specificity : 0.8205          
#          Pos Pred Value : 0.7407          
#          Neg Pred Value : 0.6275          
#              Prevalence : 0.5000          
#          Detection Rate : 0.2564          
#    Detection Prevalence : 0.3462          
#       Balanced Accuracy : 0.6667          

我打赌我们可以做得更好。

一种自然的方法是使用 CART(决策树)模型,该模型(当只有一个变量时)简单地找到最佳分割。在 R 中,您可以使用派对包中的?ctree来做到这一点

library(party)

cart.model = ctree(ind~values, dat)
windows()
  plot(cart.model)

CART(决策树)图

您可以看到,如果它是,模型将调用一个值“condition1”,否则称为“condition2”(注意 condition1 的中位数是)。这是混淆矩阵: 5.73.9

confusionMatrix(predict(cart.model), dat$ind)
# Confusion Matrix and Statistics
# 
#           Reference
# Prediction cond1 cond2
#      cond1    39    15
#      cond2     0    24
#     
#                Accuracy : 0.8077          
# ...       
#                                           
#             Sensitivity : 1.0000          
#             Specificity : 0.6154          
#          Pos Pred Value : 0.7222          
#          Neg Pred Value : 1.0000          
#              Prevalence : 0.5000          
#          Detection Rate : 0.5000          
#    Detection Prevalence : 0.6923          
#       Balanced Accuracy : 0.8077          

此规则产生的准确度为,而不是从绘图和混淆矩阵中,您可以看到真正的 condition1 成员永远不会被错误分类为 condition2。这不符合优化规则的准确性以及两种类型的错误分类同样糟糕的假设;如果不是这样,您可以调整模型拟合过程。 0.80770.6667


另一方面,如果我没有指出分类器必然会丢弃大量信息并且通常是次优的(除非你真的需要分类),那我就是失职了。您可能希望对数据进行建模,以便获得某个值成为条件 2 成员的概率。逻辑回归是这里的自然选择。请注意,由于您的条件 2 比条件 1 更分散,我添加了一个平方项以允许曲线拟合:

lr.model = glm(ind~values+I(values^2), dat, family="binomial")
lr.preds = predict(lr.model, type="response")
ord      = order(dat$values)
dat      = dat[ord,]
lr.preds = lr.preds[ord]

windows()
  with(dat, plot(values, ifelse(ind=="cond2",1,0), 
                 ylab="predicted probability of condition2"))
  lines(dat$values, lr.preds)

条件 2 的预测概率

这显然为您提供了更多、更好的信息。不建议您丢弃预测概率中的额外信息并将它们二分法分类,但为了与上述规则进行比较,我可以向您展示使用逻辑回归模型这样做所产生的混淆矩阵:

lr.class = ifelse(lr.preds<.5, "cond1", "cond2")
confusionMatrix(lr.class, dat$ind)
# Confusion Matrix and Statistics
# 
#           Reference
# Prediction cond1 cond2
#     cond1    36     8
#     cond2     3    31
# 
#                Accuracy : 0.859           
# ...
# 
#             Sensitivity : 0.9231          
#             Specificity : 0.7949          
#          Pos Pred Value : 0.8182          
#          Neg Pred Value : 0.9118          
#              Prevalence : 0.5000          
#          Detection Rate : 0.4615          
#    Detection Prevalence : 0.5641          
#       Balanced Accuracy : 0.8590          

准确度现在是,而不是0.8590.8077

在此处输入图像描述

这是许多可能性之一。早在 1979 年,Emanuel Parzen 就建议混合分位数图和箱线图。下面给出一些参考资料。显然,箱线图的方框显示了中位数和四分位数,它们只是关键的分位数。显示所有数据,即所有分位数或顺序统计信息,是完全有可能的,至少在少数组(如在此线程中)和少量或中等数量的观察(如在此线程中)。事实上,该设计很好地扩展到更大的样本量。异常值、粒度、联系、分组和差距(无论您想以哪种方式考虑这些特征)总是显而易见的,以及一般水平、分布和形状。该图不受人工制品或任意经验法则的副作用的影响,例如在最近四分位数的 1.5 IQR 范围内或不在范围内。反过来,

有理由指出,分位数图只是轴反转的累积分布图,尽管它们更常显示为点模式而不是连接线。

Cox (2012) 报告了一个 Stata 实现,他的stripplot(Stata 用户可以从 SSC 下载)提供了另一个。在任何主要的统计或数学软件中,实施都应该是微不足道的。

我认为这种显示比传统的箱形图提供了更多的细节,这里没有充分利用可用空间。传统的箱线图可能对 10-100 个组或变量有所帮助,其中可能需要对数据进行一些严重的减少,但它会为常见的少数组或少数变量的情况抛出可能有趣的精细结构。

该图的另一个关键优点是它与基本但基本的事实相呼应,即一半的值在框内,所以也有一半的值在框外(通常是最有趣或更重要的一半)。我甚至见过有经验的统计人员被胖盒子和细胡须之间的鲜明对比所误导。这方面的经典例证是任何 U 形分布或任何具有两个大致相等大小的大团块的分布。然后盒子又长又肥,胡须又短又细。人们经常忽略这样一个事实,即这种胡须隐藏着最高的密度。Tukey (1977) 用瑞利的数据给出了一个例子。

在这种情况下以及在许多其他情况下使用对数刻度。原则上,分位数箱形图很容易与任何单调变换兼容,因为分位数的变换与变换值的分位数相同。(有一些小字体限定,因为中位数和四分位数可能是通过平均相邻订单统计数据产生的,这通常不会咬人。)

我不提供任何类型的图形替代显着性检验。这是一个探索装置。

考克斯,新泽西州,2012 年。轴心练习,或图表上的位置。 统计杂志12(3):549-561。.pdf 可在此处访问

Parzen,E. 1979a。非参数统计数据建模。 杂志,美国统计协会74:105-121。

Parzen, E. 1979b。稳健估计的密度分位数函数视角。在 Launer、RL 和 GN Wilkinson (Eds)统计中的稳健性。 纽约:学术出版社,237-258。

Parzen, E. 1982。使用分位数和密度分位数函数的数据建模。在 Tiago de Oliveira, J. 和 Epstein, B. (Eds) 统计方面的一些最新进展。伦敦:学术出版社,23-52。

Tukey,JW 探索性数据分析。 马萨诸塞州雷丁:Addison-Wesley。