распределение ошибок: стандартное отклонение для одного растрового файла в R

#r #raster #r-raster

#r #растровый #r-растр

Вопрос:

У меня есть один растр, для которого я хочу рассчитать

  1. Среднеквадратичная ошибка (RMSE)
  2. Ошибка среднего значения
  3. Абсолютная средняя ошибка
  4. Стандартное отклонение
 library(r)
r <- raster(system.file("external/test.grd", package="raster"))
  

Для RMSE и (абсолютной) средней ошибки мне нужны какие-то прогнозируемые значения (?), как мне их вычислить / получить?

Для стандартного отклонения я мог бы просто написать

 sd(r)
  

но это выдает мне ошибку

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

Я некоторое время искал и нашел решения, работающие только для стеков растров, которые затем возвращают другой растр. Но я этого не хочу. Для каждого из 4 измерений я хочу, чтобы одно число возвращало мне значение того, что было вычислено.

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

1. Вот ресурс о том, как обращаться с растрами, но растр — это, по сути, сетка значений. В нем не будет «ошибки», если вы не сравните 2 растра или растр с интерполированным слоем или чем-то еще

Ответ №1:

Давайте создадим данные с известным стандартным отклонением:

 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
  

Создано 2020-08-21 пакетом reprex (версия 0.3.0)

Ответ №2:

в то время как

 sd(r[])
  

вроде сработало, оно вернуло NA, но при добавлении «na.rm = TRUE» все сработало нормально.
Другой ответ мог бы быть:

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

который, я полагаю, делает по существу то же самое. первый вариант считывает данные, тогда как второй сначала преобразует данные в матрицу.

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

1. если вы пойдете по этому пути, я бы сделал sd(values(r), na.rm=TRUE)

Ответ №3:

Для этого существует 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
  

Или, с terra помощью global метода

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