误差分布:R 中单个光栅文件的标准偏差

distribution of errors: standard deviation for single raster file in R

我有一个光栅,我想为其计算

  1. 均方根误差 (RMSE)
  2. 平均误差
  3. 绝对平均误差
  4. 标准偏差
library(r)
r <- raster(system.file("external/test.grd", package="raster"))

对于 RMSE 和(绝对)平均误差,我需要某种预测值(?)我如何 calculate/get 它们?

对于标准偏差我可以写

sd(r)

但这给我错误

Error in as.double(x) : 
  cannot coerce type 'S4' to vector of type 'double'

我找了一段时间,只找到了适用于栅格堆栈的解决方案,然后 return 另一个栅格。但我不想那样。对于 4 次测量中的每一次,我都想要一个数字来 return 我计算出的值。

让我们创建具有已知标准偏差的数据:

set.seed(69)

m <- matrix(rnorm(10000), nrow = 100)

sd(m)
#> [1] 0.9979821

现在我们可以将其转换为光栅:

library(raster)

r <- raster(m)

r
#> class      : RasterLayer 
#> dimensions : 100, 100, 10000  (nrow, ncol, ncell)
#> resolution : 0.01, 0.01  (x, y)
#> extent     : 0, 1, 0, 1  (xmin, xmax, ymin, ymax)
#> crs        : NA 
#> source     : memory
#> names      : layer 
#> values     : -3.507427, 3.669151  (min, max)

如果您想获取原始数据的值,您可以使用 data 插槽:

sd(r@data@values)
#> [1] 0.9979821

或者,更简洁地,使用子集运算符 []:

sd(r[])
#> [1] 0.9979821

reprex package (v0.3.0)

于 2020-08-21 创建

sd(r[])

有点工作,它返回 NA,但通过添加“na.rm = TRUE”它工作正常。 另一个答案可能是:

sd(as.matrix(r), na.rm = TRUE)

我认为这基本上是一样的。第一个选项读取数据,而第二个选项首先将数据转换为矩阵。

cellStats 方法

set.seed(69)
m <- matrix(rnorm(10000), nrow = 100)
sd(m)
#[1] 0.9979821

library(raster)
r <- raster(m)    
cellStats(r, sd)
#[1] 0.9979821

或者,使用 terraglobal 方法

library(terra)
x <- rast(m)
global(x, sd)
#         global
#lyr.1 0.9979821