RMSE Landsat8 AVHRR

时间:2019-02-28 09:52:35

标签: image error-handling

我想在Landsat8 NDVI IMG和AVHRR NDVI IMG之间进行空间验证

IMG具有相同的投影,范围和像素大小

为此,我想确定RMSE。 但是,我收到错误消息:

在线:

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 :(得分:0)

这是带有一些示例数据的简化代码(这是您应该在此处提出问题的方式)。

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)