如何通过 R 中的 X 和 Y 坐标按组查找数据框中的异常值?

How to find outliers in a Data Frame by group with X and Y coordinates in R?

我需要在 R 中按坐标和组查找异常值。

我的数据框看起来像:

Name, Group, X, Y
Bob,  2, -300, 20
Karl, 4,  200, 10
Sara, 2, -298, 19
Hans, 4,  210, 12
Anna, 3, -700, 100
Maria,3, -690, 110
Lars, 2,  100, 50
etc.

我设法按组制作了一个散点图,如下所示:

22334444
22335544
11335552

但我没能通过自动聚类(最近邻?)作为新的 Dataframe 按组获取异常值。

(和 Lars 一样,他离第 2 组的其他人很远)

有一个像

这样的DF就好了
    Outliers_DF
    Name, Group,X,  Y
    Lars,  2,  100, 50
    Sam,   3,  900, 70
    Trixi, 11, 200 , 2

一个循环如何按组对矩阵进行子集化,并对每个子集的距离矩阵执行层次聚类。然后,您可以从输出中的每个 hclust 对象检索最外围观察的详细信息。首先你获取组列并找到唯一的组数,然后为输出预分配这个长度的列表。

grpcol <- df$Group
ngroup <- unique(grpcol)
output <- vector("list", length(unique(grpcol)))

现在我们 运行 我们的循环:"For every group in df, subset the corresponding matrix, run hclust on its distance matrix, and put the resultant object in the preallocated list."

for (grp in ngroup) {
  mat <- df[df$Group %in% grp, -2]
  output[[grp]] <- hclust(dist(mat))
}

我已经检查过它适用于此数据框 df(请注意,我添加了两个额外的人,所以它会起作用):

structure(list(Group = c(2L, 4L, 2L, 4L, 3L, 3L, 2L, 3L, 4L), 
X = c(-300L, 200L, -298L, 210L, -700L, -690L, 100L, -680L, 
220L), Y = c(20, 10, 19, 12, 100, 110, 50, 120, 14)), .Names = c("Group", 
"X", "Y"), class = "data.frame", row.names = c("Bob", "Karl", 
"Sara", "Hans", "Anna", "Maria", "Lars", "Person1", "Person2"))

要获取单个集群,请在您想要的组上使用 [,例如 output[2]

您需要从 $height$order$labels 中提取值。 (您可以通过搜索 SO 轻松找到如何执行此操作。)另外,您必须考虑一个标准来确定什么是异常值,您可以查看交叉验证以获得对此的良好意见。