[英]How to delete outliers from a QQ-plot graph made with ggplot()?
我有一个二维数据集(例如x和y列)。 我使用以下函数来绘制此数据的QQ图。
# Creating a toy data for presentation
df = cbind(x = c(1,5,8,2,9,6,1,7,12), y = c(1,4,10,1,6,5,2,1,32))
# Plotting the QQ-plot
df_qq = as.data.frame(qqplot(df[,1], df[,2], plot.it=FALSE))
ggplot(df_qq) +
geom_point(aes(x=x, y=y), size = 2) +
geom_abline(intercept = c(0,0), slope = 1)
那就是结果图:
我的问题是,如何避免绘制最后一点(即(12,32))? 我宁愿不手动删除它,因为我有几个这样的数据对,并且每个数据对都有类似的异常值。 我想做的是编写一个代码,以某种方式识别距离45度线太远的点,并从df_qq中消除它们(例如,如果它比到45度线的平均距离远5倍,则可以消除)。 我的主要目的是使图形更易于阅读。 如果无法消除离群值,则QQ图的更规则部分会占据图形的一小部分,这使我无法直观地评估除离群值之外的两个向量的相似性。
我将不胜感激任何帮助。
有一个CRAN包referenceIntervals ,它使用Cook的距离来检测离群值。 通过将其应用于df_qq$y
的值,可以为要删除的df_qq
提供索引。
library(referenceIntervals)
out <- cook.outliers(df_qq$y)$outliers
i <- which(df_qq$y %in% out)
ggplot(df_qq[-i, ]) +
geom_point(aes(x=x, y=y), size = 2) +
geom_abline(intercept = c(0,0), slope = 1)
编辑。
根据OP的评论,
但据我了解,此功能并未考虑x和y之间的关系,
也许以下功能才是删除异常值所需要的功能,除非它们在向量之一中是异常值,而在两个向量中都不是。
cookOut <- function(X){
out1 <- cook.outliers(X[[1]])$outliers
out2 <- cook.outliers(X[[2]])$outliers
i <- X[[1]] %in% out1
j <- X[[2]] %in% out2
w <- which((!i & j) | (i & !j))
if(length(w)) X[-w, ] else X
}
使用第二个数据集(注释中的一个)进行测试。
额外的向量id
只是为了简化构面。
df1 <- data.frame(x = c(1,5,8,2,9,6,1,7,12), y = c(1,4,10,1,6,5,2,1,32))
df2 <- data.frame(x = c(1,5,8,2,9,6,1,7,32), y = c(1,4,10,1,6,5,2,1,32))
df_qq1 = as.data.frame(qqplot(df1[,1], df1[,2], plot.it=FALSE))
df_qq2 = as.data.frame(qqplot(df2[,1], df2[,2], plot.it=FALSE))
df_qq_out1 <- cookOut(df_qq1)
df_qq_out2 <- cookOut(df_qq2)
df_qq_out1$id <- "A"
df_qq_out2$id <- "B"
df_qq_out <- rbind(df_qq_out1, df_qq_out2)
ggplot(df_qq_out) +
geom_point(aes(x=x, y=y), size = 2) +
geom_abline(intercept = c(0,0), slope = 1) +
facet_wrap(~ id)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.