首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >识别河流水位随时间持续变化的离群点

识别河流水位随时间持续变化的离群点
EN

Stack Overflow用户
提问于 2022-09-21 14:44:52
回答 1查看 41关注 0票数 1

这是一种随时间变化的河流水位测量方法,由每五分钟测量一次水位的仪器测量。然而,由于一些干扰等因素的影响,水位数据中往往存在一些异常值。由于水位随时间的变化而不断变化,从水-时间散点图中可以明显地发现异常值。通常,异常值是异常值,但有时上升的水会突然改变水位。由于时间数据是精确到分钟,如何将分钟作为R中的自变量?R如何自动识别和消除这些异常值?

一些数据和数字显示为below.The,用红色选择的数据和数字是异常值。

EN

回答 1

Stack Overflow用户

发布于 2022-09-25 04:30:20

单变量异常值

您没有提供您的数据供我们查看,所以我将使用R中的mpg数据集,该数据集测量汽车度量中的许多变量。这里我只使用displ、hwy和cty变量来演示。

由于您可能在寻找一个R解决方案,一个简单的方法是在is_outlier包中使用rstatix函数。如果您关心多元异常值,也可以考虑使用mahalanobis_distance检查mahalanobis距离。要快速检查,可以使用is_outlier进行泛型检测(您可以修改设置以设置“异常值”的标准),也可以使用is_extreme来处理极端异常值。

代码语言:javascript
复制
#### Load Libraries ####
library(tidyverse)
library(rstatix)

#### Check Outliers ####
is_outlier(mpg$hwy) %>% 
  table()

在这里,您可以从列表的结果中看到有三个异常值:

代码语言:javascript
复制
FALSE  TRUE 
  231     3

我们可以通过在我们刚刚加载的ggplot包中的tidyverse包中着色这个因子来绘制它们:

代码语言:javascript
复制
#### Plot Outliers on Scatter Plot ####
mpg %>% 
  ggplot(aes(x=hwy,
             y=displ))+
  geom_point(aes(color=is_outlier(hwy)))+
  geom_smooth(se=F,
              color="lightblue")+
  labs(color="Outlier",
       x="Highway MPG",
       y="Engine Displacement",
       title="MPG x Displacement With Outlier Detection")+
  theme_bw()+
  scale_color_manual(values = c("darkblue",
                                "red"))

这给了我们这个阴谋。请注意,上面的注释在这里是高调的,因为well...using geom_smooth允许我们看到黄土线在这幅图的末尾已经向离群点移动。

您提到要过滤掉这些值。我们可以清楚地看到,高速公路MPG值超过40现在是异常值。因此,我们只需使用filter切换到绘图代码即可。

代码语言:javascript
复制
mpg %>% 
  filter(!hwy > 40) %>% 
  ggplot(aes(x=hwy,
             y=displ))+
  geom_point(aes(color=is_outlier(hwy)))+
  geom_smooth(se=F,
              color="lightblue")+
  labs(color="Outlier",
       x="Highway MPG",
       y="Engine Displacement",
       title="MPG x Displacement With Outlier Detection")+
  theme_bw()+
  scale_color_manual(values = c("darkblue",
                                "red"))

那么我们的情节就不再显示价值了:

如果希望保存数据以不存在这些异常值,只需使用以下代码即可。这里的!操作符简单地说:“不要给我这个。”

代码语言:javascript
复制
mpg.no.outliers <- mpg %>%
 filter(!hwy > 40)

多元异常值

您的数据中的多元异常值可以以相同的方式处理,在这方面,您的两个变量没有什么不同。我们可以试着把它们列成这样:

代码语言:javascript
复制
#### Find MVN Outliers ####
mpg %>%
  select(cty,hwy) %>% 
  mahalanobis_distance() %>% 
  filter(is.outlier == "TRUE")

因此,我们在城市和公路MPG变量之间发现了三个异常值:

代码语言:javascript
复制
# A tibble: 3 × 4
    cty   hwy mahal.dist is.outlier
  <int> <int>      <dbl> <lgl>     
1    28    33       16.2 TRUE      
2    33    44       14.7 TRUE      
3    35    44       22.7 TRUE 

为了绘制它们,我们使用了一个非常类似的方法:

代码语言:javascript
复制
#### Plot Them ####
mpg %>% 
  select(cty,hwy) %>% 
  mahalanobis_distance() %>% 
  ggplot(aes(x=hwy,
             y=cty,
             color=is.outlier))+
  geom_point()+
  geom_smooth(color="lightblue",
              se=F)+
  labs(x="Highway MPG",
       y="City MPG",
       title="Highway x City Mileage with MVN Outliers",
       color="MVN Outlier?")+
  theme_bw()+
  scale_color_manual(values = c("darkblue",
                                "red"))

这给了我们这样的结果:

在这种情况下,你可以看到黄土函数由于离群点而没有根性位移。这是因为与其他数据点相比,数值是极端的,但它们的线性度仍然与其他数据点相似。

正如另一个已经说过的,一个更详细的讨论什么时候和如何离群点可以在交叉验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73802759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档