如何使用dplyr管道对dataframe的各country_ID子组分别计算RMSE
按国家分组计算RMSE的dplyr实现方案
原始数据集示例
这是我的数据集my_data:
p0 | country_ID | WinFlag | ---------------------------- 0.17| UK | 0 | 0.85| GER | 1 | 0.55| USA | 0 | 0.25| USA | 0 | 0.80| UK | 1 |
还有更多同结构数据。
全局RMSE计算实现
已经通过如下代码成功计算出my_data的整体RMSE:
test <- my_data %>% group_by(predic = round(p0, digits = 2)) %>% summarize(count = n(), wf = mean(WinFlag)) %>% mutate(vwap_err_sq = ((predic-wf)^2)*count) rmse_p0 <- sqrt(sum(test$vwap_err_sq) / sum(test$count))*100
计算得到的test表示例如下:
predic count wf vwap_err_sq <dbl> <int> <dbl> <dbl> 1 0.04 6 0 0.0096 2 0.05 8 0.125 0.045 3 0.06 19 0.158 0.182 4 0.07 20 0.2 0.338
需求说明
需要为my_data中每个country_ID对应的子组分别计算专属RMSE,此前多次尝试在上述代码中添加group_by(country_ID)都无法成功输出各国家对应的RMSE。
可复现示例与最终解决方案
测试数据集
library(tidyverse) my_data <- data.frame(p0 = c(0.17,0.17,0.85,0.55,0.25,0.80), country_ID=c("UK","UK","GER","USA","USA","UK"), WinFlag=c(1,0,1,0,0,1))
分组计算RMSE代码
test <- my_data %>% group_by(predic = round(p0, digits = 2)) %>% mutate(count = 1) %>% mutate(wf = mean(WinFlag)) %>% mutate(vwap_err_sq = ((predic-wf)^2)*1) %>% ungroup() %>% group_by(country_ID) %>% mutate(rmse_p0 = sqrt(sum(vwap_err_sq*count) / sum(count))*100)
实现逻辑说明
原先全局计算用了summarize函数,会丢弃分组外的其他字段,导致后续无法保留country_ID信息做二次分组。调整方法是把第一步的summarize替换为mutate,保留所有行和国家字段,先按预测值分箱计算每个分箱的实际胜率和误差平方,解除分箱分组后再按国家维度分组汇总,即可算出每个国家的专属RMSE。
内容的提问来源于stack exchange,提问作者user2165379
相关产品推荐
相关产品推荐

