Gere um conjunto de coordenadas X, Y (correspondente a 50 pontos) de uma distribuição uniforme no intervalo de (0,100). Calcule a distância euclidiana entre cada par de pontos (dica: um loop pode facilitar o cálculo). gere um arquivo com os seis vizinhos mais próximos.
Resposta:
Primeiro, geramos o conjunto de coordenadas:
library(tidyverse)
set.seed(43)
coordenadas <- tibble(x = runif(50, 0, 100),
y = runif(50, 0, 100)
)
plot(coordenadas)
Distância bidimensional: Para pontos bidimensionais, \(P=(p_x,p_y)\) e \(Q=(q_x,q_y),\) a distância é computada como: \(\sqrt{(p_x-q_x)^2 + (p_y-q_y)^2}.\)
distancia <- function(coordenadas, p, q) {
# p e q são números inteiros menores do que 50
# p : posição do ponto P
# q : posição do ponto Q
sqrt( ( coordenadas$x[p] - coordenadas$x[q] )^2 + ( coordenadas$y[p] - coordenadas$y[q] )^2 )
}
Um looping para ajudar a criação de uma matriz de distâncias:
# e este vetor vai estocar os valores
d <- NULL
for(i in 1:nrow(coordenadas)){ # para cada ponto nas coordenadas
for(j in 1:nrow(coordenadas)){ # é calculada a distância em relação à todos os pontos
# os resultados saem em um vetor
d <- append(d, distancia(coordenadas,i,j)) }
}
# "quebrando" o vetor em 50 partes iguais temos as distâncias:
matriz_de_distancias <- matrix(d, nrow = 50, ncol = 50)
Criando a matriz de vizinhança, considerando os 6 vizinhos mais próximos:
library(spdep)
spoints <- SpatialPoints(cbind(coordenadas$x, coordenadas$y))
vizinhos <- knearneigh(spoints, k=6) # Objeto "knn"
vizinhos <- knn2nb(vizinhos) # Objeto "nb"
W <- nb2listw(vizinhos, zero.policy = T) # objeto "listw"
summary(W)
## Characteristics of weights list object:
## Neighbour list object:
## Number of regions: 50
## Number of nonzero links: 300
## Percentage nonzero weights: 12
## Average number of links: 6
## Non-symmetric neighbours list
## Link number distribution:
##
## 6
## 50
## 50 least connected regions:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 with 6 links
## 50 most connected regions:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 with 6 links
##
## Weights style: W
## Weights constants summary:
## n nn S0 S1 S2
## W 50 2500 50 14.77778 207.6111
Escreva uma função para calcular a defasagem espacial do vetor de observáveis, isto é, para gerar \(W_{x}\). A matriz deve ser um objeto da classe listw.
Resposta:
variaveis_dependentes <- tibble(x1 = rnorm(50),
x2 = rnorm(50))
Wx <- lag.listw(W, as.matrix(variaveis_dependentes))
head(Wx)
## [,1] [,2]
## [1,] -0.15541172 0.61960443
## [2,] 0.63431284 -0.51762547
## [3,] 0.95230751 -0.39329903
## [4,] 0.39710155 -0.02183324
## [5,] 0.29285660 0.14639063
## [6,] -0.05281635 0.05193640