2017-07-07 115 views
3

我比较两个栅格与细胞通过细胞情节简单的散点图两个群体,并发现我有两个看似不同的人群:[R标识散点图

true scatterplot

现在我想提取这些群体中每个群体的位置(通过隔离行ID,例如),以便我可以看到它们落在栅格中的位置,并可能理解为什么我会得到这种行为。这里是一个重复的例子:
X <- seq(1,1000,1)
Z <- runif(1000, 1, 2)
A = c(1.2 * X * Z + 100)
B = c(0.6 * X * Z)
df = data.frame(X = c(X,X), Y = c(A,B))
plot(df$X,df$Y)
sample scatter
另外,我的原数据有一定的1,000,000行,因此该解决方案需要支持大数据帧好。 关于我如何隔离这些组的任何想法?
谢谢

+1

我不明白你在做什么。期望的结果是什么?在你的原始图片中,看起来你有很多重叠。你会如何解决这个问题?你只是试图用眼睛将它们分开吗?或者你有“孤立群体”的数学定义? – MrFlick

回答

3

您的数据有一个线性分隔线。你可以找到它:

plot(df$X,df$Y) 
Pts = locator(2) 

你会想点击两组间和一个点下降了原点的另一最右侧(组间)。与您的数据我

Pts 
$x 
[1] 0.8066296 994.9723687 
$y 
[1] 48.56932 1255.32870 

## Slope 
(Pts$y[2] - Pts$y[1])/(Pts$x[2] - Pts$x[1]) 
[1] 1.213841 

## Draw the line to confirm 
abline(48,1.2, col="red") 

## use the line to distinguish the groups 
Group = rep(1, nrow(df)) 
Group[df$X*1.2 + 48 < df$Y] = 2 
plot(df, pch=20, col=Group) 

Plot

5

谱聚类是标识有明确的边界点的集群有用。一个很大的优点是它是无监督的,即不依赖于人的判断,尽管该方法很慢并且需要提供一些超参数(例如群集的数量)。

以下是集群的代码。代码在你的情况下需要几分钟。

library(kernlab) 
specc_df <- specc(as.matrix(df),centers = 2) 
plot(df, col = specc_df) 

结果是两个点集合的明显情节。 obviously two groups of points

+0

谢谢raymkchow,但我的原始数据有〜1,000,000行,所以这种解决方案在这种情况下似乎不可行 – Ilik

+0

哦,那么我们仍然需要一些更好的答案。你能否把这个要求添加到问题中? – raymkchow

+0

刚刚编辑了这个问题。 – Ilik