我需要按 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.
我设法制作了一个ScatterPlot by Group,它看起来像:
22334444
22335544
11335552
但是我没有设法通过自动聚类(最近邻居?)作为一个新的数据帧来获得Group的异常值。
(和拉尔斯一样,他远离第2组的其他人)
拥有像
这样的DF会很不错 Outliers_DF
Name, Group,X, Y
Lars, 2, 100, 50
Sam, 3, 900, 70
Trixi, 11, 200 , 2
答案 0 :(得分:0)
如何循环按组子集化矩阵并对每个子集的距离矩阵执行分层聚类。然后,您可以从输出中的每个hclust
对象中检索最远离观察的详细信息。首先,您获取组列并找到唯一的组数,然后为输出预先分配此长度的列表。
grpcol <- df$Group
ngroup <- unique(grpcol)
output <- vector("list", length(unique(grpcol)))
现在我们运行循环:“对于df
中的每个组,对相应的矩阵进行子集化,在其距离矩阵上运行hclust
,并将结果对象放在预分配列表中。”
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轻松找到如何执行此操作。)此外,您必须考虑一个标准来确定什么是异常值,您可以查看Cross Validated以获得对此的良好意见。