Кригинг климатических данных в R

Вопрос или проблема

У меня есть этот код для выполнения кридинга климатических данных. У меня есть 26 точек долготы и широты, каждая из которых имеет соответствующее значение температуры.

Данные:

df<-dput(weather_data)
structure(list(latitude = c(-5.66761223, -5.72480242, -5.71591633, 
-5.74702767, -5.718042, -5.70906367, -5.72364083, -5.6800395, 
-5.680813, -5.68343283, -5.69915, -5.72150967, -5.72126, -5.7480005, 
-5.68805267, -5.685108, -5.71851317, -5.713897, -5.7104425, -5.720915, 
-5.6980405, -5.74182587, -5.68076091, -5.77276449, -5.6662859, 
-5.74445058), longitude = c(-15.9421786, -15.9560469, -15.9541762, 
-15.9777202, -15.923983, -15.9396147, -15.945323, -15.9431937, 
-15.9449277, -15.9484998, -15.96467, -15.9544655, -15.96869, 
-15.996367, -15.9782928, -15.945571, -15.9378142, -15.9792287, 
-15.9235108, -15.9277867, -15.9728712, -15.9987156, -15.9206547, 
-16.0006466, -15.9819352, -15.9575332), tempmax = c(24.3, 23.1, 
24.4, 24.6, 35.7, 38.1, 34.6, 28.2, 32.6, 35.8, 37.7, 37.1, 38.6, 
36.1, 37.6, 36.2, 36, 41.2, 39.4, 32.9, 22.2, 33.2, 1, 23.7, 
17.5, 23.5)), class = "data.frame", row.names = c(NA, -26L))

Я пробовал код ниже, однако он изменил все мои точки местоположения на одну и ту же долготу и широту и выводит карту, покрытую розовым с значением 28.02807.

Что вызывает эту проблему, так как я ищу выход карты с разными температурами по всей области?

#выходная карта полностью розовая с 16.88088C
#kriging_df имеет только 651 значение 16.88088

# Загрузка необходимых пакетов
library(sp)      # Для обработки пространственных данных
library(gstat)   # Для вариограммы и кридинга
library(raster)  # Для работы с растровыми данными в выводе кридинга
library(ggplot2) # Для визуализации

# загрузка данных
weather_data <- read.csv("weather.csv")

coordinates(weather_data)<-~longitude+latitude

# Создание и подгонка вариограммы для выбранной погодной переменной
# Замените `temperature` на фактическое название вашей погодной переменной (например, `precipitation`)
variogram_model <- variogram(tempmax ~ 1, data = weather_data)
fitted_model <- fit.variogram(variogram_model, model = vgm("Sph"))

# Определите границы карты для Святой Елены
lon_min <- -5.8
lon_max <- -5.6
lat_min <- -16.1
lat_max <- -15.8

# Настроить сетку для интерполяции (при необходимости скорректируйте границы для вашего региона)
lon_min <- min(lon_min)
lon_max <- max(lon_max)
lat_min <- min(lat_min)
lat_max <- max(lat_max)

# Создание сетки для интерполяции
# Отрегулируйте значение 'by', если необходимо (например, меньшее значение для более высокого разрешения)
grd <- expand.grid(
  x = seq(lon_min, lon_max, by = 0.001),  # Долгота
  y = seq(lat_min, lat_max, by = 0.01)   # Широта
)
coordinates(grd) <- ~x + y
gridded(grd) <- TRUE

# Выполнение интерполяции с помощью кридинга
kriging_result <- krige(tempmax ~ 1, locations = weather_data, newdata = grd, model = fitted_model)

# Преобразование результата кридинга в растр для визуализации
kriging_raster <- raster(kriging_result)

# Преобразование растровых данных в фрейм данных для визуализации с помощью ggplot
kriging_df <- as.data.frame(rasterToPoints(kriging_raster))
colnames(kriging_df) <- c("longitude", "latitude", "temperature")

