异常值识别功能

问题描述 投票:0回答:1

我有一个如下所示的数据集:

data <- structure(list(Date = structure(c(-2208988800, -2208902400, -2208816000, 
-2208729600, -2208643200, -2208556800, -2208470400, -2208384000, 
-2208297600, -2208211200, -2208124800, -2208038400, -2207952000
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), count = c(4668.8, 
4476.9, 4945, 5275.7, 15013.1, 14418, 14059.1, 14043.5, 14142.2, 
14904.2, 13849.9, 14712.1, 8793.9)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -13L))
日期
1900年1月1日 4,668.80
1900年2月1日 4,476.90
1900年3月1日 4,945.00
1900年4月1日 5,275.70
1900年5月1日 15,013.10
1900年6月1日 14,418.00
1900年1月7日 14,059.10
1900年8月1日 14,043.50
1900年9月1日 14,142.20
1900年1月10日 14,904.20
1900年1月11日 13,849.90
1900年1月12日 14,712.10
1900年1月13日 8,793.90

我正在尝试编写一个函数,根据前一个单元格是否为异常值来添加列。我希望有一个如下所示的数据集:

日期 异常值_T1 异常值_T2 异常值_T3 异常值_T4 异常值_T5 异常值_T6 异常值_T7 异常值_T8 异常值_T9 异常值_T10 异常值_T11 异常值_T12 异常值_T13
1900年1月1日 4,668.80 0 0 0 0 0 0 0 0 0 0 0 0 0
1900年2月1日 4,476.90 0 0 0 0 0 0 0 0 0 0 0 0 0
1900年3月1日 4,945.00 0 0 0 0 0 0 0 0 0 0 0 0 0
1900年4月1日 5,275.70 0 0 0 0 0 0 0 0 0 0 0 0 0
1900年5月1日 15,013.10 1
1900年6月1日 14,418.00 1
1900年1月7日 14,059.10 1
1900年8月1日 14,043.50 1
1900年9月1日 14,142.20 1
1900年1月10日 14,904.20 1
1900年1月11日 13,849.90 1
1900年1月12日 14,712.10 1
1900年1月13日 8,793.90 1

直到第四行,没有任何异常值。但是,第五行是异常值,因此 outlier_t5 = 1。现在,outlier_t5 等于 1,因此可以免除分析,因此 outlier_t5 = NA,但 outlier_t6 = 1(因为前四行和第六行是下一个异常值计算)...等等。

我真的很感谢这里的一些帮助。

r outliers
1个回答
0
投票

对于每个数据点,我们将添加一列来指示与之前的数据相比它是否为异常值。

这是一种可能的方法:

  1. 计算 IQR 以识别异常值。
  2. 为每个数据点添加一列以指示它是否为异常值。
  3. 对检测到异常值后计算中未考虑的数据点使用
    NA

让我们从用 R 编写函数开始。

library(dplyr)

# Function to identify outliers
detect_outliers <- function(data, column_name) {
  # Calculate IQR
  Q1 <- quantile(data[[column_name]], 0.25)
  Q3 <- quantile(data[[column_name]], 0.75)
  IQR <- Q3 - Q1
  
  # Limits to determine outliers
  lower_bound <- Q1 - 1.5 * IQR
  upper_bound <- Q3 + 1.5 * IQR
  
  # Identify outliers
  outlier_flags <- ifelse(data[[column_name]] < lower_bound | data[[column_name]] > upper_bound, 1, 0)
  
  return(outlier_flags)
}

# Function to add outlier columns
add_outlier_columns <- function(data, column_name) {
  n <- nrow(data)
  # Create outlier columns
  for (i in 1:n) {
    data[[paste0("Outlier_T", i)]] <- NA
  }
  
  # Detect outliers and fill the columns
  for (i in 5:n) { # Start from 5 as the example seems to consider the first 4 as non-outliers by default
    # Use a subset of data up to the current index for detection
    subset_data <- data[1:i, ]
    outlier_flags <- detect_outliers(subset_data, column_name)
    # Mark the last point as an outlier if it is one
    data[i, paste0("Outlier_T", i)] <- outlier_flags[i]
  }
  
  return(data)
}

# Apply the function to the dataset
data_with_outliers <- add_outlier_columns(data, "count")

# Display the first few rows of the modified dataset
head(data_with_outliers)

此方法首先计算 IQR 以确定数据点是否为异常值。对于每个数据点,都会向

data
添加一个新列,以指示与之前的数据相比它是否为异常值。如果数据点被识别为异常值,根据基于先前值的 IQR 标准,异常值列将使用
NA
进行初始化,并使用
1
进行更新。

© www.soinside.com 2019 - 2024. All rights reserved.