Линия наилучшего соответствия в каждом местоположении между двумя стеками растров в R

#r #statistics #raster #r-raster

Вопрос:

Я знаю, как рассчитать корреляцию r^2 в каждой позиции между двумя стеками растров с помощью:

 library(raster)
s1<-rasterstack1
s2<-rasterstack2
a <- length(s1)
b <- length(s2)
s <- stack(s1, s2)
fun=function(x) { if (is.na(x[1])){ NA } else { m <- lm(x[1:a] ~ x[(a 1):(a b)]);summary(m)$r.squared }}
r.squared <- calc(s, fun)
 

Тем не менее, я пытаюсь найти линию, наиболее подходящую для каждой позиции. Итак, допустим, выходной растр/матрица, похожая на:

 [y=x^.8, y=X^.3]
[y=x^.5, y=x^.9]
 

где y будет оцененной зависимой переменной от заданной переменной x (на чем основаны значения r^2). Тогда я теоретически хотел бы иметь возможность ввести x и получить оценочный растр или матрицу оценочных значений y…
Я бы предположил, что результат будет примерно таким:

 output<- function(x) A <- matrix(c(x**.8, x**.3, x**.5, x**.9), 2, 2)
end<-output(x)
 

Часть, с которой я борюсь, — это вычисление этих уравнений и хранение их в матричном виде. Самое большее, чего я добился, это:

 predict <-function(rasterstack){
  # Values for (layers, ncell, ncol, nrow, method, crs, extent) come straight from the input raster stack
  # e.g. nlayers(rasterstack), ncell(rasterstack)... etc.
  print(paste("Start:",Sys.time()))
  print("Loading parameters")
  layers=nlayers(rasterstack);ncell=ncell(rasterstack);
  ncol=ncol(rasterstack);nrow=nrow(rasterstack);crs=crs(rasterstack);
  extent=extent(rasterstack);pb = txtProgressBar(min = 0, max = ncell, initial = 0)
  print("Done loading parameters")
  mtrx <- as.matrix(rasterstack,ncol=layers)
  empt <- matrix(nrow=ncell, ncol=2)
  print("Initiating loop operation")
  numb=1
  
  for (i in 1:ncell){
    setTxtProgressBar(pb,i)
    if (all(is.na(mtrx[i,1:(layers/2)])) | all(is.na(mtrx[i,((layers/2) 1):layers]))){ 
      empt[i,1] <- NA 
    } else 
      if (sum(!is.na(mtrx[i,1:(layers/2)]/mtrx[i,((layers/2) 1):layers])) < 4 ){
        empt[i,1] <- NA 
      } else {
        
        empt[i,1]<-as.expression(coef(lm( mtrx[i,((layers/2) 1):layers] ~ mtrx[i, 1:(layers/2)]))[2])*x (coef(lm( mtrx[i,((layers/2) 1):layers] ~ mtrx[i,1:(layers/2)]))[1])
        
        
        
  }
  print("Creating empty raster")
  eqmatrix <- raster(nrows=nrow,ncols=ncol,crs=crs)
  extent(eqmatrix) <- extent
  print("Populating correlation raster")
  values(eqmatrix) <- empt[,1]
  print(paste("End on",Sys.time()))
  eqmatrix
  
}
}

predict_matrix<-predict(rasterstack=s)
 

но это создает ошибку:
«as.expression(coef(lm(mtrx[i, ((слои/2) 1):слои] ~mtrx[i, :
нечисловой аргумент двоичного оператора

Комментарии:

1. Вам нужно начать с написания функции, которая выполняет то, что вам нужно для одного вектора (со значениями, которые вы можете иметь в одной ячейке растровых данных).. Пожалуйста, сначала покажите это или сначала задайте вопрос об этом. Только когда вы знаете, что хотите сделать, вы можете спросить, как это сделать с растровыми данными.