# Построение интерполированной карты погоды
ggplot() +
  geom_raster(data = kriging_df, aes(x = longitude, y = latitude, fill = temperature)) +
  scale_fill_gradient(low = "blue", high = "red", name = "Температура (°C)") +
  labs(title = "Интерполированная карта температуры",
       x = "Долгота", y = "Широта") +
  theme_minimal()

Выходная карта из этого кода

Ответ или решение

Криго́вание климатических данных в R

Введение

Криго́вание представляет собой мощный метод интерполяции, который позволяет оценивать значения переменной в не обследованных точках на основании известных значений. В данной статье мы рассмотрим процесс криго́вания данных о температуре на основе координат долготы и широты.

Проблема

Вы столкнулись с проблемой, когда результаты криго́вания отображаются не так, как ожидалось: все точки имеют одинаковые значения, и карта получает розовый цвет с фиксированной температурой около 28°C. Это может быть связано с несколькими причинами, о которых мы подробно поговорим ниже.

Причины проблем с картой

  1. Некорректная установка переменной: Возможно, вы неправильно указали, какую переменную необходимо интерполировать. В коде krige(tempmax ~ 1, ...) используется общее уравнение, которое может не обеспечить должного отклика.
  2. Настройка вараграммы: Если модель вараграммы не соответствует данным, это приведет к ухудшению качества интерполяции. Возможно, стоит рассмотреть другие модели (например, гауссову или экспоненциальную).
  3. Область интерполяции: Необходимо убедиться, что область интерполяции соответствует реальным координатам ваших данных. Вы указали диапазоны для долготы и широты, которые могут перекрывать или искажать данные.
  4. Неверные параметры сетки: Параметры сетки, такие как шаг и диапазоны могут быть неадекватно выбраны.

Подход к решению

Мы рассмотрим шаги, необходимые для исправления вашего кода для успешного криго́вания и визуализации климатических данных.

Обновление кода

  1. Убедитесь в целостности данных: Проверьте ваши данные на наличие пропусков или аномальных значений.

  2. Установка библиотеки и линейная модель вараграммы:

    library(sp)      # Для работы с пространственными данными
    library(gstat)   # Для вараграмм и криго́вания
    library(raster)  # Управление растровыми данными
    library(ggplot2) # Для визуализации
  3. Правильная установка координат и создание вараграммы:

    coordinates(weather_data) <- ~longitude + latitude
    variogram_model <- variogram(tempmax ~ 1, data = weather_data)
    fitted_model <- fit.variogram(variogram_model, model = vgm("Exp")) # Попробуйте экспоненциальную модель
  4. Настройка области интерполяции:

    lon_min <- min(weather_data$longitude)
    lon_max <- max(weather_data$longitude)
    lat_min <- min(weather_data$latitude)
    lat_max <- max(weather_data$latitude)
  5. Создание сетки:

    grd <- expand.grid(
     x = seq(lon_min, lon_max, by = 0.01),
     y = seq(lat_min, lat_max, by = 0.01)
    )
    coordinates(grd) <- ~ x + y
    gridded(grd) <- TRUE
  6. Криго́вание и визуализация:

    kriging_result <- krige(tempmax ~ 1, locations = weather_data, newdata = grd, model = fitted_model)
    kriging_raster <- raster(kriging_result)
    kriging_df <- as.data.frame(rasterToPoints(kriging_raster))
    colnames(kriging_df) <- c("longitude", "latitude", "temperature")
    
    ggplot() +
     geom_raster(data = kriging_df, aes(x = longitude, y = latitude, fill = temperature)) +
     scale_fill_gradient(low = "blue", high = "red", name = "Temperature (°C)") +
     labs(title = "Интерполированная карта температуры",
          x = "Долгота", y = "Широта") +
     theme_minimal()

Заключение

Следуя данным рекомендациям и учитывая указанные проблемы, вы сможете успешно провести крегинирование климатических данных и визуализировать их на карте. Обратите внимание на выбор модели вараграммы, поскольку это влияет на точность интерполяции. Не забывайте проверять входные данные и настраивать параметры по мере необходимости для достижения оптимальных результатов.

Оцените материал
Добавить комментарий

Капча загружается...