Выполнение кригинга в цикле

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
_taras_
Активный участник
Сообщения: 228
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 16
Откуда: Киев

Выполнение кригинга в цикле

Сообщение _taras_ »

Доброго времени!
Пробую запустить обработку климатических данных кригингом и возникли вопросы.

test.csv - сами данные. Колонки LAT, LONG - координаты для WGS_1984_UTM_ZONE_35N [+proj=utm +a=6378137.0 +b=6356752.314245 +zone=35 +no_def]
Кригинг в цикле.txt - что делаю.

Вопросы

Код: Выделить всё

tab2 <-as.geodata(tab2, coords.col = c(1, 2), data.col = 3)
Максимальная дистанция определяется
summary(tab2)
Distance summary max = 590623.35
Максимальная дистанция определяется
max.dist = 590623.35/2= 295311.7[/code]
Но при выполнении

Код: Выделить всё

krig_temp <- krige.conv(tab2, loc=prediction_grid, krige=krige.control(obj.model=sph_fit_fix))
krige.conv: model with mean given by a 1st order polynomial on the coordinates
Ошибка в solve.default(ttivtt, crossprod(ivtt, as.vector(data))) : 
  система вычислительно сингулярная: величина, обратная к числу обусловленности, равна 7.36034e-17
Использую 161156.1, _но откуда взял уже не помню :(
Второй момент - не создается растр с заданным размером пикселя 900*900 м
Вложения
Кригинг в цикле.txt
(2.92 КБ) 121 скачивание
test.csv
(9.91 КБ) 112 скачиваний
gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Выполнение кригинга в цикле

Сообщение gamm »

1) поменял местами координаты (чтобы долгота была по горизонтали)
2) исправил методические ошибки с трендом на скорую руку.
3) не хватает анализа остатков, как минимум на нормальность, гетероскедастичность и пр.

Код: Выделить всё

library(sp)
library(geoR)
library(rgeos)
library(raster)

library(MASS)
library(mgcv)

dat.dir = "d:/temp/test"

fn=sprintf("%s/test.csv",dat.dir)
p.krig = read.table(fn,header=TRUE,sep=";")

p.krig = p.krig[,c(2:1,3:ncol(p.krig))] # иначе картинка вывернута, LONG->x, LAT->y

plot(p.krig[,1:2],pch=20,cex=(p.krig[,3]-min(p.krig[,3]))/diff(range(p.krig[,3]))*2)
hist(p.krig[,3])

# [1] "LAT"     "LONG"    "y_84_01" "y_84_02" "y_84_03"

hist(dist(p.krig[,1:2]))

M0a = lm(y_84_01~LONG+LAT, data=p.krig)
M0b = lm(y_84_01~LONG*LAT, data=p.krig)
anova(M0a,M0b)
# тренд билинейный

M0 = gls(y_84_01~LONG*LAT, data=p.krig)
M1 = gls(y_84_01~LONG*LAT, data=p.krig, correlation=corLin  (form = ~ LONG + LAT,nugget=TRUE))
M2 = gls(y_84_01~LONG*LAT, data=p.krig, correlation=corSpher(form = ~ LONG + LAT,nugget=TRUE))
M3 = gls(y_84_01~LONG*LAT, data=p.krig, correlation=corExp  (form = ~ LONG + LAT,nugget=TRUE))
anova(M0,M1,M2,M3)
# сферическая фариограмма лучшая, nuget не нужен.
summary(M2)
# Parameter estimate(s):
#       range       nugget 
#2.423953e+05 1.529560e-10 
# максимальное расстояние в районе 3e5 - 4e5
max_dist = 2.5e5

