【问题标题】:R: How to remove outliers from a smoother in ggplot2?R:如何从 ggplot2 中的平滑器中删除异常值?
【发布时间】:2011-02-06 10:28:52
【问题描述】:

我尝试使用 ggplot2 绘制以下数据集,它是三个实验 A1、B1 和 C1 的时间序列,每个实验都有三个重复。

我正在尝试添加一个统计信息,该统计信息在返回更平滑(均值和方差?)之前检测并删除异常值。我已经编写了自己的异常值函数(未显示),但我希望已经有一个函数可以执行此操作,但我还没有找到它。

我从 ggplot2 书中的一些示例中查看了 stat_sum_df("median_hilow", geom = "smooth") ,但我不了解 Hmisc 的帮助文档以查看它是否删除了异常值。

在 ggplot 中是否有删除此类异常值的功能,或者我将在哪里修改下面的代码以添加我自己的功能?

编辑:我刚刚看到这个 (How to use Outlier Tests in R Code) 并注意到 Hadley 建议使用稳健的方法,例如 rlm。我正在绘制细菌生长曲线,所以我认为线性模型不是最好的,但对于其他模型或在这种情况下使用或使用稳健模型的任何建议将不胜感激。

library (ggplot2)  

data = data.frame (day = c(1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7), od = 
c(
0.1,1.0,0.5,0.7
,0.13,0.33,0.54,0.76
,0.1,0.35,0.54,0.73
,1.3,1.5,1.75,1.7
,1.3,1.3,1.0,1.6
,1.7,1.6,1.75,1.7
,2.1,2.3,2.5,2.7
,2.5,2.6,2.6,2.8
,2.3,2.5,2.8,3.8), 
series_id = c(
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1"),
replicate = c(
"A1.1","A1.1","A1.1","A1.1",
"A1.2","A1.2","A1.2","A1.2",
"A1.3","A1.3","A1.3","A1.3",
"B1.1","B1.1","B1.1","B1.1",
"B1.2","B1.2","B1.2","B1.2",
"B1.3","B1.3","B1.3","B1.3",
"C1.1","C1.1","C1.1","C1.1",
"C1.2","C1.2","C1.2","C1.2",
"C1.3","C1.3","C1.3","C1.3"))

> data
   day   od series_id replicate
1    1 0.10        A1      A1.1
2    3 1.00        A1      A1.1
3    5 0.50        A1      A1.1
4    7 0.70        A1      A1.1
5    1 0.13        A1      A1.2
6    3 0.33        A1      A1.2
7    5 0.54        A1      A1.2
8    7 0.76        A1      A1.2
9    1 0.10        A1      A1.3
10   3 0.35        A1      A1.3
11   5 0.54        A1      A1.3
12   7 0.73        A1      A1.3
13   1 1.30        B1      B1.1
... etc...

这是我目前所拥有的,并且运行良好,但未删除异常值:

r <- ggplot(data = data, aes(x = day, y = od))
r + geom_point(aes(group = replicate, color = series_id)) + # add points
   geom_line(aes(group = replicate, color = series_id)) + # add lines
   geom_smooth(aes(group = series_id))  # add smoother, average of each replicate

编辑:我刚刚在下面添加了两个图表,显示了我从真实数据而不是上面的示例数据中遇到的异常问题的示例。

第一个图显示了 p26s4 系列,在第 32 天左右,其中两个重复出现了非常奇怪的情况,显示了 2 个异常值。

第二个情节显示了 p22s5 系列,在第 18 天,那天的读数出现了一些奇怪的情况,我认为可能是机器错误。

目前我正在观察数据,以检查增长曲线是否正常。在采纳 Hadley 的建议并设置 family = "symmetric" 之后,我相信 loess smoother 在忽略异常值方面做得不错。

@Peter/@hadley,接下来我想做的是尝试将逻辑、gompertz 或 Richard 的增长曲线拟合到这些数据而不是黄土,并计算指数阶段的增长率。最终我计划在 R (http://cran.r-project.org/web/packages/grofit/index.html) 中使用 grofit 包,但现在我想尽可能使用 ggplot2 手动绘制这些。如果您有任何指点,那将不胜感激。

【问题讨论】:

    标签: r ggplot2 statistics outliers


    【解决方案1】:

    您是否尝试过 geom_smoothfamily = "symmetric" 参数(又将传递给 loess)?这将使黄土平滑地抵抗异常值。

    但是,查看您的数据,为什么您认为线性拟合是不够的?您只有 4 个 x 值,而且似乎没有强有力的证据表明偏离线性。

    【讨论】:

    • 当我尝试这个时我得到Error: Unknown parameters: family
    • 想通了!正确的语法是geom_smooth(method = loess, method.args = list(family = "symmetric"))
    【解决方案2】:

    首先,我不确定在如此小的数据上是否正确定义了“异常值”。

    其次,您必须确定“异常值”是什么意思,即它是一种药物、一种复制品还是某个时间点?

    正如 Hadley 所说,几乎没有证据表明偏离线性。

    最后,我认为使用平滑器的部分原因在于它可以很好地处理异常值,前提是有足够的数据。但你有的很少。

    所以,我必须确切地询问您为什么要删除异常值。也就是说,你打算如何处理这些数据(除了制作漂亮的图)?

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 2019-04-11
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多