#r #raster #r-raster
#r #растровый #r-растр
Вопрос:
У меня есть один растр, для которого я хочу рассчитать
- Среднеквадратичная ошибка (RMSE)
- Ошибка среднего значения
- Абсолютная средняя ошибка
- Стандартное отклонение
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