# Чтение данных
tab <- p.krig
# Выбираем нужные колонки (например, c 3-й по n-ю колонку для обработки)
columns_to_process <- colnames(tab)[3:ncol(tab)]  # Замените '3' на индекс первой колонки с данными для обработки
# Цикл по колонкам
col = columns_to_process[1] 
  
  # Преобразуем данные в формат geodata, используя текущую колонку
  tab2 <- as.geodata(tab, coords.col = c(1, 2), data.col = which(colnames(tab) == col))

  tab$Resid = residuals(M2,type="response")

  # Вычисление вариограммы
  vario_model <- variog(tab2, data=tab$Resid, max.dist = max_dist)
  plot(vario_model)
  
  # Подгонка модели сферической вариограммы
  sph_fit_fix <- variofit(vario_model, cov.model = "spherical", fix.nugget = TRUE, nugget = 0)

  # модель
  (sph_SSQ_fix <- summary(sph_fit_fix)$sum.of.squares)
  
  (tmp2 = apply(tab[,1:2],2,range))
  # Создание растровой сетки с квадратными пикселями
  step=min(diff(range(tmp2[,1]))/100,diff(range(tmp2[,2]))/100)
  x.coord = seq(tmp2[1,1],tmp2[2,1],by=step)
  y.coord = seq(tmp2[1,2],tmp2[2,2],by=step)
  nx=length(x.coord); xmin=min(x.coord); xmax=max(x.coord)
  ny=length(y.coord); ymin=min(y.coord); ymax=max(y.coord)
  prediction_grid <- expand.grid(x.coord,y.coord)

  plot(prediction_grid)
  points(p.krig[,1:2],pch=20,cex=(p.krig[,3]-min(p.krig[,3]))/diff(range(p.krig[,3]))*2,col="red")

  # чисто посмотреть, в каком порядке укладываются значения
  krig_temp <- krige.conv(tab2, loc=prediction_grid, krige=krige.control(obj.model=sph_fit_fix))
  r_test <- raster(nrows=ny, ncols=nx, xmn=xmin, xmx=xmax, ymn=ymin, ymx=ymax, crs=crs.geo, vals=krig_temp$predict)
  plot(r_test)
  points(p.krig[,1:2],pch=20,cex=(p.krig[,3]-min(p.krig[,3]))/diff(range(p.krig[,3]))*2)

  # кригинг остатков - как засунуть в него билинейный тренд не нашел
  krig_temp <- krige.conv(tab2, data=tab$Resid, loc=prediction_grid, krige=krige.control(obj.model=sph_fit_fix))
  crs.geo <- CRS("+proj=utm +zone=35 +datum=WGS84 +units=m +no_defs")
  krige_raster <- raster(nrows=ny, ncols=nx, xmn=xmin, xmx=xmax, ymn=ymin, ymx=ymax, crs=crs.geo, vals=krig_temp$predict)
  plot(krige_raster)
  
  # модель тренда
  trend.val = predict(M2,newdata=data.frame(LONG=prediction_grid[,1],LAT=prediction_grid[,2]),type="response")
  trend_raster = krige_raster 
  trend_raster[] = 0
  trend_raster[,] = matrix(trend.val,ncol=nx,nrow=ny,byrow=TRUE)
  plot(trend_raster)
  
  # сложить тренд и модель остатков
  krige_raster[] = krige_raster[] + trend_raster[]
  plot(krige_raster)
  
  # Переворот растра для сохранения
  krige_raster[,] = krige_raster[nrow(krige_raster):1,]
  plot(krige_raster)
  
  # Генерация имени файла для сохранения
  output_filename <- paste0("/home/taras/GRIDS/kriging_result_", col, ".tif")
  
  # Сохранение растра в GeoTIFF
  writeRaster(krige_raster, filename=output_filename, format="GTiff", overwrite=TRUE)
  
  print(paste("Сохранен результат для колонки:", col))
_taras_
Активный участник
Сообщения: 228
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 16
Откуда: Киев

Re: Выполнение кригинга в цикле

Сообщение _taras_ »

gamm, спасибо за Вашу неоценимую помощь!
не хватает анализа остатков, как минимум на нормальность, гетероскедастичность и пр.
В целом я просматривал некоторые из перечисленных показателей... Более-менее нормально. Для qgis-a имеется как по мне отличный плагин для крнгинга - Smart-Map - Interpolation using Ordinary Kriging and Machine Learning и через него я часть своих данных прогонял. Единственный его недостаток - работа с большими массивами данных. Щёлкать мышей замаешься. А учитывая, что возможно придется считать сумму активных температур за 40 лет... Так никакого здоровья не хватит :)
gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Выполнение кригинга в цикле

Сообщение gamm »

Не уверен, что все эти плагины считают действительно кригинг, как раз по причине отсутствия нормальной работы с трендом. Не исключено, что лучше использовать просто интерполяцию. Например МВА, если данных очень много, она есть в R или SAGA, или тот же кригинг с линейной вариограммой без nugget, там никакие параметры определять не надо.
QQshonok
Новоприбывший
Сообщения: 2
Зарегистрирован: 16 окт 2024, 13:08
Репутация: 0
Откуда: Беларусь

Re: Выполнение кригинга в цикле

Сообщение QQshonok »

Немного не по теме, но хочу поинтересоваться т.к. самоучка. А в чём вообще заключается Кригинг? Попробовал интерполировать им данные (с помощью упомянутого Smart Map) и получилась своеобразная тепловая карта точек, вместо той картины, которую я обычно наблюдаю используя Multilevel B-spline Interpolation (SAGA). Есть ли смысл пересаживаться? Также мне для интерполяции советовали Surfer 15, но пока не пробовал, нужно ли?
gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Выполнение кригинга в цикле

Сообщение gamm »

QQshonok писал(а): 16 окт 2024, 13:16 Есть ли смысл пересаживаться?
при таких водных смысла нет, лишь бы картинка нравилась.
QQshonok
Новоприбывший
Сообщения: 2
Зарегистрирован: 16 окт 2024, 13:08
Репутация: 0
Откуда: Беларусь

Re: Выполнение кригинга в цикле

Сообщение QQshonok »

gamm писал(а): 16 окт 2024, 16:25
QQshonok писал(а): 16 окт 2024, 13:16 Есть ли смысл пересаживаться?
при таких водных смысла нет, лишь бы картинка нравилась.
Тогда немного накину контекста. Имеются точки отбора проб, на которых определяется содержание тяжелых металлов в почве, какой метод использовать корректнее? Учитывается только абсолютная концентрация определенного элемента.
А как лучше поступить подключая Z-размерность?
gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Выполнение кригинга в цикле

Сообщение gamm »

можно для начала книжку Pierre Goovaerts почитать, Geostatistics for Natural Resource Evaluation
Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя