Показ просторової та часової кореляції на картах


16

У мене є дані для мережі метеостанцій по всій території США. Це дає мені кадр даних, який містить дату, широту, довготу та деяке вимірюване значення. Припустимо, що дані збираються раз на день та керуються регіональною погодою (ні, ми не збираємось вступати в цю дискусію).

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

Набір даних

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

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

Відразу ви бачите одну проблему: є багато сайтів, які мають подібні ідентифікатори або дуже близькі. FWIW, я ідентифікую їх за допомогою кодів USAF та WBAN. Заглянувши глибше до метаданих, я побачив, що вони мають різні координати та висоти, і дані зупиняються на одному місці, а потім починаються на іншому. Отже, оскільки я не знаю нічого кращого, я мушу ставитися до них як до окремих станцій. Це означає, що дані містять пари станцій, дуже близьких один до одного.

Попередній аналіз

Я спробував згрупувати дані за календарним місяцем, а потім обчислити звичайну найменшу регресію квадратів між різними парами даних. Потім будую співвідношення між усіма парами у вигляді лінії, що з'єднує станції (нижче). Колір лінії показує значення R2 від пристосування OLS. Далі на малюнку показано, як співвідносяться дані 30+ за січень, лютий тощо між різними станціями в зоні, що цікавить.

співвідношення між щоденними даними протягом кожного календарного місяця

Я написав основні коди, так що середньодобова оцінка обчислюється лише за наявності точок даних кожні 6 годин, тому дані повинні бути порівнянними на сайтах.

Проблеми

На жаль, є просто занадто багато даних, щоб мати сенс для одного сюжету. Це неможливо виправити, зменшивши розмір ліній.

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

Мережа здається занадто складною, тому я думаю, що мені потрібно знайти спосіб зменшити складність або застосувати якесь просторове ядро.

Я також не впевнений, що є найбільш підходящим показником для відображення кореляції, але для цільової (нетехнічної) аудиторії коефіцієнт кореляції від OLS може бути найпростішим для пояснення. Можливо, мені доведеться представити ще якусь інформацію, наприклад градієнт або стандартну помилку.

Запитання

Я вивчаю свій шлях у цю сферу та R одночасно, і буду вдячний для пропозицій щодо:

  1. Яка формальніша назва того, що я намагаюся зробити? Чи є корисні терміни, які дозволять мені знайти більше літератури? Мої пошуки складають пробіли для того, що має бути загальним додатком.
  2. Чи існують більш відповідні методи показу кореляції між кількома наборами даних, розділеними в просторі?
  3. ... зокрема, методи, які легко візуально показують результати?
  4. Чи реалізується будь-яке з цих програм у R?
  5. Чи піддається якомусь із цих підходів автоматизація?

[Характеризуючи часову кореляцію просторово у середовищі візуальної аналітики, "Abish Malik et al.] [1] [1]: google.com/…
пат

2
уWу

Що робити, якщо спробувати збільшити поріг побудови графіку (0,5) та використати більше 4 кольорових кроків? Або використовувати тонкі та товсті лінії замість кольорів.
nadya

нзамовлення((н2)/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. 

EDIT: додатковий приклад

Хоча в наступному прикладі не використовуються гаптовані дані, ви можете застосувати той же аналіз до поля даних після інтерполяції з 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, розроблені для особливого випадку "неодноразових даних", які ви описуєте. Ось посилання на документ, який рецензує ці методи: dx.doi.org/10.6084/m9.figshare.732650 . Ви побачите, що методи RSEOF і DINEOF є найбільш точними для отримання EOF з gappy наборів даних. Алгоритм інтерполяції DINEOF можна знайти тут: menugget.blogspot.de/2012/10/…
Марк у полі

1
Я думаю, що це найкраща відповідь на те, що це жахливе питання (заднім числом).
Енді Кліфтон

3

Я не бачу чітко за рядками, але мені здається, що є занадто багато точок даних.

Оскільки ви хочете показати регіональну однорідність, а не саме станції, я б запропонував вам спочатку згрупувати їх просторово. Наприклад, накладання «риб’ячої мережі» та обчислення середнього виміряного значення у кожній комірці (у кожний момент часу). Якщо ви розміщуєте ці середні значення в центрах комірок таким чином, ви раструєте дані (або ви можете також обчислити широту і довготу в кожній комірці, якщо ви не хочете накладати рядки). Або в середньому всередині адміністративних одиниць, як би там не було. Тоді для цих нових усереднених "станцій" ви можете розрахувати кореляції та побудувати карту з меншою кількістю рядків.

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

Це також може видалити ті випадкові одиничні лінії високої кореляції, що проходять через всю область.


Це також цікава ідея. Оскільки деякі домени можуть бути досить великими, я, мабуть, групую ці даніх×х км, а не хширота за довготою.
Енді Кліфтон

Так, спроектувати координати - це гарна ідея. Удачі!
nadya
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.