2017-07-07 119 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