Tengo datos que se ven así:

   identity  growth x-pos y-pos
1:     Z      0.1   0.5   0.7
2:     B      0.1   0.1   0.0
3:     C      0.2   4.6   2.5
4:     D      0.3   5.6   5.0
5:     A      0.4   0.2   1.0
6:     P      0.1   0.4   2.0

Me gustaría comparar si los valores de crecimiento están correlacionados entre n vecinos más cercanos para cada objeto con una identidad única. Básicamente, cree una matriz que identifique los 5 vecinos más cercanos para cada fila identity única en función de las ubicaciones indicadas por x-pos y y-pos y realice correlaciones entre el valor growth del objeto (por ejemplo, Z) y el valor de crecimiento del 1º, 2º, 3º, 4º y 5º vecino más cercano de Z.

Intenté hacer una matriz euclidiana y luego usar una medida de autocorrelación usando el paquete ADE, pero me preguntaba si hay una forma más simple de construir dicha matriz.

0
Glen 25 ago. 2020 a las 23:01

1 respuesta

La mejor respuesta

realizar correlaciones entre el valor growth del objeto (por ejemplo, Z) y el valor de crecimiento del primer, segundo, tercer, cuarto y quinto vecino más cercano de Z

No puede calcular una correlación entre dos puntos.

Las cosas más similares que se me ocurren es calcular la correlación entre sus puntos y su vecino promedio, o hacer una prueba por pares para compararlos. Pero eso sería para todos los "objetos" juntos, no una correlación por objeto (ya que solo 1 punto por objeto).

crear una matriz que identifique los 5 vecinos más cercanos para cada fila de identidad única en función de las ubicaciones indicadas por x-pos y y-pos

# read in data
df <- tribble(
  ~identity,  ~growth, ~`x-pos`, ~`y-pos`,
       "Z",      0.1,   0.5,   0.7,
       "B",      0.1,   0.1,   0.0,
       "C",      0.2,   4.6,   2.5,
       "D",      0.3,   5.6,   5.0,
       "A",      0.4,   0.2,   1.0,
       "P",      0.1,   0.4,   2.0)

# here with 3 neighbors since we have only 6 points
n_neighbors <- 3

# make matrix of coordinates
mat <- as.matrix(df[,3:4])
rownames(mat) <- df$identity

# compute [euclidian] distances
dmat <- as.matrix(dist(mat))

# find neighbors (by name)
nei_mat <- apply(dmat, 1,
                 function(crow) {names(sort(crow))[seq_len(n_neighbors+1)]})[-1,]

# match names to initial data frame to make matrix of growth
ref_growth_mat <- matrix(df$growth, dimnames=list(df$identity))
growth_mat <- matrix(ref_growth_mat[nei_mat,], nrow = n_neighbors)
colnames(growth_mat) <- df$identity

# done
growth_mat
#>        Z   B   C   D   A   P
#> [1,] 0.4 0.1 0.3 0.2 0.1 0.4
#> [2,] 0.1 0.4 0.1 0.1 0.1 0.1
#> [3,] 0.1 0.1 0.1 0.1 0.1 0.1
0
Alexlok 26 ago. 2020 a las 02:40