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))