r - R 使用多个评估度量函数进行汇总,这些评估度量函数使用数据帧中的实际值和预测值
问题描述
我想为数据集按组计算多个模型评估指标。每个指标都需要输入实际(观察到的)和预测值。这些是我的数据框中的列。我的组由变量 iTime 和 an_id 表示。
我可以通过汇总和大量冗余输入来进行必要的计算,但必须有一种咕噜咕噜的方式来做到这一点。我正在努力掌握咕噜声。我已经尝试过invoke_map
但pmap
无法弄清楚如何在我的数据框中引用“实际”和“预测”列。
一个简短的示例 - 需要更多指标:
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
解决方案
我不知道从哪里来mae
,这令人遗憾mase
地rmse
使您的示例无法重现。始终明确说明您正在使用的软件包很重要。
invoke_map
是将多个函数映射到相同数据的方法。然后,我们可以将它与nest
ing 数据结合起来,然后对嵌套map
的.invoke_map
data
我将使用您提供的示例数据并通过定义两个函数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_dfc
inside来map
应用f1
和存储结果,并将结果存储在嵌套的列中。最后一步是删除列并取消嵌套汇总统计信息。f2
data
tibble
data
更新
重现您的预期输出
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)
推荐阅读
- cloud - Openstack policy.json 文件
- php - PHP:如何循环和跳过另一个表中没有相应数据的数据库表?
- sql - 同步两个不同数据库的最佳方法
- javascript - 这个 Html Table 行排序有什么问题
- forms - TYPO3 8.7 - 核心扩展形式正在设置 fe_typo_user
- excel - vba中的POST api身份验证
- c# - 隐式暴露类属性的成员
- django - Django CKeditor 使用richTextField 但是当文本很长时它不会做段落
- scrapy - 响应查询在 shell 中工作,但在代码中给出了 SyntaxError: invalid syntax
- linux - Suse Linux 内核版本