RMSE Landsat8 AVHRR

Это довольно старая школа, я использую ее в больших циклах, чтобы избежать создания экземпляра другого буфера строк.

void tocout(long a)
{
    long c = 1;

    if(a<0) {a*=-1;cout<<"-";}
    while((c*=1000)<a);
    while(c>1)
    {
       int t = (a%c)/(c/1000);
       cout << (((c>a)||(t>99))?"":((t>9)?"0":"00")) << t;
       cout << (((c/=1000)==1)?"":",");
    }
}
0
задан FranziM 28 February 2019 в 09:52
поделиться

1 ответ

Вот ваш упрощенный код с некоторыми примерами данных (вот как вы должны задать вопрос здесь).

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)   
0
ответ дан Robert Hijmans 28 February 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: