Эффективное создание кода для расчета относительной ошибки - PullRequest
0 голосов
/ 30 мая 2019

Общая цель моего кода - вычислить относительные ошибки в масштабе пикселей после объединения карты с высоким разрешением в карту с грубым разрешением.Чтобы сделать это, я уже создал фрейм данных (здесь обозначен как df), который по крайней мере соединяет эти числа.Затем я хотел вычислить относительную ошибку для каждого пикселя с грубым разрешением, и для этого мне нужно вычислить среднеквадратичную ошибку между грубым пикселем и содержащимися в нем точными пикселями, а также среднее значение для точных пикселейэто содержит.Затем необходимо выполнить итерацию по всем грубым пикселям.

Несмотря на то, что эта проблема решена с помощью цикла for (см. Ниже), это не самый оптимальный фрагмент кода, особенно потому, что кадр данныхдовольно большой (в основном потому, что я просматриваю большую область интереса).

Я считаю, что более эффективный подход использует () или, возможно, aggregate ()?, Но я не уверен, как это можно сделать.Я пытался адаптировать код (в частности, цикл for) к этим функциям, но безуспешно.Есть мысли о том, как заставить его работать с помощью ()?

df <- as.data.frame(cbind(FineSP@data,extract$cells,extract$coarseval))

names(df)[1] <- "fine_res_values"
names(df)[2] <- "cellnumber"
names(df)[3] <- "coarse_res_values"

df$cellnumber <- as.character(df$cellnumber)

uniquecells<-unique(df$cellnumber) 

rmse_user <- function(fine, coarse){ # user fuction to calculate root-mean squared error

  rmse_fun = sqrt( mean( (fine - coarse)^2, na.rm = TRUE) ) 

  return(rmse_fun)

}

relative_error_user <- function(fine, coarse){ # user fuction to calculate pixel-scale relative error

  relative_error_value <- round(rmse_user(fine, coarse) / mean(fine), 3)

  return(relative_error_value)

}

relerror_compile <- vector()
i<-1
for(i in 1:length(uniquecells)){

  filter <- df[which(df$cellnumber == uniquecells[i]),]  # subset data frame by matching cell numbers
  relerror_compile[i] <- relative_error_user(fine = filter$fine_res_values, coarse = filter$coarse_res_values) # apply the user-based function for relative error

}

# Initial (and unsuccessful) attempt to use by() as the alternative

by_test <-by (df$fine_res_values,list(df$cellnumber),FUN=function(z) 

1 Ответ

0 голосов
/ 30 мая 2019

Совокупный может сделать это, но вы рассматривали пакет plyr? Лично я нахожу это более удобным для пользователя:

df <- data.frame(cellnumber=rep(1:3,each=4),
                 fine_res_value=rnorm(12,10,5),
                 coarse_res_value=rnorm(12,10,5))

library(plyr)
RE <- ddply(df,'cellnumber',function(x){round(sqrt( mean( (x$fine - x$coarse)^2, na.rm = TRUE) ) / mean(x$fine), 3)} )
...