值的三方比较,计算“成功”的数量

时间:2017-06-13 16:10:27

标签: r comparison simulation

假设我在一些模拟数据(多个数据集)上进行了三种类型的回归方法,这样我对每个数据集对应的每个方法都有一个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,而其他方法/测试将接收零。

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

df_result:
mse_test1 mse_test2 mse_test3
1         1         2

即,第二种方法/测试对于大多数模拟具有最低的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

1 个答案:

答案 0 :(得分:2)

一个想法是在数据框的每一行使用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))