Я хочу получить попарную ошибку из расплавленной матрицы, которая выглядит так:
pw.data = data.frame(true_tree = rep(c("maple","oak","pine"),3),
guess_tree = c(rep("maple",3),rep("oak",3),rep("pine",3)),
value = c(12,0,1,1,15,0,2,1,14))
true_tree guess_tree value
maple maple 12
oak maple 0
pine maple 1
maple oak 1
oak oak 15
pine oak 0
maple pine 2
oak pine 1
pine pine 14
Итак, я хочу оценить попарную ошибку между истинными видами деревьев и угаданными. Для этой оценки формула должна быть «попарно неправильные присвоения / все количество оценок для выбранных двух видов.
Чтобы дать лучшее объяснение: неправильная догадка для клена и дуба (сравнение клен-дуб и дуб-клен) = 1 + 0 / все количество догадок = 12 + 1 + 2 (все считается для true_tree == "клен) + 0 + 15 + 1 (все считается для true_tree == "дуб). Таким образом, оценка продукта составляет 1/31.
Когда я проверил это для одного конкретного случая, скажем еще раз для клена и дуба, я могу оценить это вручную как:
sum(pw.data[((pw.data[,1] == "maple" & pw.data[,2] == "oak") |
(pw.data[,1] == "oak" & pw.data[,2] == "maple")) &
(pw.data[,1] != pw.data[,2]),3]) /
(sum(pw.data[pw.data[,1] == "maple",3]) + sum(pw.data[pw.data[,1] == "oak",3]))
Тем не менее, я хочу сделать эти оценки для больших данных, и поэтому я хочу создать цикл / функцию для выполнения самой оценки и сохранения результатов во фрейме данных, например:
Pw_tree value
Maple-oak 0.0123
....
Я пытался использовать эту логику в цикле for, как показано ниже, но он вообще не работает.
for (i in pw.data[,1]) {
for (j in pw.data[,2]) {
x = sum( pw.data[((pw.data[,1] == i & pw.data[,2] == j ) |
(pw.data[,1] == j & pw.data[,2] == i)) &
(pw.data[,1] != pw.data[,2]),3])
y = (sum(pw.data[pw.data[,1] == i,3]) + sum(pw.data[pw.data[,1] == j,3]))
PWerr_data = data.frame( pw_tree = paste(i,j, sep = "-"), value = x/y)
}
}
Это было бы здорово, если бы я мог видеть, что я сделал не так.
Большое спасибо!