首页 > 解决方案 > R 使用多个评估度量函数进行汇总,这些评估度量函数使用数据帧中的实际值和预测值

问题描述

我想为数据集按组计算多个模型评估指标。每个指标都需要输入实际(观察到的)和预测值。这些是我的数据框中的列。我的组由变量 iTime 和 an_id 表示。

我可以通过汇总和大量冗余输入来进行必要的计算,但必须有一种咕噜咕噜的方式来做到这一点。我正在努力掌握咕噜声。我已经尝试过invoke_mappmap无法弄清楚如何在我的数据框中引用“实际”和“预测”列。

一个简短的示例 - 需要更多指标:

library(Metrics)    
  df <- data.frame(an_id = c('G','J','J', 'J', 'G','G','J','G'),    
                  iTime = c(1,1,2,2,1,2,1,2), 
                 actual = c(1.28, 2.72,.664,.927,.711,1.16,.727,.834),    
                 predicted = c(1.14,1.61,.475,.737,.715,1.15,.725,.90))



  dataMetrics <- df %>% 
                   group_by(an_id, iTime)  %>% 
                    summarise(vmae = mae(actual, predicted), 
                             rae = rae(actual, predicted), 
                              vrmse = rmse(actual, predicted))
> dataMetrics
 A tibble: 4 x 5
  an_id iTime  vmae  rae  vrmse   
 <chr> <dbl> <dbl> <dbl>  <dbl>
1 G         1 0.072 0.253 0.0990    
2 G         2 0.038 0.233 0.0472    
3 J         1 0.556 0.558 0.785     
4 J         2 0.190 1.44  0.190    

标签: r

解决方案


我不知道从哪里来mae,这令人遗憾masermse使您的示例无法重现。始终明确说明您正在使用的软件包很重要。

invoke_map是将多个函数映射到相同数据的方法。然后,我们可以将它与nesting 数据结合起来,然后对嵌套map的.invoke_mapdata

我将使用您提供的示例数据并通过定义两个函数f1和来演示f2

f1 <- function(x, y) sum(abs(x - y))
f2 <- function(x, y) sum((x - y)^2)

library(tidyverse)
df %>%
  group_by(an_id, iTime)  %>%
  nest() %>%
  mutate(tmp = map(data, ~invoke_map_dfc(
      list(f1 = f1, f2 = f2), 
      x = .x$actual, y = .x$predicted))) %>%
  select(-data) %>%
  unnest()
## A tibble: 4 x 4
#  an_id iTime    f1     f2
#  <fct> <int> <dbl>  <dbl>
#1 G         1 0.144 0.0196
#2 J         1 1.11  1.23
#3 J         2 0.381 0.0718
#4 G         2 0.01  0.0001

an_id说明:我们通过和对观察结果进行分组iTime,然后nest是剩余的数据,并使用invoke_map_dfcinside来map应用f1和存储结果,并将结果存储在嵌套的列中。最后一步是删除列并取消嵌套汇总统计信息。f2datatibbledata


更新

重现您的预期输出

library(Metrics)
df %>%
  group_by(an_id, iTime)  %>%
  nest() %>%
  mutate(tmp = map(data, ~invoke_map_dfc(
      list(vmae = mae, rae = rae, vrmse = rmse),
      actual = .x$actual, predicted = .x$predicted))) %>%
  select(-data) %>%
  unnest()
## A tibble: 4 x 5
#  an_id iTime  vmae   rae  vrmse
#  <fct> <dbl> <dbl> <dbl>  <dbl>
#1 G         1 0.072 0.253 0.0990
#2 J         1 0.556 0.558 0.785
#3 J         2 0.190 1.44  0.190
#4 G         2 0.038 0.233 0.0472

样本数据

df <- read.table(text =
    "an_id iTime  actual predicted
G 1 1.28     1.14
J           1    2.72        1.61
J           2    0.664       0.475
J        2 0.927    0.737
G        1 0.711    0.715
G        2 1.16     1.15
J        2 0.727    0.725", header = T)

推荐阅读