Пространственные данные с дубликатами и отсутствующими точками

Я анализирую данные обследования яиц. Данные доступны с разных точек Северного моря, некоторые станции регистрируются дважды в разные даты. Море должно быть покрыто квадратами размером 0,5 x 0,5 градуса. У меня есть два вопроса, на которые я пока не нашел решения:

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

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

Я попытался установить сетку, но не продвинулся очень далеко, так как не смог найти способ указать R, когда интерполировать, а когда нет.

Образец данных:

egg_data <- structure(list(Latitude = c(54.25, 54.25, 54.25, 54.25, 54.25, 
54.25, 54.25, 54.25, 54.25, 54.25, 54.25, 54.25, 54.25, 54.25, 
55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 
55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 
55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 55.25, 
55.25, 55.25, 55.25, 54.25, 54.25, 54.25, 53.25, 58.25, 57.75, 
57.25, 57.25, 57.25, 57.25, 57.25, 57.25, 57.25, 57.25, 56.75, 
56.75, 56.75, 56.75, 56.75, 56.75, 56.75, 56.75, 56.75, 56.75, 
56.75, 56.75, 56.75, 56.25, 56.25, 56.25, 56.25, 56.25, 56.25, 
56.25, 56.25, 56.25, 56.25, 56.25, 56.25, 56.25, 56.25, 56.25, 
56.25, 56.75, 56.75, 56.75), Longitude = c(6.25, 5.25, 5.25, 
4.25, 4.25, 3.25, 3.25, 2.25, 2.25, 1.25, 1.25, 0.25, 0.25, 0.25, 
0.25, 0.25, 0.25, 0.25, 1.25, 1.25, 2.25, 2.25, 3.25, 3.25, 4.25, 
4.25, 5.25, 5.25, 5.25, 5.25, 4.25, 4.25, 3.25, 3.25, 2.25, 2.25, 
1.25, 1.25, 0.25, 0.25, 0.25, 0.25, 1.25, 1.25, 0.25, 0.25, 0.25, 
0.25, 3.25, 3.25, 3.25, 2.75, 2.25, 1.75, 1.25, 0.75, 0.25, 0.25, 
0.25, 0.25, 0.75, 1.25, 1.75, 2.25, 2.75, 3.25, 3.75, 4.25, 4.75, 
5.25, 5.75, 6.25, 5.75, 5.25, 4.75, 4.25, 3.75, 3.25, 2.25, 1.75, 
1.25, 0.75, 0.25, 0.25, 0.75, 1.25, 1.75, 1.75, 1.25, 0.75), 
    Eggs = c(9L, 6L, 4L, 20L, 57L, 14L, 35L, 18L, 4L, 1L, 3L, 
    100L, 1L, 201L, 0L, 51L, 52L, 23L, 19L, 4L, 5L, 23L, 11L, 
    18L, 7L, 7L, 14L, 6L, 3L, 4L, 20L, 13L, 19L, 5L, 16L, 23L, 
    28L, 11L, 9L, 12L, 19L, 62L, 6L, 3L, 15L, 110L, 57L, 0L, 
    14L, 3L, 3L, 8L, 94L, 62L, 7L, 19L, 511L, 59L, 283L, 308L, 
    20L, 44L, 61L, 24L, 10L, 10L, 15L, 6L, 8L, 12L, 32L, 2L, 
    5L, 10L, 21L, 4L, 1L, 19L, 3L, 4L, 4L, 17L, 51L, 108L, 1213L, 
    132L, 4L, 0L, 0L, 0L)), .Names = c("Latitude", "Longitude", 
"Eggs"), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
"16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", 
"27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", 
"38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", 
"49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", 
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", 
"71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", 
"82", "83", "84", "85", "86", "87", "88", "89", "90"))

Спасибо большое!!


person keebock    schedule 26.10.2011    source источник


Ответы (1)


Добавьте коэффициент для каждого местоположения

egg_data ‹- внутри(egg_data, Location ‹- paste("(", Широта, ", ", Долгота, ")", sep = "") )

РЕДАКТИРОВАТЬ: нет смысла фантазировать об этом, так как мы хотим в ближайшее время обратить процесс вспять.

egg_data <- within(egg_data, 
  Location <- paste(Latitude, Longitude, sep = ",")
)

Тогда есть множество способов получить среднее значение.

means_by_location <- with(egg_data, tapply(Eggs, Location, mean))

or

library(plyr)
means_by_location2 <- ddply(egg_data, .(Location), summarise, Mean.eggs = mean(Eggs))

or

means_by_location3 <- aggregate(Eggs ~ Location, egg_data, mean)

or

means_by_location4 <- with(egg_data, by(Eggs, Location, mean))

РЕДАКТИРОВАТЬ: Для следующего бита вы хотите получить результат в кадре данных, поэтому используйте метод 2 или 3.

Добавьте широту и долготу обратно в новый набор данных. (Много способов сделать это.)

lat_long <- strsplit(means_by_location2$Location, ",")
means_by_location2$Latitude <- sapply(lat_long, function(x) x[1]) 
means_by_location2$Longitude <- sapply(lat_long, function(x) x[2])

Это первый ответ на ваш вопрос.


Что касается второго вопроса, вам нужно немного подумать. Взгляните на участок яиц по местоположению.

library(ggplot2)
(p <- ggplot(means_by_location2, aes(Longitude, Latitude, colour = log10(Mean.eggs  +1))) +
  geom_point() +
  scale_colour_gradient(low = "#FFFFFF", high = "#0000FF", space = "Lab")
)

Вы интерполируете с севера на юг, или с востока на запад, или со всеми соседними точками? Есть много разных вариантов, и у них могут быть разные ответы. Сказать, какая интерполяция лучше, — нетривиальная задача.

person Richie Cotton    schedule 26.10.2011
comment
Большое спасибо за такой быстрый ответ! Я должен использовать стандартный метод интерполяции, который они всегда использовали, поэтому я должен интерполировать со всеми соседними точками. - person keebock; 26.10.2011