отображение объектов списка и применение формулы - PullRequest
2 голосов
/ 19 января 2020

Я пытаюсь применить следующую формулу к каждому из целых чисел моего списка.

((TP * TN) - (FP * FN)) / sqrt((TP + FP) * (TP+FN) * (TN+FP) * (TN+FN))

Я пытаюсь с pmap, но, похоже, не могу заставить вычисления работать.

Данные :

TP <- list(12734L, 12765L, 12842L, 12786L)
FP <- list(262L, 212L, 215L, 198L)
FN <- list(635L, 869L, 943L, 1081L)
TN <- list(869L, 654L, 500L, 435L)

Я запускаю следующее:

TP <- list(12734L, 12765L, 12842L, 12786L)
FP <- list(262L, 212L, 215L, 198L)
FN <- list(635L, 869L, 943L, 1081L)
TN <- list(869L, 654L, 500L, 435L)

lst1 <- list(TP, FP, FN, TN)
purrr::pmap(lst1, ~ ((..1 * ..4) - (..2 * ..3))/sqrt((..1 + ..2) * (..1 + ..3) * (..4 + ..2) * (..4 + ..3)))

Какие выходы:

[[1]]
[1] NA

[[2]]
[1] NA

[[3]]
[1] NA

[[4]]
[1] NA

Warning messages:
1: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
  NAs produced by integer overflow
2: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
  NAs produced by integer overflow
3: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
  NAs produced by integer overflow
4: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
  NAs produced by integer overflow

1 Ответ

1 голос
/ 19 января 2020

Мы можем обернуть все элементы list в list

lst1 <- list(TP, FP, FN, TN)

Все элементы list являются целочисленными классами, и на основании вычислений значения * получатся действительно большими числа, которые превышают диапазон значений для integer. Может быть, его следует преобразовать в большой целочисленный класс или использовать numeric

library(purrr)
pmap_dbl(lst1, ~ ((as.numeric(..1) * as.numeric(..4))  - 
              (as.numeric(..2) * as.numeric(..3)))/
   sqrt((as.numeric(..1) + as.numeric(..2)) * (as.numeric(..1) + 
         as.numeric(..3)) * (as.numeric(..4) + as.numeric(..2)) * 
         (as.numeric(..4) + as.numeric(..3))))
#[1] 0.6340100 0.5344409 0.4563071 0.4068497

Кроме того, поскольку list имеют одинаковую длину, может быть лучше преобразовать его в vector и как столбцы data.frame, мы можем применять функции гораздо проще

library(dplyr)
library(tidyr)
tibble(TP, FP, FN, TN) %>% 
    unnest(c(TP, FP, FN, TN)) %>%
    mutate_all(as.numeric) %>%
    transmute(out = f1(TP, FP, FN, TN))
# A tibble: 4 x 1
#    out
#  <dbl>
#1 0.634
#2 0.534
#3 0.456
#4 0.407

, где

f1 <- function(TP, FP, FN, TN) {
         ((TP * TN) - (FP * FN)) /
          sqrt((TP + FP) * (TP+FN) * (TN+FP) * (TN+FN))
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...