三路数值比较,计数'successes'个数

Three-way comparison of values, count number of 'successes'

假设我对一些模拟数据(多个数据集)进行了三种类型的回归方法,这样我就有了对应于每个数据集的每种方法的 MSE。一些示例数据 (df) 可能如下所示:

df
simulation mse_test1 mse_test2 mse_test3
1          60        80        10                   
2          80        20        50
3          10        90        100
4          70        50        10

我想要完成的是比较给定模拟的 3 个 MSE 值中的每一个以确定最低 MSE(即对于第一行(模拟 1),我想确定 test3 具有最低 MSE)。我想对我的所有模拟进行这种比较,如果方法(测试)的 MSE 最低,它将收到 1,而其他 methods/test 将收到零。

最后,我想将这些比较的结果存储在df_result中,这样我就可以找到最大和为1的方法(测试)。例如,使用我们的示例数据,结果是这样的:

df_result:
mse_test1 mse_test2 mse_test3
1         1         2

即,第二个 method/test 对于最多的模拟具有最低的 MSE。

感谢任何提示!

我也想完成同样的结果,但是对于保存在列表中的数据如下:

    sample_results
 [[1]]
    mse_test1[[1]]
    60
    mse_test1[[2]]
    80
    mse_test1[[3]]
    10
    mse_test1[[4]]
    70



[[2]]
    mse_test2[[1]]
    80
    mse_test2[[2]]
    20
    mse_test2[[3]]
    90
    mse_test2[[4]]
    50
[[3]]
    mse_test3[[1]]
    10
    mse_test3[[2]]
    50
    mse_test3[[3]]
    100
    mse_test3[[4]]
    10

一个想法是在数据框的每一行上使用 table

table(max.col(-df[-1]))

#1 2 3 
#1 1 2 

或者,

t1 <- table(max.col(-df[-1]))
setNames(t1, paste0('mse_test', names(t1)))

#mse_test1 mse_test2 mse_test3 
#        1         1         2 

如果您有一个列表列表,则只需转换为数据框并遵循相同的过程,即

d3 <- as.data.frame(do.call(cbind, lapply(l2, function(i) unlist(i))))
t2 <- table(max.col(-d3))

setNames(t2, paste0('mse_test', names(t2)))

#mse_test1 mse_test2 mse_test3 
#        1         1         2

其中,

dput(l2)
list(list(60L, 80L, 10L, 70L), list(80L, 20L, 90L, 50L), list(
    10L, 50L, 100L, 10L))