在地图上显示时空相关性


16

我有整个美国气象站网络的数据。这给了我一个包含日期,纬度,经度和一些测量值的数据框。假设每天收集一次数据,并且受区域范围天气的驱动(不,我们将不进行讨论)。

我想以图形方式显示跨时间和空间的同时测量值如何关联。我的目标是显示正在调查的值的区域同质性(或缺乏同质性)。

资料集

首先,我带了一组在马萨诸塞州和缅因州的车站。我从NOAA的FTP站点上可用的索引文件中按纬度和经度选择了站点。

在此处输入图片说明

马上您就会看到一个问题:许多站点具有相似的标识符或非常接近。FWIW,我同时使用USAF和WBAN代码识别它们。深入了解元数据,我发现它们具有不同的坐标和高程,数据从一个站点停止,然后从另一个站点开始。因此,因为我不知道更好,所以必须将它们视为独立的站。这意味着数据包含彼此非常接近的站点对。

初步分析

我尝试按日历月对数据进行分组,然后计算不同对数据之间的普通最小二乘回归。然后,我将所有线对之间的相关性绘制为一条连接测站的线(下图)。线条颜色显示了来自OLS拟合的R2值。然后,该图显示了感兴趣区域中不同站点之间从一月,二月等开始的30多个数据点如何关联。

每个日历月的每日数据之间的相关性

我已经编写了基础代码,以便仅在每6小时内有数据点时才计算每日平均值,因此数据在各个站点之间应该是可比较的。

问题

不幸的是,在一个绘图上根本没有太多数据可以理解。无法通过减小行的大小来解决。

ķ在此处输入图片说明

网络似乎太复杂了,所以我认为我需要找到一种降低复杂性或应用某种空间内核的方法。

我也不确定什么是最合适的指标来显示相关性,但是对于目标受众(非技术人员),OLS的相关系数可能只是最简单的解释。我可能还需要提供其他一些信息,例如梯度或标准误差。

问题

我正在学习同时进入该领域和R的方法,并希望就以下方面提出建议:

  1. 我要做什么的更正式的名字是什么?有一些有用的术语可以让我找到更多的文献吗?我的搜索正在为必不可少的应用程序绘制空白。
  2. 有没有更合适的方法来显示空间上分隔的多个数据集之间的相关性?
  3. ...尤其是易于从视觉上显示结果的方法?
  4. 这些是否在R中实现?
  5. 这些方法是否适合自动化?

[在视觉分析环境中描述时间相关性,“ Abish Malik等人。] [1] [1]:google.com/…–

2
ÿw ^ÿ

如果您尝试增加打印阈值(0.5)并使用4个以上的色阶怎么办?或使用较细的线条代替颜色。
nadya 2013年

ñ订购ñ2/2

1
由此我意识到,在开始这里概述的分析之前,我需要做大量的数据预处理工作。阅读@nadya的回复,我认为很明显我需要研究某种空间聚集,但是这将具有挑战性,因为聚集陆地和海洋数据是错误的。然后,我需要研究填补空白的策略。然后(只有那时)我才能开始查看映射/可视化工作。
安迪·克利夫顿

Answers:


10

我认为有几种方法可以显示此类数据:

第一种选择是进行“经验正交函数分析”(EOF)(在非气候圈中也称为“主成分分析”(PCA))。对于您的情况,应在数据位置的相关矩阵上进行。例如,您的数据矩阵dat将是列维中的空间位置,而行中是测得的参数;因此,您的数据矩阵将由每个位置的时间序列组成。该prcomp()函数将允许您获取与此字段相关的主成分或主要的相关模式:

res <- prcomp(dat, retx = TRUE, center = TRUE, scale = TRUE) # center and scale should be "TRUE" for an analysis of dominant correlation modes)
#res$x and res$rotation will contain the PC modes in the temporal and spatial dimension, respectively.

第二种选择是创建显示相对于单个感兴趣位置的相关性的地图:

C <- cor(dat)
#C[,n] would be the correlation values between the nth location (e.g. dat[,n]) and all other locations. 

编辑:附加示例

