【问题标题】:Outliers and scales with boxplots: is my linear model being influenced in ggplot2?带有箱线图的异常值和比例:我的线性模型是否受到 ggplot2 的影响?
【发布时间】:2015-08-21 17:52:19
【问题描述】:

我正在尝试确定某些数据是否存在总体趋势。我正在绘制不同排放类型的排放数据(以吨为单位)。我觉得我正在解决这个问题,但也许我不完全理解删除(或隐藏?)异常值如何影响线性模型拟合箱线图。我的方法是为数据本身绘制一些箱线图,并为每个方面叠加一个线性模型,以了解每种排放类型的总体趋势。

有异常值:

q <- ggplot(balt, aes(year, Emissions))
q + 
  geom_boxplot(aes(color=factor(year))) + 
  facet_grid(.~type)
  geom_smooth(method='lm')

产生:

没有异常值:

q + 
  geom_boxplot(aes(color=factor(year)), outlier.shape=NA) + 
  facet_grid(.~type)
  geom_smooth(method='lm')

产生:

显然我想调整 Y 轴的大小,所以我将 Y 上限设置为看起来像 80,因为 1999 年箱线图的“NONPOINT”的顶部尾部看起来与前两个图非常接近:

q + 
  geom_boxplot(aes(color=factor(year)), outlier.shape=NA) + 
  scale_y_continuous(limits=c(0,80)) +
  facet_grid(.~type)
  geom_smooth(method='lm')

产生:

为了证明它正在调整大小,我将 Y 上限重置为 60,其中“NONPOINT”1999 箱线图明显越过了:

我收到的关于最终情节的警告如下:

Warning messages:
1: Removed 4 rows containing non-finite values (stat_boxplot).
2: Removed 24 rows containing non-finite values (stat_boxplot).
3: Removed 9 rows containing non-finite values (stat_boxplot).
4: Removed 4 rows containing missing values (stat_smooth).
5: Removed 24 rows containing missing values (stat_smooth).
6: Removed 9 rows containing missing values (stat_smooth).
7: Removed 9 rows containing missing values (geom_point).
8: Removed 17 rows containing missing values (geom_point).
9: Removed 17 rows containing missing values (geom_point).
10: Removed 17 rows containing missing values (geom_point).
11: Removed 1 rows containing missing values (geom_point).
12: Removed 1 rows containing missing values (geom_point).
13: Removed 1 rows containing missing values (geom_point).
14: Removed 2 rows containing missing values (geom_point).
15: Removed 20 rows containing missing values (geom_point).
16: Removed 52 rows containing missing values (geom_point).
17: Removed 59 rows containing missing values (geom_point).
18: Removed 41 rows containing missing values (geom_point).
19: Removed 1 rows containing missing values (geom_point).
20: Removed 7 rows containing missing values (geom_point).
21: Removed 10 rows containing missing values (geom_point).
22: Removed 43 rows containing missing values (geom_point).
18: Removed 10 rows containing missing values (geom_point).
19: Removed 43 rows containing missing values (geom_point).

我不太清楚这些非有限值的含义,但是其余的警告看起来只是在删除异常值?我在这里可能是错的,但我不知道如何猜测。

最后,将 Y 上限设置为 20 会产生相互矛盾的线性模型结果:

“NONPOINT”以前被建模为负斜率,现在它显示为正斜率。显然,箱线图的大小调整正在影响模型。 outlier.shape=NAscale_y_continuous() 是否在主动删除数据?

我的方法是否存在严重缺陷?我还没有在堆栈或其他地方看到更好的方法来从箱线图中删除异常值。

【问题讨论】:

  • 好地方,抱歉打错了。相应地用 lm 更新绘图...
  • 没有看到您的数据我不能肯定地说,但是当您将限制设置为 y = 60 时,您正在切断部分数据,从而改变分布。有意义的是,如果您删除 60 以上的值,您会将数据的中位数(和 IQR)向下移动,并且最大晶须也会向下移动。
  • 涂鸦 - 这是有道理的,并且可以解释将 Y 限制降低到如此低时线性模型的行为变化。在去除异常值后,将一个安全的方法调整为所有方面的最高胡须(图 3)?
  • 这将是一种安全的方法,可能会为您提供更符合您期望的结果。值得注意的是,简单地删除异常值很少是最好的方法。相反,您可能想要探索一种不太可能受到异常值严重影响的更稳健的回归方法。如果这回答了您的问题,请接受下面的答案,以便其他人知道您的问题已得到解决。
  • 我不确定你的线性模型在这里是否合适,你的数据看起来非常扭曲。如果您只是在探索数据,那么不要成为纯粹主义者,但如果您想做一些适当的统计,您可能需要查看其他分布,可能是泊松。或询问交叉验证...

标签: r ggplot2


【解决方案1】:

这对于评论来说太长了,因此将其移至答案。如果没有看到您的数据,我不能肯定地说,但是当您将限制设置为 y = 60 时,您正在切断部分数据,从而改变分布。有意义的是,如果您删除 60 以上的值,您会将数据的中位数(和 IQR)向下移动,并且最大胡须也会向下移动。当您限制y = 20 时,您将截断如此多的数据,从而获得截然不同的结果,因为每个时间点的数据由于各自分布的差异而受到的影响不同。

所以要回答您的问题,由于您对数据引入的人为限制,您的lm(实际上是ggplot2 的一部分)受到ggplot2 的影响。

处理异常值的方法有很多,但您可能希望在ggplot2 之外处理它们。一种选择是在每个时间点删除 > +/- 3 SD 的值。另一个是转换您的数据。您可能想探索平方根变换、对数变换和逆/倒数变换(按严重性递增的顺序)。因此,如果对数转换不充分,您可以使用下一级转换。 Box-Cox 会自动运行所有转换,因此您可以选择最佳转换。

【讨论】:

  • 有没有办法保留异常值,但隐藏它们以防止绘图?我一直在尝试outlier.color=NA,但这似乎没有任何作用。
  • @AI52487963 - 沿着这条线的东西应该可以解决问题 - # compute lower and upper whiskers ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]$stats[c(1,5)] 部分获取上下胡须值)# scale y limits based on ylim1 p1 = p0 + coord_cartesian(ylim = ylim1*1.05)(你可以在你已经完成的绘图结束)
猜你喜欢
  • 2019-06-03
  • 2017-10-13
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 2014-03-28
相关资源
最近更新 更多