2017-07-07 1 views
3

Je compare deux rasters avec un simple diagramme de dispersion de la parcelle par cellule à cellule, et que je puisse avoir deux populations apparemment différentes:r identifier deux populations scatterplot

true scatterplot

Maintenant, je suis en train pour extraire les emplacements de chacune de ces populations (en isolant les identifiants de lignes, par exemple) afin que je puisse voir où ils tombent dans les rasters et peut-être comprendre pourquoi je reçois ce comportement. Voici un exemple reproductible:
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
En outre, mes données d'origine a quelques 1.000.000 lignes, donc a besoin de la solution pour supporter un grand cadre de données bien. Des idées sur comment je peux isoler chacun de ces groupes?
Merci

+1

Je ne comprends pas ce que vous essayez de faire. Quel est le résultat souhaité? Dans votre photo originale, il semble que vous avez beaucoup de chevauchement. Comment résoudriez-vous cela? Est-ce que vous essayez juste de les séparer par les yeux? Ou avez-vous une définition mathématique de "groupes isolés"? – MrFlick

Répondre

3

Vous avez une ligne de séparation linéaire. Vous pouvez le trouver avec:

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

Vous voulez cliquer sur un point entre les deux groupes par l'origine et une autre à l'extrême droite (entre les groupes). Avec vos données, je suis

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

Spectral Clustering est utile pour identifier les groupements de points qui a une frontière claire. Un grand avantage est qu'il n'est pas supervisé, c'est-à-dire qu'il ne dépend pas beaucoup du jugement humain, bien que la méthode soit lente et que certains hyperparamètres (par exemple le nombre de groupes) doivent être fournis.

Voici le code pour la mise en cluster. Le code prend environ quelques minutes dans votre cas.

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

Le résultat est un complot évident de deux groupes de points. obviously two groups of points

+0

Merci Raymkchow, mais mes données d'origine a ~ 1,000,000 lignes, donc cette solution ne semble pas réalisable dans ce cas – Ilik

+0

Oh, alors nous avons encore besoin de quelques meilleures réponses. Pouvez-vous s'il vous plaît ajouter cette exigence à la question? – raymkchow

+0

vient d'éditer la question. – Ilik