虽然以下示例不使用空缺数据,但您可以在使用DINEOF进行插值后对数据字段进行相同的分析(http://menugget.blogspot.de/2012/10/dineof-data-interpolating-empirical.html) 。下面的示例使用以下数据集(http://www.esrl.noaa.gov/psd/gcos_wgsp/Gridded/data.hadslp2.html)的每月异常海平面压力数据的子集:

library(sinkr) # https://github.com/marchtaylor/sinkr

# load data
data(slp)

grd <- slp$grid
time <- slp$date
field <- slp$field

# make anomaly dataset
slp.anom <- fieldAnomaly(field, time)

# EOF/PCA of SLP anom
P <- prcomp(slp.anom, center = TRUE, scale. = TRUE)

expl.var <- P$sdev^2 / sum(P$sdev^2) # explained variance
cum.expl.var <- cumsum(expl.var) # cumulative explained variance
plot(cum.expl.var)

映射领先的EOF模式

# make interpolation
require(akima)
require(maps)

eof.num <- 1
F1 <- interp(x=grd$lon, y=grd$lat, z=P$rotation[,eof.num]) # interpolated spatial EOF mode


png(paste0("EOF_mode", eof.num, ".png"), width=7, height=6, units="in", res=400)
op <- par(ps=10) #settings before layout
layout(matrix(c(1,2), nrow=2, ncol=1, byrow=TRUE), heights=c(4,2), widths=7)
#layout.show(2) # run to see layout; comment out to prevent plotting during .pdf
par(cex=1) # layout has the tendency change par()$cex, so this step is important for control

par(mar=c(4,4,1,1)) # I usually set my margins before each plot
pal <- jetPal
image(F1, col=pal(100))
map("world", add=TRUE, lwd=2)
contour(F1, add=TRUE, col="white")
box()

par(mar=c(4,4,1,1)) # I usually set my margins before each plot
plot(time, P$x[,eof.num], t="l", lwd=1, ylab="", xlab="")
plotRegionCol()
abline(h=0, lwd=2, col=8)
abline(h=seq(par()$yaxp[1], par()$yaxp[2], len=par()$yaxp[3]+1), col="white", lty=3)
abline(v=seq.Date(as.Date("1800-01-01"), as.Date("2100-01-01"), by="10 years"), col="white", lty=3)
box()
lines(time, P$x[,eof.num])
mtext(paste0("EOF ", eof.num, " [expl.var = ", round(expl.var[eof.num]*100), "%]"), side=3, line=1) 

par(op)
dev.off() # closes device

在此处输入图片说明

创建关联图

loc <- c(-90, 0)
target <- which(grd$lon==loc[1] & grd$lat==loc[2])
COR <- cor(slp.anom)
F1 <- interp(x=grd$lon, y=grd$lat, z=COR[,target]) # interpolated spatial EOF mode


png(paste0("Correlation_map", "_lon", loc[1], "_lat", loc[2], ".png"), width=7, height=5, units="in", res=400)

op <- par(ps=10) #settings before layout
layout(matrix(c(1,2), nrow=2, ncol=1, byrow=TRUE), heights=c(4,1), widths=7)
#layout.show(2) # run to see layout; comment out to prevent plotting during .pdf
par(cex=1) # layout has the tendency change par()$cex, so this step is important for control

par(mar=c(4,4,1,1)) # I usually set my margins before each plot
pal <- colorRampPalette(c("blue", "cyan", "yellow", "red", "yellow", "cyan", "blue"))
ncolors <- 100
breaks <- seq(-1,1,,ncolors+1)
image(F1, col=pal(ncolors), breaks=breaks)
map("world", add=TRUE, lwd=2)
contour(F1, add=TRUE, col="white")
box()

par(mar=c(4,4,0,1)) # I usually set my margins before each plot
imageScale(F1, col=pal(ncolors), breaks=breaks, axis.pos = 1)
mtext("Correlation [R]", side=1, line=2.5)
box()

par(op)

dev.off() # closes device

在此处输入图片说明


这些功能如何处理丢失的数据?我在时间序列中经常有空白。
安迪·克利夫顿

2
有一些EOF方法是针对您描述的“ gappy数据”的特殊情况而设计的。以下是指向审查这些方法的论文的链接: dx.doi.org/10.6084/m9.figshare.732650。您将看到RSEOF和DINEOF方法是最准确的从空洞的数据集中导出EOF的方法。可在此处找到DINEOF插值算法:menugget.blogspot.de/2012/10/…–
Marc在

1
我认为这是一个可怕的问题的最佳答案(事后看来)。
Andy Clifton

3

我没有清楚地看到这些信息的背后,但是在我看来,数据点太多了。

由于您要显示区域同质性而不是确切的站点,因此建议您首先对它们进行空间分组。例如,用“渔网”覆盖并计算每个单元格中(每个时间点)的平均测量值。如果以这种方式将这些平均值放置在像元中心,则会对数据进行栅格化(或者,如果您不希望覆盖线,则还可以计算每个像元中的平均纬度和经度)。或平均分为内部管理部门。然后,对于这些新的平均“站”,您可以计算相关性并以较少的线数绘制地图。

在此处输入图片说明

这也可以删除遍及所有区域的那些随机单条高相关线。


这也是一个有趣的想法。由于某些域可能很大,因此我可能会将数据分组为X×X 公里单元而不是 X经纬度。
安迪·克利夫顿

是的,投影坐标是一个好主意。祝好运!
nadya
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.