在R的HistData数据包(https://r-forge.r-project.org/R/?group_id=574)中,我具有与约翰·斯诺(John Snow)1854年伦敦霍乱疫情地图有关的数据集。我相信它们在Walter Tobler的监督下经过精心数字化处理后,具有权威性。John Mackenzie在http://www1.udel.edu/johnmack/frec480/cholera/cholera2.html上描述了有关这些数据集的一些详细信息。
不幸的是,死亡,水泵和街道的坐标使用任意坐标系,而不是适用于R中其他GIS应用程序或地图软件(空间包,ggmap等)的地图坐标。
在http://freakonometrics.hypotheses.org/19213中, Arthur Charpentier将ggmap与来自http://www.rtwilson.com/downloads/SnowGIS_v2.zip的John Snow数据版本一起使用
。Cholera_Deaths.shp
但是,该文件仅列出489人死亡,而不是我在中记录的578人HistData::Snow.deaths
。
一种想法是找到均值与(x,y)坐标的标准偏差之间的关系并进行线性缩放,但是也许有更好的方法吗?
到目前为止,这是我尝试过的
> 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
读取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
>
好的,然后我尝试重新定标D
以具有与相同的均值和标准差XX
,但此处有些方法无法正常工作-的列均值Dscaled
应该等于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
>
编辑:在这个问题上查看新功能绘制的Snow地图可能会有所帮助,SnowMap(axis.labels=TRUE)
现在在HistData
R-Forge 的(rev 102)开发版中。轴标签在左下角显示坐标系统的原点,就像在我的数据Snow.*
数据集中一样。
Snow.*
文件中的坐标线性转换为基于GIS的地图中的坐标,并使用两个或三个泵的位置来检查精度。不幸的是,SnowGIS
文件中没有泵的标签,并且我还没有看到如何绘制它们的示例,以便可以直观地进行比较。