有效创建代码以计算相对误差

时间:2019-05-30 14:58:14

标签: r aggregate

我的代码的总体目的是在将精细分辨率图汇总到粗糙分辨率图之后,计算像素级相对误差。为此,我已经创建了一个数据框(在此标记为df),至少将这些数字放在一起。接下来,我想计算每个粗分辨率像素的相对误差,并要做到这一点,需要计算粗像素与它包含的精细像素之间的均方根误差,以及精细像素的均值它包含了。然后,需要遍历所有粗像素。

虽然我确实使用for循环解决了此问题(请参见下文),但它并不是最理想的代码,尤其是因为数据帧很大(主要是因为我查看的是较大的关注区域) 。

我相信更有效的方法是使用by()或gregation()?,但是我不确定该如何执行。我曾尝试使代码(特别是for循环)适应这些功能,但没有成功。是否有关于如何使其与by()配合使用的想法?

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 :(得分:0)

Aggregate可以做到这一点,但是您是否考虑过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)} )