簡體   English   中英

如何處理R中面板數據中觀察值內部和觀察值之間的異常值?

[英]How to deal with outliers within and between observations in a panel data in 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,10, 20, 15000), revenue_2010 = c(02, 10, 2500, 20000), revenue_2011 = c(14, 16, 10, 30000),
     size = c(2, 3, 5, 1))

正如您所看到的,我正在處理一個不平衡的面板數據,該數據在觀察值內(例如,公司 C 在 2010 年的突然收入)和觀察值之間(例如,公司 D收入比其他公司高,即使考慮到我選擇了應該相似的公司)...

所以,我的問題是,在 R 中處理這兩種異常值的最佳方法是什么? 我想對於內部異常值,寬格式的數據應該更好,對吧? 但是可以運行哪些代碼來逐行檢查異常值(即逐行觀察)? 對於第二種異常值? 將數據轉換為長格式會更好嗎? 如果是,我如何以長格式測試異常值?

非常感謝你的幫助! 最好的事物,

如何檢測主要是統計問題。 您可以使用的一種方法是 Hampel 過濾器(其優缺點不在本答案的范圍內)。

它認為中值median ± 3*(median absolute deviation)之外的median ± 3*(median absolute deviation)是異常值。

讓我們想象一下我們將使用這個標准。 您可以通過data.table by參數在測試內和測試之間進行。

將數據轉換為長格式會更好嗎?

這將使分析更容易,因此我通過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,10, 20, 15000), revenue_2010 = c(02, 10, 2500, 20000), revenue_2011 = c(14, 16, 10, 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

您還可以使用DescTools Winsorize()同時檢測和處理異常值。 查看詳情: https : //en.wikipedia.org/wiki/Winsorizing

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM