首页 > 解决方案 > 针对多个不同站点的参数进行优化

问题描述

我的数据类似于以下内容

Site Unknown_Parameter X Y Z Predicted Actual
A           2          3 4 2     5       6
A           2          4 3 2     7       5
B           3          6 8 9     12      9
B           3          4 6 2     10      10

ETC...

我正在尝试创建一个函数,通过确定未知参数的最佳值来最小化每个站点的 RMSE。我可以使用以下伪代码一次为单个站点执行此操作

fn <- function(unknown_parameter) {
df$Predicted <- calculations with unknown_parameter and X Y Z
RMSE <- sqrt(mean((df$Predicted - df$Actual)^2))
RMSE
}
optimize(fn, c(1,10))

我能够获得未知参数的最佳值以及单个站点的 RMSE,但由于我有 100 个站点,因此我想将其扩展到每个站点。理想情况下,我希望我的输出如下所示

Site Optimal_Value RMSE
A    1.7           2.45
B    1.2           3.24
C    1.3           9.21

ETC...

我一直在尝试使用 split 命令,但这会将我的数据转换为列表,我不确定如何使用它。有什么想法吗?

标签: r

解决方案


虽然split通过输入因子的值by生成子集数据帧列表,但考虑也通过一个或多个因子对数据帧进行子集,但也可以将子集传递给函数。并将所有数据帧绑定在一起运行一个do.call(rbind, ...)返回列表。

# USER-DEFINED METHOD RECEIVING subsetted df AS INPUT AND RETURNING dataframe AS OUTPUT
subset_process <- function(subdf) {

   fn <- function(unknown_parameter) {
      subdf$Predicted <- calculations with unknown_parameter and X Y Z
      RMSE <- sqrt(mean((subdf$Predicted - subdf$Actual)^2))

      return(RMSE)
   }

   opt <- optimize(fn, c(1,10))

   tmp <- data.frame(Site = subdf$Site[[1]],
                     Optimal Value = opt,
                     RMSE = fn)
   return(tmp)
}

# SPLIT + RUN METHOD ON EACH SUBSET
df_list <- by(df, df$Site, FUN=subset_process)

# APPEND ALL DF ELEMENTS INTO MASTER DF
final_df <- do.call(rbind, df_list)

推荐阅读