RMSE Landsat8 AVHRR - PullRequest
       2

RMSE Landsat8 AVHRR

0 голосов
/ 28 февраля 2019

Я хотел бы провести пространственную проверку между IMD Landsat8 и IMG AVHRR NDVI

оба IMG имеют одинаковую проекцию, экстент и размер пикселя

Для этого я хотел быопределить СКО.Тем не менее, я получаю сообщение об ошибке:

в строке:

error <- actual - predicted

эта ошибка и не может продолжаться Ошибка в фактическом - прогнозируемый: не числовой аргумент для двоичного оператора

Как мне изменить код, чтобы двигаться вперед?вот мой полный код

library(sp)
library(raster)
library(rgdal)
library(rastervis)
library(rgl)
library(dplyr)

#Setze den Pfad
setwd("/home/franziska/r-Daten/RSME")

#lade beide Raster
AVHRR <- raster("AVHRR_NDVI.tif")
Landsat <- raster("Landsat_NDVI.tif")`

# diese Funktion soll den RMSE bestimmen
rmse <- function(error)
{
 sqrt(mean(error^2))
}

# diese Funktion gibt den absoluten Fehler zurück
mae <- function(error)
{
  mean(abs(error))
}

# Weiße die Raster den Variablen zu
actual <- c(Landsat)
predicted <- c(AVHRR)

# Berechne den Fehler
error <- actual - predicted

# Ausgabe der Zwischenberechnungen
rmse(error)
mae(error)


lm.D9 <- lm(Landsat ~ AVHRR)
rmse(lm.D9$residuals) # RSME

1 Ответ

0 голосов
/ 01 марта 2019

Вот ваш упрощенный код с некоторыми примерами данных (вот как вы должны задать вопрос здесь).

library(raster)
f <- system.file("external/rlogo.grd", package="raster")
Landsat <- raster(f, 1)
AVHRR <- raster(f, 3)

error <- Landsat - AVHRR
#You can do
#[1] 25.52578
#mae <- mean(abs(values(error)))
#mae
#[1] 15.28597

Но безопасным для памяти способом было бы сделать

cellStats(error, "rms")
#[1] 25.52742
cellStats(abs(error), "mean")
#[1] 15.28597

Обратите внимание, что я возвращаю одно "глобальное" значение, в то время как ваши функции возвращают растр, что предполагает, что вам нужна "локальная" статистика ошибок.Но это имеет смысл, только если у вас есть многослойные растровые данные.В вашем примере вы не делаете;но см. ниже для местного примера.

Так в чем причина вашей ошибки?Вы делаете

#actual <- c(Landsat)
#predicted <- c(AVHRR)
#error <- actual - predicted

Или с данными нашего примера

error <- c(Landsat) - c(AVHRR)
#Error in c(Landsat) - c(AVHRR) : non-numeric argument to binary operator

Это потому, что c(Landsat) создает list и вы не можете вычесть два списка.

class(c(Landsat))
#[1] "list"

Вы могли бы делать

error <- c(Landsat)[[1]] - c(AVHRR)[[1]]

(но зачем вам)

Если вам нужны "локальные" значения, вы можете сделать что-то вроде следующего:

library(raster)
f <- system.file("external/rlogo.grd", package="raster")
Landsat <- stack(f)
AVHRR <- Landsat[[3:1]]
error <- Landsat - AVHRR

mae <- mean(abs(error))
plot(mae)   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...