我想在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
答案 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)