问题描述
我有一个数据集,显示了大约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