Como converter conjuntos de dados de John Snow para mapear coordenadas

14

No pacote HistData para R ( https://r-forge.r-project.org/R/?group_id=574 ), tenho os conjuntos de dados relacionados ao mapa de John Snow do surto de cólera em Londres, 1854. Acredito que eles têm autoridade, tendo sido cuidadosamente digitalizados sob a supervisão de Walter Tobler. Alguns detalhes sobre esses conjuntos de dados são descritos por John Mackenzie, em http://www1.udel.edu/johnmack/frec480/cholera/cholera2.html .

Infelizmente, as coordenadas de mortes, bombas e ruas usam um sistema de coordenadas arbitrário, não as coordenadas de mapa adequadas para outras aplicações GIS ou software de mapeamento em R (pacotes espaciais, ggmap, etc.)

Em http://freakonometrics.hypotheses.org/19213, Arthur Charpentier usa o ggmap com uma versão dos dados de John Snow em http://www.rtwilson.com/downloads/SnowGIS_v2.zip . O Cholera_Deaths.shparquivo, no entanto, lista apenas 489 mortes, não as 578 em que gravei HistData::Snow.deaths.

Uma idéia é encontrar as relações entre as médias e os desvios padrão das coordenadas (x, y) e redimensionar linearmente, mas talvez haja uma maneira melhor?

Aqui está o que eu tentei até agora

> data(Snow.deaths, package="HistData")
> D <- Snow.deaths[,2:3]
> colMeans(D)
       x        y 
13.03312 11.69721 
> var(D)
          x         y
x 3.8150987 0.3802654
y 0.3802654 2.7213828

Leia o arquivo Cholera_deaths

> folder <- "C:/Dropbox/R/data/Snow/SnowGIS_v2/SnowGIS"
> library(maptools)
> deaths <- readShapePoints(file.path(folder, "Cholera_Deaths"))
> head(deaths@coords)
  coords.x1 coords.x2
0  529308.7  181031.4
1  529312.2  181025.2
2  529314.4  181020.3
3  529317.4  181014.3
4  529320.7  181007.9
5  529336.7  181006.0
> # deaths has only 250 observations; 489 deaths
> sum(deaths@data$Count)
[1] 489

 > # try to relate to Snow.deaths
> X <- deaths@coords
> colnames(X) <- c("x", "y")
> 
> XX <- data.frame(X, Freq=deaths@data$Count)
> XX <- vcdExtra::expand.dft(XX)
> 
> colMeans(XX)
       x        y 
529414.8 181031.9 
> var(XX)
          x        y
x 10813.816 1521.693
y  1521.693 6227.924
>

OK, então tento redimensionar Dpara ter os mesmos meios e desvios padrão de XX, mas algo não funciona corretamente aqui - os meios da coluna de Dscaleddeveriam ter sido iguais aos de XX:

> # scale D to have the same means and standard deviations as XX
> Dscaled <- scale(D, center=TRUE, scale=TRUE)
> Dscaled <- scale(Dscaled, center=colMeans(XX), scale=sqrt(diag(var(XX))))
> colMeans(Dscaled)
        x         y 
-5091.040 -2293.947 
>

EDIT: Pode ser útil neste problema ver o mapa de Snow como desenhado pela nova função, SnowMap(axis.labels=TRUE)agora na versão de desenvolvimento HistData(rev 102) no R-Forge. Os rótulos dos eixos mostram a origem do sistema de coordenadas no canto inferior esquerdo, como estão nos meus Snow.*conjuntos de dados.

SnowMap

user101089
fonte
Acabei de tentar dimensionar as bombas de cada conjunto de dados para corresponder. Eu não acredito que a linha na ajuda (Snow.pumps) sobre as coordenadas tenham 100 metros, uma vez que uma escala de cerca de 54 (e uma tradução) faz o melhor trabalho de mapear essas coordenadas para as coordenadas de grade do shapefile no Reino Unido (que definitivamente estão em metros). Mesmo assim, os pontos não se sobrepõem exatamente, alguma outra rotação / inclinação está claramente presente. Como há menos bombas, é possível identificar as bombas correspondentes em cada conjunto de dados e calcular a troca / conversão para elas.
Spacedman
Suponho que você consultou HistData / inst / doc / Snow_deaths-duplicates.html e achou inútil?
Barrycarter
Também me ocorreu que eu poderia obter a transformação linear de coordenadas em meus Snow.*arquivos para aquelas em um mapa baseado em GIS com a localização de duas bombas ou três para verificar a precisão. Infelizmente, não há rótulos para as bombas nos SnowGISarquivos, e não vi um exemplo de como plotá-las para que eu possa compará-las visualmente.
user101089
1
Por um segundo depois de ler seu título, pensei que você queria mapear as coordenadas em Westeros .
user35594

Respostas:

4

Talvez avalie o shapefile em http://donboyes.com/2011/10/14/john-snow-and-serendipity, que possui 578 pontos.

Não acho que tentar relacionar a HistData Snow Deaths à versão de Robin Wilson (@robintw) funcione, pois o shapefile contém uma coordenada de ponto único para várias mortes em um único endereço, em vez dos vários pontos empilhados de volta da rua no mapa .

A versão de Robin definitivamente está perdendo muitos pontos. De uma olhada rápida, há muitas mortes isoladas perdidas. Outro problema está mais próximo do centro do mapa, onde não foi correspondido corretamente na borda quando reunido (isso também é visível no mapa da Wikipedia ) e isso obscurece vários pontos.

Extrato do mapa fornecido no download :

insira a descrição da imagem aqui

Extrato da versão UCLA :

insira a descrição da imagem aqui

user2856
fonte
Ótimo! Para concretização, o link para os .shparquivos é donboyes.com/download/snow_shp.zip
user101089
2

Para concluir a resposta a esta pergunta, o código a seguir localiza a transformação linear das coordenadas nos arquivos Tobler originais (in HistData) e aqueles fornecidos por Don Boyes.

folder <- "C:/Dropbox/R/data/Snow/snow_shp"
library(maptools)
deaths <- readShapePoints(file.path(folder, "deaths_gcs"))
data(Snow.deaths, package="HistData")
X <- deaths@coords
D <- Snow.deaths[,2:3]

Então, correlacione e regride D [, 1] em X [, 1] e D [, 2] em X [, 2]. A transformação linear é dada pelos coeficientes de regressão.

> cor(D[,1], X[,1])
[1] 0.9999664
> cor(D[,2], X[,2])
[1] 0.9995559
> 
> # linear transformations to GIS coords
> lm(D[,1] ~ X[,1])

Call:
lm(formula = D[, 1] ~ X[, 1])

Coefficients:
(Intercept)       X[, 1]  
      185.4       1264.7  

> 
> lm(D[,2] ~ X[,2])

Call:
lm(formula = D[, 2] ~ X[, 2])

Coefficients:
(Intercept)       X[, 2]  
    -105441         2047  
user101089
fonte