Câu hỏi Cách xóa các ngoại lệ khỏi tập dữ liệu


Tôi có một số dữ liệu đa biến về vẻ đẹp so với lứa tuổi. Độ tuổi từ 20-40 trong khoảng thời gian 2 (20, 22, 24 .... 40), và đối với mỗi bản ghi dữ liệu, chúng được đưa ra một độ tuổi và một đánh giá vẻ đẹp từ 1-5. Khi tôi làm ô nền của dữ liệu này (tuổi trên trục X, xếp hạng làm đẹp trên trục Y), có một số ngoại lệ được vẽ bên ngoài râu của mỗi hộp.

Tôi muốn loại bỏ các ngoại lệ này khỏi chính khung dữ liệu, nhưng tôi không chắc cách R tính toán các ngoại lệ cho các ô của nó. Dưới đây là ví dụ về dữ liệu của tôi có thể trông như thế nào. enter image description here


75
2018-01-24 21:23


gốc


Các boxplot chức năng trả về các ngoại lệ (trong số các số liệu thống kê khác) vô hình. Thử foo <- boxplot(...); foo và đọc ?boxplot để hiểu đầu ra. - Joshua Ulrich
Bạn nên chỉnh sửa câu hỏi của mình theo nhận xét mà bạn đã đưa ra cho câu trả lời của @ Prasad! - aL3xa
@ aL3xa: đó là câu đầu tiên của đoạn thứ hai. - Joshua Ulrich
Liên quan, thích hợp: davidmlane.com/ben/outlier.gif - eyjo
Bạn có thể gửi liên kết đến dữ liệu không? - wordsforthewise


Các câu trả lời:


OK, bạn nên áp dụng một cái gì đó như thế này để tập dữ liệu của bạn. Không thay thế và lưu hoặc bạn sẽ phá hủy dữ liệu của mình! Và, btw, bạn nên (hầu như) không bao giờ loại bỏ các ngoại lệ khỏi dữ liệu của bạn:

remove_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.5 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- NA
  y[x > (qnt[2] + H)] <- NA
  y
}

Để xem nó hoạt động:

set.seed(1)
x <- rnorm(100)
x <- c(-10, x, 10)
y <- remove_outliers(x)
## png()
par(mfrow = c(1, 2))
boxplot(x)
boxplot(y)
## dev.off()

Và một lần nữa, bạn không bao giờ nên tự làm điều này, các ngoại lệ chỉ có ý nghĩa! =)

CHỈNH SỬA: Tôi đã thêm na.rm = TRUE như mặc định.

EDIT2: Đã xóa quantile chức năng, thêm subscripting, do đó làm cho chức năng nhanh hơn! =)

enter image description here


92
2018-01-24 22:47



Cảm ơn đã giúp đỡ! Tôi sẽ nghĩ nếu R có khả năng xuất ra các ngoại lệ trong ô, tôi không cần phải thực hiện các phép tính trung gian này. Đối với việc xóa các ngoại lệ, đây chỉ là một nhiệm vụ. - Dan Q
OK, tôi đang thiếu thứ gì đó ở đây. Bạn muốn xóa các ngoại lệ khỏi dữ liệu, vì vậy bạn có thể vẽ chúng bằng boxplot. Đó là quản lý được, và bạn nên đánh dấu câu trả lời của @ Prasad sau đó, kể từ khi trả lời câu hỏi của bạn. Nếu bạn muốn loại trừ các ngoại lệ bằng cách sử dụng "quy tắc ngoại lệ" q +/- (1.5 * H), do đó chạy một số phân tích, sau đó sử dụng chức năng này. BTW, tôi đã làm điều này từ đầu, w / o Googling, do đó, có một cơ hội mà tôi đã reenvented bánh xe với chức năng này của tôi ... - aL3xa
Bạn không nên hỏi các câu hỏi chuyển nhượng trên stackoverflow! - hadley
Điều đó có nghĩa là chúng ta cũng không nên trả lời nó? =) - aL3xa
"ngoại lệ chỉ có nghĩa là"? Không cần thiết. Chúng có thể đến từ các lỗi đo lường và phải được xem xét kỹ lưỡng. Khi ngoại lệ quá lớn, nó có thể có nghĩa gì đó, hoặc không quá nhiều. Đó là lý do tại sao (ít nhất là trong sinh học), trung vị thường nói nhiều hơn về dân số so với trung bình. - Rodrigo


Không ai đã đăng câu trả lời đơn giản nhất:

x[!x %in% boxplot.stats(x)$out]

Cũng thấy điều này: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/


106
2018-02-08 19:24



Thực sự thanh lịch. Cảm ơn. Nhưng cần phải cẩn thận nếu phân phối có nhiều hơn một chế độ và các ngoại lệ thực sự chỉ có ít và phân tán. - Earnest_learner
Nó sẽ là tuyệt vời nếu bạn có thể nhận được chỉ số của họ trong một tập dữ liệu. Cách bạn thực hiện sẽ lọc dựa trên giá trị dữ liệu. Nếu ô lô cũng làm việc nhóm, không nhất thiết giá trị dữ liệu giống nhau sẽ là ngoại lệ trong mỗi nhóm - adam
Một điều cũng quan trọng cần lưu ý là nó không thay đổi tập dữ liệu. Đây chỉ là một phương pháp lọc. Vì vậy, nếu bạn dự định sử dụng tập dữ liệu mà không có ngoại lệ, hãy gán nó cho một biến. ví dụ. result = x[!x %in% boxplot.stats(x)$out] - Victor Augusto


