r - 如何从使用 ggplot() 制作的 QQ 图中删除异常值?
问题描述
我有一个二维数据集(比如列 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使用库克的距离来检测异常值。通过将它应用于它的值,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)
推荐阅读
- javascript - 有人看到问题了吗?#Bootast 脚本
- laravel - 如何显示 Laravel Breeze 状态消息
- python - 将神经网络 (Python) 编译成可执行文件
- reactjs - 自定义 useForm Hook 不更新字段值
- javascript - 有没有办法从数组中获得唯一的随机子数组,每个随机数组不应该有相同的元素?
- python - 如何拆分并转换为字典并交换键值
- javascript - 为什么这个递归示例给了我一个无限循环?
- javascript - 在特定值之后插入数组中的元素,并且仅当该值符合条件 || Javascript
- c# - 在 Windows 窗体中自定义数据网格视图
- xml - 如何在 XML 文件之间创建链接