Cómo traducir conjuntos de datos de John Snow a coordenadas de mapa

14

En el paquete HistData para R ( https://r-forge.r-project.org/R/?group_id=574 ) tengo los conjuntos de datos relacionados con el mapa de John Snow del brote de cólera en Londres, 1854. Creo que tienen autoridad y han sido digitalizados cuidadosamente bajo la supervisión de Walter Tobler. John Mackenzie describe algunos detalles de estos conjuntos de datos en http://www1.udel.edu/johnmack/frec480/cholera/cholera2.html .

Desafortunadamente, las coordenadas de muertes, bombas y calles usan un sistema de coordenadas arbitrario, no coordenadas de mapas adecuadas para otras aplicaciones SIG o software de mapeo en R (paquetes espaciales, ggmap, etc.)

En http://freakonometrics.hypotheses.org/19213 Arthur Charpentier usa ggmap con una versión de los datos de John Snow de http://www.rtwilson.com/downloads/SnowGIS_v2.zip . El Cholera_Deaths.shparchivo, sin embargo enumera sólo 489 muertes, y no el 578 He grabado en HistData::Snow.deaths.

Una idea es encontrar las relaciones entre las medias y las desviaciones estándar de las coordenadas (x, y) y reescalarlas linealmente, pero ¿tal vez hay una mejor manera?

Esto es lo que he probado hasta ahora.

> 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

Lea el archivo 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
>

Bien, entonces trato de reescalar Dpara tener los mismos medios y desviaciones estándar que XX, pero algo no funciona correctamente aquí: los medios de columna de Dscaleddeberían haber resultado ser iguales a los 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 
>

EDITAR: Puede ser útil en este problema ver el mapa de Snow como dibujado por la nueva función, SnowMap(axis.labels=TRUE)ahora en la versión de desarrollo de HistData(rev 102) en R-Forge. Las etiquetas del eje muestran el origen del sistema de coordenadas en la esquina inferior izquierda tal como están en mis Snow.*conjuntos de datos.

SnowMap

usuario101089
fuente
Acabo de intentar escalar las bombas de cada conjunto de datos para que coincidan. No creo que la línea de ayuda (Snow.pumps) sobre las coordenadas sea de 100 metros, ya que una escala de aproximadamente 54 (y una traducción) hacen el mejor trabajo al mapearlas a las coordenadas de la cuadrícula del Reino Unido del shapefile (que definitivamente están en metros). Incluso entonces los puntos no se superponen exactamente, hay otra rotación / sesgo claramente presente. Como hay menos bombas, es posible identificar las bombas correspondientes en cada conjunto de datos y calcular el cambio / traslación para ellas.
Spacedman
¿Supongo que has mirado HistData / inst / doc / Snow_deaths-duplicates.html y te ha resultado inútil?
barrycarter
También se me ocurrió que podía obtener la transformación lineal de coordenadas en mis Snow.*archivos a las de un mapa basado en SIG con las ubicaciones de dos bombas, o tres para verificar la precisión. Desafortunadamente, no hay etiquetas para las bombas en los SnowGISarchivos, y no he visto un ejemplo de cómo trazarlas para poder compararlas visualmente.
user101089
1
Por un segundo después de leer tu título, pensé que querías mapear coordenadas en Westeros .
user35594

Respuestas:

4

Quizás evalúe el archivo shape de http://donboyes.com/2011/10/14/john-snow-and-serendipity que tiene 578 puntos.

No creo que tratar de relacionar las muertes de nieve de HistData con la versión de Robin Wilson (@robintw) funcione ya que el archivo de forma contiene una coordenada de un solo punto para múltiples muertes en una sola dirección, en lugar de los múltiples puntos apilados desde la calle en el mapear .

La versión de Robin definitivamente está perdiendo muchos puntos. De un vistazo rápido, se pierden bastantes muertes individuales. Otro problema está más cerca del centro del mapa, donde no coincidía correctamente con el borde cuando se unía (esto también es visible en el mapa de Wikipedia ) y esto oscurece varios puntos.

Extracto del mapa suministrado en la descarga :

ingrese la descripción de la imagen aquí

Extracto de la versión de UCLA :

ingrese la descripción de la imagen aquí

usuario2856
fuente
¡Excelente! Para mayor concreción, el enlace a los .shparchivos es donboyes.com/download/snow_shp.zip
user101089
2

Para completar la respuesta a esta pregunta, el siguiente código encuentra la transformación lineal de las coordenadas en los archivos originales de Tobler (en HistData) y los obtenidos 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]

Luego, correlacione y regrese D [, 1] en X [, 1] y D [, 2] en X [, 2]. La transformación lineal viene dada por los coeficientes de regresión.

> 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  
usuario101089
fuente