Sử dụng outline = FALSE như là một lựa chọn khi bạn làm các ô vuông (đọc trợ giúp!).

> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)

enter image description here


25
2018-01-24 21:44



thực sự, điều này sẽ loại bỏ các ngoại lệ khỏi chính ô mẫu, nhưng tôi muốn loại bỏ các ngoại lệ ra khỏi khung dữ liệu. - Dan Q
Tôi thấy, sau đó là @ Joshua cho biết bạn cần phải xem xét dữ liệu được trả về bởi chức năng boxplot (đặc biệt là out và group các mục trong danh sách). - Prasad Chalasani


Hàm boxplot trả về các giá trị được sử dụng để thực hiện âm mưu (thực tế là sau đó được thực hiện bởi bxp ():

bstats <- boxplot(count ~ spray, data = InsectSprays, col = "lightgray") 
#need to "waste" this plot
bstats$out <- NULL
bstats$group <- NULL
bxp(bstats)  # this will plot without any outlier points

Tôi cố ý không trả lời câu hỏi cụ thể bởi vì tôi cho rằng nó sơ suất thống kê để loại bỏ "các ngoại lệ". Tôi xem xét thực hành chấp nhận được để không âm mưu chúng trong một ô vuông, nhưng loại bỏ chúng là một hệ thống mangling có hệ thống và không hợp lý của hồ sơ quan sát.


16
2018-01-24 22:04



À, bỏ qua câu hỏi mà không biết tại sao câu hỏi được hỏi cũng không phải là một cách hay. Có, nó không phải là tốt để loại bỏ 'outliers' từ dữ liệu nhưng đôi khi bạn cần dữ liệu mà không có ngoại lệ cho các nhiệm vụ cụ thể. Trong một phân bổ số liệu thống kê tôi đã có gần đây, chúng tôi đã phải hình dung một tập hợp mà không có các ngoại lệ của nó để xác định mô hình hồi quy tốt nhất để sử dụng cho dữ liệu. Vậy đó! - Alex Essilfie
Tôi không xem xét những lời khuyên bạn có thể đã nhận được trong vấn đề này để "xác định mô hình hồi quy tốt nhất" để được đặc biệt thuyết phục. Thay vào đó, nếu bạn cần loại bỏ các ngoại lệ cho mục đích mơ hồ đó, thì tôi nghĩ nó phản ánh kém trên những người khuyên nó hơn là bằng chứng về sự vô hiệu của vị trí của tôi. - 42-


x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]

Tôi thấy điều này rất dễ dàng để loại bỏ các ngoại lệ. Trong ví dụ trên tôi chỉ cần giải nén 2 phần trăm đến 98 phần trăm của các giá trị thuộc tính.


6
2017-10-23 04:55





Tôi đã tìm kiếm các gói liên quan đến việc loại bỏ các ngoại lệ và tìm thấy gói này (đáng ngạc nhiên được gọi là "các ngoại lệ"): https://cran.r-project.org/web/packages/outliers/outliers.pdf
nếu bạn đi qua nó, bạn thấy những cách khác nhau để loại bỏ các ngoại lệ và trong số đó tôi tìm thấy rm.outlier thuận tiện nhất để sử dụng và như nó nói trong liên kết ở trên: "Nếu phát hiện ngoại lệ và được xác nhận bằng các kiểm tra thống kê, chức năng này có thể loại bỏ nó hoặc thay thế bằng trung bình mẫu hoặc trung bình "và cũng ở đây là phần sử dụng từ cùng một nguồn:
"Sử dụng

rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)

Lập luận 
x  một tập dữ liệu, thường xuyên nhất là một vectơ. Nếu đối số là một khung dữ liệu, thì ngoại lệ là được loại bỏ khỏi mỗi cột một cách dễ dàng. Hành vi tương tự được áp dụng bằng cách áp dụng khi ma trận được đưa ra.
lấp đầy  Nếu được đặt thành TRUE, giá trị trung vị hoặc trung bình được đặt thay vì ngoại lệ. Nếu không outlier (s) là / chỉ đơn giản là loại bỏ.
trung bình  Nếu được đặt thành TRUE, giá trị trung bình được sử dụng thay cho giá trị trung bình trong thay thế ngoại lệ. ngược lại nếu được đặt thành TRUE, cho giá trị ngược lại (nếu giá trị lớn nhất có chênh lệch lớn nhất từ trung bình, nó cho nhỏ nhất và ngược lại) "


4
2017-12-29 01:10





Thêm vào đề xuất của @sefarkas và sử dụng định lượng dưới dạng cắt giảm, người ta có thể khám phá tùy chọn sau:

newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) ) 

Điều này sẽ loại bỏ các điểm điểm vượt quá số lượng 99. Nên cẩn thận như những gì aL3Xa đang nói về việc giữ các ngoại lệ. Nó chỉ nên được loại bỏ để có được một cái nhìn bảo thủ thay thế của dữ liệu.


3
2018-03-19 06:06



Là nó 0.91 hoặc là 0.99? như trong mydata$var < quantile(mydata$var, probs=c(.01, .91))[1]) hoặc là mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) - Komal Rathi
Nếu bạn có một lý do cụ thể để sử dụng tỷ lệ phần trăm 91 thay vì phân vị thứ 99, bạn có thể sử dụng nó. Nó chỉ là một heuristic - Earnest_learner


Sẽ không:

z <- df[df$x > quantile(df$x, .25) - 1.5*IQR(df$x) & 
        df$x < quantile(df$x, .75) + 1.5*IQR(df$x)]

hoàn thành nhiệm vụ này khá dễ dàng?


1
2017-07-28 17:36