Отображение пространственной и временной корреляции на картах

16

У меня есть данные для сети метеостанций по всей территории Соединенных Штатов. Это дает мне фрейм данных, который содержит дату, широту, долготу и некоторое измеренное значение. Предположим, что данные собираются один раз в день и определяются погодой регионального масштаба (нет, мы не будем вдаваться в это обсуждение).

Я хотел бы показать графически, как одновременно измеренные значения коррелируют во времени и пространстве. Моя цель - показать региональную однородность (или ее отсутствие) исследуемой ценности.

Набор данных

Для начала я взял группу станций в районе Массачусетса и Мэна. Я выбрал сайты по широте и долготе из файла индекса, который доступен на FTP-сайте NOAA.

введите описание изображения здесь

Сразу же вы видите одну проблему: есть много сайтов, которые имеют сходные идентификаторы или очень близки. FWIW, я идентифицирую их, используя коды USAF и WBAN. Глядя вглубь метаданных, я увидел, что они имеют разные координаты и высоты, и данные останавливаются на одном участке, а затем на другом. Так что, поскольку я не знаю ничего лучше, я должен рассматривать их как отдельные станции. Это означает, что данные содержат пары станций, которые находятся очень близко друг к другу.

Предварительный анализ

Я попытался сгруппировать данные по календарному месяцу, а затем вычислить регрессию обычных наименьших квадратов между различными парами данных. Затем я строю корреляцию между всеми парами в виде линии, соединяющей станции (ниже). Цвет линии показывает значение R2 из соответствия OLS. Затем на рисунке показано, как более 30 точек данных за январь, февраль и т. Д. Коррелируют между различными станциями в интересующей области.

корреляция между ежедневными данными за каждый календарный месяц

Я написал базовые коды так, чтобы среднесуточное значение рассчитывалось только при наличии точек данных каждые 6 часов, поэтому данные должны быть сопоставимы по сайтам.

Проблемы

К сожалению, на одном сюжете просто слишком много данных для понимания. Это не может быть исправлено уменьшением размера линий.

Квведите описание изображения здесь

Сеть кажется слишком сложной, поэтому я думаю, что мне нужно найти способ уменьшить сложность или применить какое-то пространственное ядро.

Я также не уверен, какой показатель является наиболее подходящим для показа корреляции, но для предполагаемой (нетехнической) аудитории коэффициент корреляции из OLS может быть проще всего объяснить. Возможно, мне также потребуется представить некоторую другую информацию, такую ​​как градиент или стандартная ошибка.

Вопросов

Я изучаю свой путь в этой области и R одновременно, и буду признателен за предложения по:

  1. Какое официальное название для того, что я пытаюсь сделать? Есть ли полезные термины, которые позволили бы мне найти больше литературы? Мои поиски рисуют пробелы для того, что должно быть обычным приложением.
  2. Существуют ли более подходящие методы для отображения корреляции между несколькими наборами данных, разделенными в пространстве?
  3. ... в частности, методы, которые легко показать результаты визуально?
  4. Какие-нибудь из них реализованы в R?
  5. Любой из этих подходов поддается автоматизации?
Энди Клифтон
источник
[Пространственное описание временной корреляции в среде визуальной аналитики », Абиш Малик и др.] [1] [1]: google.com/…
pat
2
YWY
Что если вы попытаетесь увеличить порог построения (0,5) и использовать более 4 цветовых шагов? Или использовать более тонкие и толстые линии вместо цветов.
Надя
Nзаказ((N2)/2)
1
Исходя из этого, я понял, что у меня много работы по предварительной обработке данных, прежде чем я начну анализ, который я изложил здесь. Читая ответ @nadya, я думаю, что ясно, что мне нужно взглянуть на какую-то пространственную агрегацию, но это будет непросто, поскольку неправильно собирать данные о суше и океане. Тогда мне нужно взглянуть на стратегии заполнения пробелов. Тогда (и только тогда) я могу начать смотреть на работу по картированию / визуализации.
Энди Клифтон

Ответы:

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 data», который вы описываете. Вот ссылка на статью, в которой рассматриваются эти методы: dx.doi.org/10.6084/m9.figshare.732650 . Вы увидите, что методы RSEOF и DINEOF являются наиболее точными для получения EOF из наборов данных gappy. Алгоритм интерполяции DINEOF можно найти здесь: menugget.blogspot.de/2012/10/…
Марк в коробке
1
Я думаю, что это лучший ответ на ужасный вопрос (задним числом).
Энди Клифтон
3

Я не вижу чёткой закулисности, но мне кажется, что данных слишком много.

Поскольку вы хотите показать региональную однородность, а не точные станции, я бы посоветовал вам сначала сгруппировать их в пространстве. Например, наложить на «рыболовную сеть» и вычислить среднее измеренное значение в каждой ячейке (в каждый момент времени). Если вы поместите эти средние значения в центры ячеек таким образом, вы растеризуете данные (или вы также можете вычислить среднюю широту и долготу в каждой ячейке, если вы не хотите наложения линий). Или усреднить внутри административных единиц, как угодно. Затем для этих новых усредненных «станций» вы можете рассчитать корреляции и построить карту с меньшим количеством линий.

введите описание изображения здесь

Это также может удалить те случайные одиночные линии высокой корреляции, проходящие через всю область.

надя
источник
Это тоже интересная идея. Поскольку некоторые из доменов могут быть довольно большими, я бы, вероятно, сгруппировал данные вИкс×Икс км клетки, а не Иксшироты по-долготы.
Энди Клифтон
Да, проектировать координаты - хорошая идея. Удачи!
Надя