如何处理R中面板数据中观察值之内和之间的离群值?

问题描述

我有一个数据集,显示了大约100.000家公司20年的收入。数据还有许多其他变量,但是下面,我正在编写此数据集的简化示例的可复制版本。

my_data <- data.frame(Company = c("A","B","C","D"),CITY = c("Paris","Paris","Quimper","Nice"),year_creation = c("2010","2009","2008","2009"),revenue_2008 = c(NA,NA,10,NA),revenue_2009 = c(NA,20,15000),revenue_2010 = c(02,2500,20000),revenue_2011 = c(14,16,30000),size = c(2,3,5,1))

正如您所看到的,我正在处理一个不平衡的面板数据,该数据在观察值(例如,C公司在2010年的突然收入)和观察值之间(例如,D公司在甚至考虑到我选择了应该是相似的公司),其收入要比其他公司高得多。

所以,我的问题是,处理R中这两种异常值的最佳方法是什么?我以为对于离群值而言,宽格式的数据应该更好,对吗?但是,可以运行哪些代码逐行检查异常值(即逐观察)? 对于第二种离群值?将数据转换为长格式是否更好?如果是,我该如何测试长格式的离群值?

非常感谢您的帮助! 最好,

解决方法

如何检测主要是统计问题。可以使用的一种方法是Hampel过滤器(它的优缺点不在此答案的范围内)。

它将median ± 3*(median absolute deviation)之外的值视为离群值。

让我们假设我们将使用此标准。您可以通过by的{​​{1}}参数在测试之内和之间进行测试。

将数据转换为长格式更好吗?

这会使分析更加容易,因此我已通过data.table

对其进行了转换。
melt
my_data <- data.frame(Company = c("A","B","C","D"),CITY = c("Paris","Paris","Quimper","Nice"),year_creation = c("2010","2009","2008","2009"),revenue_2008 = c(NA,NA,10,NA),revenue_2009 = c(NA,20,15000),revenue_2010 = c(02,2500,20000),revenue_2011 = c(14,16,30000),size = c(2,3,5,1))

library(data.table)

my_data <- as.data.table(my_data)

my_data <- melt(my_data,id.vars = c("Company","CITY","year_creation","size"))

hampel_filter <- function(x){
  x_med <- median(x,na.rm = TRUE)
  x_mad <- mad(x,na.rm = TRUE)
  (x > x_med + 3*x_mad | x < x_med - 3*x_mad)
}

my_data[,between_out := hampel_filter(value),by = variable]
my_data[,within_out := hampel_filter(value),by = Company]

您还可以同时使用> my_data Company CITY year_creation size variable value between_out within_out 1: A Paris 2010 2 revenue_2008 NA NA NA 2: B Paris 2009 3 revenue_2008 NA NA NA 3: C Quimper 2008 5 revenue_2008 10 FALSE FALSE 4: D Nice 2009 1 revenue_2008 NA NA NA 5: A Paris 2010 2 revenue_2009 NA NA NA 6: B Paris 2009 3 revenue_2009 10 FALSE FALSE 7: C Quimper 2008 5 revenue_2009 20 FALSE FALSE 8: D Nice 2009 1 revenue_2009 15000 TRUE FALSE 9: A Paris 2010 2 revenue_2010 2 FALSE FALSE 10: B Paris 2009 3 revenue_2010 10 FALSE FALSE 11: C Quimper 2008 5 revenue_2010 2500 FALSE TRUE 12: D Nice 2009 1 revenue_2010 20000 TRUE FALSE 13: A Paris 2010 2 revenue_2011 14 FALSE FALSE 14: B Paris 2009 3 revenue_2011 16 FALSE TRUE 15: C Quimper 2008 5 revenue_2011 10 FALSE FALSE 16: D Nice 2009 1 revenue_2011 30000 TRUE FALSE 中的Winsorize()检测和处理异常值。查看详细信息:https://en.wikipedia.org/wiki/Winsorizing

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...